[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: A suggestion...
From: |
Jan Djärv |
Subject: |
Re: A suggestion... |
Date: |
Thu, 17 May 2007 16:28:20 +0200 |
User-agent: |
Thunderbird 1.5.0.10 (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:
>>>
>>> ;ELC.
>>> ;;; 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
>>> nice.
>> 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
different machines.
Jan D.
Index: lisp/help-fns.el
*** 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 ----
libname)
file))))
+ (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))
+ (with-temp-buffer
+ (insert-file-contents elc-file nil 0 256)
+ (buffer-string))))
+ (src-file (and str
+ (string-match ";;; from file \\(.*\\.el\\)" str)
+ (match-string 1 str))))
+ (if (and src-file (file-readable-p src-file))
+ src-file
+ file-name)))
+
;;;###autoload
(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))
(princ "'")
+ ;; 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.
(with-current-buffer standard-output
(save-excursion