CLIツールのタブ補完、どこで効く?(アプリ内 vs シェル)とLinux/Bashでの自前実装の小ネタ

以下コピペにつきミスってたらごめん。
自作のCLIツール(今回は Node.js 製の ptk コマンド)を作っているとき、ふと気になったのが「タブ補完(Tab Completion)」の挙動。
開発を進める中で、「CLIのタブ補完」には大きく分けて2つのレイヤーがあり、それぞれ仕組みが全く異なることが見えてきました。今回はその整理と、自分用のLinux(Bash)環境でサクッとタブ補完を効かせる方法についてのメモです。
1. 「起動後のアプリ内補完」と「シェル上のコマンド補完」は別物
CLIツールを作ったり使ったりしていると、「タブキーを押したときの挙動」に遭遇しますが、これは大きく2つに分かれます。
-
① アプリ起動後(対話モード内)のタブ補完
-
ptkを起動した後のプロンプト(チャットや対話画面)内での入力補完。 -
Node.jsの標準モジュール(
readlineのcompleter機能など)を使って、アプリケーション内部で動的に制御できます。 -
実装が比較的シンプルで、クロスプラットフォーム(Linux / macOS / Windows)共通で動きやすいのが特徴。
-
-
② シェル上(Linuxのターミナル等)のコマンド補完
-
端末を開いて、コマンドを打ち始める最初の段階(例:
ptk cr[Tab])での補完。 -
これはOSのシェル(BashやZshなど)が管轄している領域です。
-
グローバルにインストールされたツールであっても、シェル側に「このコマンドにはこういうサブコマンドがある」という補完スクリプトを登録しないと、シェルは補完の仕方がわかりません。
-
すべてのOSやシェル(Bash, Zsh, Fish, PowerShell…)に対応した補完スクリプトを自動生成・配布しようとすると、メンテナンスコストが一気に跳ね上がります。そのため、個人開発やベータ段階のツールであれば、「まずはアプリ内の対話モードの補完に絞る」という割り切りが非常にコストパフォーマンスが良いと感じました。
2. じゃあ、Linux / Bash環境で自分用だけにタブ補完を効かせるには?
「全体対応は面倒だけど、自分の手元のLinux(Bash)環境だけは、ptk のサブコマンド(create, join, list, help など)をTabキーでサクッと補完させたい!」 そんなときは、シェル用の小さな補完スクリプトを自分で書いてホームディレクトリに置くのが一番手っ取り早いです。

🛠️ 具体的な手順(Bashの場合)
-
補完スクリプトの作成 例えば
~/.ptk-completion.bashというファイルを作成し、以下のコードを記述します。Bash_ptk_completion() { local cur prev opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" # 補完させたいサブコマンドの候補 opts="create join list help" if [[ ${COMP_CWORD} -eq 1 ]]; then COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 fi } complete -F _ptk_completion ptk -
設定ファイルを読み込む
~/.bashrcの末尾に以下の1行を追加します。Bashsource ~/.ptk-completion.bash -
設定の反映 ターミナルで以下を実行するか、ターミナルを再起動すれば完了です。
Bashsource ~/.bashrc
これで、手元の環境で ptk c[Tab] と打つだけで create がシュッと補完されるようになり、開発や日常の操作ストレスがぐっと軽減されます。
CLIの細かいこだわりをどこまで自動化・汎用化するか、どこで割り切るかというバランス調整の備忘録でした!