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

时间:2010-11-17 01:48:32

标签: bash shell binding

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

4 个答案:

答案 0 :(得分:141)

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

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

bind '"\e[24~":"foobar"'

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

bind '"\e[24~":"pwd\n"'

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

bind '"\e[24~":"\C-k \C-upwd\n"'

该空格确保 Ctrl - u 有一些要删除的内容,以防止铃声响起。

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

"\e[24~":"\C-k \C-upwd\n"

修改

您还可以创建一个在不干扰当前命令行的情况下执行某些操作的键绑定。

bind -x '"\eW":"who"'

然后,当您输入需要用户名的命令时,您需要知道登录用户的姓名,您可以按 Alt - Shift < / kbd> - W ,将显示who的输出,并且将重新发出提示,部分命令保持不变,光标位于该行的相同位置。

不幸的是,对于输出两个以上字符的 F12 等键,这不能正常工作。在某些情况下,这可以解决。

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

答案 1 :(得分:15)

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

&lt; keysym或键名&gt;:宏

例如:

Control-o: "> output"
当您按 Control O

时,

将创建一个插入“&gt;输出”的宏

 "\e[11~": "echo foobar"
当你按 F1 时,

会创建一个插入“echo foobar”的宏...我不知道 F11 的关键是什么。

答案 2 :(得分:7)

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

 % loadkeys
 keycode 88 = F12
 string F12 = "foobar"
 %

将在击中F12时将字符串“foobar”发送到终端。

答案 3 :(得分:2)

我想将Ctrl+B绑定到命令。受以上答案的启发,我尝试使用bind,但无法弄清楚哪些隐隐的花体(\e[24~吗?)转换为Ctrl+B

在Mac上,依次转到“终端”应用程序的“设置”,“配置文件”->“键盘”->“ +”,然后按您想要的键盘快捷键,它就会出现。对我来说Ctrl+B产生了\002,我成功绑定到了命令

bind '"\002":"echo command"'

此外,如果您希望立即执行命令(而不仅仅是插入提示中),则可以将Enter添加到命令的末尾,如下所示:

bind '"\002":"echo command\015"'