diff lisp/files.el @ 45011:2e2beba30184

(locate-file): New fun. (locate-file-completion): Rename from load-completion and generalize. (load-library): Use it. (make-auto-save-file-name): Expand caddr.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 30 Apr 2002 01:56:23 +0000
parents fd324d332ceb
children f821fa45b822
line wrap: on
line diff
--- 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