Oct 06, 2010

bash で入力補完を設定する方法

シェルを使っていると必ずお世話になる入力補完。 ls と打って、tab を押さないことはまず無いくらい。 自作コマンドでも入力補完に対応したかったので、設定方法を調べてみた。

An introduction to bash completion: part 1
http://www.debian-administration.org/articles/316
An introduction to bash completion: part 2
http://www.debian-administration.org/article/An_introduction_to_bash_completion_part_2
Completion examples
http://bashcookbook.com/bashinfo/source/bash-3.0/examples/complete/complete-examples

設定の基本

コマンド毎に入力補完用の関数を用意し、complete コマンドでシェルに登録する。 例えば、mycmd コマンド用の入力補完関数はこんな感じで記述する。

_mycmd() {
  local cur prev
  cur=${COMP_WORDS[COMP_CWORD]}
  prev=${COMP_WORDS[COMP_CWORD-1]}
  COMPREPLY=()
  if (( $COMP_CWORD <= 1)) || [[ "$cur" == -* ]]; then
    COMPREPLY=( $(compgen -W '-f --file -h --help -v --version' -- $cur) );
    return 0;
  fi
  if [ "$prev" == '-f' -o "$prev" == '--file' ]; then
    COMPREPLY=( $(compgen -f -- $cur) )
    return 0;
  fi
}

入力中の値が COMP_WORDS から取得できるので、その値を基に補完情報を作成し COMPREPLY にセットする。 補完情報の作成をサポートしてくれる compgen が提供されているので、これを使うと便利。
シェルへの登録は前述の通り complete コマンドで行う。

complete -F _mycmd mycmd

ファイル名を補完する方法

compgen をパラメータ "f" で実行する。

    COMPREPLY=( $(compgen -f -- $cur) )

選択肢を補完する方法

compgen をパラメータ "W" で実行する。 "W" の後に選択肢をスペース区切りで指定し、"-- $cur" で入力中の文字とマッチするものだけを補完情報として使用する。

    COMPREPLY=( $(compgen -W '-f --file -h --help -v --version' -- $cur) );

TrackBack ping me at
http://www.in-vitro.jp/blog/index.cgi/Linux/20101006_01.trackback
Post a comment

writeback message: Ready to post a comment.