Mercurial > emacs
comparison lisp/filesets.el @ 45164:79ab9956f2a0
(filesets-external-viewers): Fix customization problem.
(filesets-some): Replaces cl's `some'. Calls changed.
(filesets-member): Replaces cl's `member*'. Calls changed.
(filesets-ormap): New function.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Tue, 07 May 2002 16:11:20 +0000 |
parents | c26266baaba5 |
children | aa4f6ae8b6a9 |
comparison
equal
deleted
inserted
replaced
45163:58815b772067 | 45164:79ab9956f2a0 |
---|---|
19 | 19 |
20 ;; A copy of the GNU General Public License can be obtained from this | 20 ;; A copy of the GNU General Public License can be obtained from this |
21 ;; program's author or from the Free Software Foundation, Inc., 675 Mass | 21 ;; program's author or from the Free Software Foundation, Inc., 675 Mass |
22 ;; Ave, Cambridge, MA 02139, USA. | 22 ;; Ave, Cambridge, MA 02139, USA. |
23 | 23 |
24 (defvar filesets-version "1.8.1") | 24 (defvar filesets-version "1.8.4") |
25 (defvar filesets-homepage | 25 (defvar filesets-homepage |
26 "http://members.a1.net/t.link/CompEmacsFilesets.html") | 26 "http://members.a1.net/t.link/CompEmacsFilesets.html") |
27 | 27 |
28 ;;; Commentary: | 28 ;;; Commentary: |
29 | 29 |
148 ; (not (funcall cond-fn elt))))) | 148 ; (not (funcall cond-fn elt))))) |
149 (let ((rv nil)) | 149 (let ((rv nil)) |
150 (dolist (elt lst rv) | 150 (dolist (elt lst rv) |
151 (when (funcall cond-fn elt) | 151 (when (funcall cond-fn elt) |
152 (setq rv (append rv (list elt))))))) | 152 (setq rv (append rv (list elt))))))) |
153 | |
154 (defun filesets-ormap (fsom-pred lst) | |
155 "Return the the tail of FSOM-LST for the head of which FSOM-PRED is non-nil." | |
156 (let ((fsom-lst lst) | |
157 (fsom-rv nil)) | |
158 (while (and (not (null fsom-lst)) | |
159 (null fsom-rv)) | |
160 (if (funcall fsom-pred (car fsom-lst)) | |
161 (setq fsom-rv fsom-lst) | |
162 (setq fsom-lst (cdr fsom-lst)))) | |
163 fsom-rv)) | |
164 | |
165 (defun filesets-some (fss-pred fss-lst) | |
166 "Return non-nil if FSS-PRED is non-nil for any element of FSS-LST. | |
167 Like `some', return the first value of FSS-PRED that is non-nil." | |
168 (catch 'exit | |
169 (dolist (fss-this fss-lst nil) | |
170 (let ((fss-rv (funcall fss-pred fss-this))) | |
171 (when fss-rv | |
172 (throw 'exit fss-rv)))))) | |
173 ;(fset 'filesets-some 'some) ;; or use the cl function | |
174 | |
175 (defun filesets-member (fsm-item fsm-lst &rest fsm-keys) | |
176 "Find the first occurrence of FSM-ITEM in FSM-LST. | |
177 It is supposed to work like cl's `member*'. At the moment only the :test | |
178 key is supported." | |
179 (let ((fsm-test (or (plist-get fsm-keys ':test) | |
180 (function equal)))) | |
181 (filesets-ormap (lambda (fsm-this) | |
182 (funcall fsm-test fsm-item fsm-this)) | |
183 fsm-lst))) | |
184 ;(fset 'filesets-member 'member*) ;; or use the cl function | |
153 | 185 |
154 (defun filesets-sublist (lst beg &optional end) | 186 (defun filesets-sublist (lst beg &optional end) |
155 "Get the sublist of LST from BEG to END - 1." | 187 "Get the sublist of LST from BEG to END - 1." |
156 (let ((rv nil) | 188 (let ((rv nil) |
157 (i beg) | 189 (i beg) |
609 | 641 |
610 :capture-output ... capture an external viewer output | 642 :capture-output ... capture an external viewer output |
611 | 643 |
612 :constraintp FUNCTION ... use this viewer only if FUNCTION returns non-nil | 644 :constraintp FUNCTION ... use this viewer only if FUNCTION returns non-nil |
613 | 645 |
614 :constraint-flag SYMBOL ... use this viewer only if SYMBOL is non-nil | 646 :constraint-flag SEXP ... use this viewer only if SEXP evaluates to non-nil |
615 | 647 |
616 :open-hook HOOK ... run hooks after spawning the viewer -- mainly useful | 648 :open-hook HOOK ... run hooks after spawning the viewer -- mainly useful |
617 in conjunction with :capture-output | 649 in conjunction with :capture-output |
618 | 650 |
619 :args (FORMAT-STRING or SYMBOL or FUNCTION) ... a list of arguments | 651 :args (FORMAT-STRING or SYMBOL or FUNCTION) ... a list of arguments |
657 (function :tag "Function")) | 689 (function :tag "Function")) |
658 (list :tag ":constraint-flag" | 690 (list :tag ":constraint-flag" |
659 :value (:constraint-flag) | 691 :value (:constraint-flag) |
660 (const :format "" | 692 (const :format "" |
661 :value :constraint-flag) | 693 :value :constraint-flag) |
662 (symbol :tag "Symbol")) | 694 (sexp :tag "Symbol")) |
663 (list :tag ":ignore-on-open-all" | 695 (list :tag ":ignore-on-open-all" |
664 :value (:ignore-on-open-all t) | 696 :value (:ignore-on-open-all t) |
665 (const :format "" | 697 (const :format "" |
666 :value :ignore-on-open-all) | 698 :value :ignore-on-open-all) |
667 (boolean :tag "Boolean")) | 699 (boolean :tag "Boolean")) |
1169 "Search for a FILENAME relative to a MASTER file in PATH-LIST." | 1201 "Search for a FILENAME relative to a MASTER file in PATH-LIST." |
1170 (let ((f (concat (file-name-directory master) | 1202 (let ((f (concat (file-name-directory master) |
1171 filename))) | 1203 filename))) |
1172 (if (file-exists-p f) | 1204 (if (file-exists-p f) |
1173 f | 1205 f |
1174 (some (lambda (dir) | 1206 (filesets-some |
1175 (let ((dir (file-name-as-directory dir)) | 1207 (lambda (dir) |
1176 (files (if (file-exists-p dir) | 1208 (let ((dir (file-name-as-directory dir)) |
1177 (filesets-directory-files dir nil ':files) | 1209 (files (if (file-exists-p dir) |
1178 nil))) | 1210 (filesets-directory-files dir nil ':files) |
1179 (some (lambda (file) | 1211 nil))) |
1180 (if (equal filename (file-name-nondirectory file)) | 1212 (filesets-some (lambda (file) |
1181 (concat dir file) | 1213 (if (equal filename (file-name-nondirectory file)) |
1182 nil)) | 1214 (concat dir file) |
1183 files))) | 1215 nil)) |
1184 path-list)))) | 1216 files))) |
1217 path-list)))) | |
1185 | 1218 |
1186 | 1219 |
1187 (defun filesets-eviewer-get-props (entry) | 1220 (defun filesets-eviewer-get-props (entry) |
1188 "Get ENTRY's (representing an external viewer) properties." | 1221 "Get ENTRY's (representing an external viewer) properties." |
1189 (nth 2 entry)) | 1222 (nth 2 entry)) |
1201 t)))) | 1234 t)))) |
1202 | 1235 |
1203 (defun filesets-get-external-viewer (file) | 1236 (defun filesets-get-external-viewer (file) |
1204 "Find an external viewer for FILE." | 1237 "Find an external viewer for FILE." |
1205 (let ((filename (file-name-nondirectory file))) | 1238 (let ((filename (file-name-nondirectory file))) |
1206 (some | 1239 (filesets-some |
1207 (lambda (entry) | 1240 (lambda (entry) |
1208 (when (and (string-match (nth 0 entry) filename) | 1241 (when (and (string-match (nth 0 entry) filename) |
1209 (filesets-eviewer-constraint-p entry)) | 1242 (filesets-eviewer-constraint-p entry)) |
1210 entry)) | 1243 entry)) |
1211 filesets-external-viewers))) | 1244 filesets-external-viewers))) |
1212 | 1245 |
1213 (defun filesets-get-external-viewer-by-name (name) | 1246 (defun filesets-get-external-viewer-by-name (name) |
1214 "Get the external viewer definition called NAME." | 1247 "Get the external viewer definition called NAME." |
1215 (when name | 1248 (when name |
1216 (some | 1249 (filesets-some |
1217 (lambda (entry) | 1250 (lambda (entry) |
1218 (when (and (string-equal (nth 1 entry) name) | 1251 (when (and (string-equal (nth 1 entry) name) |
1219 (filesets-eviewer-constraint-p entry)) | 1252 (filesets-eviewer-constraint-p entry)) |
1220 entry)) | 1253 entry)) |
1221 filesets-external-viewers))) | 1254 filesets-external-viewers))) |
1412 | 1445 |
1413 (defun filesets-entry-mode (entry) | 1446 (defun filesets-entry-mode (entry) |
1414 "Return fileset ENTRY's mode: :files, :file, :tree, :pattern, or :ingroup. | 1447 "Return fileset ENTRY's mode: :files, :file, :tree, :pattern, or :ingroup. |
1415 See `filesets-data'." | 1448 See `filesets-data'." |
1416 (let ((data (filesets-data-get-data entry))) | 1449 (let ((data (filesets-data-get-data entry))) |
1417 (some (lambda (x) | 1450 (filesets-some |
1418 (if (assoc x data) | 1451 (lambda (x) |
1419 x)) | 1452 (if (assoc x data) |
1420 '(:files :tree :pattern :ingroup :file)))) | 1453 x)) |
1454 '(:files :tree :pattern :ingroup :file)))) | |
1421 | 1455 |
1422 (defun filesets-entry-get-open-fn (fileset-name &optional fileset-entry) | 1456 (defun filesets-entry-get-open-fn (fileset-name &optional fileset-entry) |
1423 "Get the open-function for FILESET-NAME. | 1457 "Get the open-function for FILESET-NAME. |
1424 Use FILESET-ENTRY for finding the open function, if provided." | 1458 Use FILESET-ENTRY for finding the open function, if provided." |
1425 (filesets-data-get (or fileset-entry | 1459 (filesets-data-get (or fileset-entry |
1755 filesets-data nil t))) | 1789 filesets-data nil t))) |
1756 (entry (assoc name filesets-data))) | 1790 (entry (assoc name filesets-data))) |
1757 (if entry | 1791 (if entry |
1758 (let* ((files (filesets-entry-get-files entry)) | 1792 (let* ((files (filesets-entry-get-files entry)) |
1759 (this (buffer-file-name buffer)) | 1793 (this (buffer-file-name buffer)) |
1760 (inlist (member* this files :test 'filesets-files-equalp))) | 1794 (inlist (filesets-member this files |
1795 :test 'filesets-files-equalp))) | |
1761 (cond | 1796 (cond |
1762 (inlist | 1797 (inlist |
1763 (message "Filesets: '%s' is already in '%s'" this name)) | 1798 (message "Filesets: '%s' is already in '%s'" this name)) |
1764 ((and (equal (filesets-entry-mode entry) ':files) | 1799 ((and (equal (filesets-entry-mode entry) ':files) |
1765 this) | 1800 this) |
1780 filesets-data nil t))) | 1815 filesets-data nil t))) |
1781 (entry (assoc name filesets-data))) | 1816 (entry (assoc name filesets-data))) |
1782 (if entry | 1817 (if entry |
1783 (let* ((files (filesets-entry-get-files entry)) | 1818 (let* ((files (filesets-entry-get-files entry)) |
1784 (this (buffer-file-name buffer)) | 1819 (this (buffer-file-name buffer)) |
1785 (inlist (member* this files :test 'filesets-files-equalp))) | 1820 (inlist (filesets-member this files |
1821 :test 'filesets-files-equalp))) | |
1786 ;;(message "%s %s %s" files this inlist) | 1822 ;;(message "%s %s %s" files this inlist) |
1787 (if (and files this inlist) | 1823 (if (and files this inlist) |
1788 (let ((new (list (cons ':files (delete (car inlist) files))))) | 1824 (let ((new (list (cons ':files (delete (car inlist) files))))) |
1789 (setcdr entry new) | 1825 (setcdr entry new) |
1790 (filesets-set-config name 'filesets-data filesets-data)) | 1826 (filesets-set-config name 'filesets-data filesets-data)) |
1944 (let ((masterfile (file-name-nondirectory master)) | 1980 (let ((masterfile (file-name-nondirectory master)) |
1945 (fn (or fun (lambda (a b) | 1981 (fn (or fun (lambda (a b) |
1946 (and (stringp a) | 1982 (and (stringp a) |
1947 (stringp b) | 1983 (stringp b) |
1948 (string-match a b)))))) | 1984 (string-match a b)))))) |
1949 (some (lambda (x) | 1985 (filesets-some (lambda (x) |
1950 (if (funcall fn (car x) masterfile) | 1986 (if (funcall fn (car x) masterfile) |
1951 (nth pos x) | 1987 (nth pos x) |
1952 nil)) | 1988 nil)) |
1953 filesets-ingroup-patterns))) | 1989 filesets-ingroup-patterns))) |
1954 | 1990 |
1955 (defun filesets-ingroup-get-pattern (master) | 1991 (defun filesets-ingroup-get-pattern (master) |
1956 "Access to `filesets-ingroup-patterns'. Extract patterns." | 1992 "Access to `filesets-ingroup-patterns'. Extract patterns." |
1957 (filesets-ingroup-get-data master 2)) | 1993 (filesets-ingroup-get-data master 2)) |
1958 | 1994 |
2024 (let* ((txt (match-string this-mn)) | 2060 (let* ((txt (match-string this-mn)) |
2025 (f (funcall this-fn master txt))) | 2061 (f (funcall this-fn master txt))) |
2026 (when (and f | 2062 (when (and f |
2027 (not (member f flist)) | 2063 (not (member f flist)) |
2028 (or (not remdupl-flag) | 2064 (or (not remdupl-flag) |
2029 (not (member* | 2065 (not (filesets-member |
2030 f filesets-ingroup-files | 2066 f filesets-ingroup-files |
2031 :test 'filesets-files-equalp)))) | 2067 :test 'filesets-files-equalp)))) |
2032 (let ((no-stub-flag | 2068 (let ((no-stub-flag |
2033 (and (not this-stub-flag) | 2069 (and (not this-stub-flag) |
2034 (if this-stubp | 2070 (if this-stubp |