题图:Rocky自画BASH快捷键导图
1. BASH命令行编辑的两种模式
BASH命令行支持emacs和vi两种模式。在emacs模式下使用跟emacs下一样的快捷键进行编辑,而在vi模式下则使用跟vi下一样的快捷键进行编辑。如果你熟悉emacs,则使用emacs模式编辑根本都不需要学习,直接使用~~对于vi模式也是一样,命令行也分为normal mode和instert mode,使用vi下对应模式的快捷键。
默认为emacs模式。这里主要说一下默认的emacs模式。
如果不清楚当前是哪一种模式,又该如何查看当前是哪一种模式呢?
在命令行执行bind -V
然后检查keymap
一项,如下:
mbp:~ rocky$ bind -V | grep map
keymap is set to `emacs'
...
mbp:~ rocky$ set -o vi
mbp:~ rocky$ bind -V | grep map
keymap is set to `vi'
这里通过set -o vi
指令临时将keymap
设置为vi
模式,再次执行bind -V
后显示的keymap
就是vi
模式了。
2. 关于Meta按键
据传:在这个蔚蓝色的星球上,流传着两大神器:作为神的编辑器之Emacs和作为编辑器之神的Vim。
我没用过emacs,传说中emacs会大量使用meta键。如果你的BASH是默认的emacs模式,那显然也离不开这个meta键。所以在正式介绍emacs模式的快捷键前有必要说一下emacs上常用的Meta键。
这个Meta键在上古时期的键盘上还能见到,但如今已经不知所踪了。下图是在wiki上找到的一个带Meta键的键盘:
(键盘的最下面一排,左边正数第3个,右边倒数第4个)
键盘上没有Meta键,那怎么办呢?
BASH Reference Manual上以Meta-k组合键为例来介绍Meta Key时是这样解释的:
The text M-k is read as ‘Meta-K’ and describes the character produced when the Meta key (if you have one) is depressed, and the k key is pressed. The Meta key is labeled ALT on many keyboards. On keyboards with two keys labeled ALT (usually to either side of the space bar), the ALT on the left side is generally set to work as a Meta key. The ALT key on the right may also be configured to work as a Meta key or may be configured as some other modifier, such as a Compose key for typing accented characters.
If you do not have a Meta or ALT key, or another key working as a Meta key, the identical keystroke can be generated by typing ESC first, and then typing k. Either process is known as metafying the k key.
这里说很多键盘上,Meta被标记为ALT键(在我所使用的键盘上,尽管有ALT键,但其并不是作为Meta功能使用, Macbook上也没有单独的Meta键),此时可以选用其中的一个ATL键通过设置作为Meta键。如果没有ALT键,可以通过先按ESC键,再按相应的字母键实现Meta组合件的功能。
但是实际上先按ESC,再按相应的组合键,前后要按两次以上,很不方便,通常都是通过修改设置,将ALT复用为Meta键。
以下是网上找到的几种方式:
-
Windows下使用SSH Secure Shell连接到Linux
例如我自己就是使用Secure CRT通过SSH2登录到服务器,可以通过在Secure CRT上将ALT键设置为meta键:
Menu --> Session Options --> Terminal --> Emulation --> Emacs --> Use ALT as meta key
进行设置。
如下:
-
MacOS下使用命令行终端
-
默认的Terminal终端
终端 --> 偏好设置 --> 描述文件 --> 键盘
如下:
-
iTerm2终端
iTerm2 --> Preferences --> Profile --> Keys
如下:
-
-
Linux下使用命令行终端
Linux我用得比较多的是Ubuntu桌面版,我发现Ubuntu桌面版的Terminal上,ALT会起到Meta Key的功能,但是部分功能键(如Alt+F)会被Terminal本身的菜单截获,除了手动修改配置文件的Key映射外,我还没有找到比较方便通用的解决办法。
知道如何设置的大神,恳请告知一下。
3. BASH命令行的快捷键
说完了BASH命令行的两种模式和Meta Key,下面总算进入正题介绍快捷键了。
关于命令行编辑,主要就是光标移动,字符编辑和历史命令功能。
命令行支持的快捷键很多,完整的快捷键列表请参考BASH参考手册。
下面列举最常用的几类编辑命令:
-
移动操作
- 字符
- ctrl + f, 光标向前(右)移动一个字符
- ctrl + b, 光标向后(左)移动一个字符
- 单词
- meta + f / ctrl + ->, 光标向前(右)移动一个单词
- meta + b / ctrl + <-, 光标向后(左)移动一个单词
- 行
- ctrl + a, 移动光标到行首
- ctrl + e, 移动光标到行位
- 其它
- ctrl + x, 光标在上次所在字符和当前所在字符间切换
- ctrl + l, 清除屏幕,移动光标到左上角,同clear命令。
- 字符
-
删除操作 (实际上这里的删除是剪切操作)
-
字符
- ctrl + d, 删除光标所在位置的字符
- ctrl + h, 删除光标位置左侧的字符
-
单词
- ctrl + w, 删除光标所在位置的单词到单词头
- meta + d, 删除光标所在位置的单词到单词尾
- meta + Backspacce, 删除光标位置到单词头的文本。如果光标在一个单词的开头,剪切前一个单词。
-
其它
- ctrl + k, 删除光标及其后面的所有字符
- ctrl + u, 删除光标前面所有字符
- ctrl + _, 恢复上一次删除的字符
关于Backspace和DEL我想就不需要单独列举出来了。
这里没有找到删除整行的命令,可以通过组合命令的方式实现,例如在行首执行ctrl+k或行尾执行ctrl+u。
-
-
撤销操作
- ctrl + _, 撤销上一次删除操作
- ctrl + y, 撤销上一次 ctrl + u的删除操作(实际上是将上一次剪切的文本重新粘贴到光标位置)
- ctrl + ?, 撤销上一次的输入操作
-
位置调换操作
- ctrl + t, 将光标位置的字符和光标前面的字符互换位置
- meta + t, 将光标位置的单词和光标前面的单词互换位置
-
大小写转换操作
- meta + l, 从光标位置到单词尾的字符转换为小写字母
- meta + u, 从光标位置到单词头的字符转换为大写字母
-
历史命令操作
- 穿梭
- ctrl + p, 显示上一条历史命令,相当于按上箭头
- ctrl + n, 显示下一条历史命令,相当于按下箭头
- meta + <, 显示第一条历史命令
- meta + >, 显示最后一条历史命令, 实际上是当前命令行
- 搜索
- ctrl + r, 反向搜索,即从当前命令开始,向上递增搜索
- 执行
- ctrl + o, 执行历史命令中的当前想,并移动到下一个。如果想要执行历史命令中的一系列命令,这很方便。
- !number, 执行历史命令列表中的第number行的命令
- !string, 执行最近历史列表中,以这个字符串开始的命令
- 穿梭
-
其它
- ctrl + s, 锁定命令行
- ctrl + q, 解锁命令行
4. 更多命令行快捷键
BASH命令行操作的快捷键还有很多,关于光标移动,字符编辑和历史命令操作3条就已经够日常装B使用了。更多的快捷键可以在BASH手册的第8章”Command Line Editing”中找到。
不嫌麻烦的同学可以搜索公众号“洛奇看世界”,后台回复关键词获取本文的PDF版和BASH的用户手册。
网友评论