Emacs 基本命令
Emacs 中的操作都对应一个命令,大多命令都绑定了一个或多个快捷键。
首先,看看图形界面下 Emacs 的操作过程:
-
图形界面操作的过程
用户点击按钮或菜单,编辑器弹出对话框,用户点击鼠标选中焦点,用户输入信息,然后点鼠标后用键盘输入下一个信息,编辑器执行相应的操作。
-
Emacs 操作过程:
用户点击快捷键,用户输入信息,手不离开键盘,继续输入下一个信息,编辑器执行相应操作。
这两个过程的差异是,Emacs 交互过程是确定的,可以手不离键盘进行操作;而图形界面却需要有更复杂的交互过程。
认知心理学告诉我们,人的思维模式存在一种筛状结构,从日常状态聚焦到筛孔中形成聚焦。而程序设计这样的思考过程正是需要思维聚焦,需要从常规思考平面进入专注的筛孔,从而进入心流状态;而图形的切换交互,会产生思维抖动,提高思维聚焦的难度,更难以进入心流状态,这就是纯键盘操作的优势,也是终端文本编辑器的优势。
在 Emacs Lisp 中会了解 Emacs 命令是一个带 interactive 的 Emacs Lisp 函数,可以绑定一个快捷键,都可以用 M-x command-name 执行,下面我们来讲 M-x 是什么。
键盘约定
- Ctrl 键:简写为大写字母 C
- Meta 键:简写为大写字母 M
- Shift 键:简写为大写字母 S
Meta 键在现代键盘上已不常见,取而代之的是 Alt。
Meta 还有一种等效输入方式,即先按 ESC 释放后再按下其他键,效果和按住 Alt 不放再按下其他键等效。
- TAB
- RET:RETURN ENTER
- DEL:BACKSPACE 在组合键时与 DEL 是一致的
设计初衷
Emacs 命令有很多,最好的记忆方式是亲手使用:当你有时间时,在不同的场景下反复使用命令。
- C-n:C 或 M 或 S 后带有 - 时,是常用的命令绑定,操作方式是按住 CTRL 后,再按下 n ,然后释放两个键;
- ESC n:空格键表示释放后再按键,这里是按下 ESC,释放后,再按 n 键;
- C-x n:常用命令设计为 C-x 后接一个字符,在键盘上 C-z 是挂起程序,所以 C-x 是最近的一个键
- C-c n:用户命令设计为 C-c 后接一个字符,在键盘上 C-x 是被占用了,所以 C-c 是最近的一个键
特殊的键盘由于产生特殊的字符代码,此特性可定义一个键盘映射图实现对组合的快捷键实现二层定制。定制前提是:键盘特殊键所产生的字符代码是以一个特殊字符开头,并且至少有3个字符长时,才能在 Emacs 里对它们进行定义。利用这个特性可实现按下一个键执行一个命令(类似 Vim),类似游戏机的金手指。
Emacs 基本操作
初学者逃生命令
对于初学者,遇到光标不知所踪,或卡在 mini buffer 不知道怎么处理时,请使用下列命令回到编辑区。
| 操作 | 命令名称 | 快捷键 | 备注 |
|---|---|---|---|
| 取消命令 | keyboard-quit | C-g | 非常有用 |
| 撤销 | undo | C-x u 或 C-/ 或 C-_ | 根据习惯使用其中一种即可 |
文件和缓冲区 File and Buffer
| 操作 | 命令名称 | 快捷键 | 备注 |
|---|---|---|---|
| 访问文件 | find-file | C-x C-f | 或者说读取文件内容到缓冲区,并展示出来。 |
| 关闭缓冲区 | kill-buffer | C-x k | |
| 保存缓冲区 | save-buffer | C-x C-s | 当缓冲区有变化时,保存缓冲区到文件中。 |
| 批量保存 | save-some-buffers | C-x s | |
| 另存为文件 | write-file | C-x C-w | |
| 保存后退出 | save-buffers-kill-emacs | C-x C-c | |
| 恢复缓冲区 | revert-buffer | ||
| 恢复文件 | recovery-file | ||
| 正则关闭缓冲 | kill-matching-buffers | ||
| 批量关闭缓冲 | kill-some-buffers | ||
| 打开缓冲列表 | list-buffers | C-x C-b | |
| 切换缓冲 | switch-to-buffer | C-x b | |
| 缓冲重命名 | rename-buffer | ||
| 唯一命名缓冲区 | rename-uniquely | ||
| 只读模式 | read-only-mode | C-x C-q | 把当前的缓冲切换成只读模式 |
框架 Frame (Windows 的窗口)
| 操作 | 命令名称 | 快捷键 | 备注 |
|---|---|---|---|
| 最小化框架 | iconify-or-deiconify-frame | C-z | |
| 打开新框架 | make-frame-command | C-x 5 2 | 即另一个 Windows 窗口 |
| 关掉其他框架 | delete-other-frames | C-x 5 1 | |
| 关掉本框架 | delete-frame | C-x 5 0 | |
| 切换框架 | switch-to-buffer-other-frame | C-x 5 b | |
| 新框架 | other-frame | C-x 5 o | |
| 新框架访问文件 | find-file-other-frame | C-x 5 f | |
| 新框架只读文件 | find-file-read-only-other-frame | C-x 5 r |
窗口 Window (Windows 窗口内的操作)
| 操作 | 命令名称 | 快捷键 | 备注 |
|---|---|---|---|
| 纵向分割出窗口 | split-window-below | C-x 2 | |
| 横向分割出窗口 | split-window-right | C-x 3 | |
| 跳到新窗口 | other-window | C-x o | |
| 增加窗口高度 | enlarge-window | C-x ^ | |
| 减小窗口高度 | shrink-window | ||
| 增加窗口宽度 | enlarge-window-horizontally | C-x } | |
| 减小窗口宽度 | shrink-window-horizontally | C-x { | |
| 平衡窗口 | balance-windows | C-x + | |
| 小窗口高度 | shrink-window-if-larger-than-buffer | C-x - | 如果窗口高度比缓冲行数更多, 则缩小窗口. |
| 在另一个窗口打开文件 | find-file-other-window | C-x 4 C-f C-x 4 f | 相当于 C-x C-f, 不过使用另一个窗口或新建一个窗口. |
| 在另一个窗口只读打开缓冲 | find-file-read-only-other-window | C-x 4 r | 在另一个窗口以只读的模式打开文件. 可以使用 C-x C-q 来取消只读. |
| 在另一个窗口打开缓冲 | swith-to-buffer-other-window | C-x 4 b | 相当于 C-x b, 不过使用另一个窗口或新建一个窗口. |
移动 Motion
这些操作在 Linux 和 macOS 终端中通用
| 操作 | 命令名称 | 快捷键 | 备注 |
|---|---|---|---|
| 左移一个字符 | backward-char | C-b 或 ← | |
| 左移一个字符 | forward-char | C-f 或 → | |
| 下移一行 | next-line | C-n 或 ↓ | |
| 上移一行 | previous-line | C-p 或 ↑ | |
| 前移一个词 | backward-word | M-b | |
| 后移一个词 | forward-word | M-f | |
| 前移一段 | M-{ | 需要按 Shift | |
| 后移一段 | M-} | 需要按 Shift | |
| 上滚一屏 | scroll-up | C-v 或 PgUp | |
| 下滚一屏 | scroll-down | M-v 或 PgDn | |
| 滚到上一页 | C-x [ | 分页符以 ^L 分隔 | |
| 滚到下一页 | C-x ] | 分页符以 ^L 分隔 | |
| 移到行首 | beginning-of-line | C-a | |
| 移到行尾 | end-of-line | C-e | |
| 移到句首 | backward-sentence | M-a | |
| 移到句尾 | forward-sentence | M-e | |
| 移到首字符 | beginning-of-buffer | M-< | 需要按 Shift |
| 移到尾字符 | end-of-buffer | M-> | 需要按 Shift |
| 移到屏幕中间 | recenter | C-l | 按三次分别是中上下 |
| 跳到指定行 | goto-line | M-x goto-line RET (n) | |
| 改写模式 | M-x overwrite-mode RETURN |
增量查找 Incremental Search
| 操作 | 命令名称 | 快捷键 | 备注 |
|---|---|---|---|
| 后向查找 | isearch-backward | C-r | |
| 前向查找 | isearch-forward | C-s | |
| 查找替换 | query-replace | M-% | |
| 正则替换 | query-replace-regexp | C-M-% |
选择 Selecting
| 操作 | 命令名称 | 快捷键 | 备注 |
|---|---|---|---|
| 标记 | set-mark-command | C-@ 或 C-Space | 即鼠标点选拖动前的定位 |
| 转换光标和标记 | exchange-point-and-mark | C-x C-x | |
| 选择段 | mark-paragraph | M-h | |
| 选择页面 | mark-page | C-x C-p | 分页符以 ^L 分隔 |
| 全选 | mark-whole-buffer | C-x h |
移除和删除 Killing and Deleting
移除进入移除环(剪贴板),删除不进入移除环。
| 操作 | 命令名称 | 快捷键 | 备注 |
|---|---|---|---|
| 删除一个字符 | delete-char | C-d 或 Del | 不进入 kill-ring |
| 向前删除一个字符 | delete-backward-char | Backspace | |
| 移除一个词 | kill-word | M-d | 向后删除到词的边界 |
| 向前移除一个词 | backward-kill-word | M-DEL | |
| 移除一行 | kill-line | C-k | 按两次删除一行,第一次删除文本,第二次删除换行符 |
| 移除句 | kill-sentence | M-k | |
| 移除区域 | kill-region | C-w | 删除标记和当前光标 |
| 移除段 | kill-paragraph | ||
| 反向移除段 | backward-kill-paragraph | ||
| 复制 | kill-ring-save | M-w 或 C-Ins | 和剪切类似,但不删除 |
| 粘帖(召回) | yank | C-y 或 C-Ins | 可理解为粘帖,但其实是从 kill-ring 中召回 |
| 粘帖(召回前一个) | yank-pop | M-y | 需上一个命令是 C-y,从 kiil-ring 轮询下一个文本召回 |
| 插入一行 | electric-newline-and-maybe-indent | C-j | 根据 mode 确定是否换行 |
| 剪切到粘贴板 | clipboard-kill-region | ||
| 复制到粘贴板 | clipboard-kill-ring-save | ||
| 召回粘贴板 | clipboard-yank | ||
| 交换前字符 | transpose-chars | C-t | |
| 交换前词 | transpose-words | M-t | |
| 交换前行 | transpose-lines | C-x C-t |
可以设置移除环的深度:M-x set-variable RETURN kill-ring-max RETURN new-value RETURN
重复命令
| 操作 | 命令名称 | 快捷键 | 备注 |
|---|---|---|---|
| 重复 n 次命令 | M-n COMMAND | n 为要重复的次数, COMMAND 是命令. | |
| 重复命令 | universal-argument | C-u (n) COMMAND | 带 n 同 M-n 相同,不带 n 则执行 4 次, 多次输入 C-u 是 4 的倍数次。 |
转化
| 操作 | 命令名称 | 快捷键 | 备注 |
|---|---|---|---|
| 单词首字符转大写 | capitalize-word | M-c | |
| 整个单词转为大写 | upcase-word | M-u | |
| 整个单词转为小写 | downcase-word | M-l | |
| 选定区域全部改为小写 | downcase-region | C-x C-l | |
| 选定区域全部改为大写 | upcase-region | C-x C-u |
书签 Bookmark
书签文件位置 ~/.emacs.bmk
| 操作 | 命令名称 | 快捷键 | 备注 |
|---|---|---|---|
| 建立书签 | bookmark-set | C-x r m | |
| 移动到书签 | bookmark-jump | C-x r b | |
| 书签重命名 | bookmark-rename | ||
| 删除书签 | bookmark-remove | ||
| 书签目录 | bookmark-bmenu-list | C-x r l | 打开书签目录 |
SHELL
| 操作 | 命令名称 | 快捷键 | 备注 |
|---|---|---|---|
| 打开Shell | M-x | ||
| 执行命令 | M-! shell-command | ||
| 交互Shell | M-x shell | 常见命令,需要先输入 C-c 转义 |
帮助 Help
| 操作 | 命令名称 | 快捷键 | 备注 |
|---|---|---|---|
| 查看命令 | describe-key-briefly | C-h c | |
| 查看按键 | describe-key | C-h k | |
| 最近100字符 | view-lossage | C-h l | |
| 按键绑定 | where-is | C-h w | |
| 查看函数 | describe-function | C-h f | |
| 查看变量 | describe-variable | C-h v | |
| 查看模式 | describe-mode | C-h m | |
| 缓冲区绑定 | describe-bindings | C-h b | |
| 查看语法表 | describe-syntax | C-h s | |
| 查看指南 | help-with-tutorial | C-h t | |
| 启动程序 | info | C-h i | |
| 帮助列表 | C-h ? | ||
| 查看快捷键 | C-h C-h |
简写模式 Abbrev Mode
| 操作 | 命令名称 | 快捷键 | 备注 |
|---|---|---|---|
| 进入或退出简写 模式 | abbrev-mode | ||
| 词后输入全局简写词 | inverse-add-glabal-abbrev | C-x a - 或 C-x a i g | |
| 词后输入局部简写词 | inverse-add-mode-abbrev | C-x a i l | |
| 撤销最近一个简写词 | unexpand-abbrev | ||
| 保存简写词列表 | write-abbrev-file | ||
| 编辑简写词列表 | edit-abbrevs | ||
| 查看简写词列表 | list-abbrevs | ||
| 本次警用简写词列表 | kill-all-abbrevs |
邮件 Mail 和 新闻组 UseNet
| 操作 | 命令名称 | 快捷键 | 备注 |
|---|---|---|---|
| 写邮件 | C-x m | 可以进入邮件模式 |
建议使用邮件客户端,比如 ThunderBird 处理邮件;建议使用客户端访问新闻组。
FTP / Telnet / W3
建议自行探索
制表符
| 操作 | 命令名称 | 快捷键 | 备注 |
|---|---|---|---|
| 改变制表符设置 | edit-tabs-stops | ||
| 空格转制表符 | tabify | ||
| 制表符转空格 | untabify | ||
| 段落重排 | fill-individual-paragraphs |
矩形模式
| 操作 | 命令名称 | 快捷键 | 备注 |
|---|---|---|---|
| 移除一个矩形 | kill-rectangle | C-x r k | |
| 删除一个矩形 | delete-rectangle | C-x r d | |
| 召回一个矩形 | yank-rectangle | C-x r y | |
| 清空一个矩形 | clear-rectangle | C-x r c | |
| 插入一个空白矩形 | open-rectangle | C-x r o |
图形模式
建议自行探索
大纲模式 outline mode
大纲提供了一种一览全局的视图。
C Programming Language
目录
第一章 导言
1.1 入门
1.2 变量和算术表达式
1.3 for语句
第二章 类型、运算符和表达式
2.1 变量名
2.2 数据类型及长度
2.3 常量
C Programming Language
* 目录
* 第一章 导言
** 1.1 入门
** 1.2 变量和算术表达式
** 1.3 for语句
* 第二章 类型、运算符和表达式
** 2.1 变量名
** 2.2 数据类型及长度
** 2.3 常量
大纲模式中的概念:
- 正文(Body):除标题行以外的其他行
- 标题(Heading):以一个或多个星号加一个空格开始的行;大纲模式用变量 outline-regexp 控制。
(setq outline-regexp "\\(\\.11\\)\\|\\(\\.1e2\\)\\|\\(\\.lev3\\)\\|\\(\\.level4\\)")
标题和正文行的组合:
- 条目(Entry): 标题和其下所有的正文行组成一个条目
- 子树(Subtree): 标题和其下的所有子标题以及它们的正文行组成一棵子树
| 操作 | 命令名称 | 快捷键 | 备注 |
|---|---|---|---|
| 移到下一个标题 | outline-next-visible-heading | C-c C-n | |
| 移到上一个标题 | outline-previous-visible-heading | C-c C-p | |
| 移到下一个同级标题 | outline-forward-same-level | C-c C-f | |
| 移到上一个同级标题 | outline-backward-same-level | C-c C-b | |
| 移到上一级标题 | outline-up-heading | C-c C-u | |
| 隐藏正文行 | hide-body | C-c C-t | |
| 显示正文行 | show-body | C-c C-a | |
| 隐藏子节点 | hide-sublevels | C-c C-q | 可用 C-u 或 M-(n) 实现递归 |
| 隐藏其它节点 | hide-other | C-c C-o | |
| 显示子树 | show-subtree | C-c C-s | |
| 隐藏子树 | hide-subtree | C-c C-d | |
| 显示孩子节点 | show-children | C-c TAB | |
| 显示分支节点 | show-branches | C-c C-k | |
| 隐藏叶子节点 | hide-leaves | C-c C-l | |
| 显示记录 | show-entry | C-c C-e | |
| 隐藏记录 | hide-entry | C-c C-c |
更多可转到 Emacs org mode 查看
TEX 和 LATEX 模式
Donald Knuth 创造了 TEX;LATEX 是 Leslie Lamport 开发的 TEX 命令。
它们是带有排版标记的模式,常用来写论文排版格式。
其中的 Html-helper 模式带有非常多的命令。
版本控制 Version Control
了解即可,现代更多的是 Git 和 SVN 进行版本控制。