安装 Debian 8.3
stty werase '^H'
或在 Arch Linux 2/2016 上
stty werase '^?'
in .bashrc
(例如)makes Ctrl-Backspace删除终端中的最后一个单词。但这仍然与现代 GUI 应用程序(例如 Firefox)中的行为不同:它删除了最后一个空白- 分隔的单词,而不是由空格分隔的最后一个单词或者像这样的字符. : , ; " ' & / ( )
。
是否可以使Ctrl-Backspace在终端中的行为类似于现代 GUI 应用程序?另外,有什么办法可以Ctrl删除Delete光标前面的单词吗?
答案1
这里有两个行编辑器在起作用:内核提供的基本行编辑器(规范模式 tty 行编辑器)和 bash 的行编辑器(通过 readline 库实现)。这两个命令都有一个擦除到上一个字的命令,默认情况下该命令绑定到Ctrl+ 。可以通过;W为规范模式 tty 行编辑器配置该键。 stty werase
bash 会模仿它在 tty 设置中找到的键绑定,除非在它自己的配置中被覆盖。
werase
无法配置 tty 行编辑器中的操作。它总是删除 (ASCII) 空格分隔的单词。与 tty 行编辑器交互的情况很少见——这就是您在cat
不带参数的情况下键入时所得到的结果。如果您想要在那里进行精美的键绑定,您可以在类似的工具下运行该命令回卷它使用 readline。
Bash 提供了两个删除前一个单词的命令: unix-word-rubout
( Ctrl+w或通过stty werase
) 和backward-kill-word
( M-DEL
, ie Esc Backspace) 其中将单词视为当前语言环境中的字母数字字符序列,并且_
。如果您希望Ctrl+Backspace删除先前的字母数字字符序列,请不要设置stty werase
,而是将以下行放入您的.inputrc
:
"\C-h": backward-kill-word
请注意,这假设您的终端发送Ctrl+的 Ctrl+H 字符Backspace。不幸的是,它是没有标准绑定的键之一(Backspace特别是是一个烂摊子由于历史原因)。
还有一个对称命令,默认kill-word
绑定到M-d
( Alt+ )。D要将其绑定到Ctrl+ Delete,您首先需要弄清楚终端发送的转义序列,然后在.inputrc
.输入Ctrl+V然后Ctrl+ Delete;这将插入类似的内容^[[3;5~
,其中首字母^[
是转义字符的视觉表示。那么绑定就是
"\e[3;5~": kill-word
如果您对某个单词的任一定义都不满意,您可以在 bash 中提供自己的定义:请参阅bash 中 emacs 风格的键绑定的令人困惑的行为
答案2
尝试
alt+backspace
在基本操作系统中,它按照您想要的方式工作(就像ctrl+ backspace)
答案3
熟模式终端处理中 WERASE 字符的行为是硬编码的,至少在 Linux 中:
if (kill_type == WERASE) {
/* Equivalent to BSD's ALTWERASE. */
if (isalnum(c) || c == '_')
seen_alnums++;
else if (seen_alnums)
break;
}
所以单词是字母、数字和下划线。当执行自己的熟模式处理的应用程序未运行时,Linux 终端中始终会出现这种情况。
readline 的版本(由 bash 和其他人使用)似乎与内核的版本有点不同,但它似乎也硬编码的:
单词由字母和数字组成。
但这似乎bash
与我实际所做的不符:foo+bar^W
删除所有内容,而不仅仅是删除bar
。还有更多相关信息这里。
答案4
您可以使用自动键使用与您的终端应用程序匹配的“窗口过滤器”来捕获Ctrl+Backspace并对其执行任何操作。
例如,keyboard.send_keys("<ctrl>+w")
改为执行 a。