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

3wabscal  于 2023-02-13  发布在  Shell
关注(0)|答案(4)|浏览(143)

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

ctzwtxfj

ctzwtxfj1#

在命令行中按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)可以是任何可执行文件-程序、脚本或函数。

mrphzbgm

mrphzbgm2#

您可以在~/.inputrc(GNU Readline库的配置文件)中定义bash键绑定。
〈密钥符号或密钥名称〉:巨集
例如:

Control-o: "> output"

我将创建一个宏,当你按下ControlO键时,它会插入"〉output

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

将创建一个宏插入"回声foobar"当你按下F1 ...我不知道什么是F11的键符号是现成的。
编辑:
.inputrc理解\n的换行符转义序列,因此您可以使用

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

它将在命令发出后有效地"按回车"。

lp0sw83n

lp0sw83n3#

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

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

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

elcex8rz

elcex8rz4#

我想把Ctrl+B绑定到一个命令上,受到上面答案的启发,我尝试使用bind,但无法弄清楚哪一系列神秘的曲线(\e[24~?)可以转换为Ctrl+B
在Mac上,进入终端应用程序的设置,配置文件-〉键盘-〉+,然后按下你想要的键盘快捷键,它就出来了。对我来说,Ctrl+B导致\002,我成功地绑定到命令
bind '"\002":"echo command"'
此外,如果您希望命令立即执行(而不仅仅是插入到提示符中),则可以在命令末尾添加Enter键,如下所示:
bind '"\002":"echo command\015"'

相关问题