# HG changeset patch # User Stefan Monnier # Date 1020131783 0 # Node ID 2e2beba30184dac179ab74546f6e8c4757180af2 # Parent 138248fb3df1f9ef05439e0d1d3269fc244778b0 (locate-file): New fun. (locate-file-completion): Rename from load-completion and generalize. (load-library): Use it. (make-auto-save-file-name): Expand caddr. diff -r 138248fb3df1 -r 2e2beba30184 lisp/files.el --- a/lisp/files.el Tue Apr 30 01:04:05 2002 +0000 +++ b/lisp/files.el Tue Apr 30 01:56:23 2002 +0000 @@ -546,13 +546,34 @@ (read-file-name "Load file: ")))) (load (expand-file-name file) nil nil t)) -(defun load-completion (string predicate action) +(defun locate-file (filename path &optional suffixes predicate) + "Search for FILENAME through PATH. +If SUFFIXES is non-nil, it should be a list of suffixes to append to +file name when searching. If SUFFIXES is nil, it is equivalent to '(\"\"). +If non-nil, PREDICATE is used instead of `file-readable-p'. +PREDICATE can also be an integer to pass to the access(2) function, +in which case file-name-handlers are ignored. +For compatibility with XEmacs, PREDICATE can also be a symbol among +`executable', `readable', `writable', or `exists' or a list of one +of those symbols." + (if (and predicate (symbolp predicate) (not (functionp predicate))) + (setq predicate (list predicate))) + (when (and (consp predicate) (not (functionp predicate))) + (setq predicate + (logior (if (memq 'executable predicate) 1 0) + (if (memq 'writable predicate) 2 0) + (if (memq 'readable predicate) 4 0)))) + (locate-file-internal filename path suffixes predicate)) + +(defun locate-file-completion (string path-and-suffixes action) + "Do completion for file names passed to `locate-file'. +PATH-AND-SUFFIXES is a pair of lists (DIRECTORIES . SUFFIXES)." (if (file-name-absolute-p string) - (read-file-name-internal string predicate action) + (read-file-name-internal string nil action) (let ((names nil) - (suffix (concat (regexp-opt load-suffixes t) "\\'")) + (suffix (concat (regexp-opt (cdr path-and-suffixes) t) "\\'")) (string-dir (file-name-directory string))) - (dolist (dir load-path) + (dolist (dir (car path-and-suffixes)) (if string-dir (setq dir (expand-file-name string-dir dir))) (when (file-directory-p dir) (dolist (file (file-name-all-completions @@ -562,13 +583,16 @@ (setq file (substring file 0 (match-beginning 0))) (push (if string-dir (concat string-dir file) file) names))))) (if action - (all-completions string (mapcar 'list names) predicate) - (try-completion string (mapcar 'list names) predicate))))) + (all-completions string (mapcar 'list names)) + (try-completion string (mapcar 'list names)))))) (defun load-library (library) "Load the library named LIBRARY. This is an interface to the function `load'." - (interactive (list (completing-read "Load library: " 'load-completion))) + (interactive + (list (completing-read "Load library: " + 'locate-file-completion + (cons load-path load-suffixes)))) (load library)) (defun file-local-copy (file) @@ -3372,7 +3396,7 @@ (if (string-match (car (car list)) filename) (setq result (replace-match (cadr (car list)) t nil filename) - uniq (caddr (car list)))) + uniq (car (cddr (car list))))) (setq list (cdr list))) (if result (if uniq