💭

zshでaliasの展開後のコマンドをhistoryに書き込む方法

2022/09/24に公開

https://zenn.dev/convcha/articles/9b8a344930a11e
こちらの記事にて以下のようなaliasをご紹介しました。

.zshrc
alias rt='npx turbo $(cat turbo.json | jq -r ".pipeline | keys | .[]" | fzf)'

ただ、これに限らずなのですがaliasは実行するときは楽でも後でhistoryを見返したときに何をやっているのかわかりにくくなるのが欠点です。
これがfzfやpecoのようなツールを使うaliasの場合はなんせ実行時に対象を絞るので完全に情報が失われてしまいます。
例えば前述のrtコマンドを使いまくったあとのhistoryはこうなります。

rt
rt
rt
rt

でも実際はこんなコマンドが実行されていたわけです。

npx turbo build
npx turbo db:seed
npx turbo dev
npx turbo build

これは色々と不便ですよね。
例えば同じコマンドをもう一度実行したいときは↑ + enterでサクッと実行したいところですが、rtの場合はrtがもう一度実行されるのでまた絞らないといけないわけです。
ということで調べたところ以下のようにaliasを書けば解決できることがわかりました。

.zshrc
alias rt='f=$(cat turbo.json | jq -r ".pipeline | keys | .[]" | fzf); print -rs npx turbo $f; npx turbo $f'

これで展開後のコマンドがhistoryに書き込まれます。
aliasは普通に書いて、後はzshの設定やらプラグインやらで勝手に展開してくれるのが理想なんですけどね...。
globaliasというaliasを展開してくれるプラグインもあるのですが、これはスペースなど何かしらのキーを押さないといけなくて、それはさすがに面倒なんですよね。
(実はできたりする?)

参考

https://unix.stackexchange.com/a/522040

Discussion