首先我们应该知道的是,Emacs 面对用户的操作界面是由 Buffer、Window 和 Frame 三者构成的。

所谓 Buffer,就是文件在内存中的表示。因为 Emacs 并不直接对文件进行操作,而是把它加载到 Buffer 中供用户操作。只有当用户确定要把在 Buffer 中所作的修改写入文件时,即执行“save-buffer”命令时,Emacs 才把 Buffer 中的内容写入文件。

所谓 Window,就是 Buffer 的显示区域,或者说 View。可见 Emacs 也是按照Document/View 模式设计的。之所以叫 Window 而不叫 View,是因为 Emacs 诞生的很早,它的窗口概念和现代的基于窗口的操作系统中的窗口概念不是一样的。而在那个年月能有Window 这样的概念已经是相当先进了,而且更让你吃惊的是,Emacs 居然支持多窗口。

Frame 就是 Emacs 在操作系统中的实际窗口了。一个 Frame 中可以包含多个 Window,每个 Window 显示一个 Buffer 的内容。而 Emacs 还可以拥有多个 Frame。

Emacs 最基础的部分是用 C 写的,这个最基础的部分就是一个 Emas Lisp 语言的解释引擎,而其它部分就都是使用 Emacs Lisp 语言写的了。所以 Emacs Lisp 语言就是另外一个必须要知道了。Emacs Lisp 语言是基于 Lisp 语言的。Lisp 是 LISt Processor 的缩写,即列表处理语言。Lisp 语言的语法是由一个一个的表构成的,因此而得名。

Emacs 为了能够处理不同的文档,设计了 mode 机制。mode 与普通编辑器中的“代码加亮”有些类似,有 major mode 和 minor mode 之分。每一个 buffer 对应一个 major mode,有且只能有一个 major mode,但是可以有多个 minor mode。Emacs 对每一种文件都有一个mode。比如:“*.c”文件有 c-mode、“*.cpp”文件有 c++mode、“*.java”文件有 java-mode……

通过前面的介绍,我们已经了解到 Emacs 的快捷键非常复杂,所以为了简化描述,大多数资料甚至 Emacs 的官方文档都会使用一些惯用表示法。Ctrl 键统一使用 C 表示,Alt 键用 M 表示。比如退出 Emacs 的 Ctrl+x Ctrl+c,可以使用 C-x C-c 来表示;执行命令的 Alt+x,可以使用 M-x 表示。对于 Alt 键,有一些系统的配置会有别的定义,这个时候可以使用“ESC”键来代替。但是使用“ESC”并不要求按住不放,而是按一下即可,之后再单独按具体的后缀按键就能实现功能。所以我们在前面表述的时候会使用“Alt+x 或 Esc x”已表示区别。除了一些最常用的,如:移动光标、复制粘贴这样的功能之外,Emacs 的大多数快捷键都是有一个前缀的,而最多的前缀就是 C-x 和 C-c。前缀表示你不必要一起按下前缀和后缀,可以先按下前缀,Emacs 会等待你按下剩余的快捷键,如果改变了主意,按“C-g”即可取消掉。这样,Emacs 中的快捷键按起来还是很方便的。

其实 Emacs 的快捷键是由 Keymap 来控制的,有全局和局部之分。每一个 mode 都会有一个自己的局部 Keymap,局部的 Keymap 会覆盖全局的 Keymap。更进一步,如果对应的major mode 有开启的 minor mode,而这个 minor mode 又恰巧定义了 Keymap 的话,这个 minor mode 的 Keymap 会覆盖 major mode 的 Keymap。可见,Emacs 利用 mode 机制可以实现对不同类型文档的细微差异化处理,显然功能可以无线放大并能恰到好处啊。

学习 Emacs 最好的办法就是逼迫自己去使用它,而且你不用因为买不到合适的 Emacs教材而发愁。因为 Emacs 附带了十分强大的联机帮助。最常用的就是《Emacs 快速指南》和《Emacs Manual》。前者拥有多种语言的支持,而且包括简体中文,使用“C-h t”即可打开。后者是最权威的 Emacs 参考资料,记录了 Emacs 的方方面面,适用于使用 Emacs 的任何用户,使用“C-h r”即可打开。除了这些文档之外,Emacs 还提供很多便捷的帮助信息,比如:“C-h f”可以查看Ḁ个命令的文档、“C-h k”可以查看Ḁ个快捷键对应的命令,而“C-h w”则可以查看某个命令具体绑定到了那个快捷键上。对于学习 Emacs 很有帮助的快捷键和命令见所描述的内容。

emacs 获取帮助的命令和快捷键
序号 命令 快捷键 功能
1 describe-variable C-h v 查看某个内置 Lisp 变量的说明文档。
2 describe-function C-h f 查看某个内置命令的说明文档。
3 describe-mode C-h m 查看当前 buffer 对应的 mode 的说明文档。
4 describe-key C-h k 查看某个快捷键对应的命令。
5 where-is C-h w 查看某个命令绑定的快捷键。
6 describe-bindings C-h b 查看当前 buffer 所有的快捷键列表。
7 find-function 查看某个内置命令的 Lisp 源代码。
8 find-variable 查看某个内置变量的 Lisp 源代码。
9 apropos 模糊查询内置命令或变量的说明文档。

此外,若想查看某个快捷键的前缀都有那些后缀,可以使用“<前缀> C-h”来查看。比
如“C-c C-h”可以列出所以以“C-c”为前缀的快捷键。