;;; 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.
(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