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の場合)

  1. 補完スクリプトの作成 例えば ~/.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
    
  2. 設定ファイルを読み込む ~/.bashrc の末尾に以下の1行を追加します。

    Bash

    source ~/.ptk-completion.bash
    
  3. 設定の反映 ターミナルで以下を実行するか、ターミナルを再起動すれば完了です。

    Bash

    source ~/.bashrc
    

これで、手元の環境で ptk c[Tab] と打つだけで create がシュッと補完されるようになり、開発や日常の操作ストレスがぐっと軽減されます。

CLIの細かいこだわりをどこまで自動化・汎用化するか、どこで割り切るかというバランス調整の備忘録でした!

wanderingdj
  • wanderingdj
  • 田上は文筆業、新田は配信業、にしざわはインターネットジャンキーと、名義をそれぞれ分けてます。
    最近は社会復帰しようとはげんでいる、障害手帳持ちのオジサンです。
    よろしくお願いします。

コメントする

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA