怎么用啊!!在 zsh 别名中

怎么用啊!!在 zsh 别名中

我正在尝试创建一个基于我之前的命令的别名。

说我跑

ag foo

查看列表后,我希望能够在 vim 中使用这些结果,所以我这样做了

vim -q<(!! --vimgrep)

我想要的别名是

alias edit-last='vim -q<(!! --vimgrep)'

但我似乎无法!!在我的别名中使用。我很难找到有关!!内置别名的信息

答案1

!!历史扩展。第一个!开始历史扩展;!!事件指示符意思是上一个命令。

您可以通过以下方式访问命令历史记录fchistory内置函数并通过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
}

相关内容