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 进行版本控制。