将 reverse-kill-word 绑定到 Ctrl+w

将 reverse-kill-word 绑定到 Ctrl+w

我正尝试从长期使用 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 7fESC DEL
  • Xterm 带有metaSendsEscape: true发送功能1b 08ESC BS)。
  • 终端没有 metaSendsEscape发送88HTS,或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/

以下是 iTerm2 中的设置: 在此处输入图片描述

因此,具体到 Putty 和 Terminal,gravity 的回答很棒。但是在花费了大量时间寻找如何在 iTerm2 中应用设置之后,这个超级用户帖子似乎出现得最频繁​​,因此似乎有责任提供与 iTerm2 相关的信息作为此问题的答案。

相关内容