bash 中的 Ctrl-Backspace 和 Ctrl-Delete

viu*_*ser 20 bash keyboard-shortcuts terminal line-editor

安装 Debian 8.3

stty werase '^H'
Run Code Online (Sandbox Code Playgroud)

或在 Arch Linux 2/2016 上

stty werase '^?'
Run Code Online (Sandbox Code Playgroud)

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

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

Gil*_*il' 41

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

werase无法配置 tty 行编辑器中的操作。它总是擦除 (ASCII) 空格分隔的单词。很少与 tty 行编辑器进行交互——这是您在cat不带参数的情况下键入时得到的结果。如果您想要在那里进行花哨的键绑定,您可以在使用 readline 的rlwrap 之类的工具下运行该命令。

Bash 提供了两个命令来删除前一个单词:unix-word-rubout( Ctrl+w或 as set through stty werase) 和backward-kill-word( M-DEL, ie Esc Backspace)将单词视为当前语言环境中的字母数字字符序列 和_。如果您希望Ctrl+Backspace删除前面的字母数字字符序列,请不要设置stty werase,而是将以下行放入您的.inputrc:

"\C-h": backward-kill-word
Run Code Online (Sandbox Code Playgroud)

请注意,这假设您的终端为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
Run Code Online (Sandbox Code Playgroud)

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

  • 需要注意的是,定义`~/.inputrc` 会禁用默认的`/etc/inputrc`。要解决此问题,您必须包含该文件:`$include /etc/inputrc`(来自 [here](http://unix.stackexchange.com/q/179291/68186)) (6认同)
  • @CiprianTomoiaga `"\C-?": back-kill-word` 或任何你想要的 readline 函数。但是您只能为 Ctrl+Backspace 定义一个与 Backspace 的绑定不同的绑定,如果它们发送不同的字符。如果您的终端同时为 Backspace 和 Ctrl+Backspace 发送 `^?`,那么终端中运行的应用程序就无法区分它们。某些终端可以配置(例如 xterm、urxvt),而其他终端(例如基于 VTE 的终端仿真器)则不能。 (4认同)
  • 很好的解释!`Ctrl+Del` 运行良好。但是,我无法让`Ctrl+Backspace` 工作。对于`Ctrl+v, Ctrl+Backspace`,我的终端显示`^?`。我应该在 `.inputrc` 中放什么?谢谢 (3认同)

小智 10

尝试

alt+backspace

在基本操作系统中,它的工作方式与您想要的一样(就像ctrl+一样backspace)