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>键即可回到编辑模式。

下表包含常见的 EmacsVim 键绑定可以在 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 删除直到前一个空白,即删除当前单词的开头部分,一直到当前光标位置。

您可以通过在文件中添加您自己的绑定来自定义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 可能的值为:emcasvi 。 默认是 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