在bash中,如何将功能键绑定到命令?

Sie*_*geX 84 bash shell binding

示例:我想将F12键绑定到命令,echo "foobar"这样每次我点击F12消息"foobar"都会打印到屏幕上.理想情况下,它可以是任意shell命令,而不仅仅是内置命令.怎么会这样呢?

Pau*_*ce. 149

您可以通过在命令行按Ctrl- v然后按下您感兴趣的键来确定键发出的字符序列.在我的系统中F12,我得到^[[24~.该^[代表Esc.不同类型的终端或终端仿真器可以为相同的密钥发出不同的代码.

在Bash提示符下,您可以输入这样的命令来启用密钥宏,以便您可以尝试使用它.

bind '"\e[24~":"foobar"'
Run Code Online (Sandbox Code Playgroud)

现在,当您按下时F12,您将在命令行上获得"foobar",以便进一步编辑.如果您想要按键立即输入命令,可以添加换行符:

bind '"\e[24~":"pwd\n"'
Run Code Online (Sandbox Code Playgroud)

现在,当您按下时F12,您将显示当前目录而无需按Enter.如果您已在线路上输入了某些内容并使用自动执行的内容,该怎么办?它可能会变得混乱.但是,您可以将该行清除为宏的一部分:

bind '"\e[24~":"\C-k \C-upwd\n"'
Run Code Online (Sandbox Code Playgroud)

空间确保Ctrl- u有一些东西要删除,以防止铃声响起.

一旦你以你想要的方式运行宏,你可以通过将它添加到你的~/.inputrc文件来使它保持持久.不需要bind命令或外部单引号:

"\e[24~":"\C-k \C-upwd\n"
Run Code Online (Sandbox Code Playgroud)

编辑:

您还可以创建一个键绑定,它将执行某些操作而不会干扰当前命令行.

bind -x '"\eW":"who"'
Run Code Online (Sandbox Code Playgroud)

然后,当您输入需要用户名的命令时,您需要知道登录用户的姓名,您可以按Alt- Shift- Wwho显示输出并重新发出提示部分命令保持不变,光标位于行中的相同位置.

不幸的是,这对于F12输出两个以上字符的键不起作用.在某些情况下,这可以解决.

命令(who在这种情况下)可以是任何可执行文件 - 程序,脚本或函数.

  • @kubudi:`bind'"\ Cq":menu-complete'`例如(或在你的`〜/ .inputrc`:`"\ Cq":menu-complete`).您可能还需要`〜/ .bashrc`中的`stty -ixon`来禁用流控制并使^ S和^ Q可用. (5认同)
  • 如果我想为"ctrl + q"添加绑定怎么办? (2认同)

Bar*_*den 18

您可以在.inputrc(GNU Readline库的配置文件)中定义bash密钥绑定.语法是

<keysym或key name>:宏

例如:

Control-o: "> output"
Run Code Online (Sandbox Code Playgroud)

将按下时创建一个插入">输出"的宏 ControlO

 "\e[11~": "echo foobar"
Run Code Online (Sandbox Code Playgroud)

当你按下时,会创建一个插入"echo foobar"的宏F1...我不知道是什么关键F11是在手边.

  • 您可以在宏中使用"\n"来添加换行符: (4认同)

Wes*_*ice 7

此解决方案特定于X11环境,与bash无关,但在.Xmodmaps中添加以下内容

 % loadkeys
 keycode 88 = F12
 string F12 = "foobar"
 %
Run Code Online (Sandbox Code Playgroud)

在击中F12时将字符串"foobar"发送到终端.

  • 这真是太棒了,但从Fedora 20开始似乎还是行不通。我什至尝试使用xev首先找到适合F12的正确键码(在我的情况下为96),然后使用它而不是88。两者都不起作用。 (2认同)