Emacs 操作速查手册:jaywcjlove/reference 中的编辑器全量参考
【免费下载链接】reference为开发人员分享快速参考备忘清单(速查表)项目地址: https://gitcode.com/jaywcjlove/reference
Emacs 是一款可扩展、可定制、自记录(self-documenting)的实时显示文本编辑器,其强大的键位体系与 Lisp 扩展机制使其成为无数开发者的长期工作环境。本文基于 jaywcjlove/reference 仓库中的 docs/emacs.md 备忘清单展开,系统整理 Emacs 27+ 的核心操作、快捷键、搜索与替换、窗口管理、宏录制及 Emacs Lisp 定制方法,帮助读者快速建立完整可用的编辑器操作地图。
本清单的背景与适用范围
该清单收录于 jaywcjlove/reference 项目,是面向开发者的快速参考备忘清单(速查表)体系中的编辑器类条目,在 README.md 的工具分类下以 Emacs 之名索引。文中的键位约定与命令名称均以 Emacs 27 及以上版本为基准,适用于 GUI 与文本终端两种形态。
入门:启动、挂起与退出
启动 Emacs
要进入 Emacs,只需在终端输入其名称:
$ emacs启动后的基础生命周期操作:
| 快捷键 | 说明 | | :- | :- | |C-z| 挂起 Emacs | |C-xC-c| 永久退出 Emacs |
挂起(suspend)与退出不同:
C-z只是把 Emacs 暂时放到后台(终端模式下回到 Shell),进程与缓冲区状态均保留;C-x C-c则会结束 Emacs 进程,未保存的缓冲区会逐一询问是否保存。
按键记法约定
整份清单遵循统一的修饰键记法,理解它们是使用一切快捷键的前提:
| 记法 | 含义 | | :- | :- | |C-<key>| 按住 Control 键,然后按<key>| |M-<key>| 按一次Esc键,然后按<key>|
在多数终端配置中
M-也可以映射为 Alt 键;但按Esc再按<key>是文档约定的、与终端设置无关的可靠写法。
光标移动
移动是编辑的基础,下表以"返回 / 向前"成对列出不同粒度的移动实体:
| 返回 | 向前 | 要移动的实体 | | :- | :- | :- | |C-b|C-f| 字符 | |M-b|M-f| 单词 | |C-p|C-n| 行 | |C-a|C-e| 行开头(或结尾) | |M-a|M-e| 句子 | |M-{|M-}| 段落 | |C-x[|C-x]| 页 | |C-M-b|C-M-f| Sexp(符号表达式) | |C-M-a|C-M-e| 函数 | |M-<|M->| 缓冲区开始(或结束) |
滚动与跳转
当缓冲区内容超出屏幕时,滚动与定点跳转是高效导航的关键:
| 快捷键 | 说明 | | :- | :- | |C-v| 滚动到下一个屏幕 | |M-v| 滚动到上一个屏幕 | |C-x<| 向左滚动 | |C-x>| 向右滚动 | |C-l| 将当前行滚动到屏幕中央、顶部、底部(连续按循环切换) |
定点跳转:
| 快捷键 | 说明 | | :- | :- | |M-gg| 转到指定行 | |M-gc| 转到指定字符 | |M-m| 返回行首缩进处(back-to-indentation) |
文本编辑基础
大小写转换
| 快捷键 | 说明 | | :- | :- | |M-u| 大写单词 | |M-l| 小写单词 | |M-c| 单词首字母大写 | |C-xC-u| 大写区域(region) | |C-xC-l| 小写区域 |
转置(Transposing)
| 快捷键 | 说明 | | :- | :- | |C-t| 转置字符 | |M-t| 转置单词 | |C-xC-t| 转置行 | |C-M-t| 转置 Sexp |
杀死与删除
Emacs 中"删除"与"杀死(kill)"是两套语义:被杀死的内容会进入 kill ring(剪贴环),可随时拉回(yank);而DEL/C-d这类删除操作不进入 kill ring。下表按"向后 / 向前"列出:
| 向后 | 向前 | 要杀死的实体 | | :- | :- | :- | |DEL|C-d| 字符(删除) | |M-DEL|M-d| 单词 | |M-0C-k|C-k| 行(到结尾) | |C-xDEL|M-k| 句子 | |M--C-M-k|C-M-k| Sexp |
区域与 kill ring 操作:
| 快捷键 | 说明 | | :- | :- | |C-w| 杀死区域 | |M-w| 复制区域到 kill ring(不删除) | |M-zchar| 杀死直到下一次出现指定字符为止 | |C-y| 拉回(yank)最后一个被杀死的内容 | |M-y| 用更早的杀死记录替换刚拉回的内容(配合C-y循环浏览 kill ring) |
C-k默认只杀死从光标到行尾的内容(不含换行符);使用前缀参数M-0 C-k则会连同换行符一起杀死,这是逐行精确清理的常用技巧。
标记与区域
标记(mark)与点(point)共同界定区域(region),是批量操作的基础:
| 快捷键 | 说明 | | :- | :- | |C-@/C-SPC| 在此处设置标记 | |C-xC-x| 交换点和标记 | |M-@| 设置标记并移动 arg 个单词 | |M-h| 标记整个段落 | |C-xC-p| 标记整个页面 | |C-M-@| 标记 Sexp | |C-M-h| 标记整个函数 | |C-xh| 标记整个缓冲区 |
文件操作
| 快捷键 | 说明 | | :- | :- | |C-xC-f| 将文件读入 Emacs(find-file) | |C-xC-s| 将文件保存回磁盘 | |C-xs| 保存所有文件(逐个询问) | |C-xi| 将另一个文件的内容插入当前缓冲区 | |C-xC-v| 用新文件替换当前文件 | |C-xC-w| 将缓冲区内容写入指定文件(另存为) | |C-xC-q| 切换缓冲区的只读状态 |
错误恢复与安全网
编辑过程难免出错,Emacs 提供多层次的撤销与恢复手段:
| 快捷键 / 命令 | 说明 | | :- | :- | |C-g| 中止部分键入或正在执行的命令 | |M-xrecover-session| 恢复因系统崩溃而丢失的文件 | |C-xu/C-_/C-/| 撤销不需要的更改 | |M-xrevert-buffer| 将缓冲区恢复到磁盘上的原始内容 | |C-l| 重绘(redraw)杂乱的屏幕 |
C-g是 Emacs 的"万能取消键":在误输入、命令卡死或进入递归编辑时,连续按C-g都能安全退回到正常状态。若在C-s增量搜索中按C-g,则只取消尚未匹配的部分,保留已匹配的搜索。
获取帮助:自文档化系统
Emacs 的自我文档化特性使帮助触手可及。键入C-h(或F1)并跟随提示即可;首次使用者可键入C-h t进入内置教程(Emacs Tutorial):
| 快捷键 | 说明 | | :- | :- | |C-x1| 删除帮助窗口 | |C-M-v| 滚动帮助窗口 | |C-ha| Apropos:显示匹配字符串的所有命令 | |C-hk| 描述某个按键所运行的函数 | |C-hf| 描述某个函数 | |C-hm| 获取当前模式(major/minor mode)专属信息 |
多窗口与多框架
Emacs 的窗口(window)指同一框架(frame)内的窗格。下表同时给出窗口版本与框架版本(第二列为框架版本命令,作用于独立窗口框架):
删除与拆分:
| 框架命令 | 窗口命令 | 说明 | | :- | :- | :- | |C-x51|C-x1| 删除所有其他窗口 | |C-x52|C-x2| 上下拆分窗口 | |C-x50|C-x0| 删除当前窗口 | | |C-x3| 左右拆分窗口(并排) | | |C-M-v| 滚动其他窗口 |
窗口间切换与缓冲区展示:
| 框架命令 | 窗口命令 | 说明 | | :- | :- | :- | |C-x5o|C-xo| 将光标切换到另一个窗口 | |C-x5b|C-x4b| 在其他窗口中选中缓冲区 | |C-x5C-o|C-x4C-o| 在其他窗口中显示缓冲区(不切换焦点) | |C-x5f|C-x4f| 在其他窗口中查找文件 | |C-x5r|C-x4r| 在其他窗口中以只读方式查找文件 | |C-x5d|C-x4d| 在其他窗口中运行 Dired(文件管理器) | |C-x5.|C-x4.| 在其他窗口中查找标签(tag) |
窗口尺寸调整:
| 快捷键 | 说明 | | :- | :- | |C-x^| 增加窗口高度 | |C-x{| 缩小窗口宽度 | |C-x}| 增加窗口宽度 |
格式化
| 快捷键 | 说明 | | :- | :- | |TAB| 缩进当前行(行为取决于当前模式) | |C-M-\| 缩进区域(取决于模式) | |C-M-q| 缩进 Sexp(取决于模式) | |C-xTAB| 按 arg 列刚性缩进区域 | |M-;| 插入/对齐注释 | |C-o| 在光标后插入换行符(保持光标位置) | |C-M-o| 将当前行以下内容垂直下移 | |C-xC-o| 删除光标周围的空行(仅保留一行) | |M-^| 与上一行合并(带前缀参数则与下一行) | |M-\| 删除光标周围的所有空白 | |M-SPC| 在光标处只保留一个空格 | |M-q| 填充(fill)当前段落 | |C-xf| 将填充列(fill-column)设置为 arg | |C-x.| 设置每行开头的行前缀 | |M-o| 设置文本的面(face,即字体与颜色样式) |
格式化命令大量依赖当前主模式(major mode)的缩进规则:在 Lisp 类代码中
TAB遵循括号对齐规则,在 C/Java 等模式中则遵循各自的缩进风格,这是 Emacs"模式驱动"设计的直接体现。
信息阅读器(Info)
Emacs 自带 Info 超文本文档系统,可用于阅读 GNU 手册:
| 快捷键 | 说明 | | :- | :- | |C-hi| 进入 Info 文档阅读器 | |C-hS| 在 Info 中查找指定的函数或变量 |
节点内移动:
| 快捷键 | 说明 | | :- | :- | |SPC| 向前滚动 | |DEL| 反向滚动 | |b| 回到节点开头 |
节点之间移动:
| 快捷键 | 说明 | | :- | :- | |n| 下一个节点 | |p| 上一个节点 | |u| 上升到父节点 | |m| 按名称选择菜单项 | |1–9| 按编号选择第 n 个菜单项 | |f| 跟随交叉引用(用l返回) | |l| 返回上一个浏览过的节点 | |d| 返回目录节点 | |t| 转到 Info 文件的顶部节点 | |g| 按名称跳转到任意节点 |
其他 Info 操作:
| 快捷键 | 说明 | | :- | :- | |h| 运行 Info 教程 | |i| 在索引中查找主题 | |s| 在节点中按正则表达式搜索 | |q| 退出 Info |
小缓冲区(Minibuffer)
小缓冲区用于命令输入、文件选择与完成(completion)。以下是其中定义的键:
| 快捷键 | 说明 | | :- | :- | |TAB| 尽可能完整地补全 | |SPC| 最多补全一个单词 | |RET| 完成输入并执行 | |?| 显示所有可能的补全项 | |M-p| 取上一条 minibuffer 历史输入 | |M-n| 取下一条 minibuffer 输入或默认值 | |M-r| 按正则表达式向后搜索历史 | |M-s| 按正则表达式向前搜索历史 | |C-g| 中止命令 |
键入
C-xESCESC可以编辑并复用 minibuffer 中最后执行的命令;在文本终端上键入F10可激活菜单栏。
缓冲器(Buffer)管理
| 快捷键 | 说明 | | :- | :- | |C-xb| 选择另一个缓冲区 | |C-xC-b| 列出所有缓冲区 | |C-xk| 杀死(关闭)一个缓冲区 |
标签(Tags)
标签表用于在大型工程中定位符号定义:
| 快捷键 / 命令 | 说明 | | :- | :- | |M-.| 查找标签(跳到定义处) | |C-uM-.| 查找标签的下一次出现 | |M-xvisit-tags-table| 指定一个新的标签文件(TAGS) | |M-xtags-search| 在标签表覆盖的所有文件中做正则搜索 | |M-xtags-query-replace| 在所有文件中执行查询替换 | |M-,| 继续上一次标签搜索或查询替换 |
矩形操作
矩形(rectangle)操作面向列状文本区域,常用于代码块缩进、表格对齐与多列注释:
| 快捷键 | 说明 | | :- | :- | |C-xrr| 复制矩形到寄存器 | |C-xrk| 杀死(剪切)矩形 | |C-xry| 拉回(粘贴)矩形 | |C-xro| 打开矩形,将右侧文本右移 | |C-xrc| 用空白矩形覆盖区域 | |C-xrt| 用字符串为区域内每一行添加前缀 |
键盘宏
键盘宏可录制一串操作并反复回放,是批量机械操作的利器:
| 快捷键 / 命令 | 说明 | | :- | :- | |C-x(| 开始定义键盘宏 | |C-x)| 结束键盘宏定义 | |C-xe| 执行最后定义的键盘宏 | |C-uC-x(| 追加到最后一个键盘宏 | |M-xname-last-kbd-macro| 为最后一个键盘宏命名 | |M-xinsert-kbd-macro| 在缓冲区中插入宏的 Lisp 定义(便于保存复用) |
Emacs 搜索
正则表达式:常用构造
Emacs 正则表达式的分组与引用风格与 Perl 类正则有所不同,注意区分:
| 写法 | 说明 | | :- | :- | |.(dot) | 除换行符外的任意单个字符 | |*| 零次或多次重复 | |+| 一次或多次重复 | |?| 零次或一次重复 | |\| 引用特殊字符 | |\c| 引用正则表达式特殊字符 c | |\|| 替代("或") | |\(...\)| 分组 | |\(:?...\)| 非捕获分组(shy group) | |\(:NUM...\)| 显式编号分组 | |\n| 与第 n 组相同的文本 | |\b| 单词边界(处于断字位置) | |\B| 非单词边界(不处于断字位置) |
正则表达式:条目边界
| 开始 | 结束 | 实体 | | :- | :- | :- | |^|$| 行 | |\<|\>| 单词 | |\_<|\_>| 符号(symbol) | |\‘|\’| 缓冲区 |
正则表达式:字符集与分类
| 这些 | 其他 | 说明 | | :- | :- | :- | |[...]|[^...]| 显式字符集(/补集) | |\w|\W| 单词语法字符 | |\sc|\Sc| 具有语法(syntax)c 的字符 | |\cc|\Cc| 属于类别(category)c 的字符 |
增量搜索(Incremental Search)
增量搜索随键入即时定位:
| 快捷键 | 说明 | | :- | :- | |C-s| 向前搜索 | |C-r| 向后搜索 | |C-M-s| 正则表达式搜索 | |C-M-r| 反向正则表达式搜索 | |M-p| 选择上一条搜索字符串 | |M-n| 选择下一条搜索字符串 | |RET| 退出增量搜索(停留在当前匹配处) | |DEL| 撤销对最后一个字符的搜索效果 | |C-g| 中止当前搜索 |
再次使用C-s或C-r可在任一方向重复搜索;若 Emacs 仍在搜索过程中,C-g只取消尚未匹配的部分,已匹配的内容会保留。
查询替换(Query Replace)
| 快捷键 / 按键 | 说明 | | :- | :- | |M-%| 以交互方式替换文本字符串 | |M-xregexp(query-replace-regexp) | 使用正则表达式替换 | |SPC/y| 替换当前匹配,继续下一个 | |,| 替换当前匹配,但停留不动 | |DEL/n| 不替换,跳到下一个 | |!| 替换所有剩余匹配项 | |^| 回到上一处匹配 | |RET| 退出查询替换 | |C-r| 进入递归编辑(用C-M-c退出) |
杂项操作
Shell 集成
| 快捷键 / 命令 | 说明 | | :- | :- | |M-!| 执行一条 shell 命令 | |M-&| 异步执行 shell 命令 | |M-\|| 在区域上运行 shell 命令(区域作为输入) | |C-uM-\|| 通过 shell 命令过滤区域(以输出替换区域) | |M-xshell| 在窗口中启动一个交互式 shell |
国际字符集与编码
| 快捷键 / 命令 | 说明 | | :- | :- | |C-xRETl| 指定主要语言环境(locale) | |M-xlist-input-methods| 显示所有输入法 | |C-\| 启用或禁用输入法 | |C-xRETc| 为下一个命令设置编码系统 | |M-xlist-coding-systems| 显示所有编码系统 | |M-xprefer-coding-system| 选择首选的编码系统 |
寄存器(Registers)
寄存器可保存文本、位置等多种数据:
| 快捷键 | 说明 | | :- | :- | |C-xrs| 将区域保存到寄存器 | |C-xri| 将寄存器内容插入缓冲区 | |C-xrSPC| 将点的位置保存到寄存器 | |C-xrj| 跳转到寄存器中保存的位置 |
数值参数与其他
| 快捷键 | 说明 | | :- | :- | |C-unum| 数值参数(为命令提供重复次数或参数) | |M--| 否定参数 | |C-qchar| 引用插入(按字面插入特殊字符) |
处理 Emacs Lisp 的命令
Emacs 的可扩展性源于 Lisp 求值能力,常用求值入口:
| 快捷键 / 命令 | 说明 | | :- | :- | |C-xC-e| 求值光标前的 Sexp | |C-M-x| 求值当前定义(defun 等) | |M-xeval-region| 求值区域内的代码 | |M-:| 在 minibuffer 中读取并求值表达式 | |M-xload-library| 从加载路径加载 Lisp 库 |
简单定制
图形化定制
键入M-x customize进入 Customize 界面,可交互地定制变量(variables)与面(faces),Emacs 会把修改写入配置文件。
全局键绑定示例
在 Emacs Lisp 中做全局键绑定:
(global-set-key (kbd "C-c g") 'search-forward) (global-set-key (kbd "M-#") 'query-replace-regexp)
kbd宏将按键描述字符串解析为键向量,global-set-key将其绑定到指定命令符号。上述两行将C-c g绑定到向前搜索、M-#绑定到正则查询替换,放入配置文件(如~/.emacs或~/.emacs.d/init.el)后即可生效。
缩写(Abbrevs)
| 快捷键 | 说明 | | :- | :- | |C-xag| 添加全局缩写 | |C-xal| 添加模式局部缩写 | |C-xaig| 为当前缩写添加全局展开定义 | |C-xail| 为当前缩写添加模式局部展开定义 | |C-xae| 显式展开缩写 | |M-/| 动态展开前一个单词(按字典补全) |
拼写检查
| 快捷键 / 命令 | 说明 | | :- | :- | |M-$| 检查当前单词的拼写 | |M-xispell-region| 检查区域内所有单词的拼写 | |M-xispell-buffer| 检查整个缓冲区的拼写 | |M-xflyspell-mode| 切换即时拼写检查(输入即检查) |
编写自定义命令
命令语法
Emacs 命令本质上是带interactive声明的 Lisp 函数,其骨架如下:
(defun command-name (args) "documentation" (interactive "template") body)interactive的模板字符串声明了该函数如何从用户输入获取参数,是普通函数与"可交互命令"的分水岭。
完整示例
(defun this-line-to-top-of-window (line) "Reposition current line to top of window. With prefix argument LINE, put point on LINE." (interactive "P") (recenter (if (null line) 0 (prefix-numeric-value line))))该命令把当前行重定位到窗口顶部:无前缀参数时调用(recenter 0)将光标行移到窗口第一行;带前缀参数时则通过prefix-numeric-value将参数解析为数字,把点移动到指定行后重定位。保存此定义后,可用C-x C-e求值并用M-x this-line-to-top-of-window调用。
学习路径建议
综合本清单内容,可形成如下实战路径:先掌握"入门"部分的启动、退出与按键记法;随后用"移动、滚动、跳转"建立导航能力;以"杀死与删除、标记、文件操作"完成日常编辑闭环;再通过"搜索与替换"提升文本处理效率;最后结合"多窗口、宏、寄存器、Lisp 定制"进入高级工作流。遇到不熟悉的按键时,随时用C-h k、C-h f与C-h t向 Emacs 自身求助,这正是其自文档化设计的核心价值所在。
【免费下载链接】reference为开发人员分享快速参考备忘清单(速查表)项目地址: https://gitcode.com/jaywcjlove/reference
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考