Mal*_*ppa 8 command-line bash shortcut-keys
在 Bash 中,有一些方便的操作符可以重复上一个命令的部分内容:
!^ 扩展到前一个命令的第一个参数,例如,
$ echo one "two three"
one two three
$ echo !^
echo one
one
Run Code Online (Sandbox Code Playgroud)!$ 扩展到上一个命令的最后一个参数,例如,
$ echo one "two three"
one two three
$ echo !$
echo "two three"
two three
Run Code Online (Sandbox Code Playgroud)!* 扩展到前一个命令的所有参数,例如,
$ echo one "two three"
one two three
$ echo !*
echo one "two three"
one two three
Run Code Online (Sandbox Code Playgroud)(据我所知,它们分别是!!:^,!!:$和 的语法糖!!:*, where!!是扩展到前一个命令的事件指示符^,$和*是单词指示符,请参阅Bash 参考手册或man bash。)
这些通常非常方便。但是使用键盘快捷键会变得更酷:
当你点击Alt+.或Alt+ 时_,上一个命令的最后一个参数被插入到当前命令中,就像你!$在那个时候写的一样。
也可以点击Alt+ Ctrl+y来插入上一个命令的第一个参数,就像你!^在那个时候写的一样。
(请参阅GNU Readline 库或info readline。)
我倾向于使用键盘快捷键而不是 Bash 的历史操作符,因为我可以在实际执行命令之前看到我正在插入的内容。但是,似乎没有一种快捷方式可以让我插入上一个命令的所有单词,即,一个可以完成!*工作的单词。至少我找不到它。
有这样的捷径吗?如果没有,是否可以将 readline 库配置为添加一个,以及如何配置?
如果您查看以下命令的输出:
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字符串来选择任何其他组合。
资源:
help -m bind