在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在其回答中所述。