Readline .inputrc 每行都重置为默认值

Bri*_*ian 5 osx bash readline

我正在尝试重新映射 bash 命令行上的键。我有一个 .inputrc 文件,我已将其简化为:

"\C-w": forward-word
Run Code Online (Sandbox Code Playgroud)

还有其他设置,但为了问题的清晰起见,我将它们简化为一个。

发生的情况是,在 shell 的每一行中,Cw 重置为其默认绑定unix-word-rubout. 我可以在编辑该行时使用 Cx Cr 重新加载 .inputrc 文件,并且 Cw 执行我分配给它的操作forward-word。然后在 bash 的下一行,它unix-word-rubout再次重置。

如果我跑

> bind -P | grep C-w
Run Code Online (Sandbox Code Playgroud)

我得到

unix-word-rubout can be found on "\C-w".
Run Code Online (Sandbox Code Playgroud)

但如果我跑

> bind -P | grep C-w 
Run Code Online (Sandbox Code Playgroud)

然后在我按下回车键之前用 Cx Cr 重新加载 .inputrc,我得到

forward-word can be found on "\C-w", "\ef".
Run Code Online (Sandbox Code Playgroud)

所以我可以很好地加载 .inputrc 并且 bash 甚至承认它。但它会在每条新行上重新加载默认设置。

JLine,Java Readline 克隆按预期使用我的 .inputrc 没有任何问题。

我在 OS/X Yosemite 上运行 bash。我正在运行 Homebrew 4.4.12 版本,但 Apple 3.2.57 版本(从 2007 年开始)的工作原理完全相同。它在 Terminal.app 和 iTerm2 中的工作方式相同。

我希望我的设置适用于每一行。我怎样才能让他们坚持下去?

ImH*_*ere 5

问题是串行通信也定义了一些键。
用:

$ stty -a
speed 38400 baud; … …
swtch = <undef>; start = ^Q; stop = ^S; … … werase = ^W; …
-parenb …
Run Code Online (Sandbox Code Playgroud)

在那里(取决于您的系统设置)您应该看到:

werase = ^W
Run Code Online (Sandbox Code Playgroud)

这就是 word-rubout 作为 key 的 stty 定义ctrl W

只需执行:

stty werase undef
Run Code Online (Sandbox Code Playgroud)

undefssty控制器制作这样的钥匙。
请注意您选择进行的更改,因为您可能会导致终端无法使用。

然后密钥将被readline系统重新分配给 bash shell 使用。

为了使(的变化stty werase undef)依然存在,你可以把它放在/etc/profile所有使用该文件(几乎所有)炮弹。在/etc/bash.bashrc所有的bash炮弹或~/.bashrc为“此用户”互动炮弹。