【发布时间】:2011-05-11 04:34:48
【问题描述】:
示例:我想将 F12 键绑定到命令 echo "foobar",这样每次我按 F12 时,都会将消息“foobar”打印到屏幕上。理想情况下,它可以是任意的 shell 命令,而不仅仅是内置命令。怎么办?
【问题讨论】:
示例:我想将 F12 键绑定到命令 echo "foobar",这样每次我按 F12 时,都会将消息“foobar”打印到屏幕上。理想情况下,它可以是任意的 shell 命令,而不仅仅是内置命令。怎么办?
【问题讨论】:
您可以通过在命令行中按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)。您可能还需要在您的~/.bashrc 中添加stty -ixon 来禁用流量控制并使^S 和^Q 可用。
^[ 代表esc,然后您似乎在示例中将其替换为\e。你能解释一下为什么吗?
^[ 是输出表示。 \e 是一种输入方式(^[ 对此不起作用)。
您可以在~/.inputrc(GNU Readline 库的配置文件)中定义 bash 键绑定。语法是
例如:
Control-o: "> output"
当您按下 ControlO
时,将创建一个插入“输出”的宏 "\e[11~": "echo foobar"
将创建一个宏,当您按 F1 时插入“echo foobar”...我不知道 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”发送到终端。
【讨论】:
我想将Ctrl+B 绑定到一个命令。受上述答案的启发,我尝试使用bind,但无法弄清楚哪些系列的神秘曲线(\e[24~?)转换为Ctrl+B。
在 Mac 上,转到终端应用程序的设置,配置文件 -> 键盘 -> +,然后按您要使用的键盘快捷键,它就会出现。对我来说Ctrl+B 导致\002 我成功绑定到命令
bind '"\002":"echo command"'
另外,如果您希望命令立即执行(不仅仅是插入到提示符中),您可以将 Enter 添加到命令的末尾,如下所示:
bind '"\002":"echo command\015"'
【讨论】: