18 结论

我们现在已经到达了这个介绍的结尾。您现在已经学到足够的关于在Emacs Lisp中编程的知识,足以设置值、为自己和朋友编写简单的.emacs文件,以及编写对Emacs进行简单定制和扩展的代码。

这是一个停下来的地方。或者,如果您愿意,现在可以继续前进,自己深入学习。

您已经学到了一些编程的基础知识。但仅仅是一些。有许多容易使用的括号和铰链,我们尚未涉及。

您现在可以追踪GNU Emacs的源代码以及 The GNU Emacs Lisp Reference Manual

Emacs Lisp的源代码是一场冒险。当您阅读源代码并遇到一个陌生的函数或表达式时,您需要弄清楚或找出它的作用。

前往参考手册。它是对Emacs Lisp进行了详尽、完整且相当易读的描述。它不仅是为专家编写的,还为像您一样有一定基础的人编写的。(参考手册与标准GNU Emacs发行版一起提供。与本介绍一样,它作为一个Texinfo源文件,因此您可以在计算机上阅读它,并作为排版的印刷书籍阅读。)

查看GNU Emacs的其他内置帮助:所有函数和变量的内置文档,以及 xref-find-definitions,该程序可以带您转到源代码。

这里是我探索源代码的一个示例。由于其名称,simple.el是我很久以前首先查看的文件。恰好simple.el中的一些函数很复杂,或者至少乍一看很复杂。例如,open-line函数看起来很复杂。

您可能想像这个函数的作用,就像我们之前使用forward-sentence函数一样慢慢地走一遍。(See The forward-sentence function.) 或者您可能想跳过该函数,查看另一个函数,比如split-line。您不需要阅读所有函数。根据 count-words-in-defunsplit-line函数包含102个单词和符号。

即使很短,split-line包含我们尚未学习的表达式:skip-chars-forwardindent-tocurrent-columninsert-and-inherit

考虑skip-chars-forward函数。 在GNU Emacs中,您可以通过键入C-h fdescribe-function)和函数的名称来查找有关skip-chars-forward的更多信息。这将显示函数文档。

您可能能够猜到一个命名得当的函数(例如indent-to)的作用;或者您也可以查找它。顺便说一下,describe-function函数本身位于help.el中;它是那些很长但可以解读的函数之一。您可以使用C-h f命令查找describe-function

在这种情况下,由于代码是Lisp,*Help*缓冲区包含包含函数源代码的库的名称。您可以将光标放在库的名称上,按下RET键,在这种情况下它绑定到help-follow,直接转到源代码,方式类似于M-.xref-find-definitions)。

describe-function的定义说明了如何定制interactive表达式,而不使用标准字符代码;它还展示了如何创建临时缓冲区。

indent-to函数是用C而不是Emacs Lisp编写的;它是一个内置函数。help-follow会将您带到它的源代码,就像xref-find-definitions一样,当正确设置时。)

您可以使用xref-find-definitions查看函数的源代码,它绑定到M-.。最后,您可以查看Reference Manual中关于该函数的内容,方法是在Info中访问手册,然后键入iInfo-index)和函数的名称,或者在印刷副本的索引中查找该函数。

同样,您可以找出insert-and-inherit的含义。

其他有趣的源文件包括paragraphs.elloaddefs.elloadup.elparagraphs.el文件包含简短、易于理解的函数以及较长的函数。loaddefs.el文件包含许多标准的自动加载和许多按键映射。我从未完全查看过它;只是查看了部分。loadup.el是加载Emacs标准部分的文件;它告诉您关于Emacs构建方式的很多信息。(See Building Emacs in The GNU Emacs Lisp Reference Manual, 了解更多有关构建的信息。)

正如我所说,您已经学到了一些基础知识;但是,非常重要的是,我们几乎没有涉及编程的重要方面;我对如何排序信息一无所知,除了使用预定义的sort函数之外;我对如何存储信息一无所知,除了使用变量和列表之外;我对如何编写编写程序的程序一无所知。这是另一种、不同类型的书籍、不同类型的学习的主题。

您所做的是学到了足够在GNU Emacs中进行实际工作的知识。您所做的是开始。这是一个开始的结束。