bash 中的 Ctrl-Backspace 和 Ctrl-Delete

bash 中的 Ctrl-Backspace 和 Ctrl-Delete

安装 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 werasebash 会模仿它在 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。

自动键1

相关内容