bash中的Ctrl-Backspace和Ctrl-Delete


14

戴上Debian 8.3

stty werase '^H'

或在Arch Linux 2/2016上

stty werase '^?'

.bashrc(例如)使得Ctrl- Backspace删除终端的最后一个字。不过这不是相同的行为在现代GUI应用程序(如火狐):删除最后一个空白 -分隔字,而不是最后一个字由空格分隔字符,如. : , ; " ' & / ( )

是否有可能使Ctrl- Backspace的行为在终端类似现代的GUI应用程序?另外,有什么方法可以Ctrl- Delete删除光标前的单词吗?


1
您的外壳程序可能支持那些可以绑定到给定键的操作。
Thomas Dickey

@ThomasDickey:我正在使用bash。如果仅在bash中工作就可以了。
2016年

Answers:


27

这里有两个行编辑器:内核提供的基本行编辑器(规范模式tty行编辑器)和bash的行编辑器(通过readline库实现)。两者都有一个“擦除前一字”命令,默认情况下绑定到Ctrl+ W。可以通过以下方式为规范模式tty行编辑器配置密钥stty werase:bash模仿它在tty设置中找到的键绑定,除非在其自己的配置中被覆盖。

werase在tty线路编辑行为不能配置。它总是擦除(ASCII)空格分隔的单词。与tty行编辑器进行交互是很少见的-这就是您得到的,例如,当您输入cat不带参数的时候。如果您想在那里使用精美的键绑定,则可以在使用readline的rlwrap之类的工具下运行命令。

Bash提供了两个删除前一个单词的命令unix-word-ruboutCtrl+ w或通过set设置的stty werase)和backward-kill-word((M-DELEsc Backspace)),将一个单词视为当前语言环境和中的字母数字字符序列_。如果您想Ctrl+ Backspace删除以前的字母数字字符序列,请不要设置stty werase,而是在您的代码中添加以下行.inputrc

"\C-h": backward-kill-word

请注意,这里假设你的终端发送的按Ctrl + H字符Ctrl+ Backspace。不幸的是,它是没有标准绑定的那些键之一(由于历史原因Backspace,尤其是一团糟)。

默认情况下,还有一个对称命令kill-word绑定到M-dAlt+ D)。要将其绑定到Ctrl+ Delete,首先需要确定终端发送的转义序列,然后在中添加相应的行.inputrc。输入Ctrl+ V然后Ctrl+ Delete; 这将插入类似^[[3;5~首字母^[的转义字符的可视表示形式。然后绑定是

"\e[3;5~": kill-word

如果您对一个单词的定义都不满意,则可以在bash中提供自己的单词:请参阅bash 中emacs样式的键绑定的混乱行为


2
极好的解释!该Ctrl+Del行之有效。但是,我无法Ctrl+Backspace上班。对于Ctrl+v, Ctrl+Backspace我的终端说^?。我应该放什么.inputrc?谢谢
CiprianTomoiagă17年

3
@CiprianTomoiaga "\C-?": backward-kill-word或您想要的任何readline函数。但是,您只能为Ctrl + Backspace定义一个绑定,如果它们发送不同的字符,则该绑定与Backspace的绑定不同。如果您的终端同时发送^?Backspace和Ctrl + Backspace,则在终端中运行的应用程序将无法区分它们。某些终端可以配置(例如xterm,urxvt),而其他终端(例如基于VTE的终端仿真器)则不能。
吉尔(Gilles)'所以

4
请务必注意,定义~/.inputrc会禁用默认值/etc/inputrc。要解决此问题,您必须包含该文件:($include /etc/inputrc此处开始
CiprianTomoiagă17年

为Esc + Backspace +1
CelalErgün19年


1

至少在Linux中,在烹饪模式终端处理中WERASE字符的行为是硬编码的

           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。这里有更多有关此的信息。


1. vi用户可能只是在寻找backward-kill-word(默认绑定M-DEL)而不是unix-word-rubout
吉尔(Gilles)“所以,别再邪恶了”
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.