mise run 〇〇(タスクランナー)をfzfで実行しやすくする
miseのタスクランナーはmise run 〇〇
で実行できます。これをfzfと連携してさくっと実行するzshのスクリプトを紹介します。
動作の例
筆者はmise run 何だったっけな~
とタスク名を忘れて、その度に.mise.toml
を確認していました。
これをfzfを使って解決します。
実際に使っている例を見てみましょう。
次のようなファイルを対象に実行しました。
mise runが初めての人
まだmise run
を使ったこと無い人は、初回で次のようにエラーが出ます(2024年10月現在)。
書いてあるとおりmise run
は実験的機能であるため、コマンドでその設定をオンにしておきましょう。
依存
yqとzshを使っていますが、どちらも別のものに置き換え可能です。
yqはtmolファイルからタスクを抽出するために使っています。
zshはキーバインドの割り当てと履歴を残すためにZLEを使っています。
実装の紹介
先にスクリプトの全体を紹介します。
次のセクションから小分けにして順に解説します。
tomlファイルがない場合にエラー
.mise.toml
が無い場合はエラーにします。
send-break
を使わないと、エラーになったときに次のプロンプトが表示されません。
send-break
を使えば、今のプロンプトを終了して新しいプロンプトに切り替わります。
公式ドキュメントを読むとtaskだけ他のtomlファイルに切り出したり、miseのtomlファイルのパスもいろいろあるようですが、今回は.mise.toml
のみを対象としました。必要に応じて変更してください。
yqがなかったらエラー
上記と同様にyq
がなかったらエラーにしています。
タスクを抽出
yqを使って.mise.toml
からタスクを抜き出しています。
この段階ではまだ実行していないため、コマンド部分を改行して掲載します。
ざっくりとこんなステップです。
- yqを実行して
.mise.toml
からtaskを抽出する - yqでエラーがあったら捨てる
- エラーがあったら空文字にする
yqの実行後は次のように"タスク名 = コマンドの内容"
のような文字列に変換されています。
yqのオプション-oj
で出力をJSON形式にしています。こうしないとコマンドに改行を示す\n
が入っている場合にうまく処理できないためです。
タスクがなければエラー
タスクがなかったらエラーにします。
文字列を整形とfzfの実行
また長いコマンドが訪れたので改行したものを見てみましょう。
yqの結果は"hello = echo 'hello'"
のようにダブルクオートが付いているため、sed
で葬ります。
fzf実行後、選択した文字列のうちタスク名の部分だけを抜き出します。
プロンプトを弄ってから実行
プロンプトをリセットして、未選択だったらそのまま終了します。
最後に、履歴にmise run 〇〇
という実行記録を残すためにプロンプトを書き換えてから実行します。
キーバインドのセット
キーバインドの設定も忘れずに。
以上、miseのタスクランナーとfzfの連携でした。
npm run 〇〇
(pnpm
にも対応)についても書いてます。Node.jsを使う人にはおすすめです。
fzfでpackage.jsonのscriptsを選んで実行 | えいじのサイバー備忘録