在他的Linux 实用指南, 4e,索贝尔给了我们以下片段:
$ cat ~/.inputrc
set editing-mode vi
$if mode=vi
"\C-y": vi-next-word
$else
"\C-y": forward-word
$endif
该代码片段的出现是为了让 CONTROL-Y 将光标移动到下一个单词的开头,无论 bash 处于 vi 还是 emacs 模式。
我感到困惑的是,鉴于此代码片段,我们如何才能处于 emacs 模式。我目前的理解如下:
当我使用 Readline 库中的一些元素/快捷方式/令牌(我不知道这个术语)时,bash 会在 input.rc 中查找以了解我的意思。
如果 1) 为真(也许不是,并且 input.rc 仅用于初始化新 shell,但在这种情况下,我无法理解为什么
$else
上面的子句是相关的,因为它永远不会到达?)然后我使用set -o emacs
并且也许使用CONTROL-Y
在命令行的给定条目中向前跳过,不会读取 input.rc 并将我切换回某种editing-mode = vi
情况吗?
答案1
我认为你几乎猜对了。
set editing-mode
将确定使用哪种 Readline 模式默认情况下。但bash
允许您随时切换模式;使用 Readline 的其他应用程序也可能这样做。
每次按下按键时读取实际.inputrc
文件的效率很低,因此实际发生的情况可能更像是:
当程序初始化 Readline 库时,该库将读取该.inputrc
文件,准备所需的设置两种模式。将set editing-mode
立即确定首先向用户提供哪种模式;但两种模式仍将被配置,以防用户稍后想要切换模式。
如果没有条件,任何键绑定将在可能的情况下应用于两种模式;使用$if mode=
条件构造,您可以使键绑定仅应用于特定模式。
还有其他条件构造:$if term=
仅当当前终端属于特定类型时才可用于配置键绑定,并且$if application=
可用于在.inputrc
.