Emacs Lisp函数指南

17

我已经使用 Emacs 超过三年了,但即使是编写小型 Lisp 函数也需要花费数天的时间。我查阅了 GNU Emacs Lisp 参考手册,但它太庞大了,而且结构与 JavaDoc 完全相反,不是从函数到描述,而是另一种方式。

能让我的生活更轻松的是某种类似于 JavaDoc 的简短文档,其中包含最常用的 Emacs 内部函数和它们的快速描述。

    (point) - 返回缓冲区中当前位置。
    (save-excursion (p)) - 在执行 (p) 前保存缓冲区中的当前位置,并在执行后恢复它。

有人知道我可以在哪里找到这样的东西吗?


2
Javadoc类似的文档的问题在于没有模块系统来给它任何层次结构。 - Chris Conway
是的,但它可以逻辑上分割。关键是,我可以查看相当大量的函数名称以找到可能的内容。而我想要的就是那个列表。虽然所有的函数都太大了,无法征服,所以我只想要最有用的部分。 - vava
2
参考手册有一个索引,难道不够好吗? - huaiyuan
12个回答

14

您尝试过 Emacs 中内置的手册吗?在任何 Lisp 编辑器缓冲区(或任何使用 Lisp 模式的缓冲区)中,将光标移到任何函数或变量上,然后按下 C-h f(查看函数)或 C-h v(查看变量)。Emacs 将会为您提供该函数/变量的相当简明的描述。

例如,(save-excursion) 的手册内容为

save-excursion is a special form in `C source code'.
(save-excursion &rest BODY)

Save point, mark, and current buffer; execute BODY; restore those things.
Executes BODY just like `progn'.
The values of point, mark and the current buffer are restored
even in case of abnormal exit (throw or error).
The state of activation of the mark is also restored.

This construct does not save `deactivate-mark', and therefore
functions that change the buffer will still cause deactivation
of the mark at the end of the command.  To prevent that, bind
`deactivate-mark' with `let'.

好的一点是,内置手册会给你“链接”到函数源代码和可能相关的其他函数,这使得浏览变得更加方便。

当然,你不能通过这种方式学习Lisp,但对于查找函数文档来说,这是一个不错的起点。如果您发现内置手册难以理解(有时确实会发生),那么就是时候谷歌这个函数了 ;)


我不知道首先要寻找什么,所以这不是一个解决方案。 - vava
我忽略了你想要一个「函数列表」。但实际上,入门的方法是开始阅读 Lisp 代码并看看你最常遇到的内容。如果你有其他语言的经验,很多 Lisp 看起来显然是可以理解的;你所需要做的就是查找那些不太自解释的函数。 - polyglot
试着多尝试几次,你会发现大多数情况下函数名比参考指南中立即显而易见的更容易猜测。顺便说一句,它的Info版本也有一个很好的概念索引。 - tripleee

12

3
这是我在这里看到的最有用的链接。尽管那些页面的背景知识让我感到很困扰。 - vava
5
Xah Lee是一位才华横溢的程序员,但他对于何为“正确”的想法有些奇怪。只是提个小小的警告... - Joe Casadonte
5
是的,我不会认真对待他说的任何话。不过,他关于自己与妓女发生性关系的文章还是相当不错的。 - jrockway
4
我发现 Xah 的页面对我最初 6 个月的 elisp 编程很有帮助,但后来我意识到他的疯狂思想压倒了初学者的信息。在新闻组中,他经常催促人们为他更新维基、重写 Emacs、改变术语以适应他自己的“深入”研究等等。 - Michael Paulukonis

11

同意。楼主需要忍耐并阅读这篇文章,然后再查阅相关资料。 - jrockway
3
完全没有回答问题——为什么没有像索引一样的手册,而是仅仅按主题分类? - Michael Paulukonis

10

我想再加几个:

  • M-x apropos - 搜索函数和变量,查找您指定的任何字符串(例如 directory)。请注意,这与 C-h a 稍有不同,后者仅查找交互式函数。

  • 查找类似的代码并复制它 - 通过查看已完成的内容,您可以学到很多做事情的方法。如果您想查看某个特定函数的示例,则一种好的方法是在 dired 中访问主 lisp 源目录(例如 d:/product/emacs/lisp 或 /usr/share/lib/emacs/lisp)并执行 % g,然后会在所有文件中查找您键入的任何字符串。打开该文件并查看其他人对其所做的操作。

  • C-h fC-h v - 正如其他人提到的,您可以打开源代码,在函数或变量上定位点,然后获取有关它的文档。

  • 查看Emacs wiki,其中包含大量 Emacs Lisp 模块供您浏览。


8
我认为你的方法不对。在学习编程语言和库(统称“Emacs Lisp”)时,你需要从微观和宏观两个层面来考虑。在开始编写软件之前,你需要了解可用的工具。这就是Emacs Lisp手册旨在教育你的内容。你真的需要坐下来读完整本手册,这样你就知道Emacs提供的功能。
读完手册后,你需要“微观层面”的信息。有许多来源可以提供这些信息。如果你大致知道你要做什么(比如“处理缓冲区”),那么Lisp参考资料是一个好地方,可以帮助你找到需要了解的内容。如果你知道有一个函数可以完成你想要的操作,但不太记得它的名字,那么M-x aproposC-u C-h a)可以帮助你搜索文档。如果你知道要使用哪个函数,但不太记得它的工作方式,那么M-x describe-functionC-h f)将为你解决问题。
总之,关键是要学习Emacs Lisp,然后让Emacs帮助你解决细节问题。一堆函数列表并不能教你太多东西。
(哦,还有一件事——你应该熟悉Common Lisp。大多数Emacs库使用cl,这是在Emacs Lisp中实现的有用的CL函数。其中包括loopdestructuring-binddefun*等,它们非常有帮助。)

2
虽然我同意这种方法,但我没有时间做那个。我的想法是能够编写一些小函数来帮助我完成日常工作,并不是成为Common Lisp编程专家。 - vava
1
你似乎有很多时间在这个网站上浏览浪费。每天抽出一个小时来阅读Lisp手册吧。然后你就会拥有解决Emacs Lisp中任何问题所需的知识,这可能会在未来节省你大量的时间。 - jrockway
1
不,我每天在这里花费的时间不超过10分钟。而且,有比阅读没有图片的庞大无聊手册更重要的事情要做 :) - vava
1
这就是我对 man 手册的不喜欢,它们没有图片。只能看到一些 ASCII 图表,也没有表格。 - Yoo
M-x elisp-index-search,C-h F,C-h V,C-h K。这些命令和著名的C-h v和C-h f一起使用也非常有用。 - Yoo
尽管我不同意 cl 的普及和可取性,但是如果你只想要 Elisp,那就继续使用 Elisp。 - tripleee

2


1

你尝试过 <f1> f 吗?它绑定了 describe-function。以 point 为例:

point is a built-in function in C source code.
(point)

Return value of point, as an integer.
Beginning of buffer is position (point-min).

[back]

像大多数Lisp系统一样,Emacs具有集成的文档工具!

  • 任何Lisp函数或变量都可以声明一个可选的文档字符串。
  • 几乎所有标准命令或函数都声明了一个有用的文档字符串。
  • Emacs(像大多数Lisp系统一样)允许您在任何时候显示任何函数或变量的文档字符串(<f1> f<f1> v)。
  • 当显示时,文档字符串是可浏览的,这意味着您可以单击符号以查看其文档字符串,或转到相应函数或变量的源。
  • 只要评估了任何defundefvar,其文档字符串就可以通过describe-functiondescribe-variable获得:此文档是活跃的!

1

M-x find-library RET <library name> 是你所需要的全部。


1
如果你愿意花钱购买一本纸质书,我会推荐《学习 GNU Emacs》。Learning GNU Emacs
(来源: oreilly.com)

2
我更喜欢Bob Glickstein的书,它专门关注于Elisp。http://www.amazon.com/gp/aw/d/B0043M56SW/ref=redir_mdp_mobile/186-0564429-8448460 - tripleee
回答中的链接已经失效,因此无法查看推荐内容。请更新链接并添加纯文本说明。 - Andrew Swann

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