在 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
。
资源:
- 操作历史记录的命令
help -m bind
- BASH-如何使用上一个命令的参数?