仙豆のレシピ

ちょっとしたことでも書いていく姿勢で

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のときは偽を返すように設定。

なんかもっとうまいことやる方法ないのだろうか