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