在Emacs Lisp中,如何查找符号定义的位置?

5

当我执行C-h fC-h v时,帮助会告诉我该符号定义在哪个文件中或将从哪里自动加载。如何以编程方式找到相同的信息?

2个回答

10

一些调查发现,

(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 k C-h f来确定C-h f绑定的是什么。结果是describe-function,所以让我们运行C-h f describe-function以查看其源代码。我注意到它本质上是一个交互式包装器,围绕describe-function-1展开的,所以我跳转到了该函数的源代码。其中有很多内容,但是关键的一行是:

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

揭示了 find-lisp-object-file-name 是内部用于执行此任务的函数。


1
(find-lisp-object-file-name 'goto-line 'function) 对我返回 nil(find-lisp-object-file-name 'goto-line (symbol-function 'goto-line)) 返回文件名,如 @jisang-yoo 在他的答案中所描述的。 - mgalgs

2
为了补充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")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接