fishでNode.js/Denoのパッケージマネージャを自動で補完するプラグインを作った
TL;DR
- fishでNode.js/Denoのパッケージマネージャを自動で補完するプラグインを作った

nを入力すると、lockfileを考慮してnpm, yarn, pnpm, bun, denoのどれかを自動で補完してくれる
はじめに
皆さんは@antfu/ni使ってますか?
niは、npm/yarn/pnpm/bun からプロジェクトの構造を読み取ってよしなにコマンドを選択、実行してくれるCLIツールです。
とても便利なのですが、いくつかの点で不満がありました。
- 機能ごとにコマンドが別れていてそのうち別コマンドと被りそう
- fishの履歴機能と相性が悪い
- fishにはabbrという機能があるのに活用できてない
そこで、fishで自分好みのものを作ることにしました。
先行事例
Nodeに依存せず、シェルスクリプトでni相当の実装をしている例はいくつかあります。
またZshですが、zeno.zshのabbrを用いて今回実装したコマンド展開を行っている例もあります。
作ったもの
作ったものは☝️です。
これをfisherでインストールし、自分の好きなコマンドをabbrとして登録することで、そのコマンドを入力した時に自動的にNode.js/Denoのパッケージマネージャを補完してくれます。
ちなみに自分はかなりdenoを使うので、ちゃっかりdenoにも対応しました。
動作の様子は冒頭にあるGIFをご覧ください。
サブコマンドの補完について
先行事例では、サブコマンドの差異を吸収するような実装がされていました。
例えば、
-
ni->npm install,yarn add -
nun->npm uninstall,yarn remove -
nr dev->npm run dev,yarn dev
などなど。
以前はnpmにaddやremoveといったサブコマンドはありませんでした。yarn、pnpm、bunなど他のパッケージマネージャにはありますね。
またnpmでscriptsを実行する際にはrunを使うのですが、他のパッケージマネージャではrunを省略できますね。
しかし、自分の使っているNode v22では
-
addやremoveがnpmでも使える -
npmでもrunを省略できる
ことが確認できたため、これらのサブコマンドの差異を吸収するような実装は必要ないと判断しました。
(差異を吸収する必要があるとすれば、npm add --global->yarn global addくらいだと思いますが、そもそも自分はglobalのインストールをあまりしない/yarnを使わないので今回は対応していません)
まとめ
fishでNode.js/Denoのパッケージマネージャを自動で補完するプラグインを作りました。
自分の好きなコマンドをabbrとして登録することで、そのコマンドを入力した時に自動的にNode.js/Denoのパッケージマネージャを補完してくれます。
みなさんもぜひ使ってみてください。
Discussion