示例:我想将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”。