春节前开始正式地系统学习 Emacs, 目前已经基本上能够做到正常使用了.
这篇文章并不是一篇有效的 Emacs 教程, 主要用来记录学习过程中的一些心得.

接触 Emacs 之前以使用 vim/sublime 为主. 在这次学习之前, 对Emacs所知甚少, 唯一印象深刻的命令是如何关掉它: C-x C-c, 算是非常彻底的从零开始.
这里先简单介绍一点有关 Emacs 的基本常识.
Vim 和 Emacs 都属于尽可能发挥键盘威力的文本编辑器: 但不同之处在于, vim 选择区分不同的模式分别用于命令和文本编辑, 而 Emacs 采用了组合键的方式, 即使用键盘上的 Esc, Meta, Alt, Ctrl, Shift (因此坊间也戏称 Emacs 为这一组功能键的头字母简写) 等功能键与字母区的按键组合来触发特定功能.
使用 Emacs 时, 我们经常会将几个按键同时按下, 术语称之为键和弦, 在文档中, 用连字符将按键名相连来表示一个键和弦, 例如 C-? 表示将 Ctrl 键与 ? 按键一同按下, M-? 表示将 Meta 键与 ? 按键一同按下(作为非常古老的软件, Emacs 的许多术语沿袭自计算机的洪荒年代, 现代美式键盘上没有 Meta 键, 我们使用 Alt 键作为替代; 有些键盘上也没有 Alt 键, 这时可以先按下 Esc 键然后释放, 再按 ? 键, 这种组合操作与 M-? 等效). 有些命令还需要配合上档键 Shift完成, 例如, 回到当前打开文件的首部的指令是 M-<, 实际输入时需要同时按住 Alt, Shift 和 , 键.
Emacs自带的教程就是非常好的入门资料, 自然地, 我也选择从它来起步. 一边阅读一边参照着教程的指导进行练习, 认真过上几遍基本的操作就没什么大的问题了.
开启 Emacs 内置教程的组合键为 C-h t, 意为同时按下 Ctrl 和 h, 松开, 然后再按 t 键. 如果系统的语言设置为中文, 则会默认开启已翻译中文的教程. 教程的组织形式简单明了, 还可以随时进行练习. 非常贴心的一点是, 修改过的 Emacs 默认绑定键位也会在教程相应位置出现提示. Emacs 内置的文档也是必不可少的学习资料. 如果不确定某个组合键的功能, 遗忘了 ‘C-f’ 的作用, 可以使用 C-h k C-f 来查看对应的文档. 命令中的 k 指代 keyboard, 与之对应还有一条查询函数功能的命令: ‘C-h f’, 其中 f 指代 function. 使用组合键触发的功能还可以通过函数调用的方式来激活. 即使用 M-x 函数名. 许多函数会绑定到一些特定的组合键上. 这些函数大多数用 elisp 写成, 少数出于性能考虑使用 C 语言编写. Emacs 实际上可以视为一个 elisp 的解释环境, 其大多数的功能都通过这些函数来实现, 也允许用户自定义自己的 elisp 函数.
elisp 即 Emacs lisp, 是一种专门用于 Emacs 的 lisp 方言. 网上入门教程很多, 这里推荐看: learn x iny minutes where x = elisp, 你可以将 el 格式(即 elisp 语言文件格式)下载到本地用 Emacs 打开, 在实践过程中学习. 之后 Emacs 的配置也需要懂一点 elisp 知识.

Emacs 的一组需要了解的特有术语和概念:
buffer:
简单地理解, Emacs 中正在处理的一切都可以视为一个 buffer, 例如一个正在编辑的文件.
frame:
类似 windows 系统中 window (窗口)的概念.
window:
中文翻译为窗格, Emacs 允许将一个 frame 划分为多个 window, 在不同的 window 中加载不同的 buffer 进行编辑操作. 出于历史原因, frame 与 window 与现在通用的术语含义有所区别.
point:
当前 window 中光标所在的位置.
echo area 与 minibuffer:
Echo area 位于 Emacs 的 frame 的最下方, 会回显命令效果. 也是显示组合键输入缓存的地方. 比如 当 point 位于某个 elisp 函数后, 可以用’C-x C-e’ 执行它, 并将结果显示在 echo area 区域.(如果使用 ‘C-j’ 来执行函数, 结果会显示在 buffer 中 point 所在的位置.) 有的命令需要交互式地输入信息, 此时 echo area 会载入一个 minibuffer 供你进行编辑.

结合自带教程和一些补充资料, 就能对基础的命令和操作有一个初步的了解, 下面是我的学习总结:

滚屏操作:
C-v 向前移动一屏.
M-v 向后移动一屏.
C-l 将 point 所在行居中; 再次输入会将 point 所在行置于屏幕顶端; 再次输入则移至底端.

基本的光标操作:
C-p point 移动到上一行, p 代表 previous.
C-n point 移动到下一行, n 代表 next.
C-b point 向左移动一个字符, b 代表 backward.
C-f point 向右移动一个字符, f 代表 forward.
M-b point 移动到前一个”词首部”, Emacs 是用空格区分词的, 因此在中文中, 效果是移动到上一句话的首部. 如果 point 位于词的中间, 则移动到当前词的首部.
M-f point 移动到下一个”词尾部”.

C-a point 移动到行首. a 代表 ahead.
C-e point 移动到行尾, e 代表 end.
M-a point 移动到段首.
M-e point 移动到段尾.

M-< point 移动到 buffer 首部.
M-> point 移动到 buffer 尾部.

容易发现, Meta 主要用来操作由语言定义的单位(词,句,段), 而 Ctrl 常用来操作与编辑相关的单位(字符,行).

例如, Meta 组合键可以用来控制文本的大小写:
M-u 当前词全部大写.
M-l 当前词全部小写.
M-c 当前词首字母大写, 其余小写.

常用的编辑操作:
普通的输入是所见即所得的, 不需要像 vim 那样切换到插入模式.

<RET> 回车键可以换行. 实际上默认的回车绑定了 elisp 函数 newline.

删除/剪切操作如下:
<del> 删去 point 所在位置的前一个字符.
C-d 删去 point 所在位置的字符, d 代表 delete.
M-<DEL> 剪切 point 所在位置的前一个词.
M-d 剪切 point 所在位置的后一个词.
C-k 剪切 point 所在位置到行尾的字符, 如果为空行则剪切行, k 代表 kill.
M-k 剪切 point 所在位置到行首的字符.
C-w 剪切当前选中的区域, 如没有选中区域, 剪切当前行.
C-<SPC> 配合光标移动操作来选中一段文本. 在中文环境下会与输入法的热键冲突.
C-@ 效果等同 C-<SPC>.

实际运用时需要灵活使用多对组合键完成功能: 例如, 剪切一行的操作也可以用 C-a C-k C-k.

删除与剪切操作略有区别. 删除的字符不会保存, 而剪切的文本会保存在剪贴板中, 可以使用 C-y 将剪贴板的内容插入到 buffer 中 point 所在位置, 这里 y 代表 yank, 中文教程中翻译为召回.
连续使用的剪切操作会将内容保存在同一个剪贴板中, 使用 C-y 便能一次性将其召回.
如果要插入更老的剪切内容, 可以使用 M-y. 多次使用 M-y 能够轮询所有可用的剪贴板.

撤销操作:
C-/ 撤销上一个命令带来的所有改变.
与之等效的还有 C-_, C-x u.

为操作调用的函数附加参数:
C-u 有些函数接受额外的参数. 使用键和弦 C-u 后可以输入一个数, 作为下一个命令调用的函数的参数传入. 数字参数的效果通常是重复执行函数的次数, 例如, C-u 20 C-f 的效果是 point 向前移动 20 个字符. 也有例外, 比如 C-vM-v 在接受数字参数后, 参数将指定滚屏的行数而非屏数.
C-[NUM] [NUM] 限制为 0~9 的数字. 效果类似 C-u.
M-[NUM]C-[NUM] 等效.
用以上命令便可以重复执行多次同一个函数了.

中止操作:
C-g 中止失去响应或者执行过久的命令. 也可以用于取消数字参数和输入了一半的命令.

与 frame, window, buffer 相关的命令:
这种命令多以键和弦 C-x 开头.
例如回到 buffer 首部除了 M-< 外也可以用 C-x [; 跳往 buffer 尾部除了 M-> 还可以用 C-x ].

可以在一个 frame 中打开多个 window.
C-x 2 将当前的 window 水平划分为 2 个 windows.
C-x 3 将当前的 window 竖直划分为 2 个 windows.
C-x 1 关闭其他 window (注意不等同于关闭其他 window 显示的 buffer), 让当前 window 占据整个 frame.
C-x 0 关闭当前window. 注意为数字 0 而不是字母 o.
C-x o 跳转 window 操作. 将 point 跳转到下一个 window 的光标所在位置. 注意是字母 o 不是数字 0.
C-M-v 滚动下一个 window 的屏幕. 同时打开两个屏幕时这条命令非常实用. 能够在不切换窗格的情况下翻动另外一个窗格的内容.

打开文件的操作为:
C-x C-f 打开文件. 打开一个文件并将其载入为一个 buffer, 如果没有则先创建一个新的 buffer. 载入后的 buffer 会占据当前的 window.
C-x C-v 打开另一个文件. 关闭当前的 buffer, 并打开另一个文件将其载入为 buffer. 注意, 如果由多个 window 同时显示这个 buffer, 那么它们会一起被关闭并都载入新的 buffer.

保存文件的操作为:
C-x C-s 将当前 window 的 buffer 保存到文件中. 如果对使用 C-x C-f 新建的 buffer 使用, 则此时将创建一个新文件.
C-x C-w 相当于另存为.

切换当前 window 中载入的 buffer:
C-x C-b 显示当前的 buffers 列表.
C-x b [BUFFER] 在当前的 window 打开某个 buffer.
C-x s 保存多个 buffers.
如果在有方向键的键盘上, C-x 加方向键可以在当前 window 中轮询切换所有打开的 buffers.

新建 frame:
M-x make-frame 新建一个 frame, 在图形界面下可以同时显示多个 frame, 在命令行界面下只能显示一个 frame.
M-x delete-frame 关闭当前所在的 frame.

撤销递归编辑:
当一次操作没有完成又进行了另外一次操作时, 将进入递归编辑状态(RECURSIVE EDITING LEVELS). 使用 ESC ESC ESC 可以退出递归编辑状态, 这条命令也可以用来关掉多余的 window 或者离开 minibuffer 区域.

其他命令:
Emacs 提供的函数数量非常庞大, 而组合键的数量十分有限, 因此更多的函数调用通过
M-x 函数名的方式来实现.

文本模式:
为了针对不同类型的文件和编辑操作使用不同的配置, Emacs 可以设置为不同的文本模式. 不同的文本模式下, Emacs 处理文本的方式会有所区别.
文本模式会显示在 echo area 上方的状态栏 mode line 中. 状态栏显示的信息可以通过配置进行修改, 一般在光标位置信息右侧显示的就是文本模式信息.
文本模式分两类: 主模式 (major mode) 和辅模式 (minor mode). 主模式提供基本的配置, 辅模式可以提供额外的一些小功能. Emacs 同时有且只能设置为一种主模式, 但是可以设置多个辅模式.
缺省模式称为 Funamental, 它是一种主模式.
处理自然语言(如写日记)可以切换到 text-mode 下: 使用命令 M-x text-mode 即可. 咋看之下与缺省模式毫无区别, 但细心一些会发现 M-f 和 M-b 等处理单位为词的命令将单引号(‘)视为词的一部分了.
使用命令 M-x auto-fill-mode 可以打开一个具有自动换行功能的辅模式, 自动换行的行宽通过 C-uC-x f 传入一个数字参数来设置, 默认设置一般为 70.
再次输入开启文本的模式命令能够关闭该模式.

搜索:
C-s 从 point 位置向下文搜索.
这种搜索会从起点开始搜寻目标, 并将 point 移动到目标位置. 搜索并不是在命令完成后开始的, 一旦开始输入目标字符串, Emacs 就会开始试图查找目标, 并将光标移动到符合结果的位置去, 如果使用 <DEL> 删除了目标字符串的一个字符, 光标会跳回上一个符合结果的目标处. 输入完成后, 再次按下 C-s 可以查找下一个符合的结果. 这种搜索方式称为增量搜索.
对应的命令还有:
C-r 从 point 位置向上文搜索.
默认的这两条指令不是基于正则表达式的, 在我目前的配置中, 它们被替换为了基于正则表达式搜索的版本.

文档与帮助:
这类命令多以 C-h 打头.
C-h m 查看当前文本模式的文档.
C-h k 查看组合键文档.
C-h f 查看函数文档.
C-h v 查看当前环境中某个变量绑定的值.
C-h t 自带教程.