我正在尝试重新映射 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 中的工作方式相同。
我希望我的设置适用于每一行。我怎样才能让他们坚持下去?
问题是串行通信也定义了一些键。
用:
$ 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)
undef
由ssty
控制器制作这样的钥匙。
请注意您选择进行的更改,因为您可能会导致终端无法使用。
然后密钥将被readline
系统重新分配给 bash shell 使用。
为了使(的变化stty werase undef
)依然存在,你可以把它放在/etc/profile
对所有使用该文件(几乎所有)炮弹。在/etc/bash.bashrc
所有的bash炮弹或~/.bashrc
为“此用户”互动炮弹。