Emacs 初见
前言
一直想学习 Emacs,但是苦于无法入门。有看过一步步配置出自己的 Emacs 的教程,包括博客教程和视频教程,但学着很不得劲。最后的水平也就记住了退出和保存的快捷键 C-x C-c
和 C-x C-s
。
这次打算主要看 Arch Wiki 上的 Emacs 百科进行学习,辅以 Emacs 官方文档。
Emacs 内置教程
我不喜欢 Emacs 的图形化界面,感觉像十年前的前端样式,“不是我喜欢的 Emacs ,直接拒绝”。在终端中输入 emacs -nw
,emacs 就在终端中启动了。
先过一遍 Emacs 内置的快速指南,快捷键是 C-h t
。如果像我一样不习惯阅读英文,用命令 M-x help-with-tutorial-spec-language
,选择一份中文文档进行学习。这里的 M
是 Meta 键,通常是键盘上的 Alt
。

回显区:屏幕最下面一行,用于显示输入的命令。
状态栏:回显区正上方的一行,显示 Emacs 的状态和你正在编辑的文字的一些信息。
光标移动
我的习惯是,Emacs 的上下左右移动快捷键要学,因为之前 Vim 的中英文切换让我十分狼狈,以至于养成了“每次输入完中文都会主动切换回英文”的习惯。
简而言之就是利用 Vim 的模式,插入模式用 Emacs 进行光标移动,普通模式下则用 Vim 移动。
微操:
- 上移:
C-p
,下移:C-n
。p 记作 previous ,n 记作 next - 左移:
C-b
,右移:C-f
。b 记作 back,f 记作 forward
个人觉得用找个单词记忆快捷键会简单些。接下来的前移后移和居中,适合浏览代码。
- 前移一屏:
C-v
,后移一屏:M-v
- 光标所在行居中:
C-l
。多按几次,就是“中-上-下”循环
Meta 系列组合键用来操作“由语言定义的单位(比如词、句子、段落)”,而 Ctrl 系列组合键用来操作“与语言无关的基本单位(比如字符、行等等)”。比如:
C-a
和C-e
可以将光标移动到“一行”的头部和尾部M-a
和M-e
则是将光标移动到“一句”的头部和尾部M-b
:向左移动一个词,M-f
:向右移动一个词
取消命令
命令输入一半,输错了或者不想用了,可以用 C-g
中断。特别的,ESC
+ C-g
会显示组合键未定义,建议多按两次 ESC
取消。
删除移除
- 删除光标前一字符 :
<DEL>
,删除光标后一字符:C-d
- 移除光标前一单词 :
M-<DEL>
,移除光标后一词:M-d
- 移除从光标到“行尾”间的字符 :
C-k
,移除从光标到“句尾”间的字符 :M-k
删除是 delete,移除是 kill。区别在于:被 kill 的文本被 Emacs 记录下来,后续可以重新插入被移除的文本,类似平时用的剪贴功能,Emacs 称之为 yank。
只消除一个字符或者只消除空白的命令,无法用 yank (C-y
) 插入被移除的字符或空白,比如 <DEL>
和 C-d
。但这也不是绝对的,这两条命令有前缀参数时,就变成了”移除“命令。
C-y 可以召回最近一次移除的内容;M-y
可以召回再前一次被移除的内容,再按一次 M-y
又可以召回再上一次的内容……连续使用 M-y
会回到起始点。
撤销
C-/
和 C--
都是撤销一条命令,不包括没有改变文字的命令,比如光标移动和滚动。
撤销(undo)可以恢复删除和移除的文本;移除文本+召回(yank)效果等同“剪贴”。
文件
- 打开文件:
C-x C-f
,f 记作 file - 保存文件:
C-x C-s
,s 记作 save
打开一个不存在的文件,等同于创建一个新文件。
保存文件时,Emacs 会为文件备份。关闭备份的方法:M-x customize-variable <Return> make-backup-files <Return>
。
缓冲区
- 列出缓冲区:
C-x C-b
,b 记作 buffer - 切换缓冲区:
C-x b
- 保存所有缓冲区:
C-x s
每个已打开的文件都是一个缓冲区。因此切换缓冲区,等同于打开一个已经打开的文件。
C-x C-s 一次只能给一个文件(缓冲区)保存,如果有多个文件(缓冲区)需要保存,可以用 C-x s
。
快捷键拓展
Emacs 的命令就像天上的星星,数也数不清。把它们都对应到 Ctrl 和 Meta 组合键上显然是不可能的。Emacs 用扩展命令来解决这个问题,扩展命令有两种风格:
- 字符扩展:
C-x
。 C-x 之后输入另一个字符或者组合键 - 命令名扩展:
M-x
。 M-x 之后输入一个命令名
挂起 Emacs
如果需要临时从 Emacs 回到终端,可以不用保存和退出,选择挂起 Emacs:
- 挂起 Emacs:
C-z
- 返回 Emacs:
fg
或%emacs
自动保存
Emacs 会定期将正在编辑的文件写入一个“自动保存”文件中。自动保存文件的文件名的头尾各有一个“#”字符,比如正在编辑的文件叫“hello.c”,那么它的自动保存文件就叫“#hello.c#”。这个文件会在正常存盘之后被 Emacs 删除。
打开原来的文件(注意不是自动保存文件)然后输入 M-x recover file
来恢复自动保存文件。
搜索
- 向前搜索:
C-s
- 向后搜索:
C-r
以向前搜索为例,C-s 后接想找的字符串,匹配到结果后,继续按 C-s ,光标会跳转到下一个匹配的字符串。此时,按 <return>
,光标停留在匹配字符串;按 C-g
,光标返回初始位置。
多窗格
- 只保留光标所在的窗格:
C-x 1
- 向下分割出窗格:
C-x 2
- 向右分割出窗格:
C-x 3
- 切换窗格:
C-x o
,o 记作 other
不管是向下分,还是向右分,光标还是位于原来的窗格。切换窗格时,多按几次 C-x o,就能循环遍历所有窗格。
光标可以不切换到新窗格,就能在新窗格中滚动页面。当前窗格滚动快捷键是 C-v
和 M-v
,新窗格是 C-M-v
和 C-M-S-v
。这两个快捷键很重要,平时翻阅帮助文档时候,就是创建一个新窗格,在新窗格内查看文档。
与窗口的区别:终端中的 Emacs 只有一个窗口,即当前的终端窗口;GUI 界面的 Emacs 可以创建多个窗口。每个窗口有单独的菜单栏、滚动条,就像平时的应用多开。
⚠️需要注意的是,Emacs 的原文文档中 windows 指代的是本文的窗格,frame 指代的是本文的窗口。注意区分。
递归编辑
递归编辑状态由位于状态栏的方括号所指示,其中包含了用小括号来指明的模式名称。比如说,你有时可能会看到 [(Fundamental)]
,而不是 (Fundamental)
。
不能用 C-g
退出递归编辑,而应该用 ESC ESC ESC
。这条命令还可以关闭多余的窗格。
帮助文档
C-h c
:查看快捷键。在状态栏显示命令的简要说明C-h k
:查看快捷键。在下方窗格中显示命令的完整文档C-h x
:解释一个命令。需要输入命令名C-h v
:查看 Emacs 变量C-h a
:相关命令搜索C-h i
:阅读手册(info),主要参考文档C-h ?
:info 的使用指南
C-h c
和 C-h k
根据快捷键确定;C-h x
根据命令名确定。
相关命令搜索是指 Emacs 根据输入的关键词,罗列出所有包含关键词的命令。
软件仓库
M-x list-packages
可浏览所有可安装的软件包。这个命令显示的界面中可以安装和卸载软件包,以及查看软件包的简介。
尾声
把 Emacs 内置的快速指南过了一遍,GNU Emacs 官网上的文档没来得及看。接下来我要去看看 Emacs 的一款主题 Spacemacs。