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


91

示例:我想将F12键绑定到命令echo "foobar",以便每次我按下F12“ foobar”消息时,都会将其打印到屏幕上。理想情况下,它可以是任何任意的shell命令,而不仅仅是内置命令。如何做到这一点?

Answers:


163

通过在命令行中按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-- ShiftW然后who将显示的输出,并重新发出提示。完整保留您的部分命令,并将光标置于行中的同一位置。

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

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


2
如果我想向“ ctrl + q”添加绑定怎么办?
kubudi

5
@kubudi:bind '"\C-q": menu-complete'例如(或在您的~/.inputrc:中"\C-q": menu-complete)。您可能还需要stty -ixon在你~/.bashrc来禁用流量控制,使^ S和^推出问。
暂停,直到另行通知。

您说那^[代表esc,然后\e在您的示例中似乎用它代替。你能解释为什么吗?
卸妆

1
@Remover:^[是输出表示。这\e是一种输入方式(^[不适用于该方式)。
暂停,直到另行通知。


19

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

<keysym或键名>:宏

例如:

Control-o: "> output"

当您按下时,将创建一个插入“>输出”的宏 ControlO

 "\e[11~": "echo foobar"

将创建一个宏,当您按时将插入“ echo foobar” F1。我不知道键盘的作用F11是什么。

编辑:

.inputrc了解\n换行的转义序列,因此您可以使用

 "\e[11~": "echo foobar\n"

发出命令后,它将有效地“按Enter”。


4
您可以在宏中使用“ \ n”添加换行符:
Barton Chittenden 2010年

这对我来说更好,因为它定义了打开终端时的键映射。
Heldraug 2012年

对于Alt,使用\e,例如"\eo": "> output"
贾尼斯·埃默里斯(JānisElmeris)

有关使用一个更深入的教程.inputrchackaday.com/2018/01/19/linux-fu-custom-bash-command-completion
乔希Habdas

1
@ArthurHenriqueDellaFraga我已经编辑了答案;它会在您的主目录中。如果不存在,则可以创建它。
巴顿·奇滕登

7

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

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

在按F12键时,将向终端发送字符串“ foobar”。


请记住,这与运行命令的shell不同。如果您实际上要运行命令,则必须按Enter键(或发送字符串来为您完成此操作)。可能还想先安全并清除生产线。
卡斯卡贝尔

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

2

我想绑定Ctrl+B到命令。受到以上答案的启发,我尝试使用bind但无法弄清楚什么系列的隐晦的花体字词(\e[24~?)会翻译成Ctrl+B

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.