在 Bash 中,使用的是 ReadLine 这个库来处理交互式输入。它支持两种键盘快捷键使用风格。默认是 Emacs,还有一种是 Vi。
使用 bash -o emacs
或 bash -o vi
可以切换风格,但由于默认都是 emacs,所以接下来将只介绍 emacs 风格的快捷键。
若要了解更多,还请查看 bash 的帮助文档 READLINE 部分。大多数人都只听说过 emacs,而没有使用过,据说是神之编辑器(编辑器之神?),没想到每天都在接触着。
在我见过的人群中,在 Bash 命令的 输入/修改/删除 的操作上大概分三种类型:
- 第一类: 只会使用 Backspace 向前删除键、方向键。如果一行命令的最前面有拼写错误,就狂按左方向键(或按着不放),然后修改。然后又狂按右方向键,回到结束,继续编辑。要取消命令的输入,就狂按backspace向前删除键。这是最最笨的一类(原谅我用了“笨”这个词),占比不低(就算是很多后端多年经验的程序员,也不免这样);
- 第二类: 和第一类相比,多会一些常规的键盘快捷键,比如 HOME 回到行开始,END 回到行末。这一类看起来要聪明一点,不会显得特别小白。我本人也在这一阶段停留了非常之长久才逐渐成为第三类;
- 第三类: 多数操作使用快捷键,一看就像是大神在操作,动作非常迅速。
接下来我就将列出一些特别方便的、平常用得多、能大大提高命令行编辑效率的的快捷键组合(不包含常规的按键,比如方向键,翻页键等)。
不是所有都能立即熟悉,以下是我不断完善的过程。
按键说明
C-x
代表Ctrl
+x
M-x
代表Meta/Alt/Option
+x
M-C-x
代表Meta/Alt/Option
+Ctrl
+x
⌘-x
代表Command
+x
(macOS专用)C-?
代表Ctrl
+Shift
+/
(因为Shift + /
得到?
,请不要杠)- 在部分 macOS 上,
Backspace
键名被显示为Delete
在 MacOS 上开启 Meta 键的方法
- 如果是 Terminal.app:Preferences → Profiles → Keyboard → Use Option as Meta key。
- 如果是 iTerm2.app:Preferences → Profiles → Keys → Option Key → Esc+。
快捷键表
分类 | 按键 | 助记 | 说明 |
---|---|---|---|
光标移动 | C-a | anchor,^ | 光标移动到行首 |
C-e | end | 光标移动到行尾 | |
C-f | forward | 光标向前(右)移动一个字符 | |
C-b | backward | 光标向后(左)移动一个字符 | |
M-f | forward | 光标向前(右)移动到单词结尾 | |
M-b | backward | 光标向后(左)移动到单词开始 | |
C-] 字符 | ? | 光标向右移动到`字符`出现的位置,即搜索 | |
M-C-] 字符 | ? | 光标向左移动到`字符`出现的位置,即搜索 | |
文本改变 | C-d | delete | 删除光标所在位置的一个字符(光标下有字符的时候) |
C-h | h(vim) | 删除光标所在位置前面的一个字符 | |
C-w | word | 删除光标所在位置前面的一个单词(以空白字符为边界) | |
M-Backspace | word | 删除光标所在位置前面的一个单词 | |
M-d | delete | 删除光标所在位置的一个单词 | |
C-t | transpose | 交换光标所在位置的两个字符的位置 | |
M-t | transpose | 交换光标所在位置的两个单词的位置 | |
C-u | ?(kill Until beginning) | 删除光标前面的所有字符。 存入剪贴板。 | |
C-k | kill | 删除从光标开始后面的所有字符。 存入剪贴板。 | |
C-y | yank | 粘贴剪贴板的内容。 | |
M-u | uppercase | 使光标下的单词变成全大写 | |
M-l | lowercase | 使光标下的单词变成全小写 | |
M-c | capital | 使光标下的单词首字母大写,即标题体 | |
历史命令 | C-p | previous | 前一个命令,相当于按“上”键。 |
C-n | next | 后一个命令,相当于按“下”键。 | |
C-r | reverse | 搜索历史命令(从最近开始往回搜索)。 按下后输入字符开始搜索,然后按 ESC/TAB/方向键等授受。 按 Ctrl-G / Ctrl-C 取消搜索。 | |
M-. M-_ | .(vim中的重复) | 插入上一个命令的最后一个参数到当前位置 | |
撤销与重做 | C-_ C-x C-u | undo | 增量撤销最近一次的操作 这个可以用来撤销 TAB 展开的路径!非常好用。 |
M-r | revert | 当前行重置为最开始的内容 | |
M-# | # comment | 注释掉当前命令并进入下一行。 等同于: 1. 按下 `^a`,回到行首 2. 输入`#`,注释当前行 3. 按下 `Enter`,进入下一行 | |
自动补全 | TAB | ? | 尝试自动补全到输入 |
M-? | ? | 直接显示可能的补全结果列表而不尝试补全到输入 | |
M-* | * | 将 M-? 的所有结果插入到输入 | |
M-g | glob | 将光标下的单词作为 GLOB 正则(并追加一个 *)来扩展出可能的文件名 | |
C-x * | glob | 将光标下的单词作为 GLOB 正则(不会自动追加一个 *)来扩展出可能的文件名,插入输入 | |
C-x g | glob | 将光标下的单词作为 GLOB 正则(不会自动追加一个 *)来列举出可能的文件名,不会插入 | |
其它 | C-l | ?(cLear) | 把当前行提到屏幕的最上端(类似清屏) |
⌘k | ?(Clear Buffer) | 清屏 | |
C-i | ? | TAB | |
C-j | ? | Enter | |
C-d | end-of-file | 如果当前输入为空行,则返回 EOF 给输入,代表输入结束 | |
C-v | verbatim | 直接插入输入字符(取消特殊作用)。 比如 C-v 后按 TAB 可以输入制表符 | |
C-x C-e | editor | 在$EDITOR 编辑器中编辑当前命令,然后执行 | |
C-x C-v | version | 显示 bash 的版本 |