前のコマンドに基づいてエイリアスを作成しようとしています。
私が走ると言う
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
}