Emacs 入门教程

Emacs 命令格式

Emacs 按键命令通常包含 CONTROL 键(有时候以CTRL标识)和 META 键(有时以ALT标识)。Emacs 中的命令以以下方式给出
c-<chr> 表示当输入字符<chr>时按住 CONTROL 键,因此C-f表示:按住 CONTROL 键再输入 f。

M-<chr> 表示当输入字符<chr>时按住META(或ALT)键。

退出Emacs:使用命令:C-x C-c(两个连续的组合键)。
退出一个正在运行的命令:C-g

光标移动

将光标移动到下一屏开头:C-v
将光标移动到上一屏结尾:M-v
将光标置于屏幕中央:C-L

  • 再按一次:将光标置于屏幕顶部
  • 再按一次:将光标置于屏幕底部
  • 再按一次:将置于屏幕中央(新一轮循环开始)

光标移动:上下左右移动分别是:C-p, C-n, C-b, C-f
光标移动(基于词):左右移动分别是:M-b, M-f
定位到行头:C-a
定位到行尾:C-e
定位到句头:M-a
定位到句尾:M-e
快速移动到文件的开头:M-<(META 小于号)
快速移动到文件的末尾:M->(META 大于号)

大部分的 Emacs 命令接受数字参数,对于多数命令而言,这些数字参数的作用是指定命令的重复次数,为一个命令指定数字参数主要通过以下两种方法:

  1. 先输入 C-u,然后输入数字作为参数,最后再输入命令
  2. 按住 META 键不放,然后输入数字,最后输入命令

快速将光标移动到屏幕顶部:C-u 0 C-l

将光标移动到上一个位置:C-u C-<space>

插入、删除与恢复

插入和命令一样也可以重复指定次数:
插入8个*C-u 8 *
删除光标后的一个字符:C-d
移除光标前的一个字符:M-d
移除从光标到“行尾”间的字符:C-k
移除从光标到“句尾”间的字符:M-k
选定文字与移除:

  • 先按下 C-<SPC><SPC>指空格)
  • 在按下控制光标的任何指令即可选定文字:例如C-p, C-n, C-b, C-f等
    Emacs 有 kill ring(剪切环),可以保存多段剪切内容,不是单一的剪贴板。
    移除选定的文字:C-w(剪切选中区域,保存在剪切环)
    从剪切环粘贴最近一次被 kill 的文本:C-y

移除整行
单独的C-k首先会把一行的内容移除,然后按下第二个C-k会移除换行符
如果使用C-u 2 C-k则会把两行以及它们的换行符移除

召回
重新插入被移除的文字这个动作叫做“召回(yanking)”。可以在删除文字的地方召回,也可以在别的地方召回:C-y

每一次被移除的文字都存储在剪切环中,使用命令M-y输入被移除的一部分按下Tab键,能自动补全相应的内容,按下回车键后自动插入光标处。

撤销
修改了一处文字觉得不满意可以使用以下命令撤销:C-/
通常C-/会消除一个命令所造成的所有改变;如果在一行中多次地使用C-/,你会把以前的命令也依次撤销。但是有两个例外:

  1. 没有改变文字的命令不算
  2. 从键盘输入的字符以组为单位处理——每组最多20个字符。
    C-x u == C-_ == C-/

文件

打开文件或新建文件: 按下C-x C-f后输入文件名

存储文件:C-x C-s

每次对文件进行变更之后再保存,Emacs会自动备份变更前的文件,命名规则为在原文件名之后添加一个~字符。

要关闭这个特性可以使用以下命令:(按下Tab键可以自动补全命令)
M-x customize-variable <Return> make-backup-files <Return>

执行完上述命令后会弹出一个新窗格,并自动将光标转移到新窗格,移动光标到Toggle处按下<Return>,再移动光标到<State>处选择数字1(Save for Future Sessions)

上述命令会自动将配置保存到 ~/.emacs中。

窗格

Emacs 的迷人之处很多,比如能够在屏幕上同时显示多个窗格就是其中之一。
Emacs 可以有多个“窗格”,每个窗格显示不同的文字。

在一个新窗格显示指定命令的文档:C-h k C-f(光标还是位于原来的窗格)
关闭文档窗格:C-x 1(只保留当前窗格)

将屏幕划分成两个窗格(垂直分割):C-x 2
将屏幕划分成两个窗格(垂直分割):C-x 3

滚动下方的窗格:

  • C-M-v 向下滚动一屏
  • C-M-S-v 向上滚动一屏

将光标移动到下方窗格:C-x o 该命令可以遍历所有窗格

关闭下方窗格,只保留当前窗格:C-x 1

使用以下命令在下面窗格打开一个文件并将光标留在新打开的文件中:
C-x 4 C-f

C-x 0 关闭当前窗格,这个命令会关闭当前选中的窗格,但不会关闭其中的缓冲区。
C-x 4 0 (Ctrl+X 然后按 4,再按 0),这个命令会关闭当前窗格并杀死其中的缓冲区。
C-x 1 最大化当前窗格(关闭其他所有窗格)

多窗口

Emacs 可以创建多个窗口。窗口由许多窗格以及菜单、滚动条、回显区等组成。在图形界面下,多个窗口可以同时显示出来。在文本终端中,只能同时显示一个。

使用以下命令新建一个新的窗口:
M-x make-frame <Return>

使用以下命令关闭光标所在的窗口:
M-x delete-frame <Return>

切换窗口命令:
C-x 5 o

缓冲区

Emacs 把每个编辑中的文件都放在一个称为“缓冲区”的地方,每打开一个文件,Emacs就会为其开辟一个缓冲区。使用以下命令列出当前所有的缓冲区:
C-x C-b 列出缓冲区
C-x 1 关闭缓冲区列表,只保留当前窗格

不管存在多少缓冲区,任何时候都只能有一个“当前”缓冲区,要想编辑其它缓冲区,就必须“切换”过去,主要有两种办法:
C-x C-f
C-x b 需要手动输入缓冲区名称,可以自动补全

有一些特殊的缓冲区,比如*Messages*存放的是在 Emacs 底部出现的消息,这类缓冲区不存储在磁盘中,关闭 Emacs 后就删除了。

C-x s 保存多个缓冲区,该命令会依次列出所有被修改的缓冲区,输入‘y’或’n’进行保存或跳过

C-x k 杀死当前缓冲区(需要确认)
M-x kill-this-buffer 直接杀死当前缓冲区,无需确认
M-x kill-some-buffers 这个命令会逐个询问你是否要关闭每个缓冲区。
M-x kill-other-buffers 关闭除当前缓冲区外的所有缓冲区
M-x kill-all-buffer 关闭所有文件缓冲区(保留特殊缓冲区)

使用 ibuffer 管理多个缓冲区
M-x ibuffer ibuffer 是管理多个缓冲区的强大工具:
在 ibuffer 模式中:

  • 标记要删除的缓冲区:m
  • 取消标记:u
  • 标记所有:t
  • 执行操作(如杀死):x

命令集扩展

Emacs 的命令集数量巨大,把它们都对应到 CONTROL 和 META 组合键上显然是不可能的。Emacs 用扩展(extend)命令来解决这个问题,扩展命令有两种风格:
C-x 字符扩展。C-x 之后输入另一个字符或者组合键
M-x 命令名扩展。M-x 之后输入一个命令名。

前面提到的很多命令都是扩展命令,比如C-x C-f用于寻找文件和用C-x C-s保存文件,退出 Emacs 用的 C-x C-c

C-x的扩展命令有很多:

  • C-x C-f 打开或新建文件
  • C-x C-s 保存文件
  • C-x C-b 列出缓冲区
  • C-x C-c 离开 Emacs
  • C-x 1 关掉其它所有窗格,只保留一个。
  • C-x u 撤销。

用命令名扩展的命令通常并不常用:比如 replace-string(字符串替换)这个命令,它会把字符串替换成另一个。在输入 M-x之后,Emacs 会在屏幕底部向你询问并等待你输入命令名。Emacs会自动补全命令,只需输入repl s<TAB>就行了
M-x replace-string<Return>changed<Return>altered<Return>
注:这个命令是向后搜索,若要全文搜索,需要光标置于文件开头。

和 replace-string 有一个类似的命令是 query-replace,两者用法一致,前者直接在整个缓冲区(或选区)中一次性替换所有匹配,后者逐个匹配地替换,每次替换前询问用户(通过输入y或n)。

也可以模糊匹配并替换(基于正则表达式):

  • replace-regexp
  • query-replace-regexp

自动保存

如果正在编辑的文件在保存前,电脑死机或其他原因导致Emacs异常退出,那么未保存的文件的丢失了。为了避免这种情况的发生,Emacs有自动保存机制,就是定期将正在编辑的文件写入一个”自动保存文件中“。自动保存的文件名的头尾各有一个”#“字符。这个文件会在正常存盘之后被Emacs 删除。

如果不幸的事情发生了,我们可以打开原来的文件(不是自动保存的文件)然后输入以下命令来恢复:
M-x recover file <Return> 提示确认的时候,输入 y 确认。

回显区(ECHO AREA)

回显区位于 Emacs 的底部,用来 显示临时信息、提示、和接收用户输入 的地方。
使用以下命令清空回显区中输入到一半的命令:
C-g C-g

状态栏(MODE LINE)

位于回显区正上方的一行称为”状态行“。状态栏上显示当前缓冲区和编辑状态的各种信息。

位置 含义
U 编码
-- 缓冲区状态:--表示未改动,**表示已修改
- 当前文件所在目录
hello-world.cpp 当前缓冲区或文件名
42% 光标在缓冲区的位置(百分比)
L100 当前所在行数
(C++//l Abbrev) 当前主模式(Major Mode)和 副模式(Minor Mode)

Emacs 中有数种主要模式,有的是用来编辑程序代码的比如Lisp模式;编辑各种自然语言文本的Text模式。在任何情况下只能应用一个主模式,其名称会显示在状态栏。

使用以下命令启用 Text 模式:
M-x text-mode <Return>

在 text-mode 模式下,M-f 和 M-b 把单引号(')视为词的一部分。
在 Fundamental 模式中,M-f 和 M-b 都单引号视为分隔单词的符号。

使用以下命令查看当前主模式的文档:C-h m

除了主模式外,还同时有一个“辅模式(minor mode)”,辅模式不能代替主模式,而是提供一些辅助的功能。每个辅模式都可以独立的开启和关闭,可以使用一个或同时使用多个辅助模式。

有一个叫做自动折行(Auto Fill)的辅助模式很有用,启用自动折行后,Emacs 会在你打字超过一行边界时自动替你换行(在边界处输入空格,可自动识别换行,这个规则主要争对)。使用以下命令启用自动折行:
M-x auto-fill-mode <Return>

针对于自动折行模式,用以下命令设置每行最大字符,多出会自动折行:
对于命令C-x f并传递参数 20,完整的命令格式:C-20 C-x f (此处设置为20,它的原始默认值是70)
运行完上述命令后需要使用M-q手动折行,光标必须位于需要折行的那一段里。

搜索

向前搜索:C-s 搜索光标右边之后的内容
向后搜索:C-r 搜索光标左边之前的内容
连续按下命令多次,可以便利匹配的结果。

在匹配处按下<Enter>,光标将停留匹配处,可以有两种方式回到开始搜索的位置:

  • C-u C-<space>
  • 不按下<Enter>,按下C-g C-g

递归编辑

有时可能会看到[(Fundamental)],而不是 (Fundamental)。【比如在用 M-%
进行交互式替换的时候你又用了 C-s 进行搜索,这时替换模式并没有结束,但
你又进入了搜索模式,这就是所谓的递归编辑。】

离开递归编辑可以用 ESC ESC ESC,这是一个通用的”离开“命令,你甚至可以使用它来关掉多余的窗格,或者离开小缓冲区。

获得更多帮助

Emacs 提供了一些命令来查看 Emacs 的命令文档,这些命令都以C-h 开头,这个字符也因此被称为”帮助“字符。

最基本的帮助功能是:C-h c,输出C-h c之后再输入一个组合键,Emacs会给出这个命令的简要说明,例如:
C-h c C-p

要获得更多信息,可以使用 C-h k C-p

C-h f 解释一个函数,需要输入函数名
C-h v用来显示 Emacs 变量的文档,Emacs 变量可以被用来”定制“ Emacs 的行为,同样我们需要输入变量的名称。例如:
C-h v fill-column <RET> 显示当前fill-column值

C-h a 相关命令搜索,输入一个关键词后 Emacs 会列出所有命令名中包含次关键词的命令。这些命令全部都可以用 M-x来启动。对于某些命令来说,相关命令搜索还会列出一两个组合键,例如:

C-h a file <Return>
Emacs 会在另一个窗格里显示一个M-x命令列表,这个列表包含了所有名称中包含"file"的命令。

C-h i 阅读手册,这个命令打开一个称为*info*的特殊缓冲区,在那里,可以阅读安装在系统里的软件包使用手册。要阅读 Emacs 的使用手册,按 m emacs <Return>就可以。按"?" Emacs 就会进入 Info 的使用指南,Emacs Info 是重要的参考文档。

主语列表

command               命令
cursor                光标
scrolling             滚动
numeric argument      数字参数
window                窗格 [1]
insert                插入
delete                删除 [2]
kill                  移除 [2]
yank                  召回 [2]
undo                  撤销
file                  文件
buffer                缓冲区
minibuffer            小缓冲
echo area             回显区
mode line             状态栏
search                搜索
incremental search    渐进式搜索 [3]

Emacs的优势

  1. 高度可定制、几乎无限扩展
    • Emacs 本质上不仅是编辑器,更是一个 Lisp 运行环境
    • 所有功能(包括菜单、快捷键、行为)都可以通过 Emacs Lisp 改写或扩展。
    • 你可以自己写脚本,也可以安装别人写好的包(MELPA、ELPA)。
    • 能变成 IDE、邮件客户端、RSS 阅读器、任务管理器、甚至浏览器。
  2. 统一的工作环境
    • 不同于 VS Code 或 Sublime 等需要频繁切换窗口,Emacs 追求 “在同一个缓冲区完成所有事”
      • 写代码
      • Git 管理(Magit)
      • 终端(Eshell / vterm)
      • 记笔记(Org mode)
      • 阅读 PDF / 文本
    • 减少上下文切换,工作流极其连贯。
  3. 强大的文本编辑能力
    • 多光标/矩形编辑(通过内置 rectangle 或包)
    • 宏录制与回放(重复性操作秒变自动化)
    • 无限撤销/重做(undo-tree)
    • 增量搜索/替换 + 正则表达式支持
    • 强大的代码折叠、语法高亮和跳转。
  4. Org Mode – 独一无二的神器
    • 大纲笔记、待办、时间安排、导出 PDF/HTML。
    • 文学化编程、学术写作、科研笔记、GTDer 的神器。
    • 一旦熟练 Org Mode,很多单独的工具(Notion/Trello/Obsidian)都可以替代。
  5. 跨平台 & 开源 & 免费
    • Windows、Linux、macOS 都能用。
    • 40+ 年社区沉淀,几乎所有语言和场景都有插件。
    • 生态稳固,不怕跑路;配置文件可迁移。
  6. 键盘驱动、极快的操作效率
    • 熟练掌握快捷键后,几乎可以 不碰鼠标
    • 对熟练用户,效率非常高;对手腕也友好(少鼠标、多键盘)。
  7. 长期可持续
    • Emacs 的配置可以跟你走一辈子。
    • 你可以逐步积累自己的 .emacs.d,形成专属“操作系统”。
    • 不依赖任何公司,不会因商业策略而被砍功能。
  8. 社区资源丰富
    • MELPA/ELPA/GNU ELPA 上有数千个包。
    • 世界各地有大量博客、视频教程、配置分享(doom-emacs、spacemacs)。

适合人群:

  • 喜欢自己折腾工具的人。
  • 希望用 一个统一环境管理工作流 的人。
  • 对文本/编程/笔记有高要求的重度用户。

一句话总结:
Emacs = “可编程的编辑器 + 个人操作系统”
只要你愿意花时间上手,几乎没有做不到的。