我正尝试从长期使用 Tcsh 转向最近探索 Bash。
我成功地移植了我最喜欢的所有功能,除了 Ctrl+w,它将空格和斜线视为单词边界,最有可能是向后杀字。然而在 Bash 中,readline 会一直删除到第一个空格,删除其间的所有斜线。
我已尝试使用 bind 在 .inputrc 和 .bashrc 中对 \Cw:backward-kill-word 进行多种组合,但无法使其按我想要的方式工作。
有趣的是,在工作时,我可以通过 Windows 上的 Putty 使用 Alt+Backspace(手册上也说这是默认绑定)来产生我想要的确切行为。但在我家 Mac 上的 Terminal.app 中,这不起作用。对于我碰巧从 Terminal.app 登录的任何 FreeBSD 或 Linux 服务器也是如此。
因此我向超级用户寻求帮助。
答案1
readline
不绑定Ctrl-W因为它默认由终端驱动程序处理:
$ stty -a
(...) werase = ^W; (...)
要禁用此功能,您必须运行(在~/.bashrc
):
stty werase undef
bind '"\C-w": backward-kill-word'
.inputrc
在这里不会有帮助,因为当Ctrl-W仍然分配给时它会被读取werase
。
还要注意,\C-w
格式 keyseqs 必须用双引号括起来,如上所述。
不同的终端可能会以不同的方式Alt处理Backspace。
- PuTTY 和 GNOME 终端(使用默认设置)发送
1b 7f
(ESC DEL
) - Xterm 带有
metaSendsEscape: true
发送功能1b 08
(ESC BS
)。 - 终端没有
metaSendsEscape
发送88
(HTS
,或BS
设置最高位)。
Xterm 有一些设置可以控制Alt按键的行为(Meta在 Xterm 和 X11 中通常称为)。使用 时metaSendsEscape
,按住Alt将在按键前加上前缀ESC
(十六进制1b
)。如果没有设置(默认模式),Alt将设置输入字符的最高位,从而产生特殊字符。(例如,Alt-分别N产生ESC n
和î
。)
据我所记得,Terminal.app 也有一个类似的设置来控制 Meta/Alt/whatever-Macs-use 的行为。
答案2
如果您set bind-tty-special-chars off
在您的中.inputrc
,您可以自定义特殊终端字符的行为。
例如:
set bind-tty-special-chars off
Control-u: kill-whole-line
Control-w: backward-kill-word
答案3
记录显示,适用于 iTerm2 的答案是设置Alt- Backspace(或Opt ⌥-⌫在 Mac 上)发送十六进制代码0xb1
,并0x7f
执行backward-kill-word
以下操作:将非字母数字字符视为分隔符。
为了区分,下面是我所描述的行为,按一次Opt ⌥-即可改变这种情况:⌫
echo "/example/filepath/with_non-alpha.characters@blah:meh
更改为:
echo "/example/filepath/with_non-alpha.characters@blah:
随后按Opt ⌥- ⌫:
echo "/example/filepath/with_non-alpha.characters@
echo "/example/filepath/with_non-alpha.
echo "/example/filepath/with_non-
echo "/example/filepath/with_
echo "/example/filepath/
因此,具体到 Putty 和 Terminal,gravity 的回答很棒。但是在花费了大量时间寻找如何在 iTerm2 中应用设置之后,这个超级用户帖子似乎出现得最频繁,因此似乎有责任提供与 iTerm2 相关的信息作为此问题的答案。