通过 .inputrc 将 Ci 和 TAB 键绑定到终端应用程序中的不同命令

Ant*_*lix 5 bash terminal-emulator terminal inputrc

为了什么我都试过了,TAB并且C-i在.inputrc文件似乎意味着同样的事情,无论我绑定到一个绑定到其他。我知道最初是一样的,而且这种行为是从旧时代继承下来的,但是现在,除了终端仿真器之外,所有 X 应用程序都使 aC-iTABpress有所不同。

那么有没有办法在我按下TAB键时运行终端命令(例如“完成”)并在按下时运行另一个命令C-i

(同样的问题适用于C-mand ENTER, C-z, C-d,以及我想通过原始绑定以外的其他方式发送的所有这些控制序列,并将我自己的命令应用于这些宝贵的键绑定)

顺便说一句,如果你能解释一下从按键到 shell 解释的过程,这将有助于我理解。现在我明白键盘事件由 Xmodmap 翻译,然后由 .inputrc 翻译,结果由 shell 或类似的东西解释。

我目前使用 Guake,有时使用 gnome-terminal 作为终端模拟器。

按照评论中提出的链接后,终端模拟器似乎是将TABkeysym 从 X 服务器转换为 的链的元素C-i,并将其发送到 bash shell,因为它不理解诸如TAB,ENTER和兄弟姐妹之类的东西。因此,在终端模拟器之后和 bash shell 之前,配置 readline 本身将不起作用。问题可以这样精确:如何配置我的终端模拟器,以便将TABand C-iENTERandC-m等转换为不同的字符序列对?也许制作TABENTER发送一个新的自定义转义序列,稍后可以在 .inputrc 中映射到原始命令,最后能够使用C-iC-m用于其他目的。或者离开TABENTER制作C-iC-m发送转义序列。

Gil*_*il' 9

终端模拟器将诸如“Tab按键被按下”之类的事件转换为在终端中运行的应用程序(在您的情况下为 bash)读取的字符序列。请参阅键盘输入和文本输出如何工作?有关此主题的更详细介绍。

由于历史原因,一些键发送的字符与按下Ctrl其他字符相同:Tab= Ctrl+ I, Return= Ctrl+ M, Esc= Ctrl+ [。这是因为历史上的物理终端是这样做的,所以在终端中运行的应用程序会期待它,所以终端会这样做。

Guake 和 Gnome-terminal 都使用VTE 库,它不允许配置从键和弦到字符序列的映射。您有与bash相同的问题- 使用 control+alt+space 错误的键序列绑定

Xterm具有完全可配置的键绑定。您可以让Tab键发送一个制表符(这是默认值),或者让它发送 stringhello或您选择的任何内容。Xterm 是通过X resources配置的。例如,要在按下和松开时Tab发送转义序列,请将其放入您的:\e[t\e]t~/.Xresources

XTerm.vt100.translations: #override \
  <Key>Tab: string("\033[t") \n\
  <KeyRelease>Tab: string("\033]t") \n\
Run Code Online (Sandbox Code Playgroud)

或者,也许您会离开Tab发送制表符并制作Ctrl+I发送其他内容:

XTerm.vt100.translations: #override \
  Ctrl~Meta~Shift<Key>I: string("\033[a5i") \n\
  Ctrl~Meta Shift<Key>I: string("\033[a6i") \n\
Run Code Online (Sandbox Code Playgroud)

然后,您可以\e[a5i使用可配置的键绑定在 bash 和其他终端应用程序中绑定到您想要的任何内容。

请注意,按照惯例,多字符转义序列以转义字符开头(通常在编程语言和配置文件中表示为\eor\033或 or \x1b);某些应用程序可能会遇到以其他字符开头的转义序列的问题,当然你不能有一个既是转义序列又是它自己的键的字符,除非你愿意接受超时(这就是它的工作方式应用程序,例如 viEsc本身就绑定到某些功能)。如果您定义自己的键序列,请注意不要与功能键和光标键发送的键序列发生冲突,这些键或多或少是事实上的标准化

  • 谢谢,这种知识在互联网上很难找到,几个月来我一直在寻找解决这个问题的方法,这是我第一次听说这些可能性! (2认同)