[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: A suggestion...
Re: A suggestion...
Thu, 17 May 2007 16:28:20 +0200
Thunderbird 184.108.40.206 (X11/20070403)
David Kastrup skrev:
> "Herbert Euler" <address@hidden> writes:
>>> When doing something like C-h f for a function, one gets displayed a
>>> hyperlink to the corresponding source file.
>>> Now there is not rarely the situation that one actually wants not to
>>> go to the Elisp file in load-path, but rather the actual source file.
>>> It happens that .elc files have a header similar to the following:
>>> ;;; Compiled by address@hidden on Mon May 14 12:09:35 2007
>>> ;;; from file /rep/emacs/lisp/gnus/mml2015.el
>>> ;;; in Emacs version 23.0.51
>>> ;;; with all optimizations.
>>> The information is sufficient for determining whether the compilation
>>> happened on the current machine by the current user, and if so, what
>>> the actual source file has been.
>>> So in this particular case, I'd prefer if, without further
>>> configuration and ado, I'd be landed in the corresponding source file
>>> if it is still present on the given machine.
>>> Since I have several packages I build and install from the respective
>>> CVS source archives, having this work automatically would be quite
>> I agree. M-. now always creates buffers like "subr.el<2>", which
>> is not good.
> I have in my own personal .emacs file the following which mitigates
> the problem but requires manual configuration for every package you
> work with. And at my Emacs at the workplace, I have not yet adapted
> .emacs, so I was annoyed again. All the info for an automatic
> solution is actually in-place in the compiled Lisp files. Even when
> some installation procedure copies _only_ the compiled files.
I want this feature as well. I came up with the following patch. It probably
don't work correctly with non-ascii file names, I think one should check file
coding there somewhere. Also I don't check user and machine since I share
installation and source directories with different user names (long story) on
*** lisp/help-fns.el.~1.96.~ 2007-01-24 20:52:15.000000000 +0100
--- lisp/help-fns.el 2007-05-17 16:23:46.000000000 +0200
*** 232,237 ****
--- 232,250 ----
+ (defun find-source-lisp-file (file-name)
+ (let* ((elc-file (locate-file (concat file-name "c") load-path))
+ (str (if (and elc-file (file-readable-p elc-file))
+ (insert-file-contents elc-file nil 0 256)
+ (src-file (and str
+ (string-match ";;; from file \\(.*\\.el\\)" str)
+ (match-string 1 str))))
+ (if (and src-file (file-readable-p src-file))
(defun describe-function-1 (function)
(let* ((def (if (symbolp function)
*** 309,314 ****
--- 322,331 ----
;; but that's completely wrong when the user used load-file.
(princ (if (eq file-name 'C-source) "C source code" file-name))
+ ;; See if lisp files are present where they where installed from.
+ (if (not (eq file-name 'C-source))
+ (setq file-name (find-source-lisp-file file-name)))
;; Make a hyperlink to the library.