emacs-devel
[Top][All Lists]
Advanced

[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

reply via email to

[Prev in Thread] Current Thread [Next in Thread]