r3f.cn
GitHub Repo stars

Emacs

Emacs 是可扩展、可定制、自文档化的实时显示文本编辑器。 此参考文档针对 Emacs 27 制作。

#入门

#启动 Emacs

要进入 Emacs,只需键入其名称:

$ emacs

- -
C-z 挂起 Emacs
C-x C-c 永久退出 Emacs

#全局说明

- -
C-<key> 表示按住 Control 键,然后按 <key>
M-<key> 表示按一次 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 S-表达式 (Sexp)
C-M-a C-M-e 函数
M-< M-> 缓冲区开始
(或结束)

#大小写转换

- -
M-u 单词转大写
M-l 单词转小写
M-c 单词首字母大写
C-x C-u 区域转大写
C-x C-l 区域转小写

#文件

- -
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 切换缓冲区的只读状态

#错误恢复

- -
C-g 中止部分输入或正在执行的命令
M-x recover-session 恢复因系统崩溃而丢失的文件
C-x u
C-_
C-/
撤销不需要的更改
M-x revert-buffer 将缓冲区恢复到其原始内容
C-l 重绘混乱的屏幕

#调换

- -
C-t 调换字符
M-t 调换单词
C-x C-t 调换行
C-M-t 调换 S-表达式

#滚动

- -
C-v 滚动到下一屏
M-v 滚动到上一屏
C-x < 向左滚动
C-x > 向右滚动
C-l 将当前行滚动到
屏幕中央、顶部、底部

#跳转

- -
M-g g 跳转到行
M-g c 跳转到字符
M-m 返回到缩进处

#标记

- -
C-@
C-SPC
在此处设置标记
C-x C-x 交换点和标记
M-@ 在 arg 个词后设置标记
M-h 标记段落
C-x C-p 标记页面
C-M-@ 标记 S-表达式
C-M-h 标记函数
C-x h 标记整个缓冲区

#剪切和删除

后退 前进 剪切单位
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-表达式

#剪切

- -
C-W 剪切区域 C-w
M-w 将区域复制到剪切环
M-z char 剪切到下一个 char 出现的位置
C-y 粘贴上次剪切的内容
M-y 用上上次剪切的内容替换上次粘贴的内容

#获取帮助

- -
C-x 1 移除帮助窗口
C-M-v 滚动帮助窗口
C-h a Apropos:显示匹配字符串的命令
C-h k 描述按键运行的函数
C-h f 描述一个函数
C-h m 获取模式特定信息

帮助系统很简单。键入 C-h (或 F1) 并按照指示操作。如果您是初次使用的用户,请键入 C-h t 以获取教程。

#多窗口

当显示两个命令时,第二个命令是针对框架而非窗口的类似命令。

- - -
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 . 在其他窗口中查找标签
C-x ^ 增高窗口
C-x { 缩窄窗口
C-x } 加宽窗口

#格式化

- -
TAB 缩进当前行 (模式相关)
C-M-\ 缩进区域 (模式相关)
C-M-q 缩进 S-表达式 (模式相关)
C-x TAB 将区域严格缩进 arg 列
M-; 为注释缩进
C-o 在光标后插入新行
C-M-o 将行的其余部分垂直向下移动
C-x C-o 删除光标周围的空行
M-^ 将行与上一行合并 (带参数则与下一行合并)
M-\ 删除光标周围的所有空白
M-SPC 在光标处精确放置一个空格
M-q 填充段落
C-x f 将填充列设置为 arg
C-x . 设置每行开头的固定前缀
M-o 设置字体

#Info

- -
C-h i 进入 Info 文档阅读器
C-h S 在 Info 中查找指定的函数或变量

#在节点内移动

- -
SPC 向前滚动
DEL 向后滚动
b 节点开始

#在节点间移动

- -
n 下一个节点
p 上一个节点
u 向上移动
m 按名称选择菜单项
n 按编号选择第 n 个菜单项 (1–9)
f 跟随交叉引用 (用 l 返回)
l 返回到你看到的最后一个节点
d 返回到目录节点
t 转到 Info 文件的顶部节点
g 按名称转到任何节点

#其他

- -
h 运行 Info 教程
i 在索引中查找主题
s 在节点中搜索正则表达式
q 退出 Info

#Minibuffer (微缓冲区)

以下按键在微缓冲区中定义。

- -
TAB 尽可能多地补全
SPC 补全一个词
RET 补全并执行
? 显示可能的补全
M-p 获取上一个微缓冲区输入
M-n 获取下一个微缓冲区输入或默认值
M-r 在历史记录中向后搜索正则表达式
M-s 在历史记录中向前搜索正则表达式
C-g 中止命令

键入 C-x ESC ESC 来编辑并重复上一个使用微缓冲区的命令。在文本终端上键入 F10 来激活菜单栏项目。

#标签

- -
M-. 查找标签 (定义)
C-u M-. 查找下一个出现的标签
M-x visit-tags-table 指定一个新的标签文件
M-x tags-search 在标签表中的所有文件上搜索正则表达式
M-x tags-query-replace 在所有文件上运行查询替换
M-, 继续上一次的标签搜索或查询替换

#矩形

- -
C-x r r 将矩形复制到寄存器
C-x r k 剪切矩形
C-x r y 粘贴矩形
C-x r o 打开矩形,将文本向右移动
C-x r c 清空矩形
C-x r t 为每行添加字符串前缀

#键盘宏

- -
C-x ( 开始定义键盘宏
C-x ) 结束键盘宏定义
C-x e 执行最后定义的键盘宏
C-u C-x ( 追加到上一个键盘宏
M-x name-last-kbd-macro 命名上一个键盘宏
M-x insert-kbd-macro 在缓冲区中插入 Lisp 定义

#缓冲区

- -
C-x b 选择另一个缓冲区
C-x C-b 列出所有缓冲区
C-x k 关闭一个缓冲区

#Emacs 搜索

#正则表达式 (常用)

- -
. (点) 除换行符外的任何单个字符
* 零次或多次重复
+ 一次或多次重复
? 零次或一次重复
\ 转义特殊字符
\c 转义正则表达式特殊字符 c
\| 或者 (“or”)
\(...\) 分组
\(:?...\) 非捕获分组
\(:NUM...\) 显式编号分组
\n 与第 n 个组相同的文本
\b 在单词边界
\B 不在单词边界

#正则表达式 (入口)

开始 结束 实体
^ $
\< \> 单词
\_< \_> 符号
\‘ \’ 缓冲区

#正则表达式 (冲突)

这些 其他 类别
[...] [^...] 显式集合
\w \W 单词语法字符
\sc \Sc 具有语法 c 的字符
\cc \Cc 具有类别 c 的字符

#增量搜索

- -
C-s 向前搜索
C-r 向后搜索
C-M-s 正则表达式搜索
C-M-r 反向正则表达式搜索
M-p 选择上一个搜索字符串
M-n 选择下一个搜索字符串
RET 退出增量搜索
DEL 撤销上一个字符的效果
C-g 中止当前搜索

再次使用 C-sC-r 在任一方向重复搜索。如果 Emacs 仍在搜索,C-g 仅取消未匹配的部分。

#查询替换

- -
M-% 交互式替换文本字符串
M-x regexp 使用正则表达式
SPC / y 替换当前匹配,并继续下一个
, 替换当前匹配,但不移动
DEL / n 跳过当前匹配,不替换
! 替换所有剩余的匹配
^ 返回到上一个匹配
RET 退出查询替换
C-r 进入递归编辑 (C-M-c 退出)

#其他

#Shell

- -
M-! 执行一个 shell 命令
M-& 异步执行一个 shell 命令
M- 在区域上运行一个 shell 命令
C-u M- 通过 shell 命令过滤区域
M-x shell 在窗口 shell 中启动一个 shell

#国际字符集

- -
C-x RET l 指定主要语言
M-x list-input-methods 显示所有输入法
C-\ 启用或禁用输入法
C-x RET c 为下一个命令设置编码系统
M-x list-coding-systems 显示所有编码系统
M-x prefer-coding-system 选择首选编码系统

#寄存器

- -
C-x r s 将区域保存到寄存器
C-x r i 将寄存器内容插入到缓冲区
C-x r SPC 将光标位置的值保存到寄存器
C-x r j 跳转到保存在寄存器中的光标位置

#杂项

- -
C-u num 数字参数
M-- 负数参数
C-q char 引用插入

#处理 Emacs Lisp 的命令

- -
C-x C-e 求值光标前的 S-表达式
C-M-x 求值当前 defun
M-x eval-region 求值区域
M-: 读取并求值微缓冲区
M-x load-library 从 load-path 加载 Lisp 库

#简单定制

- -
M-x customize 定制变量和外观

在 Emacs Lisp 中进行全局按键绑定:

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

#缩写 (Abbrevs)

- -
C-x a g 添加全局缩写
C-x a l 添加模式局部缩写
C-x a i g 为此缩写添加全局展开
C-x a i l 为此缩写添加模式局部展开
C-x a e 显式展开缩写
M-/ 动态展开上一个词

#拼写检查

- -
M-$ 检查当前单词的拼写
M-x ispell-region 检查区域中所有单词的拼写
M-x ispell-buffer 检查整个缓冲区的拼写
M-x flyspell-mode 切换实时拼写检查

#编写命令

#语法

(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 以获取更多详细信息。