Ant*_*lix 5 bash terminal-emulator terminal inputrc
为了什么我都试过了,TAB
并且C-i
在.inputrc文件似乎意味着同样的事情,无论我绑定到一个绑定到其他。我知道最初是一样的,而且这种行为是从旧时代继承下来的,但是现在,除了终端仿真器之外,所有 X 应用程序都使 aC-i
和TAB
press有所不同。
那么有没有办法在我按下TAB
键时运行终端命令(例如“完成”)并在按下时运行另一个命令C-i
?
(同样的问题适用于C-m
and ENTER
, C-z
, C-d
,以及我想通过原始绑定以外的其他方式发送的所有这些控制序列,并将我自己的命令应用于这些宝贵的键绑定)
顺便说一句,如果你能解释一下从按键到 shell 解释的过程,这将有助于我理解。现在我明白键盘事件由 Xmodmap 翻译,然后由 .inputrc 翻译,结果由 shell 或类似的东西解释。
我目前使用 Guake,有时使用 gnome-terminal 作为终端模拟器。
按照评论中提出的链接后,终端模拟器似乎是将TAB
keysym 从 X 服务器转换为 的链的元素C-i
,并将其发送到 bash shell,因为它不理解诸如TAB
,ENTER
和兄弟姐妹之类的东西。因此,在终端模拟器之后和 bash shell 之前,配置 readline 本身将不起作用。问题可以这样精确:如何配置我的终端模拟器,以便将TAB
and C-i
、ENTER
andC-m
等转换为不同的字符序列对?也许制作TAB
并ENTER
发送一个新的自定义转义序列,稍后可以在 .inputrc 中映射到原始命令,最后能够使用C-i
和C-m
用于其他目的。或者离开TAB
和ENTER
制作C-i
并C-m
发送转义序列。
终端模拟器将诸如“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 和其他终端应用程序中绑定到您想要的任何内容。
请注意,按照惯例,多字符转义序列以转义字符开头(通常在编程语言和配置文件中表示为\e
or\033
或 or \x1b
);某些应用程序可能会遇到以其他字符开头的转义序列的问题,当然你不能有一个既是转义序列又是它自己的键的字符,除非你愿意接受超时(这就是它的工作方式应用程序,例如 viEsc本身就绑定到某些功能)。如果您定义自己的键序列,请注意不要与功能键和光标键发送的键序列发生冲突,这些键或多或少是事实上的标准化。