コンテンツにスキップ

Shell の補完を良い感じにする

Shell の補完を便利にするための設定を備忘録として残しておく。

背景

Shell の補完はコマンドの入力を助けるための機能である。しかし、デフォルトの機能だけでは各種ツールのサブコマンドやオプションの補完が不十分な場合がある。そのため、補完をより便利にするための設定をしたい。メインで使っているシェルは zsh であるが、最近は nushell も使っているので、それについても補完の設定をしたい。

選択肢と検討

Shell の補完をより便利にするための選択肢はいくつかある。自前で補完関数を書く方法もあるが、それだと手間がかかるため良い感じに補完をサポートしてくれるツールを使いたい。調べたところ、次のツールを検討することにした。

上記のツールを調べたり、実際に使ってみて最終的にargc-completionsを採用することにした。理由は、argc-completionsがデフォルトで多くのコマンドに対応しており、多くの作業をせずに補完を使えるようになるためである。

zsh-completions は補完用のスクリプトをツールごとに特定のディレクトリ配下に配置する必要があるように見えた。モダンなツールは配置する補完用のスクリプトを自動生成できるため、そこまで手間にならないが、補完用のスクリプトを自動で良い感じにしてくれる他のツールが魅力に感じた。

carapace は zsh や nushell の他にも fish や elvish などのシェルに対応している補完ツールである。デフォルトでいくつかのコマンドに対応しており、自分で補完用のスクリプトを書くこともできる。しかし、デフォルトで用意されてる補完のサブコマンドやオプションが古く、最新のものに対応していないことがある。そのため、同様の機能を持つargc-completionsを採用することにした。

argc-completions

以下 LLM によるargc-completionsの紹介

sigoden/argc-completions は、bash、zsh、fish、powershell、nushell など、様々なシェルで動作するコマンド補完機能を提供するオープンソースプロジェクトです。1,000 以上のコマンドに対応し、ヘルプテキストやマニュアルページから自動的に補完スクリプトを生成することで、効率的なコマンド入力とターミナルの高速起動を可能にします。

主要な機能

  • 1,000 以上のコマンド対応: 幅広いコマンドに対応し、使い勝手の良い補完機能を提供します。
  • 自動生成: ヘルプテキストやマニュアルページから自動的に補完スクリプトを生成します。
  • 動的な補完: スクリプトの読み込み回数を減らし、ターミナルの起動時間を短縮します。
  • クロスシェル対応: bash、zsh、powershell、fish、nushell、elvish、xonsh、tcsh など、様々なシェルに対応しています。
  • クロスプラットフォーム対応: Linux、macOS、Windows で動作します。

インストールと設定

  1. GitHub からリポジトリをクローンします。
git clone https://github.com/sigoden/argc-completions.git
  1. シェルに合わせて設定スクリプトを実行します。
./scripts/setup-shell.sh bash

Windows では Git Bash で実行し、macOS では互換性問題を避けるため、brew install bash gawk gnu-sedを実行してください。

その他

  • 独自の補完スクリプト生成: ./scripts/generate.sh your-commandで、独自の補完スクリプトを生成できます。
  • ドキュメント: docs/generate.mddocs/complete-patterns.mdに、詳細な使い方や補完パターンの解説が記載されています。

実際に使ってみる

nushell で git commit の補完を試したところ、次のように補完が効いていることが確認できた。

~/dev/tmp-devbox/argc-completions| git commit --[TAB]                               11/04/2024 06:44:43 AM
--all                   Tell the command to automatically stage files that have been modified and delete...
--patch                 Use the interactive patch selection interface to choose which changes to commit....
--reuse-message         Take an existing commit object, and reuse the log message and the authorship inf...
--reedit-message        Like -C, but with -c the editor is invoked, so that the user can further edit th...
--fixup                 Create a new commit which "fixes up" <commit> when applied with git rebase --aut...
--squash                Construct a commit message for use with rebase --autosquash.
--reset-author          When used with -C/-c/--amend options, or when committing after a conflicting che...
--short                 When doing a dry-run, give the output in the short-format.
--branch                Show the branch and tracking info even in short-format.
...省略

実行結果は省略するが、zsh でも同様に補完が効いていることが確認できた。

ハマりポイント

git の branch や ref, tag の補完が効かなかった。補完用ディレクトリでargc generate gitを実行すると補完が効くようになった。これを実行するとファイルが上書きされ、補完が弱くなるため、補完が効くことを確認したら更新されたファイルを元に戻すと良い。

まとめ

argc-completionsを使うことで、多くのコマンドに対応した補完を簡単に導入できることがわかった。これにより、コマンドの入力を助けるための補完機能をより便利に使うことができる。補完機能を使うことで、コマンドの入力を効率化し、作業効率を向上できる。

参考