就我所尝试的而言,.inputrc 中的“TAB”和“Ci”似乎意味着同一件事,我将任何东西绑定到一个上,它也会绑定到另一个上。我知道最初它们是同一件事,而且这种行为是从旧时代继承下来的,但现在,除了终端仿真器外,所有 X 应用程序都会在 Ci 和 TAB 按下之间产生差异。
那么,有没有一种方法,当我按 TAB 键时运行终端命令(例如“complete”),当我按“Ci”时运行另一个命令?
(同样的问题也适用于 Cm 和 ENTER、Cz、Cd 以及所有这些控制序列,我想通过原始绑定以外的其他方式发送它们,并将我自己的命令应用于这些宝贵的键绑定)
顺便说一句,如果您能稍微解释一下从按键到 shell 解释的过程,那将有助于我理解。现在我明白了键盘事件由 Xmodmap 翻译,然后由 .inputrc 翻译,结果由 shell 或类似的东西解释。
答案1
xmodmap
和之间没有直接联系.inputrc
。
根据终端仿真器的不同,有几种方法可以修改通过终端发送的键。其中包括
然而,在正常情况下,control/I会发送一个tab字符,因为几乎所有终端都是这样设置的。
使用xkb
,您可以(原则上)更改键盘的功能。反过来,X 应用程序会检测按键按下和释放事件,并将其转换为按键符号。 xev
对于显示事件很有用。在 X 中运行的终端仿真器获取一系列事件,然后(使用 X 库调用)将其转换为字符。tab
在这种情况下,A 只是另一个字符。
xmodmap
在此过程中的作用是对 X 键盘配置进行临时更改。
如果您恰好使用xterm
,该translations
资源提供了许多可配置性。这是X工具包,它允许您将各种键组合与 xterm 的内置操作关联起来。默认键绑定列在手动的。您可以覆盖或添加这些绑定。有几个地方可以设置信息($HOME/.Xdefaults
例如,尽管它很容易变得混乱)。例如,我设置了XAPPLRESDIR
环境变量指向包含自定义 app-defaults 文件的用户目录。在一个名为 的文件中XTerm
,我可以将其放入其中以更改 的结果ctrl/I:
*VT100*translations: #override \n\
Ctrl ~Shift<Key>I:string("??")
由于该tab键具有自己特殊的键符号,因此不受此翻译的影响。