]> code.delx.au - gnu-emacs/blobdiff - lisp/emacs-lisp/find-func.el
(match-string-no-properties): Use substring-no-properties.
[gnu-emacs] / lisp / emacs-lisp / find-func.el
index 1225333ed26201fd883324a4990a459fb24f3fcb..5a7cd1093c42d69bd662d2ba91dc47ec5720e537 100644 (file)
@@ -97,8 +97,9 @@ default."
 (defcustom find-function-recenter-line 1
   "The window line-number from which to start displaying a symbol definition.
 A value of nil implies center the beginning of the definition.
-See the function `center-to-window-line' for more information, and
-`find-function' and `find-variable'."
+See `find-function' and `find-variable'."
+  :type '(choice (const :tag "Center" nil)
+                integer)
   :group 'find-function
   :version "20.3")
 
@@ -111,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)))
+  (or (locate-file library
+                  (or find-function-source-path load-path)
+                  (append (find-library-suffixes) '("")))
+      (error "Can't find library %s" library)))
+
+;;;###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.
@@ -125,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
@@ -299,7 +312,8 @@ The library where VARIABLE is defined is searched for in FILE or
 `find-function-source-path', if non nil, otherwise in `load-path'."
   (if (not variable)
       (error "You didn't specify a variable"))
-  (let ((library (or file (symbol-file variable))))
+  ;; Fixme: I think `symbol-file' should be fixed instead.  -- fx
+  (let ((library (or file (symbol-file (cons 'defvar variable)))))
     (find-function-search-for-symbol variable 'variable library)))
 
 ;;;###autoload
@@ -338,26 +352,27 @@ See `find-variable' for more details."
   "Find the function that KEY invokes.  KEY is a string.
 Point is saved if FUNCTION is in the current buffer."
   (interactive "kFind function on key: ")
-  (save-excursion
-    (let* ((event (and (eventp key) (aref key 0))) ; Null event OK below.
-          (start (event-start event))
-          (modifiers (event-modifiers event))
-          (window (and (or (memq 'click modifiers) (memq 'down modifiers)
-                           (memq 'drag modifiers))
-                       (posn-window start))))
-      ;; For a mouse button event, go to the button it applies to
-      ;; to get the right key bindings.  And go to the right place
-      ;; in case the keymap depends on where you clicked.
-      (when (windowp window)
-       (set-buffer (window-buffer window))
-       (goto-char (posn-point start)))
-      (let ((defn (key-binding key))
-           (key-desc (key-description key)))
-       (if (or (null defn) (integerp defn))
-           (message "%s is unbound" key-desc)
-         (if (consp defn)
-             (message "%s runs %s" key-desc (prin1-to-string defn))
-           (find-function-other-window defn)))))))
+  (let (defn)
+    (save-excursion
+      (let* ((event (and (eventp key) (aref key 0))) ; Null event OK below.
+            (start (event-start event))
+            (modifiers (event-modifiers event))
+            (window (and (or (memq 'click modifiers) (memq 'down modifiers)
+                             (memq 'drag modifiers))
+                         (posn-window start))))
+       ;; For a mouse button event, go to the button it applies to
+       ;; to get the right key bindings.  And go to the right place
+       ;; in case the keymap depends on where you clicked.
+       (when (windowp window)
+         (set-buffer (window-buffer window))
+         (goto-char (posn-point start)))
+       (setq defn (key-binding key))))
+    (let ((key-desc (key-description key)))
+      (if (or (null defn) (integerp defn))
+         (message "%s is unbound" key-desc)
+       (if (consp defn)
+           (message "%s runs %s" key-desc (prin1-to-string defn))
+         (find-function-other-window defn))))))
 
 ;;;###autoload
 (defun find-function-at-point ()
@@ -388,4 +403,5 @@ Point is saved if FUNCTION is in the current buffer."
 
 (provide 'find-func)
 
+;;; arch-tag: 43ecd81c-74dc-4d9a-8f63-a61e55670d64
 ;;; find-func.el ends here