Shell の補完を良い感じにする¶
Shell の補完を便利にするための設定を備忘録として残しておく。
背景¶
Shell の補完はコマンドの入力を助けるための機能である。しかし、デフォルトの機能だけでは各種ツールのサブコマンドやオプションの補完が不十分な場合がある。そのため、補完をより便利にするための設定をしたい。メインで使っているシェルは zsh であるが、最近は nushell も使っているので、それについても補完の設定をしたい。
選択肢と検討¶
Shell の補完をより便利にするための選択肢はいくつかある。自前で補完関数を書く方法もあるが、それだと手間がかかるため良い感じに補完をサポートしてくれるツールを使いたい。調べたところ、次のツールを検討することにした。
- zsh-completions
- argc-completions
- carapace
上記のツールを調べたり、実際に使ってみて最終的に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 で動作します。
インストールと設定¶
- GitHub からリポジトリをクローンします。
- シェルに合わせて設定スクリプトを実行します。
Windows では Git Bash で実行し、macOS では互換性問題を避けるため、
brew install bash gawk gnu-sed
を実行してください。その他¶
- 独自の補完スクリプト生成:
./scripts/generate.sh your-command
で、独自の補完スクリプトを生成できます。- ドキュメント:
docs/generate.md
とdocs/complete-patterns.md
に、詳細な使い方や補完パターンの解説が記載されています。
実際に使ってみる¶
nushell で git commit の補完を試したところ、次のように補完が効いていることが確認できた。
実行結果は省略するが、zsh でも同様に補完が効いていることが確認できた。
ハマりポイント¶
git の branch や ref, tag の補完が効かなかった。補完用ディレクトリでargc generate git
を実行すると補完が効くようになった。これを実行するとファイルが上書きされ、補完が弱くなるため、補完が効くことを確認したら更新されたファイルを元に戻すと良い。
まとめ¶
argc-completions
を使うことで、多くのコマンドに対応した補完を簡単に導入できることがわかった。これにより、コマンドの入力を助けるための補完機能をより便利に使うことができる。補完機能を使うことで、コマンドの入力を効率化し、作業効率を向上できる。