是否可以为 `!!` 创建命令行别名?

是否可以为 `!!` 创建命令行别名?

我有一个有点特殊的 CLI 工作流程,但它对我来说很有效。我通常会迭代命令,然后在下一个命令中使用这些命令的结果。例如:

查找文件:

$ ff thing_im_looking_for_spec
./specs/foo/bar/thing_im_looking_for_spec.rb

重新运行该命令(因为它很快)并将其结果用作另一个程序的参数:

$ rspec `!!`

...扩展为:

$ rspec `ff thing_im_looking_for_spec`

...并运行我正在寻找的测试。从那里我可以按向上箭头并快速编辑以下内容:

$ vim `ff thing_im_looking_for_spec`

...编辑该文件。

我知道这很奇怪,但效果很好。我使用 [反引号][bang][bang][反引号] 来表示“是的,那个东西”感觉很舒服。

但是“`!!”有点难输入。是否可以为其创建别名?我一直不知道该怎么做,因为“`!!”本身就是最后一个命令的别名。

答案1

本身!!可以通过使用 包装在别名或函数中history -p,这允许脚本获取任何 !expansion 的结果(即使整个功能被禁用):

alias 1='eval "$(history -p !!)"'

现在是vim `1`rspec `1`,输入起来相对更方便(不需要 Shift)。但是对于反引号就无能为力了。


嗯,从技术上讲,你可以不使用反引号来实现这一点,但这涉及一些奇怪的技巧:

shopt -s extdebug
trap 'case $BASH_COMMAND in *" that")
          eval "${BASH_COMMAND/%" that"/" $(eval "$(history -p !!)")"}";
          false;
      esac' DEBUG

现在是vim thatrspec that。(此示例仅检测最后的字,以限制爆炸风险。修改以匹配/替换命令行中任何位置的单词留作练习。)


一个不那么奇怪的技巧是绑定一个按键(宏)自动插入,`!!`就像输入一样:

bind '"\e[2~": "`!!`"'

这个例子告诉 bash 的阅读行翻译\e[2~(实际上是Insert键)为`!!`,这样您就可以输入来获得。任何输入(不一定是特殊的键序列)都可以转换为宏。vim Insertvim `!!`

(其他可能的便捷键包括 Alt+Enter \e\n、Ctrl+F \C-f,等等。)

相关内容