--- title: "fishでNode.js/Denoのパッケージマネージャを自動で補完するプラグインを作った" date: '2024-05-16' isPublished: true lang: 'ja' --- # TL;DR - fishでNode.js/Denoのパッケージマネージャを自動で補完するプラグインを作った https://github.com/ryoppippi/na.fish ![0.gif](./0.gif) _`n`を入力すると、lockfileを考慮してnpm, yarn, pnpm, bun, denoのどれかを自動で補完してくれる_ # はじめに 皆さんは[@antfu/ni](https://github.com/antfu-collective/ni)使ってますか? `ni`は、npm/yarn/pnpm/bun からプロジェクトの構造を読み取ってよしなにコマンドを選択、実行してくれるCLIツールです。 https://github.com/antfu-collective/ni とても便利なのですが、いくつかの点で不満がありました。 - 機能ごとにコマンドが別れていてそのうち別コマンドと被りそう - fishの履歴機能と相性が悪い - fishには[abbr](https://fishshell.com/docs/current/cmds/abbr.html)という機能があるのに活用できてない そこで、fishで自分好みのものを作ることにしました。 # 先行事例 Nodeに依存せず、シェルスクリプトで`ni`相当の実装をしている例はいくつかあります。 https://efcl.info/2023/03/24/ni/ https://zenn.dev/karibash/articles/0e2cdc16d0596e またZshですが、zeno.zshのabbrを用いて今回実装したコマンド展開を行っている例もあります。 https://www.m3tech.blog/entry/zeno-zsh-abbr # 作ったもの https://github.com/ryoppippi/na.fish 作ったものは☝️です。 これを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のパッケージマネージャを補完してくれます。 みなさんもぜひ使ってみてください。