有没有一种方法可以将两个操作组合为一个键绑定(bind)(不要认为可以与功能一起使用)。
这是我想做的:
我想要一个键绑定(bind)(例如Ctrl-X)以-
我知道我可以(在
~/.inputrc
中)指定C-X: "ls"
)C-SPACE: menu-complete
)但是我不确定如何将它们放在一起
最佳答案
诀窍是调用重新绑定(bind)键的函数。在我的示例中,我将使用C-b而不是C-x来插入文本并调用menu-complete。在我的示例中,您将不得不牺牲一把 key 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)键以执行以下三种操作之一,但不能将它们组合使用:bind '"key": command'
bind '"key":"keystrokes"'
bind -x '"key": shell-command'
因此,如果要结合这三件事,则需要将它们分别绑定(bind)到单独的击键组合(在我的示例中为C-t {1,2,3}),并绑定(bind)一个键以执行所有这些击键。
在示例中:
C-b首先插入
ls
并“按下” C-t1,后者执行set_Cb_to_complete
,这又将C-b重新绑定(bind)到menu-complete
。它也重新绑定(bind)了C-m,回车或Enter,因为它现在需要做两件事:接受该行,并通过调用ls
函数将C-b重置为插入set_Cb_to_insert_text
,这也将Enter重置为正常使用状态。我说必须“牺牲” C-t的原因是,如果您按C-t,readline将在执行任何操作之前先等待您是否要按1、2,或任何绑定(bind)的键序列。但是,当您第一次使用C-t时,您可以将其用作大量击键的初始键,以覆盖您的所有readline技巧。
一条建议:在编写和测试这些代码时,请将替代键绑定(bind)到
accept-line
,因为突然有东西在错误的地方打断了链,并且您被困在终端中而无法执行命令:)