在Emacs Lisp中,如何查找符号的定义位置
当我执行在Emacs Lisp中,如何查找符号的定义位置,emacs,elisp,Emacs,Elisp,当我执行C-h f或C-h v时,帮助会告诉我符号是在哪个文件中定义的,或者从哪里自动加载的。如何以编程方式找到相同的信息?一些挖掘揭示了这一点 (find-lisp-object-file-name object type) 我们应该做到这一点。例如: (find-lisp-object-file-name 'goto-line 'function) ;; => "/usr/local/Cellar/emacs/24.3/share/emacs/24.3/lisp/simple.el"
C-h f
或C-h v
时,帮助会告诉我符号是在哪个文件中定义的,或者从哪里自动加载的。如何以编程方式找到相同的信息?一些挖掘揭示了这一点
(find-lisp-object-file-name object type)
我们应该做到这一点。例如:
(find-lisp-object-file-name 'goto-line 'function)
;; => "/usr/local/Cellar/emacs/24.3/share/emacs/24.3/lisp/simple.el"
编辑:我是如何发现此信息的:
首先,我做了C-hkc-hf
来找出C-hf
与什么有关。结果是descripe function
,所以让我们做C-h f descripe function
来查看它的源代码。我注意到它本质上是一个围绕descripe-function-1
的交互式包装器,因此我跳转到源代码。里面有很多东西,但相关的是:
(file-name (find-lisp-object-file-name function def))
揭示了
查找lisp对象文件名
是用于在内部执行此工作的函数。添加到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")
(查找lisp对象文件名'goto line'函数)
为我返回nil
(查找lisp对象文件名'goto line(符号函数'goto line))
返回文件名,如@jisang yoo在其回答中所述。