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
writeback message: Ready to post a comment.
