bash中复杂的键绑定

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

这就是我想做的事情:

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

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

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

>插入带有(C-X:“ls”)的文本
>执行readline命令(C-SPACE:menu-complete)

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

这样做的诀窍是调用重新绑定键的函数.在我的例子中,我将使用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’

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

在示例中:

C-b首先插入ls并’按’C-t1,执行set_Cb_to_complete,然后将C-b重新绑定到菜单完成.它还重新绑定C-m,回车或Enter,因为它现在需要做两件事:接受该行,并通过调用set_Cb_to_insert_text函数重置C-b以插入ls,这也将Enter重置为正常使用.

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

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

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...