!* 的 Bash 历史键盘快捷键

Mal*_*ppa 8 command-line bash shortcut-keys

在 Bash 中,有一些方便的操作符可以重复上一个命令的部分内容:

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

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

  • 当你点击Alt+.Alt+ 时_,上一个命令的最后一个参数被插入到当前命令中,就像你!$在那个时候写的一样。

  • 也可以点击Alt+ Ctrl+y来插入上一个命令的第一个参数,就像你!^在那个时候写的一样。

(请参阅GNU Readline 库info readline。)

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

有这样的捷径吗?如果没有,是否可以将 readline 库配置为添加一个,以及如何配置?

Rad*_*anu 5

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

bind -l
Run Code Online (Sandbox Code Playgroud)

或者更好地:

bind -l | grep arg
Run Code Online (Sandbox Code Playgroud)

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

让我们尝试制作一个符合您要求的箱子...

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

bind -p | grep yank-nth-arg
Run Code Online (Sandbox Code Playgroud)

输出是:

"\e\C-y": yank-nth-arg
Run Code Online (Sandbox Code Playgroud)

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

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

现在注意以下场景:

  • 如果设置以下绑定:

    bind '"\ea": "\e2\e."'
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 如果你设置:

    bind '"\ea": "\e1\e. \e2\e."'
    
    Run Code Online (Sandbox Code Playgroud)

    按下Alt+ 后A,前一个命令的前两个参数将插入当前命令中。如果上一条命令的参数个数最多为 2,当然所有上一条命令都插入到当前命令中。

  • 如果你设置:

    bind '"\ea": "\e1\e. \e2\e. \e3\e."'
    
    Run Code Online (Sandbox Code Playgroud)

    当你按下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."'
Run Code Online (Sandbox Code Playgroud)

而且我认为只要我不经常使用带有这么多参数的命令就足够了。

要使其持久化,请将以下行添加到您的~/.inputrc文件中:

"\ea": "\e1\e. \e2\e. \e3\e. \e4\e. \e5\e. \e6\e. \e7\e. \e8\e. \e9\e. \e1\e0\e."
Run Code Online (Sandbox Code Playgroud)

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

资源: