我正在尝试创建一个基于我之前的命令的别名。
说我跑
ag foo
查看列表后,我希望能够在 vim 中使用这些结果,所以我这样做了
vim -q<(!! --vimgrep)
我想要的别名是
alias edit-last='vim -q<(!! --vimgrep)'
但我似乎无法!!
在我的别名中使用。我很难找到有关!!
内置别名的信息
答案1
!!
是历史扩展。第一个!
开始历史扩展;!!
有事件指示符意思是上一个命令。
您可以通过以下方式访问命令历史记录fc
和history
内置函数并通过history
多变的。
由于--vimgrep
仅对 有意义ag
,因此如果将别名应用于最后一个ag
命令,它会更有用。您可以ag
像这样找到上一个命令:
${${(M)history:#ag *}[1]}
此外,您需要将 注入--vimgrep
到命令中。
alias edit-last='vim -q<(eval "${${(M)history:#ag *}[1]} --vimgrep")'
如果您更改了当前目录,最后一个ag
命令将不再有意义。这很难被发现。您可能希望将可接受的命令列入白名单。当然,这不是一个完美的测试。
edit-last () {
local cmd
setopt local_options extended_glob
for cmd in $history; do
case $cmd in
((ls|(cvs|git|hg|svn) status)(| *)) :;;
("ag "*) vim -q<(eval "$cmd --vimgrep"); return;;
(edit-last) :;;
(*) echo >&2 "The previous ag command is too old."; return 125;;
esac
done
}