3. 命令行编辑
在 bash
命令行模式下,当您键入命令时,您可以通过使用箭头键移动到该行中的特定位置并对其进行编辑来进行更正,
更改完成后您可以只需按<Enter>
键即可执行该命令。 不要求必须在光标位于行尾时按下<Enter>
才执行命令。
编辑模式
使用箭头键逐个字符导航可能会很痛苦。 readline
库在命令行中提供了两种高效的命令编辑模式
emacs
这是默认模式。 在此模式下,您可以使用emacs
风格的快捷方式来导航和编辑命令。vi
在此模式下,您可以使用vi
样式快捷方式来导航和编辑命令。 由于我是vim
编辑器的粉丝,所以我更喜欢这种模式。
以下表明 shell
当前使用的是 emacs
模式。
$ set | grep SHELLOPTS
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:int
eractive-comments:moni
要更改为vi
模式,请执行以下操作:
$ set -o vi
$ set | grep SHELLOPTS
SHELLOPTS=braceexpand:hashall:histexpand:history:interacti
ve-comments:monitor:vi
要返回 emacs
模式,请执行以下操作:
$ set -o emacs
$ set | grep SHELLOPTS
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:int
eractive-comments:monitor
vi
模式下,使用方向键转到上一个命令后,使用导航命令之前请使用<Esc>
键。 当你是准备插入文本或进行修改,再次使用<Esc>
键即可回到编辑模式。
编辑模式下的快捷键
下表包含常见的 Emacs
和 Vim
键绑定可以在 bash
命令行中使用的文本操作
Emacs 模式 | Vim 模式 | 描述 |
---|---|---|
<Ctrl>+b |
h |
向左移动1个字符 |
<Ctrl>+f |
l |
向右移动1个字符 |
<Ctrl>+d |
x |
删除光标突出显示的字符 |
Backspace |
删除光标左侧的字符 | |
Just start typing |
<Esc> |
从当前光标位置插入字符 |
<Ctrl>+a |
^ |
跳转至行首 |
<Ctrl>+e |
$ |
跳转至行尾 |
<Ctrl>+b |
b or B |
向左移动一个单词 |
<Ctrl>+f |
w or W |
向右移动一个单词 |
<Ctrl>+k |
D |
删除从当前光标位置到行尾的所有字符 |
<Ctrl>+d |
dw |
删除当前单词的其余部分,如果当前字符是空格,则删除下一个词 |
<Ctrl>+w |
dB |
删除直到前一个空白,即删除当前单词的开头部分,一直到当前光标位置。 |
~/.inputrc 文件
您可以通过在文件中添加您自己的绑定来自定义readline
默认键绑定。 以下是一些readline
行为,您可以通过在.inputrc
文件中设置相应的变量来更改这些行为。
变量 | 描述 |
---|---|
bell-style |
终端铃声风格。 可选的值为:none , visible , audible(默认) |
comment-begin |
需要作为注释行前缀的字符串。 默认为 # |
completion-ignorecase |
设置为 "on" 时,在文件名完成期间忽略大小写。 默认为 "off" 。 |
completion-queryitems |
对于补全,默认情况下,当可能性高于 100 时,它会显示 "Display all xxx possibilities? (y or n)" 。 使用此参数更改该数字。 |
disable-completion |
通过设置为 "on" 来打开禁用单词补全,默认为 "off" 。 |
editing-mode |
可能的值为:emcas 、vi 。 默认是 emacs 。 |
expand-tilde |
将其设置为 "on" 可将波形符(~) 自动转换为完整路径以完成单词。 默认为 "off" |
history-size |
将其设置为 "0" 可在历史记录中存储无限命令。 |
horizontal-scrollmode |
当您在命令行中键入的行较长时,当该值设置为 "on" 时,它将水平滚动(而不是换行)。 默认为 "off" 。 |
mark-directories |
当目录名称完成后(当您按 Tab 时),默认情况下会自动在目录后附加斜杠 (/) 。 默认情况下启用此功能,将此值设置为 "off" 以禁用此功能。 |
用户默认的 inputrc
文件是~/.inputrc
,但是如果
INPUTRC
变量是指向一个文件, bash
将尝试从该文件中读取值。
如果~/.inputrc
不存在,并且
INPUTRC
变量没有指向的文件,那么 bash
将使用全局默认文件/etc/inputrc.local
。
对于 bash shell
,如果您想在每次登录时将默认编辑模式更改为vi
, ~/.inputrc
文件是设置它的好地方。
$ vi ~/.inputrc
set editing-mode vi
"set -o vi"
添加到 .bash_profile
文件中。
~/.inputrc
文件是设置多个自定义用户配置的好地方。 例如,设置历史记录大小,如下所示。
$ cat ~/.inputrc
set editing-mode vi
set history-size 1500
set completion-ignore-case on