zshで「!」をaliasしたい2
前に同じことをしようとして書いた .zshrc を少し改良した。
senz.hatenablog.com
前のやつだと
$ history 133 v 134 v 135 v 136 v
みたいになるし「↑」キーでも当然vしか戻らないので具合が悪かった。
よって以下に変更。
function v(){ cmd=`fc -ln 1 | grep "^v." | tail -1 | sed -e "s|~|$HOME|"` print -Sr $cmd # add to history eval $cmd } zshaddhistory(){ local line=${1%%$'\n'} local cmd=${line%% *} # if $cmd==v, don't add to history [[ ${cmd} != v ]] }
ざっくり説明を書くと、
v()でvが入力されたときの挙動を指定。
まず前回と同様にhistoryのうちvから始まる最新のコマンドを取得し変数$cmdに代入。
print -Sr でhistoryに追加、その後実行。
(2021.08.14 追記:`r` オプションを追加。これはエスケープを無視するオプションで、Next.js の Dynamic Routes とかで `pages/post/[pid].js` みたいなファイル名を取り扱うときなどに必要だった。)
zshaddhistory()はコマンドが実行されてからhistoryに書き込まれる前に実行され、
偽が返るとhistoryに書き込まないというものらしい。
よってコマンドがvのときは偽を返すように設定。
なんかもっとうまいことやる方法ないのだろうか