有没有办法将两个操作组合成一个键绑定(不要认为可以使用函数)。
这就是我想做的事情:
我想要一个键绑定(比如Ctrl-X)到 -
我知道我可以(在~/.inputrc
中)指定
C-X: "ls"
)C-SPACE: menu-complete
)但我不知道如何将这些放在一起
答案 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
,您可以绑定键来执行以下三种操作之一,但不能将它们组合在一起:
bind '"key": command'
bind '"key":"keystrokes"'
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 -p
或bind -P
来检查readline命令,bind -s
将显示您已有的宏。有关bind命令,请参阅here,您也可以创建一个宏,请参阅here。最后检查是否正在读取.inputrc
文件,因为环境变量设置为/etc/Inputrc
并且我的个人版本从未被调用过,我遇到了麻烦。
BTW避开Control-x,因为它已经用于许多readline命令。