bash中复杂的键绑定

nhe*_*hed 10 bash readline

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

这就是我想做的事情:

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

  1. 然后插入一些文字
  2. 使用插入的文本作为完成的基础来调用完整或菜单完成

我知道我可以(在~/.inputrc)指定

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

但我不知道如何把它们放在一起

akt*_*ivb 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
Run Code Online (Sandbox Code Playgroud)

这是如何工作的:

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

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

所以,如果你想这三样东西结合起来,你需要他们每个绑定到按键的组合分开(在我的例子C-t{ 1,2,3})和绑定一个键来执行所有这些按键.

在示例中:

C-b第一插入件ls和"按下" C-t1,该单元执行set_Cb_to_complete,这反过来又重新绑定C-bmenu-complete.它还重新绑定C-m,回车,或者Enter,因为它现在需要做两件事:接受该行,并通过调用该函数重置C-b为插入ls,该set_Cb_to_insert_text函数也重置Enter为正常使用.

我之所以C-t必须被"牺牲" 的原因是,如果你按下C-t,readline将等待你在采取任何行动之前是否要按1,或2或任何绑定的键序列.但是当你第一次C-t使用它时,你可以使用它作为大量击键的初始键来覆盖你所有的readline技巧.

建议:当你编写和测试这些时,将一个备用键绑定到accept-line,因为突然有什么东西在错误的地方打破了链,你被困在一个终端而无法执行命令:)