94466
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 1 ;;; find-cmd.el --- Build a valid find(1) command with sexps
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 2
106815
+ ��膩��鰹申鐃順�渇��膩��� 3 ;; Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
94466
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 4
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 5 ;; Author: Philip Jackson <phil@shellarchive.co.uk>
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 6 ;; Version: 0.6
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 7
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 8 ;; This file is part of GNU Emacs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 9
94678
+ ��膩��鰹申鐃順�渇��膩��� 10 ;; GNU Emacs is free software: you can redistribute it and/or modify
94468
+ ��膩��鰹申鐃順�渇��膩��� 11 ;; it under the terms of the GNU General Public License as published by
94678
+ ��膩��鰹申鐃順�渇��膩��� 12 ;; the Free Software Foundation, either version 3 of the License, or
+ ��膩��鰹申鐃順�渇��膩��� 13 ;; (at your option) any later version.
94466
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 14
94468
+ ��膩��鰹申鐃順�渇��膩��� 15 ;; GNU Emacs is distributed in the hope that it will be useful,
+ ��膩��鰹申鐃順�渇��膩��� 16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ��膩��鰹申鐃順�渇��膩��� 17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ ��膩��鰹申鐃順�渇��膩��� 18 ;; GNU General Public License for more details.
94466
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 19
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 20 ;; You should have received a copy of the GNU General Public License
94678
+ ��膩��鰹申鐃順�渇��膩��� 21 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
94466
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 22
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 23 ;;; Commentary:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 24
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 25 ;; With this module you can build up a (hopefully) valid find(1)
106606
+ ��膩��鰹申鐃順�渇��膩��� 26 ;; string ready for the command line. For example:
94466
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 27
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 28 ;; (find-cmd '(prune (name ".svn" ".git" ".CVS"))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 29 ;; '(and (or (name "*.pl" "*.pm" "*.t")
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 30 ;; (mtime "+1"))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 31 ;; (fstype "nfs" "ufs"))))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 32
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 33 ;; will become (un-wrapped):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 34
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 35 ;; "find '/home/phil/' \\( \\( -name '.svn' -or -name '.git' -or
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 36 ;; -name '.CVS' \\) -prune -or -true \\) \\( \\( \\( -name '*.pl'
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 37 ;; -or -name '*.pm' -or -name '*.t' \\) -or -mtime '+1' \\) -and \\(
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 38 ;; -fstype 'nfs' -or -fstype 'ufs' \\) \\)"
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 39
94469
+ ��膩��鰹申鐃順�渇��膩��� 40 ;;; Code:
94466
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 41
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 42 (defconst find-constituents
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 43 '((and . find-and)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 44 (not . find-not)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 45 (or . find-or)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 46
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 47 (a . find-and)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 48 (n . find-not)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 49 (o . find-or)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 50
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 51 (prune . find-prune)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 52
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 53 ;; switches
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 54 (L . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 55 (P . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 56 (H . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 57
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 58 ;; generic tests
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 59 (amin . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 60 (anewer . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 61 (atime . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 62 (cmin . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 63 (cnewer . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 64 (ctime . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 65 (empty . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 66 (false . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 67 (fstype . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 68 (gid . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 69 (group . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 70 (ilname . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 71 (iname . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 72 (inum . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 73 (iwholename . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 74 (iregex . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 75 (links . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 76 (lname . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 77 (mmin . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 78 (mtime . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 79 (name . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 80 (newer . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 81 (nouser . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 82 (nogroup . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 83 (path . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 84 (perm . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 85 (regex . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 86 (wholename . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 87 (size . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 88 (true . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 89 (type . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 90 (uid . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 91 (used . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 92 (user . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 93 (xtype . (nil))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 94
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 95 ;; normal options (always true)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 96 (depth . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 97 (maxdepth . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 98 (mindepth . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 99 (mount . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 100 (noleaf . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 101 (xdev . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 102 (ignore_readdir_race . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 103 (noignore_readdir_race . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 104
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 105 ;; actions
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 106 (delete . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 107 (print0 . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 108 (printf . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 109 (fprintf . (2))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 110 (print . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 111 (fprint0 . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 112 (fprint . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 113 (ls . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 114 (fls . (1))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 115 (prune . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 116 (quit . (0))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 117
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 118 ;; these need to be terminated with a ;
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 119 (exec . (1 find-command t))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 120 (ok . (1 find-command t))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 121 (execdir . (1 find-command t))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 122 (okdir . (1 find-command t)))
106606
+ ��膩��鰹申鐃順�渇��膩��� 123 "Holds details of each of the find options.
+ ��膩��鰹申鐃順�渇��膩��� 124 The car of each alist is the name. The cdr is minimum args, the
106840
+ ��膩��鰹申鐃順�渇��膩��� 125 function used to join many occurrences of the argument together,
106606
+ ��膩��鰹申鐃順�渇��膩��� 126 and whether or not to leave quotes off the string (non-nil means
+ ��膩��鰹申鐃順�渇��膩��� 127 the string will be quoted).")
94466
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 128
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 129 ;;;###autoload
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 130 (defun find-cmd (&rest subfinds)
106606
+ ��膩��鰹申鐃順�渇��膩��� 131 "Initiate the building of a find command.
+ ��膩��鰹申鐃順�渇��膩��� 132 For example:
94466
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 133
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 134 \(find-cmd '\(prune \(name \".svn\" \".git\" \".CVS\"\)\)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 135 '\(and \(or \(name \"*.pl\" \"*.pm\" \"*.t\"\)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 136 \(mtime \"+1\"\)\)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 137 \(fstype \"nfs\" \"ufs\"\)\)\)\)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 138
106606
+ ��膩��鰹申鐃順�渇��膩��� 139 `default-directory' is used as the initial search path. The
94466
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 140 result is a string that should be ready for the command line."
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 141 (concat
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 142 "find " (shell-quote-argument (expand-file-name default-directory)) " "
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 143 (cond
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 144 ((cdr subfinds)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 145 (mapconcat 'find-to-string subfinds ""))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 146 (t
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 147 (find-to-string (car subfinds))))))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 148
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 149 (defun find-and (form)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 150 "And FORMs together, so:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 151 \(and \(mtime \"+1\"\) \(name \"something\"\)\)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 152 will produce:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 153 find . \\\( -mtime '+1' -and -name 'something' \\\)"
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 154 (if (< (length form) 2)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 155 (find-to-string (car form))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 156 (concat "\\( "
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 157 (mapconcat 'find-to-string form "-and ")
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 158 "\\) ")))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 159
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 160 (defun find-or (form)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 161 "Or FORMs together, so:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 162 \(or \(mtime \"+1\"\) \(name \"something\"\)\)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 163 will produce:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 164 find . \\\( -mtime '+1' -or -name 'something' \\\)"
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 165 (if (< (length form) 2)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 166 (find-to-string (car form))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 167 (concat "\\( "
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 168 (mapconcat 'find-to-string form "-or ")
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 169 "\\) ")))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 170
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 171 (defun find-not (form)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 172 "Or FORMs together and prefix with a -not, so:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 173 \(not \(mtime \"+1\"\) \(name \"something\"\)\)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 174 will produce:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 175 -not \\\( -mtime '+1' -or -name 'something' \\\)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 176 If you wanted the FORMs -and(ed) together instead then this would
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 177 suffice:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 178 \(not \(and \(mtime \"+1\"\) \(name \"something\"\)\)\)"
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 179 (concat "-not " (find-or (mapcar 'find-to-string form))))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 180
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 181 (defun find-prune (form)
106606
+ ��膩��鰹申鐃順�渇��膩��� 182 "-or together FORMs postfix '-prune' and then -or that with a
94466
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 183 -true, so:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 184 \(prune \(name \".svn\" \".git\"\)\) \(name \"*.pm\"\)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 185 will produce (unwrapped):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 186 \\\( \\\( \\\( -name '.svn' -or -name '.git' \\\) /
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 187 -prune -or -true \\\) -and -name '*.pm' \\\)"
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 188 (find-or
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 189 (list
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 190 (concat (find-or (mapcar 'find-to-string form)) (find-generic "prune"))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 191 (find-generic "true"))))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 192
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 193 (defun find-generic (option &optional oper argcount args dont-quote)
106606
+ ��膩��鰹申鐃順�渇��膩��� 194 "Allow an arbitrary string to be used as a form.
+ ��膩��鰹申鐃順�渇��膩��� 195 OPTION is the name of the form, OPER is the function used to either
+ ��膩��鰹申鐃順�渇��膩��� 196 OR or AND multiple results together. ARGCOUNT is the minimum of
+ ��膩��鰹申鐃順�渇��膩��� 197 args that OPTION can receive and ARGS are the arguments for OPTION.
+ ��膩��鰹申鐃順�渇��膩��� 198 If DONT-QUOTE is non-nil, arguments are quoted for passing them to
+ ��膩��鰹申鐃順�渇��膩��� 199 the shell."
94466
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 200 (when (and (numberp argcount) (< (length args) argcount))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 201 (error "'%s' needs at least %d arguments" option argcount))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 202 (let ((oper (or oper 'find-or)))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 203 (if (and args (length args))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 204 (funcall oper (mapcar (lambda (x)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 205 (concat "-" option
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 206 (if dont-quote
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 207 (concat " " x " ")
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 208 (concat " "
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 209 (shell-quote-argument x)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 210 " "))))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 211 args))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 212 (concat "-" option " "))))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 213
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 214 (defun find-command (form)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 215 "For each item in FORM add a terminating semi-colon and turn
106606
+ ��膩��鰹申鐃順�渇��膩��� 216 them into valid switches. The result is -and(ed) together."
94466
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 217 (find-and (mapcar (lambda (x)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 218 (concat (find-to-string x) "\\; "))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 219 form)))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 220
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 221 (defun find-to-string (form)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 222 "Parse FORM to produce a set of valid find arguments."
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 223 (cond
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 224 ((stringp form)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 225 form)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 226 ((consp form)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 227 (let ((option (cdr (assoc (car form) find-constituents))))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 228 (cond
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 229 ((and (symbolp option) (fboundp option))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 230 (funcall option (cdr form)))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 231 ((consp option)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 232 (let ((option (symbol-name (car form)))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 233 (argcnt (car option))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 234 (oper (cadr option))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 235 (dont-quote (car (cddr option))))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 236 (find-to-string
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 237 (find-generic option oper argcnt (cdr form) dont-quote))))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 238 (t
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 239 (error "Sorry I don't know how to handle '%s'" (car form))))))))
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 240
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
+ ��膩��鰹申鐃順�渇��膩��� 241 (provide 'find-cmd)
94469
+ ��膩��鰹申鐃順�渇��膩��� 242
+ ��膩��鰹申鐃順�渇��膩��� 243 ;; arch-tag: 9687fd9e-4e90-4022-864a-f904526e2046
+ ��膩��鰹申鐃順�渇��膩��� 244 ;;; find-cmd.el ends here