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

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

在 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
    

(据我所知,它们是 和 的语法糖!!:^!!:$其中!!:*!!扩展到前一个命令的事件指示符,^$*单词指示符,请参阅Bash 参考手册或者man bash。)

这些通常非常方便。但使用键盘快捷键会更酷:

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

  • 也可以按++Alt来插入前一个命令的第一个参数,就像您在那时写的那样。Ctrly!^

(见GNU Readline 库或者info readline。)

我倾向于使用键盘快捷键而不是 Bash 的历史操作符,因为我可以在实际执行命令之前看到我插入的内容。但是,似乎没有快捷键可以让我插入前一个命令的所有单词,也就是说,没有快捷键可以完成!*的工作。至少我找不到。

有这样的快捷方式吗?如果没有,是否可以配置 readline 库来添加一个,以及如何添加?

答案1

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

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++ 。Ctrly

可以用同样的方式解释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

资源:

相关内容