自作Zshプラグイン・CLIツールの使用状況報告

ここ数年の間にいくつかの小さいZshプラグインCLIツールを作成しました。

頻繁に使用しているものもあればその実そうでないものもあります。本記事では現在の自作プラグイン・ツールの使用状況を報告します。

1. Almel

Almelは高速に動作するカスタマイズ性に優れたシェルプロンプトです。

ryooooooga.hateblo.jp

かれこれ3年以上使用しており、自作Zshプロンプトを非同期対応した - 茅の下で紹介したように非同期描画に対応したことで(自作なので当たり前ではあるのですが)不満点を克服し、より手放し難いものになりました。

ryooooooga.hateblo.jp

上記記事を書くにあたり参考のために人気の高い Powerlevel10k を使用したこともあったのですが、セットアップの容易さなどを鑑みても今後他のプロンプトに乗り換えることはおそらくありません。

今後の機能追加を積極的に行っていくつもりはない(なにせ現状に満足しているため)一方で、コンフィグファイルの構造などには反省点も多いので、別の名前で作り直すことはひょっとしたらあるかもしれません。

2. Zouch

Zouchはテンプレートから新規ファイルを生成するコマンドです。

ryooooooga.hateblo.jp

これは現在でもちょくちょく使っており、また-rオプションを付けることで中間ディレクトリの作成も行えて便利なため、touchコマンドの代わりに使用することもしばしばです。

もっともよく生成しているファイルはおそらく .editorconfig.gitignore で、これらはFZFを利用してインタラクティブに内容を生成できるようにしています。

一方で、一定のルールに従って複数のファイルを同時に出力したい (hoge.gohoge_test.go, src/main/java/.../Piyo.javasrc/test/java/.../PiyoTest.java など) という瞬間も多く、そのような場合のためにmdmgの導入を検討しています。

blog.himanoa.net

3. zabrze

zabrzeは略語展開を行うZshプラグインです。

ryooooooga.hateblo.jp

もっとも使用頻度が高く、もっとも生産性を向上させているZshプラグインです。

evaluateやzabrzeのアイデアの根幹であるcontextといった機能は上記記事公開後に(パクリ元である)zeno.zshにも逆輸入され、さらにzeno.zshの実行パフォーマンスも改善されたため記事中で紹介したいくつかのユースケースはzeno.zshで代替可能になったのですが、その後のzabrzeへの機能追加によってより発展的な展開が行えるようになりました。

追加された機能:

  1. 正規表現による略語マッチ
  2. コマンド全体の置換
  3. 条件付きの略語展開

1. 正規表現による略語マッチ

マッチする略語のパターンを正規表現で指定できるようになりました。

abbrevs:
  # cp を cp -i に, mv を mv -i  に展開する 
  - name: cp/mv
    abbr-pattern: ^(cp|mv)$
    snippet: $abbr -i # マッチした略語は $abbr という変数でアクセスできる
    evaluate: true

  # .N を awk '{ print $N }' に展開する
  - name: .N
    abbr-pattern: ^\.\d+$
    snippet: awk '{ print ${abbr/./$} }'
    evaluate: true

これにより、複数の略語を1つの設定で記述できるようになりました。

2. コマンド全体の置換

以前は入力の置換対象は略語のみに限られていましたが、コマンド全体を置換することが可能になりました。

abbrevs:
  # cd - を popd に展開する
  - name: cd -
    abbr: "-"
    snippet: popd
    action: replace-all # コマンド全体を置換する
    global: true
    context: ^cd\s+-$

また、上で紹介した正規表現による略語マッチと組み合わせることでsuffix aliasを実現できるようになりました。

abbrevs:
  # *.py を python3 *.py に展開する
  - name: python3 *.py
    abbr-pattern: \.py$
    snippet: python3 $abbr
    evaluate: true

3. 条件付きの略語展開

略語展開の条件を設定できるようになりました。

これにより「macOSでのみ展開する」、あるいは「特定のコマンドが存在している場合のみ展開する」略語が実現できるようになりました。

abbrevs:
  # macOSでのみ展開される
  - name: chrome
    abbr: chrome
    snippet: open -a 'Google Chrome'
    if: '[[ "$OSTYPE" =~ darwin ]]'

  # trashコマンドが存在するときのみ rm を trash に展開する
  - name: trash
    abbr: rm
    snippet: trash
    if: (( ${+commands[trash]} ))

  # trashコマンドが存在しないときは rm を rm -ri に展開する
  - name: rm
    abbr: rm
    snippet: rm -ri

4. qtmut

qtmut はTmuxinatorの代替ツールです。

ryooooooga.hateblo.jp

あんまり使っていません (ZLEに組み込んでいるため呼び出しはしているが、本来の用途では使っていない)。Tmuxを生で呼び出す場合に比べやや遅く感じるためRustなどを用いて再実装することを考えていますが、使用頻度は高くないので腰は重いです。

5. commitizen-deno

commitizen-deno はDeno製のcommitizenクライアントです。

ryooooooga.hateblo.jp

たまに使用します。が、直接 lazygit で feat(Hoge): .... のようなコミットメッセージを入力してしまうことの方が多いです。

6. qwy

qwy はpmyのクローンです。

github.com

ryooooooga.hateblo.jp

紹介記事を書いたことはありませんが、半年ほど前に作成したツールです。

pmyから使用していない機能を削除し、設定ファイルの項目を整理することで設定間の再利用性を高めたものです。が、多くの人にとってはzeno.zshで十分なのでREADMEからして他人に使わせる気がありません。

現在運用している設定のほぼ全てが以前pmyで使用していたものを移植したものです。

ファイル名の補完に利用することが多く、1日に1回程度のあまり高くない頻度で利用しています。

まとめ

よく使用しているものもあればそうでもないものもありますが、使っていない=存在している価値がない, 作る価値がない、ということではないですし、手札を増やすことは良いことなので今後もそんなに使わないものを作っていきたいですね。

自分の運用している設定はdotfilesリポジトリで確認できます。