将反向杀伤词绑定到Ctrl + w


23

我正在尝试从长时间使用Tcsh切换到最近对Bash的探索。

我已经设法移植了所有我喜欢的功能,但Ctrl + w则将空格和斜杠视为单词边界,很可能是后杀单词。但是,在Bash中,readline会一直删除到第一个空格,并删除它们之间的所有斜杠。

我已经尝试了\ Cw的多种组合:使用bind在.inputrc和.bashrc中都使用了反向杀伤词,但是我无法使其按我想要的方式工作。

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

因此,我向超级用户寻求帮助。

Answers:


40

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

$ stty -a
(...) werase = ^W; (...)

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

stty werase undef
bind '"\C-w": backward-kill-word'

.inputrc不会有任何帮助,因为当Ctrl- W仍分配给时会被读取werase

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


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

  • PuTTY和GNOME终端(使用默认设置)发送1b 7fESC DEL
  • 的xterm与metaSendsEscape: true发送1b 08ESC BS)。
  • Xterm metaSendsEscape发送88HTSBS设置了最高位)。

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

据我所记得,Terminal.app也有一个类似的设置来控制Meta / Alt / Mac的使用行为。


这不仅是最好的答案,而且非常有用,谢谢!
Stefan M

1
@shurane:象普通的擦除(退格键)一样,werase的 “单词擦除”操作由操作系统本身在“ tty设备”驱动程序中实现–注意,即使在从stdin盲目读取的程序中也可以使用它们。cat。在所有Unix上,stty用于控制各种tty参数,包括这些特殊键。(这是UNIX 7th Edition的stty样子。)
grawity 2012年

1
@shurane:同时,readline是一个用户空间库,最初是为bash shell 编写的(尽管现在许多程序都在使用它)。可能已在readline中实现了其他操作,以避免避免tty驱动程序膨胀(如stty手册中所述,该驱动程序已经具有大量的标志和切换)。另外,bash最初是为GNU OS设计的,后来才移植到其他Unix。在一个库中维护编辑功能比在几个非常不同的内核中维护容易得多。
grawity

3
@shurane:但是,从技术上讲,所有这些操作(包括字擦除)都是由readline实现的-处于活动状态时,它将完全禁用终端驱动程序的Backspace和Ctrl + W处理。readlinestty出于简化目的考虑配置,但可以由readline自己的设置覆盖(如Matt Day的回答中所述)。
grawity

4
赞成,这是一个很好的信息答案。但是,应该注意的是,除非所有程序都使用readline,否则它将禁用所有程序的Ctrl-w,这可能不是任何人想要的...,因此请尝试@f​​jarlq的答案。
0fnt

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

2
这具有为所有使用readline的程序(例如)工作的好处python
wchargin '16

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中的设置: 在此处输入图片说明

因此,对于腻子和终端而言,grawity的答案非常棒。但是,在花了很长时间寻找如何在iTerm2中应用设置之后,该超级用户帖子似乎最常出现,因此似乎有责任提供与iTerm2相关的信息,作为此问题的答案。


我花了很长时间才弄清楚这一点,并且在远程bash shell上登录时,此解决方案确实可以在OS X(带有iTerm2)上运行。谢谢!
马丁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.