示例:我想将F12键绑定到命令echo "foobar",以便每次我按下F12“ foobar”消息时,都会将其打印到屏幕上。理想情况下,它可以是任何任意的shell命令,而不仅仅是内置命令。如何做到这一点?
Answers:
通过在命令行中按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,W然后who将显示的输出,并重新发出提示。完整保留您的部分命令,并将光标置于行中的同一位置。
不幸的是,这对于诸如F12输出两个以上字符的键不能正常工作。在某些情况下,可以解决此问题。
该命令(who在这种情况下)可以是任何可执行文件-程序,脚本或函数。
bind '"\C-q": menu-complete'例如(或在您的~/.inputrc:中"\C-q": menu-complete)。您可能还需要stty -ixon在你~/.bashrc来禁用流量控制,使^ S和^推出问。
^[代表esc,然后\e在您的示例中似乎用它代替。你能解释为什么吗?
^[是输出表示。这\e是一种输入方式(^[不适用于该方式)。
您可以在~/.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”。
Alt,使用\e,例如"\eo": "> output"。
.inputrc见hackaday.com/2018/01/19/linux-fu-custom-bash-command-completion
此解决方案特定于X11环境,与bash无关,但是将以下内容添加到您的.Xmodmaps中
% loadkeys
keycode 88 = F12
string F12 = "foobar"
%
在按F12键时,将向终端发送字符串“ foobar”。