bash中复杂的键绑定

时间:2011-12-03 08:15:09

标签: bash readline

有没有办法将两个操作组合成一个键绑定(不要认为可以使用函数)。

这就是我想做的事情:

我想要一个键绑定(比如Ctrl-X)到 -

  1. 插入一些文字,然后
  2. 使用插入的文本作为完成的基础来调用完整或菜单完成
  3. 我知道我可以(在~/.inputrc中)指定

    • 使用(C-X: "ls"
    • 插入文字
    • 执行readline命令(C-SPACE: menu-complete

    但我不知道如何将这些放在一起

2 个答案:

答案 0 :(得分:15)

这样做的诀窍是调用重新绑定键的函数。在我的例子中,我将使用 C-b 来插入文本并调用menu-complete,而不是 C-x 。你必须牺牲一把钥匙,在我的例子中 C-t

在.bashrc中,或者来源的bash文件

set_Cb_to_insert_text() {
  bind '"\C-m": accept-line'
  bind '"\C-b":"ls \C-t1"'
  bind -x '"\C-t1":set_Cb_to_complete'
}
set_Cb_to_complete() {
  bind '"\C-m":"\C-t2\C-t3"'
  bind '"\C-b": menu-complete'
  bind '"\C-t2": accept-line'
  bind -x '"\C-t3":set_Cb_to_insert_text'
}
set_Cb_to_insert_text

这是如何运作的:

使用bind,您可以绑定键来执行以下三种操作之一,但不能将它们组合在一起:

  • 执行readline命令:bind '"key": command'
  • 执行一系列击键:bind '"key":"keystrokes"'
  • 执行shell命令:bind -x '"key": shell-command'

因此,如果你想要结合这三件事,你需要将它们分别绑定到一个单独的击键组合(在我的例子中 Ct { 1 ,< kbd> 2 , 3 })并绑定一个键来执行所有这些击键。

在示例中:

Cb 首先插入ls和'按' Ct 1 ,执行set_Cb_to_complete,然后执行menu-complete Cb 重新绑定到ls。它还重新绑定 Cm ,回车或 Enter ,因为它现在需要做两件事:接受该行,并重置 Cb 以插入set_Cb_to_insert_text,通过调用accept-line函数,该函数也会将 Enter 重置为正常使用。

我说 Ct 必须被“牺牲”的原因是,如果你按 Ct ,readline将等待你是否要按1,或2,或任何绑定的键序列,在采取任何行动之前。但是当你第一次将 C-t 用于此用途时,你可以将它用作大量击键的初始键,以涵盖你所有的readline技巧。

建议:在编写和测试这些内容时,将备用密钥绑定到{{1}},因为突然有些东西会在错误的位置打破链,并且您无法执行命令而陷入终端:)

答案 1 :(得分:4)

这可能对您有用:

"\ex": menu-complete
"\ez": "ls \ex"

~/.inputrc文件中加入这些行。

这些行将Alt-x设置为menu-complete,将Alt-z设置为ls space menu-complete。这将为您提供目录中的第一个文件,并使用Alt-x一次循环其余一个文件。

有关宏的更多示例,请参阅here

通过调用bind -pbind -P来检查readline命令,bind -s将显示您已有的宏。有关bind命令,请参阅here,您也可以创建一个宏,请参阅here。最后检查是否正在读取.inputrc文件,因为环境变量设置为/etc/Inputrc并且我的个人版本从未被调用过,我遇到了麻烦。

BTW避开Control-x,因为它已经用于许多readline命令。