Zsh

怎麼用!!在 zsh 別名中

  • April 8, 2015

我正在嘗試創建一個基於我之前的命令的別名。

說我跑

ag foo

查看列表後,我希望能夠在 vim 中使用這些結果,所以我這樣做了

vim -q<(!! --vimgrep)

我想要的別名是

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

但我似乎無法!!在我的別名中使用。我很難找到關於它是什麼!!、內置的、別名的資訊

!!歷史擴展。第一個!開始歷史擴展;!!具有事件指示符,表示上一個命令。

您可以通過內置命令和fc變數訪問命令歷史記錄。historyhistory

由於--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
}

引用自:https://unix.stackexchange.com/questions/195089