将向后终止词绑定到 Ctrl+w

Ste*_*n M 24 bash readline

我正在尝试从长期使用 Tcsh 转向最近对 Bash 的探索。

我设法移植了所有我最喜欢的功能,除了 Ctrl+w 将空格和斜杠视为单词边界,最有可能是向后删除单词。然而,在 Bash 中 readline 一直删除到第一个空格,删除之间的所有斜杠。

我已经使用 bind 在 .inputrc 和 .bashrc 中尝试了许多不同的 \Cw:backward-kill-word 组合,但我无法让它以我想要的方式工作。

有趣的是,通过工作中的 Windows 中的 Putty,我可以使用 Alt+Backspace(手册中也说这是默认绑定)来产生我想要的确切行为。但是在我家里的 Mac 上的 Terminal.app 中,这不起作用。我碰巧从 Terminal.app 登录的任何 FreeBSD 或 Linux 服务器也是如此。

所以我转向超级用户寻求帮助。

use*_*686 40

readline不绑定Ctrl-W因为它默认由终端驱动程序处理:

$ stty -a
(...) werase = ^W; (...)
Run Code Online (Sandbox Code Playgroud)

要禁用此功能,您必须运行(在 中~/.bashrc):

stty werase undef
bind '"\C-w": backward-kill-word'
Run Code Online (Sandbox Code Playgroud)

.inputrc在这里不会有帮助,因为它是在Ctrl-W仍然分配给werase.

另请注意,\C-w格式 keyeqs 必须用双引号括起来,如上所述。


不同的终端可以处理Alt-Backspace不同。

  • PuTTY 和 GNOME 终端(使用默认设置)发送1b 7f( ESC DEL)
  • 带有metaSendsEscape: true发送1b 08( ESC BS) 的Xterm 。
  • Xterm metaSendsEscape发送88HTS,或BS设置最高位)。

Xterm 有一些设置来控制Alt键的行为(Meta通常在 Xterm 和 X11 中调用)。使用metaSendsEscape,holdAlt将在按键前加上ESC(hex 1b)。如果不设置(默认模式),Alt将设置输入字符的最高位,产生特殊字符。(例如,Alt-分别N导致ESC nî。)

据我所知,Terminal.app 也有类似的设置来控制 Meta/Alt/whatever-Macs-use 的行为。

  • 这是一个很好的信息答案,upvote。但是,应该注意的是,这会禁用所有程序的 Ctrl-w,除非它们使用 readline,这可能不是任何人想要的......,所以试试@fjarlq 的答案。 (4认同)
  • @shurane:但是,从技术上讲,**所有**这些操作,包括字擦除,都是由 *readline* 实现的——激活时,它会完全禁用终端驱动程序对退格键和 Ctrl+W 的处理。*readline* 只是为了简单起见尊重 `stty` 配置,但它可以被 *readline* 自己的设置覆盖(如 Matt Day 的回答中所述)。 (3认同)

fja*_*rlq 19

grawity 写道,这无法在.inputrc文件中控制,但这是不正确的。

如果您set bind-tty-special-chars off在 中.inputrc,则可以自定义特殊终端字符的行为。

例如:

set bind-tty-special-chars off
Control-u: kill-whole-line
Control-w: backward-kill-word
Run Code Online (Sandbox Code Playgroud)

  • 这对所有使用 readline 的程序都有好处——例如,`python`。 (2认同)