Bash历史记录键盘快捷键!*


8

在Bash中,有一些方便的运算符可以重复执行最后一条命令:

  • !^ 扩展到上一个命令的第一个参数,例如,

    $ echo one "two three"
    one two three
    $ echo !^
    echo one
    one
  • !$ 扩展到上一个命令的最后一个参数,例如,

    $ echo one "two three"
    one two three
    $ echo !$
    echo "two three"
    two three
  • !* 扩展到上一个命令的所有参数,例如,

    $ echo one "two three"
    one two three
    $ echo !*
    echo one "two three"
    one two three

(据我理解,这些是语法糖!!:^!!:$!!:*分别,其中!!是一个事件指示符,膨胀到前面的命令,并且^$并且*是字标志,参见击参考手册man bash)。

这些通常很方便。但是通过键盘快捷键,它变得更加酷:

  • 当您按下Alt+ .Alt+时_,上一个命令的最后一个参数将插入当前命令中,就像您在此时编写的一样!$

  • 也可以按Alt+ Ctrl+ y插入上一个命令的第一个参数,就像您在此时编写的一样!^

(请参阅GNU Readline库info readline。)

与Bash的历史记录运算符相比,我倾向于使用键盘快捷键,因为在实际执行命令之前,我可以看到要插入的内容。但是,似乎没有捷径可让我插入上一个命令的所有单词,即可以完成!*任务的单词。至少我找不到它。

有这样的捷径吗?如果不是,是否可以将readline库配置为添加一个库,怎么做?


AFAIK,键盘快捷键由终端仿真器处理。所以我想您正在使用gnome-terminal?
赛斯

1
在中zsh,如果键入echo !*然后按TAB键,则效果理想。通常,TAB在读取行时将展开所有可扩展的内容。非常便利; 也许bash会有一些相同的配置?@Seth,我认为这是进入bash的readline,而不是终端模拟器-虽然不确定。
Rmano 2014年

2
@Seth不,Q的快捷方式由bash处理。您可以为产品查询“命令用于操纵史”man bash(在该行3030某处)
拉杜Rădeanu

@RaduRădeanu太有趣了!我不知道 我的坏假设不好。
塞斯(Seth)

1
\e.\e_映射到readline函数yank-last-arg\e\C-y并映射到yank-nth-arg。可悲的是,似乎没有(单个)命令可以一次添加多个先前的参数。
Adaephon 2014年

Answers:


5

如果查看以下命令的输出:

bind -l

或者更好的是:

bind -l | grep arg

您会看到所有参数都不存在任何readline函数,例如,yank-last-arg最后一个参数-可以将最后一个参数插入上一个命令(上一个历史记录条目的最后一个字)。因此,如果不存在这样的功能,则很可能不存在完成您想要的功能的快捷方式。

让我们尝试创建一个满足您要求的方法...

首先,查看以下命令的输出示例:

bind -p | grep yank-nth-arg

输出为:

"\e\C-y": yank-nth-arg

并可以翻译如下:(yank-nth-arg将第一个参数插入上一个命令-将参数n插入上一个命令中的第n个参数)绑定到Alt+ Ctrl+ y

以相同的方式可以解释bind -p命令输出中的任何行。

现在,请注意以下情况:

  • 如果设置以下绑定:

    bind '"\ea": "\e2\e."'

    Alt+ A将映射到Alt+ 2Alt+ .,该+ + 将插入上一条命令的第二个参数。因此,当您按Alt+后A,上一个命令的第二个参数将插入当前命令中。

  • 如果您设置:

    bind '"\ea": "\e1\e. \e2\e."'

    当您按Alt+之后A,上一个命令的前两个参数将插入当前命令中。如果前一个命令的参数个数最大为2,则所有前一个命令当然都会插入当前命令中。

  • 如果您设置:

    bind '"\ea": "\e1\e. \e2\e. \e3\e."'

    当您按Alt+后A,将一个命令的前三个参数插入当前命令中。如果前一个命令的参数个数最多为3(如您的情况),则当然,所有前一个命令都将插入到当前命令中。

  • 等等。

对于前10个参数,可以使用:

bind '"\ea": "\e1\e. \e2\e. \e3\e. \e4\e. \e5\e. \e6\e. \e7\e. \e8\e. \e9\e. \e1\e0\e."'

而且我认为这足够长,因为我不经常使用带有太多参数的命令。

要使其持久,请在~/.inputrc文件中添加以下行:

"\ea": "\e1\e. \e2\e. \e3\e. \e4\e. \e5\e. \e6\e. \e7\e. \e8\e. \e9\e. \e1\e0\e."

在此示例中,我选择Alt+ A插入上一个命令的所有参数(如果参数数不大于10),但是可以通过在上一个命令中替换\ea字符串来选择其他任意组合。

资源:


好吧,它有点黑,它仅适用于有限数量的参数,但这似乎是我们可以轻松获得的最接近的参数-我会接受它;)实际上,我只是看过readline的源代码。乍看起来,在文件中funmap.c,该函数yank-nth-arg映射到C函数rl_yank_nth_arg,而C函数又在中定义kill.c。类似地yank-last-arg。当然,可以使用这种功能来扩展readline,但是我不想这样做。我希望我的apt
阅读热线由来
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.