有没有办法在Emacs中打印现有功能的定义?


10

我想查看Emacs中现有功能的定义。这可能吗?

我已经尝试过了C-h d function-name RET,但是它只返回函数的文档字符串,而不是实际函数本身。

我在考虑类似于bash的type命令,它将返回函数的整个定义。

(令人尴尬的背景故事:我不小心在.emacs文件中使用了非工作版本覆盖了一个工作函数。原始函数仍在内存中!而且可以工作!但是我一生都无法记住我是如何做到的。)


1
如果您一直.emacs在缓冲区中打开,请尝试疯狂撤消。
吉尔(Gilles)'所以

Answers:


10

如果键入C-h f function-name RET,则将获取函数的文档,并带有指向函数源的链接(如果有)。

我不认为可以调用一个简单的Lisp函数来检索函数源的位置。查找与帮助系统的其余部分完全交织在一起。find-lisp-object-file-name是试图找出函数源的主要函数。

除非function-name是原语(在Emacs的C源代码中定义),否则您可以使用(symbol-function 'function-name)或更广泛地(间接函数'function-name')查看其代码。但是,如果函数是字节编译的,那么您将看到的只是它的字节码。


1
谢谢!(symbol-function 'function-name)正是我想要的!同样,如果您确实需要C函数的源代码,则可以使用Oleg答案中的信息来获取它。
Micah R Ledbetter

谢谢!另外,如果该函数是自动加载的,则需要先调用一次,然后才能获取源代码。
Gerhard Burger 2014年

3

M-x find-function 返回该点附近函数的定义。

从文档中:

在缓冲区中查找包含函数定义的源文件,该点位于点附近(由“函数调用点”选择),并将点放置在定义之前。如果缓冲区已经存在,请在移动前设置标记。

如果您还想包括用C实现的功能,则必须在.emacs文件中添加以下内容:

(setq find-function-C-source-directory (concat (getenv "emacs_home") "/path/to/source-dir"))

嗯 很高兴知道这一点,但是我认为它仅适用于内置功能,而这并不是我想要的。
Micah R Ledbetter

1
它也适用于用户定义的功能
Oleg Pavliv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.