]> code.delx.au - gnu-emacs/commitdiff
(find-library-suffixes, find-library-name)
authorStefan Monnier <monnier@iro.umontreal.ca>
Mon, 9 Sep 2002 21:50:36 +0000 (21:50 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Mon, 9 Sep 2002 21:50:36 +0000 (21:50 +0000)
(find-library): New funs.
(find-function-search-for-symbol): Use it.

lisp/emacs-lisp/find-func.el

index 6e491409233d1c07bc27b70db7b6df26f9bb5510..40016cec928e452aded84b473022115f0927dd6f 100644 (file)
@@ -112,6 +112,34 @@ See the functions `find-function' and `find-variable'."
 
 ;;; Functions:
 
+(defun find-library-suffixes ()
+  (let ((suffixes nil))
+    (dolist (suffix load-suffixes (nreverse suffixes))
+      (unless (string-match "elc" suffix) (push suffix suffixes)))))
+
+(defun find-library-name (library)
+  "Return the full name of the elisp source of LIBRARY."
+  ;; If the library is byte-compiled, try to find a source library by
+  ;; the same name.
+  (if (string-match "\\.el\\(c\\(\\..*\\)\\)\\'" library)
+      (setq library (replace-match "" t t library 1)))
+  (or (locate-file library
+                  (or find-function-source-path load-path)
+                  (find-library-suffixes))
+      (error "Can't find library %s" file)))
+
+;;;###autoload
+(defun find-library (library)
+  "Find the elisp source of LIBRARY."
+  (interactive
+   (list
+    (completing-read "Library name: "
+                    'locate-file-completion
+                    (cons (or find-function-source-path load-path)
+                          (find-library-suffixes)))))
+  (let ((buf (find-file-noselect (find-library-name library))))
+    (condition-case nil (switch-to-buffer buf) (error (pop-to-buffer buf)))))
+
 ;;;###autoload
 (defun find-function-search-for-symbol (symbol variable-p library)
   "Search for SYMBOL.
@@ -126,23 +154,7 @@ If VARIABLE-P is nil, `find-function-regexp' is used, otherwise
   (save-match-data
     (if (string-match "\\.el\\(c\\)\\'" library)
        (setq library (substring library 0 (match-beginning 1))))
-    (let* ((path find-function-source-path)
-          (compression (or (rassq 'jka-compr-handler file-name-handler-alist)
-                           (member 'crypt-find-file-hook find-file-hook)))
-          (filename (progn
-                      ;; use `file-name-sans-extension' here? (if it gets fixed)
-                      (if (string-match "\\(\\.el\\)\\'" library)
-                          (setq library (substring library 0
-                                                   (match-beginning 1))))
-                      (or (locate-library (concat library ".el") t path)
-                          (locate-library library t path)
-                          (if compression
-                              (or (locate-library (concat library ".el.gz")
-                                                  t path)
-                                  (locate-library (concat library ".gz")
-                                                  t path)))))))
-      (if (not filename)
-         (error "The library `%s' is not in the path" library))
+    (let* ((filename (find-library-name library)))
       (with-current-buffer (find-file-noselect filename)
        (let ((regexp (format (if variable-p
                                  find-variable-regexp