我想查看Emacs中现有功能的定义。这可能吗?
我已经尝试过了C-h d function-name RET
,但是它只返回函数的文档字符串,而不是实际函数本身。
我在考虑类似于bash的type
命令,它将返回函数的整个定义。
(令人尴尬的背景故事:我不小心在.emacs
文件中使用了非工作版本覆盖了一个工作函数。原始函数仍在内存中!而且可以工作!但是我一生都无法记住我是如何做到的。)
我想查看Emacs中现有功能的定义。这可能吗?
我已经尝试过了C-h d function-name RET
,但是它只返回函数的文档字符串,而不是实际函数本身。
我在考虑类似于bash的type
命令,它将返回函数的整个定义。
(令人尴尬的背景故事:我不小心在.emacs
文件中使用了非工作版本覆盖了一个工作函数。原始函数仍在内存中!而且可以工作!但是我一生都无法记住我是如何做到的。)
Answers:
如果键入C-h f function-name RET
,则将获取函数的文档,并带有指向函数源的链接(如果有)。
我不认为可以调用一个简单的Lisp函数来检索函数源的位置。查找与帮助系统的其余部分完全交织在一起。find-lisp-object-file-name
是试图找出函数源的主要函数。
除非function-name
是原语(在Emacs的C源代码中定义),否则您可以使用(symbol-function 'function-name)
或更广泛地(间接函数'function-name')查看其代码。但是,如果函数是字节编译的,那么您将看到的只是它的字节码。
(symbol-function 'function-name)
正是我想要的!同样,如果您确实需要C函数的源代码,则可以使用Oleg答案中的信息来获取它。
M-x find-function
返回该点附近函数的定义。
从文档中:
在缓冲区中查找包含函数定义的源文件,该点位于点附近(由“函数调用点”选择),并将点放置在定义之前。如果缓冲区已经存在,请在移动前设置标记。
如果您还想包括用C实现的功能,则必须在.emacs文件中添加以下内容:
(setq find-function-C-source-directory (concat (getenv "emacs_home") "/path/to/source-dir"))
.emacs
在缓冲区中打开,请尝试疯狂撤消。