Emacs 编辑器

精选 Emacs 编辑器 常用指令与核心速查备忘单,涵盖高频用法、配置参数与实用技巧。

#入门指南

#启动 Emacs (Starting Emacs)

要启动 Emacs,直接输入其命令名:

$ emacs

- -
C-z Suspend Emacs
C-x C-c Exit Emacs permanently
快捷键 执行操作
C-z 挂起/最小化 Emacs
C-x C-c 永久退出 Emacs

#快捷键符号说明 (Global Description)

快捷键前缀 详细组合按法说明
C-<key> 表示按住 Ctrl 键,同时按下 <key> 按键
M-<key> 表示按一下 Esc 键(或按住 Alt),然后按下 <key> 按键

注意:本备忘单严格遵循上述符号约定。

#光标移动 (Motion)

向后移动 向前移动 移动的目标元素
C-b C-f 单个字符 (Character)
M-b M-f 单词 (Word)
C-p C-n 行 (Line)
C-a C-e 行首
(或行尾)
M-a M-e 句子 (Sentence)
M-{ M-} 段落 (Paragraph)
C-x [ C-x ] 页面 (Page)
C-M-b C-M-f S 表达式 (Sexp)
C-M-a C-M-e 函数 (Function)
M-< M-> 缓冲区开头
(或末尾)

#大小写转换 (Case Change)

快捷键 执行操作
M-u 将当前单词转换为大写
M-l 将当前单词转换为小写
M-c 将当前单词首字母大写
C-x C-u 将选区 (Region) 内容转换为大写
C-x C-l 将选区 (Region) 内容转换为小写

#📁 文件操作 (File Handling)

快捷键 执行操作
C-x C-f 打开/读取文件至 Emacs 缓冲区
C-x C-s 将当前文件保存写入磁盘
C-x s 保存所有打开的文件
C-x i 将另一个文件的内容插入当前缓冲区
C-x C-v 用新指定的文件替换当前文件
C-x C-w 将当前缓冲区另存为指定文件
C-x C-q 切换当前缓冲区的只读状态

#错误恢复与撤销 (Error Recovery)

快捷键 执行操作
C-g 中断/取消当前正在输入或执行的命令
M-x recover-session 恢复因系统崩溃而丢失的文件
C-x u
C-_
C-/
撤销上一次的修改操作
M-x revert-buffer 将缓冲区重置恢复至磁盘上的原始内容
C-l 重新绘制错乱的屏幕界面

#交换位置 (Transposing)

快捷键 执行操作
C-t 对调两个字符的位置
M-t 对调两个单词的位置
C-x C-t 对调两行的位置
C-M-t 对调两个 S 表达式的位置

页面滚动 (Scroll)

快捷键 执行操作
C-v 向下翻页(滚动至下一屏)
M-v 向上翻页(滚动至上一屏)
C-x < 向左水平滚动
C-x > 向右水平滚动
C-l 循环将当前行滚动置于
屏幕中央、顶部或底部

快速跳转 (Goto)

快捷键 执行操作
M-g g 跳转至指定行号
M-g c 跳转至指定字符位置
M-m 返回至当前行的首个非空白字符

#选择与标记 (Marking)

快捷键 执行操作
C-@
C-SPC
在当前光标处设置标记 (Mark)
C-x C-x 交换光标点 (Point) 与标记 (Mark) 的位置
M-@ 将标记设置在相隔指定单词数的位置
M-h 选中当前段落
C-x C-p 选中当前页面
C-M-@ 选中当前 S 表达式
C-M-h 选中当前函数
C-x h 全选整个缓冲区的内容

#剪切与删除 (Killing and Deleting)

向后删除 向前删除 删除的目标元素
DEL C-d 字符
(普通删除)
M-DEL M-d 单词
M-0 C-k C-k
(至行尾)
C-x DEL M-k 句子
M-- C-M-k C-M-k S 表达式

剪贴板操作 (Killing)

快捷键 执行操作
C-w 剪切选中区域至剪贴环 (Kill Ring)
M-w 复制选中区域至剪贴环
M-z char 删除从当前位置直至指定字符出现处
C-y 粘贴最后一次剪切/复制的内容
M-y 循环替换为剪贴环中的上一条历史记录

#获取帮助 (Getting Help)

快捷键 执行操作
C-x 1 关闭帮助窗口
C-M-v 滚动帮助窗口内容
C-h a 命令检索:显示与指定字符串匹配的所有命令
C-h k 描述按键所绑定的对应函数
C-h f 描述指定函数的详细文档
C-h m 获取当前模式 (Mode) 的专属帮助信息

帮助系统非常直观。按 C-h(或 F1)并按照提示操作即可。如果是首次使用,请按 C-h t 查看交互式新手教程。

#多窗口管理 (Multiple Windows)

当显示两个命令时,第二个命令代表对框架 (Frame/独立窗口) 进行操作,而非对窗口 (Window) 操作。

框架操作 窗口操作 执行功能描述
C-x 5 1 C-x 1 关闭所有其他窗口,仅保留当前窗口
C-x 5 2 C-x 2 上下拆分当前窗口
C-x 5 0 C-x 0 关闭当前窗口
C-x 3 左右拆分当前窗口
C-M-v 滚动另一个窗口的内容
C-x 5 o C-x o 将光标焦点切换至另一个窗口
C-x 5 b C-x 4 b 在另一个窗口中打开指定缓冲区
C-x 5 C-o C-x 4 C-o 在另一个窗口中显示指定缓冲区
C-x 5 f C-x 4 f 在另一个窗口中打开指定文件
C-x 5 r C-x 4 r 在另一个窗口中以只读方式打开文件
C-x 5 d C-x 4 d 在另一个窗口中运行 Dired 文件管理器
C-x 5 . C-x 4 . 在另一个窗口中查找 Tag 标签定义
C-x ^ 增加当前窗口的高度
C-x { 减少当前窗口的宽度
C-x } 增加当前窗口的宽度

#🎨 格式化排版 (Formatting)

快捷键 执行操作
TAB 缩进当前行(取决于当前主模式)
C-M-\ 缩进选中区域
C-M-q 缩进 S 表达式
C-x TAB 刚性缩进选区指定列数
M-; 缩进并插入注释
C-o 在光标后插入新行
C-M-o 将当前行剩余内容垂直下移
C-x C-o 删除光标周围的空白空行
M-^ 将当前行与上一行合并(带参数时与下一行合并)
M-\ 删除光标周围的所有空白字符
M-SPC 在光标处仅保留正好一个空格
M-q 填充/重排当前段落
C-x f 设置段落填充列限制宽度
C-x . 设置每行开头的固定前缀
M-o 设置字体/字面样式 (Face)

#Info 文档系统 (Info)

快捷键 执行操作
C-h i 进入 Info 官方在线文档阅读器
C-h S 在 Info 中查找指定的函数或变量说明

在节点内浏览 (Moving within a Node)

快捷键 执行操作
SPC 向下翻页阅读
DEL 向上翻页阅读
b 跳转至当前节点的开头

在不同节点间跳转 (Moving between Nodes)

快捷键 执行操作
n 跳转至下一个节点 (Next)
p 跳转至上一个节点 (Previous)
u 返回上一级父节点 (Up)
m 按名称选择菜单项目
n 按数字 (1-9) 选择第 n 个菜单项目
f 追踪交叉引用链接 (按 l 键可返回)
l 返回最后阅读过的上一个节点
d 返回目录节点 (Directory)
t 跳转至 Info 文件的顶层根节点
g 按名称跳转至任意指定节点

其他操作 (Other)

快捷键 执行操作
h 运行 Info 交互式入门教程
i 在索引集中查找主题
s 使用正则表达式搜索节点内容
q 退出 Info 阅读器

#迷你缓冲区交互 (Minibuffer)

在 Minibuffer 输入框中定义了以下快捷键。

快捷键 执行操作
TAB 尽可能补全更多文本
SPC 补全至多一个单词
RET 确认补全并执行命令
? 显示所有可能的补全候选列表
M-p 获取上一条输入的历史记录
M-n 获取下一条输入的历史记录或默认值
M-r 在历史记录中向上进行正则搜索
M-s 在历史记录中向下进行正则搜索
C-g 中断/取消当前命令

C-x ESC ESC 可以编辑并重复执行上一次使用 Minibuffer 的命令。在文本终端下,按 F10 可激活菜单栏项目。

#Tags 标签系统 (Tags)

快捷键 执行操作
M-. 查找 Tag 标签(定义跳转)
C-u M-. 查找该标签的下一个出现位置
M-x visit-tags-table 指定并载入新的 Tags 标签文件
M-x tags-search 在 Tags 表包含的所有文件中进行正则搜索
M-x tags-query-replace 在所有相关文件中执行交互式查询替换
M-, 继续上一次的 Tags 搜索或查询替换

#矩形选区操作 (Rectangles)

快捷键 执行操作
C-x r k 剪切矩形块区域 (Kill)
C-x r y 粘贴矩形块区域 (Yank)
C-x r o 插入矩形块空白,将原有文本向右推送
C-x r c 清空矩形块区域为空白字符
C-x r t 在矩形块的每一行前添加指定字符串前缀
C-x r r 将矩形块区域保存至寄存器

#键盘宏录制 (Keyboard Macros)

快捷键 执行操作
C-x ( 开始录制键盘宏 (Start macro)
C-x ) 结束键盘宏录制 (End macro)
C-x e 执行最后一次录制的键盘宏
C-u C-x ( 追加内容至上一个键盘宏
M-x name-last-kbd-macro 为最后录制的键盘宏命名
M-x insert-kbd-macro 将键盘宏的 Lisp 定义代码插入缓冲区

#缓冲区管理 (Buffers)

快捷键 执行操作
C-x b 切换/选择另一个缓冲区
C-x C-b 列出所有打开的缓冲区
C-x k 关闭/销毁一个缓冲区

#Emacs 搜索与正则

#正则表达式常用语法 (Regex)

正则字符 详细功能说明
. (点) 匹配除换行符外的任意单个字符
* 匹配前面的字符零次或多次
+ 匹配前面的字符一次或多次
? 匹配前面的字符零次或一次
\ 转义特殊字符
\c 转义正则表达式中的特殊字符 c
\| 逻辑“或”关系分支 (Alternative)
\(...\) 分组捕获 (Grouping)
\(:?...\) 非捕获分组 (Shy grouping)
\(:NUM...\) 显式编号分组
\n 反向引用第 n 个分组匹配的相同文本
\b 匹配单词边界
\B 匹配非单词边界

#正则表达式锚点 (Regex Entry)

开头锚点 结尾锚点 匹配的目标实体
^ $ 行 (Line)
\< \> 单词 (Word)
\_< \_> 符号 (Symbol)
\‘ \’ 缓冲区 (Buffer)

#正则字符类 (Regex Conflict)

包含类 排除类 匹配字符集
[...] [^...] 显式字符集合
\w \W 单词语法字符 (Word Syntax)
\sc \Sc 具有语法 c 的字符
\cc \Cc 具有分类 c 的字符
快捷键 执行操作
C-s 向前增量搜索 (Search Forward)
C-r 向后增量搜索 (Search Backward)
C-M-s 正则表达式增量搜索
C-M-r 反向正则表达式增量搜索
M-p 选择上一条搜索过的字符串
M-n 选择下一条搜索过的字符串
RET 退出渐进式搜索
DEL 撤销上一个字符的匹配效果
C-g 中断/取消当前搜索

重复按 C-sC-r 可在任一方向上继续查找下一个匹配项。如果 Emacs 仍处于搜索状态中,按 C-g 仅取消 未匹配的部分。

#查询替换 (Query Replace)

快捷键 执行操作
M-% 交互式查询替换文本字符串
M-x regexp 使用正则表达式进行查询替换
SPC / y 替换当前匹配项并跳转至下一个
, 替换当前匹配项,保持光标不动
DEL / n 跳过当前匹配项,不进行替换
! 替换剩余的所有匹配项
^ 回退至上一个匹配项位置
RET 退出查询替换
C-r 进入递归编辑模式 (按 C-M-c 退出)

#杂项与高级扩展 (Misc)

#Shell 交互

快捷键 执行操作
M-! 执行一条同步 Shell 命令
M-& 异步执行一条 Shell 命令
M-| 对选中区域 (Region) 运行 Shell 命令
C-u M-| 将选中区域作为输入通过 Shell 命令过滤
M-x shell 在窗口中启动终端 Shell

#国际化字符集支持 (International)

快捷键 执行操作
C-x RET l 指定主要语言环境
M-x list-input-methods 显示所有可用的输入法列表
C-\ 开启或禁用输入法
C-x RET c 为下一条命令设置编码系统
M-x list-coding-systems 显示所有编码系统列表
M-x prefer-coding-system 选择首选的编码系统

#寄存器 (Registers)

快捷键 执行操作
C-x r s 将选区内容保存至寄存器
C-x r i 将寄存器中的内容插入缓冲区
C-x r SPC 将当前光标位置保存至寄存器
C-x r j 跳转至寄存器中保存的光标位置

#其他杂项命令 (Miscellaneous)

快捷键 执行操作
C-u num 数值前缀参数 (Numeric Argument)
M-- 负数前缀参数 (Negative Argument)
C-q char 原样引用插入字符

#🛠️ 常用命令:Emacs Lisp 脚本求值

快捷键 执行操作
C-x C-e 对光标前的 S 表达式求值 (Eval)
C-M-x 对当前 defun 函数求值
M-x eval-region 对选中区域的代码求值
M-: 从 Minibuffer 读取并求值 Lisp 表达式
M-x load-library 从 load-path 中加载 Lisp 扩展库

#简单自定义设置 (Simple Customization)

快捷键 执行操作
M-x customize 图形化自定义变量与字体 Face

在 Emacs Lisp 中配置全局快捷键绑定示例:

(global-set-key (kbd "C-c g") ’search-forward)
(global-set-key (kbd "M-#") ’query-replace-regexp)

#缩写扩展 (Abbrevs)

快捷键 执行操作
C-x a g 添加全局缩写 (Global Abbrev)
C-x a l 添加当前模式局部的缩写
C-x a i g 为当前单词添加全局展开定义
C-x a i l 为当前单词添加模式局部展开定义
C-x a e 显式展开当前缩写
M-/ 动态补全/展开前一个单词

#拼写检查 (Spelling Check)

快捷键 执行操作
M-$ 检查当前单词的拼写
M-x ispell-region 检查选中区域内所有单词的拼写
M-x ispell-buffer 检查整个缓冲区的拼写
M-x flyspell-mode 开启/关闭即时实时拼写检查

#编写自定义命令 (Writing Commands)

语法格式

(defun command-name (args)
"documentation" (interactive "template")
body)

函数定义示例

(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))))

interactive 规范说明了如何交互式读取参数。输入 C-h f interactive RET 可了解更多细节。