导航到内置函数和变量的源代码


9

在一天当中,我经常使用C-h fC-h vdescribe-functiondescribe-variable)查找有关函数和变量的文档。如果我没有获得所需的全部信息,通常会单击以下文件末尾的文件链接:

some-random-command is an interactive compiled Lisp function in `some-mode.el'.

并导航到源代码。这适用于已安装的软件包,但似乎不适用于内置软件包。例如,在命令的帮助页面顶部,describe-function我得到的是:

describe-function is an interactive compiled Lisp function.

没有链接到源代码。有什么方法可以快速导航到内置包的源代码?

我知道我可以在中找到源代码,例如,/usr/share/emacs/24.5/lisp并提出了多种方法来快速访问该目录,但是我很好奇是否有一种快速简便的方法可以导航到内置函数/变量定义中。源代码。谢谢!


5
M-x find-function; M-x find-variable; M-x find-face; M-x find-library。我始终使用完整的Emacs安装程序,以便可以访问所有内容,并且在构建自己的Emacs之后,我复制了C源代码并设置了它的位置,以便可以找到C源代码定义。find-function-C-source-directory复制变量后,请参见变量以设置C源代码的位置。
法律列表

1
使用Emacs的master分支,我得到以下信息M-x describe-functiondescribe-function是'help-fns.el'中的交互式自动加载的已编译Lisp函数。 从那里,我可以单击(或按Enter键)help-fns.el,然后将其传输到代码的适用部分。也许您有多个Emacs版本,而您当前使用的版本没有安装所有源代码?
法律列表

如果使用emacs -Q(没有初始化文件)启动Emacs时出现这种情况,或者可以用开头的配方进行复制emacs -Q(例如说出要加载的库以及如何加载等),则请考虑提交错误。报告:M-x report-emacs-bug
提请

4
在IIRC中,Debian的Emacs软件包(也许还有其他操作系统)将.el文件(视为可选)与.elc文件(强制性)分开,因此您需要安装一个或多个其他软件包才能获得它们。如果您从OS软件包管理器获得了Emacs,则也许可以这样解释。
菲利浦斯

1
你可以做的二进制文件(具有可执行权限)的名称的grep(或其他搜索工具) - emacs的emacsclient - ,看看他们是你的硬盘上。我将我的资料完全单独存储在自己的专用文件夹中。例如,我有操作系统随附的版本- /usr/bin/emacs/usr/bin/emacsclient,并且我将一个版本很好地打包在以.app结尾的OSX应用程序文件夹中-即,/Applications/Emacs.app(在Emacs.app内是二进制文件,并且所有源代码文件)。
法律列表

Answers:


7

有时会看到没有文件名的“交互式已编译Lisp函数”(或类似地表示变量)的原因是该函数是从字节编译文件中加载的,而相应的Elisp源文件不存在。为了向您显示源代码,Emacs必须能够找到源代码。

许多发行版将Lisp源文件放在单独的程序包中,因为不是每个用户都想要它们,而且它们很庞大。例如,在Debian及其衍生产品上,安装emacs24-el。如果您从源代码构建Emacs,请make install复制Elisp源代码。

如果要查看原语(子例程和特殊形式)的源代码,Emacs需要能够找到C源代码。除非您从源代码安装,否则通常无法使用这些功能。

Emacs在中的目录中寻找Lisp源load-path。对于从foo.elc,文件加载的函数或变量,可以是foo.elfoo.el.gz。Emacs在中查找C源source-directory,如果找不到源文件,则提示您输入其他目录。


尽管我可能发誓要从源代码构建此版本的Emacs,但当我M-x emacs-version在其末尾称其为“由Debian修改”时,这表明我使用的是OS(Ubuntu)软件包管理器中的版本,对吗?
elethan

@elethan如果显示“由Debian修改”,则说明您已安装或至少构建了Ubuntu软件包。您可能是从源代码构建的(也许是因为您想要的版本比Ubuntu版本中的版本更高)。您在跑步/usr/bin/emacs还是/usr/local/bin/emacs
吉尔斯(Gillles)“所以别再邪恶了”

1

如果你正在寻找方法来快速跳转到源代码,也有find-function-at-pointfind-variable-at-point这将跳转到光标下符号的定义-你可以将它们绑定到章比照和Ch了Cv,例如。

或者,您可以尝试使用M-的elisp-slime-nav。跳转到符号的定义,然后返回M-,返回-导航至变量,函数,库和面-https: //github.com/purcell/elisp-slime-nav/

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.