diff lisp/lib-complete.el @ 398:74fd4e045ea6 r21-2-29

Import from CVS: tag r21-2-29
author cvs
date Mon, 13 Aug 2007 11:13:30 +0200
parents 8626e4521993
children 697ef44129c6
line wrap: on
line diff
--- a/lisp/lib-complete.el	Mon Aug 13 11:12:06 2007 +0200
+++ b/lisp/lib-complete.el	Mon Aug 13 11:13:30 2007 +0200
@@ -38,7 +38,6 @@
 ;; Last Modified By: Heiko M|nkel <muenkel@tnt.uni-hannover.de>
 ;; Additional XEmacs integration By: Chuck Thompson <cthomp@cs.uiuc.edu>
 ;; Last Modified On: Thu Jul 1 14:23:00 1994
-;; RCS Info        : $Revision: 1.3.2.1 $ $Locker:  $
 ;; ========================================================================
 ;; NOTE: XEmacs must be redumped if this file is changed.
 ;;
@@ -57,6 +56,7 @@
 ;;; ChangeLog:
 
 ;; 4/26/97: sb Mule-ize.
+;; 6/24/1999 much rewriting from Bob Weiner
 
 ;;; Code:
 
@@ -217,7 +217,6 @@
       (if tail (setcdr tail nil)))))
 
 ;;=== Read a filename, with completion in a search path ===================
-(defvar read-library-internal-search-path)
 
 (defun read-library-internal (FILE FILTER FLAG)
   "Don't call this."
@@ -255,82 +254,93 @@
     (cond 
      ((equal library "") DEFAULT)
      (FULL (locate-file library read-library-internal-search-path
-			;; decompression doesn't work with Mule -slb
-			(if (featurep 'mule)
-			    ".el:.elc"
-			  ".el:.el.gz:.elc")))
+			 '(".el" ".el.gz" ".elc")))
      (t library))))
 
+(defun read-library-name (prompt)
+  "PROMPTs for and returns an existing Elisp library name (without any suffix) or the empty string."
+  (interactive)
+  (let ((read-library-internal-search-path load-path))
+    (completing-read prompt
+		     'read-library-internal 
+		     (lambda (fn) 
+		       (cond
+			((string-match "\\.el\\(\\.gz\\|\\.Z\\)?$" fn)
+			 (substring fn 0 (match-beginning 0)))))
+		     t nil)))
+
 ;; NOTE: as a special case, read-library may be used to read a filename
 ;; relative to the current directory, returning a *relative* pathname
 ;; (read-file-name returns a full pathname).
 ;;
 ;; eg. (read-library "Local header: " '(nil) nil)
 
-(defun get-library-path ()
-  "Front end to read-library"
-  (read-library "Find Library file: " load-path nil t t
-		  (function (lambda (fn) 
-			      (cond
-			       ;; decompression doesn't work with mule -slb
-			       ((string-match (if (featurep 'mule)
-						  "\\.el$"
-						"\\.el\\(\\.gz\\)?$") fn)
-				(substring fn 0 (match-beginning 0))))))
-		  ))
-
 ;;=== Replacement for load-library with completion ========================
 
 (defun load-library (library)
   "Load the library named LIBRARY.
 This is an interface to the function `load'."
   (interactive 
-   (list (read-library "Load Library: " load-path nil nil nil
-		  (function (lambda (fn) 
-			      (cond 
-			       ((string-match "\\.elc?$" fn)
-				(substring fn 0 (match-beginning 0))))))
-		  ))) 
+   (list (read-library "Load library: " load-path nil nil nil
+		       (function (lambda (fn) 
+				   (cond 
+				    ((string-match "\\.elc?$" fn)
+				     (substring fn 0 (match-beginning 0))))))
+		       ))) 
   (load library))
 
-;;=== find-library with completion (Author: Heiko Muenkel) ===================
+;;=== find-library with completion (Author: Bob Weiner) ===================
 
-(defun find-library (library &optional codesys)
-  "Find and edit the source for the library named LIBRARY.
-The extension of the LIBRARY must be omitted.
-Under XEmacs/Mule, the optional second argument specifies the
-coding system to use when decoding the file.  Interactively,
-with a prefix argument, you will be prompted for the coding system."
+(defun find-library (library &optional codesys display-function)
+  "Find and display in the current window the source for the Elisp LIBRARY.
+LIBRARY should be a name without any path information and may include or omit
+the \".el\" suffix.  Under XEmacs/Mule, the optional second argument CODESYS
+specifies the coding system to use when decoding the file.  Interactively,
+with a prefix argument, this prompts for the coding system.  Optional third
+argument DISPLAY-FUNCTION must take two arguments, the filename to display
+and CODESYS.  The default for DISPLAY-FUNCTION is `find-file'."
   (interactive 
-   (list (get-library-path)
+   (list (read-library-name "Find library: ")
 	 (if current-prefix-arg
 	     (read-coding-system "Coding System: "))))
-  (find-file library codesys))
+  (let ((path (if (or (null library) (equal library ""))
+		   nil
+		(locate-file library load-path
+			     ;; decompression doesn't work with Mule -slb
+			     (if (featurep 'mule)
+				 ":.el:.elc"
+			       ":.el:.el.gz:.el.Z:.elc")))))
+    (if path (funcall (if (fboundp display-function)
+			  display-function 'find-file)
+		      path codesys)
+      (error "(find-library): Cannot locate library `%s'" library))))
 
 (defun find-library-other-window (library &optional codesys)
-  "Load the library named LIBRARY in another window.
-Under XEmacs/Mule, the optional second argument specifies the
-coding system to use when decoding the file.  Interactively,
-with a prefix argument, you will be prompted for the coding system."
+  "Find and display in another window the source for the Elisp LIBRARY.
+LIBRARY should be a name without any path information and may include or omit
+the \".el\" suffix.  Under XEmacs/Mule, the optional second argument CODESYS
+specifies the coding system to use when decoding the file.  Interactively,
+with a prefix argument, this prompts for the coding system."
   (interactive 
-   (list (get-library-path)
+   (list (read-library-name "Find library in other window: ")
 	 (if current-prefix-arg
-	   (read-coding-system "Coding System: "))))
-  (find-file-other-window library codesys))
+	     (read-coding-system "Coding System: "))))
+  (find-library library codesys 'find-file-other-window))
 
 (defun find-library-other-frame (library &optional codesys)
-  "Load the library named LIBRARY in a newly-created frame.
-Under XEmacs/Mule, the optional second argument specifies the
-coding system to use when decoding the file.  Interactively,
-with a prefix argument, you will be prompted for the coding system."
+  "Find and display in another frame the source for the Elisp LIBRARY.
+LIBRARY should be a name without any path information and may include or omit
+the \".el\" suffix.  Under XEmacs/Mule, the optional second argument CODESYS
+specifies the coding system to use when decoding the file.  Interactively,
+with a prefix argument, this prompts for the coding system."
   (interactive 
-   (list (get-library-path)
+   (list (read-library-name "Find library in other frame: ")
 	 (if current-prefix-arg
 	     (read-coding-system "Coding System: "))))
-  (find-file-other-frame library codesys))
+  (find-library library codesys 'find-file-other-frame))
 
-; This conflicts with an existing binding
-;(define-key global-map "\C-xl" 'find-library)
+;; This conflicts with an existing binding.
+;;(define-key global-map "\C-xl" 'find-library)
 (define-key global-map "\C-x4l" 'find-library-other-window)
 (define-key global-map "\C-x5l" 'find-library-other-frame)