【问题标题】:In bash, how do I bind a function key to a command?在 bash 中,如何将功能键绑定到命令?
【发布时间】:2011-05-11 04:34:48
【问题描述】:

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

【问题讨论】:

    标签: bash shell binding


    【解决方案1】:

    您可以通过在命令行中按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-Wwho 的输出将被显示,并且将重新发出提示,您的部分命令保持不变并且光标在该行中的相同位置。

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

    命令(本例中为who)可以是任何可执行文件——程序、脚本或函数。

    【讨论】:

    • 如果我想给 "ctrl+q" 添加绑定怎么办?
    • @kubudi: bind '"\C-q": menu-complete' 例如(或在你的~/.inputrc: "\C-q": menu-complete)。您可能还需要在您的~/.bashrc 中添加stty -ixon 来禁用流量控制并使^S 和^Q 可用。
    • 您说^[ 代表esc,然后您似乎在示例中将其替换为\e。你能解释一下为什么吗?
    • @Remover:^[ 是输出表示。 \e 是一种输入方式(^[ 对此不起作用)。
    • 如何绑定“\C-z”?我很想得到类似于sheerun.net/2014/03/21/how-to-boost-your-vim-productivityzsh 上描述的内容@
    【解决方案2】:

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

    :宏

    例如:

    Control-o: "> output"
    

    当您按下 ControlO

    时,将创建一个插入“输出”的宏
     "\e[11~": "echo foobar"
    

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

    编辑:

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

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

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

    【讨论】:

    • 您可以在宏中使用“\n”来添加换行符:
    • 这对我来说效果更好,因为它定义了打开终端时的键映射。
    • 对于Alt,使用\e,例如"\eo": "> output".
    • 有关使用.inputrc 的更深入的教程,请参阅hackaday.com/2018/01/19/linux-fu-custom-bash-command-completion
    • @ArthurHenriqueDellaFraga 我已经编辑了答案;它将在您的主目录中。如果它不存在,您可以创建它。
    【解决方案3】:

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

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

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

    【讨论】:

    • 请记住,这与运行命令的 shell 不同。如果你真的想运行一个命令,你必须按回车键(或者让发送的字符串为你做这件事)。大概也想先安全清线吧。
    • 这太棒了,但它似乎在 Fedora 20 上不起作用。我什至尝试使用 xev 首先为 F12 找到正确的键码(在我的情况下为 96)并使用它而不是 88。两者都不起作用。
    【解决方案4】:

    我想将Ctrl+B 绑定到一个命令。受上述答案的启发,我尝试使用bind,但无法弄清楚哪些系列的神秘曲线(\e[24~?)转换为Ctrl+B

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 2017-09-14
      • 1970-01-01
      • 2020-05-31
      相关资源
      最近更新 更多