2013-08-10 13 views

risposta

9

qualche scavo rivela che

(find-lisp-object-file-name object type) 

dovrebbe fare il trucco. Per fare un esempio:

(find-lisp-object-file-name 'goto-line 'function) 
;; => "/usr/local/Cellar/emacs/24.3/share/emacs/24.3/lisp/simple.el" 

EDIT: Come ho scoperto questa informazione:

Prima ho fatto C-h k C-h f di capire cosa C-h f è destinato a. Il risultato è describe-function, quindi facciamo C-h f describe-function per vedere l'origine per quello. Ho notato che si trattava essenzialmente di un wrapper interattivo attorno allo describe-function-1, quindi sono passato al sorgente per quello. C'è un sacco di roba lì, ma la linea è pertinente:

(file-name (find-lisp-object-file-name function def)) 

rivelando che find-lisp-object-file-name è la funzione utilizzata per fare questo lavoro internamente.

+1

'(find-lisp-oggetto-file-name funzione 'goto-line')' restituisce 'quelle negative per me. '(find-lisp-object-file-name 'goto-line (funzione-simbolo' goto-line))' restituisce il nome del file, come descritto da @ jisang-yoo nella sua risposta. – mgalgs

2

Per aggiungere alla risposta di James Porter

;;; run from: emacs -q 

(require 'cl) ; for incf 

(print (list 
     ;; goto-line is a function defined in simple.el 
     (find-lisp-object-file-name 'goto-line (symbol-function 'goto-line)) 
     ;; print is a function defined in C 
     (find-lisp-object-file-name 'print (symbol-function 'print)) 
     ;; rx is an autoload from rx.el 
     (find-lisp-object-file-name 'rx (symbol-function 'rx)) 
     ;; incf is an alias for cl-incf defined in cl.el 
     (find-lisp-object-file-name 'incf (symbol-function 'incf)) 
     ;; cl-incf is defined in cl-lib.el 
     (find-lisp-object-file-name 'cl-incf (symbol-function 'cl-incf)))) 
;; => ("c:/run/Emacs/lisp/simple.el" C-source 
;; "c:/run/Emacs/lisp/emacs-lisp/rx.el" "c:/run/Emacs/lisp/emacs-lisp/cl.el" 
;; "c:/run/Emacs/lisp/emacs-lisp/cl-lib.el") 

(print (list 
     ;; print-circle is a variable defined in C 
     (find-lisp-object-file-name 'print-circle 'defvar) 
     ;; indent-line-function is a variable defined in indent.el 
     (find-lisp-object-file-name 'indent-line-function 'defvar))) 
;; => (C-source "c:/run/Emacs/lisp/indent.el")