2011-12-03 49 views
9

有没有办法将两个操作合并到一个键绑定中(不要以为可以使用函数)。bash中的复杂键绑定

这是我想要做什么:

我想一键绑定(说按Ctrl-X),以 -

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

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

0123文字
  • 插入带(C-X: "ls"
  • 执行的ReadLine命令(C-SPACE: menu-complete

但我不知道如何把这些结合在一起

回答

13

这个技巧是调用重新绑定你的密钥的函数。在我的示例中,我将使用C-b插入文本并调用菜单完成,而不是使用C-x。在我的例子中,你必须牺牲一把钥匙。C-t

In。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 {,, })并绑定一个键来执行所有这些键击。

在该实例中:

C-B第一刀片ls和 '按下' C-吨 ,该单元执行set_Cb_to_complete,这反过来又重新绑定C-Bmenu-complete。它也将重新绑定厘米,回车,或输入,因为它现在需要做两两件事:接受就行了,复位的Cb插入ls,通过调用set_Cb_to_insert_text功能,这也将重置输入到这是正常的使用。

我之所以这么说,的Ct不得不“牺牲”,就是如果你按的Ct,readline的会等着看,如果你打算按1或2,或任何绑定的关键序列,在它采取任何行动之前。但是,当您首次将C-t用于此用途时,您可以将其用作大量击键的初始键以涵盖所有的readline欺骗。

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

+0

非常感谢你的想法,例子和详细的答案(令人费解,是的,但你在bash + readline框架及其限制内工作)。在我发布的一年多之后,我只能隐约记得我在大图中所做的事情......所以我刚刚证实了您的示例的工作原理,但会花更多时间重新创建我以前完成的任务 - 谢谢! – nhed

4

这可能会为你工作:

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

将这些行包含在~/.inputrc文件中。

这些行设置Alt-x为menu-complete和Alt-z为lsspacemenu-complete。这将为您提供目录中的第一个文件,并使用Alt-x一次一个遍历剩余的文件。

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

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

顺便说一下,因为它已被许多readline命令使用,所以不要使用Control-x。

+0

这几乎是诀窍,但后续调用需要2个关键组合。我已经了解如何绑定文本插入以及如何绑定菜单完成......如果我第二次“Alt-z”,我希望显示器只显示'ls ',但是我却看到了ls ls '... – nhed

+0

这意味着(我可能在这里错了),你想要相同的组合键来切换它的动作。在阅读readline库的文档时,唯一的条件规则是关于'mode',即bash,emacs,ftp ......或许在这种情况下,您可能需要编写一个新的readline函数,参见[here](http:// cnswww .cns.cwru.edu/PHP /切特/ readline的/ readline.html#SEC23)。顺便说一下,看看这种方式... Alt-x和Alt-z相距不是百万英里(不在我的键盘上),菜单完整的关键组合通常会派上用场。 – potong

+0

实际上,在我的Mac上,你提到的关键组件只对Esc-x,Esc-z做出响应,而在后面的“\ ex”似乎并没有做任何事情。 – nhed