概要
- BashとZshでの タブ補完 の違いと統一的な実装方法を解説
- Mill build tool での実践例を紹介
- ZshだけでなくBashでも 補完候補の説明文 を表示する手法
- コマンドが1つだけの時にも説明を見せる 工夫
- CLIツールにおける ユーザー体験向上 のヒント
BashとZshでのタブ補完の基本
-
Bash と Zsh ではタブ補完APIが異なるため、両対応の実装が必要
-
タブ補完は、ユーザーが<TAB>を押した時に ハンドラ関数 を呼び出し、入力中の単語やカーソル位置を受け取る仕組み
-
補完候補は 配列 で管理し、入力のプレフィックスに一致するものをリストアップ
-
Bashでは COMPREPLY、Zshでは compadd を使って補完候補を返却
-
設定は ~/.bashrc や ~/.zshrc などに記述し、シェル起動時に読み込ませる
- 例: Mill build toolの
./mill mill.tabcomplete/installコマンドは自動で設定ファイルを更新
- 例: Mill build toolの
補完候補の説明文表示
- Zshは 補完候補の説明文 を標準サポート、Bashは未対応
- 候補生成関数で「単語:説明文」の形式で配列を作成
- Zshでは
compadd -dで 説明文付き候補 を表示 - Bashでは説明文を カットして COMPREPLYに入れることで、単語のみ補完
Bashで説明文を見せるハック
-
Bashで説明文を表示するには、 複数候補 がある時だけ説明文付きで候補を返す
-
候補が1つだけなら説明文をカットし、複数ならそのまま表示
-
Bashは共通プレフィックスしか自動補完しないため、説明文がコマンドラインに挿入されることはない
- 例:
foo <TAB>→ 候補+説明文一覧を表示foo a<TAB>→ プレフィックス一致の候補+説明文のみ表示
- 例:
完全一致時にも説明文を表示する工夫
-
コマンドが 1つだけ一致 した場合でも説明文を表示したい場合は、 ダミー候補 を追加
-
1つの候補+説明文と、説明文なしの同じ単語を2つ返すことで、シェルが候補一覧を表示
-
実際に補完されるのは説明文なしの単語のみ
- Bash・Zshともにこの方法で 完全一致時の説明文表示 が可能
実装例のまとめ
-
補完ロジックは _generate_foo_completions 関数に集約
-
BashとZshで 補完API の違いを吸収しつつ、UXを向上
-
補完候補の 説明文 はCLIツールの学習コストを下げる重要な機能
- Mill, Maven, Gradleなど ラッパースクリプト 型のツールにも有効
CLIツール開発者へのアドバイス
- Bash/Zsh両対応 の補完スクリプトを用意することで、幅広いユーザーに快適な体験を提供
- 補完候補の 説明文 を積極的に活用し、ユーザーが迷わずコマンドを選択できるようにする
- シェルの仕様差異を吸収しつつ、 一貫した補完体験 を目指す設計が重要