2011年4月15日金曜日

bashの補完機能を試す(rosbashの中身を見てみる)

roscdやrostopicを初めて使ったとき、その補完機能にびっくりした人は私だけじゃないはず。
今回はこの補完機能に迫ります。

$ roscd rosbash
して、そのなかのrosbashというファイルを見てみます。

ここにはいろいろ書いてありますが以下に注目しました。

function _roscomplete {
local arg opts
COMPREPLY=()
arg="${COMP_WORDS[COMP_CWORD]}"
opts="`_ros_list_packages` `_ros_list_stacks`"
IFS=$'\n'
COMPREPLY=($(compgen -W "${opts}" -- ${arg}))
unset IFS
}
complete -F "_roscomplete" "rosmake"
$ man bash
として、compgenを検索するとこの使い方が書いてありました。
上記の例ではrosmakeというコマンドの引数の補完として、_roscomplete関数を用いる。
そして、${opts}変数に入っている文字列をIFS変数を区切り文字として使って、
現在入力中の${arg}を補完する。という意味になるみたいです。-Wはwordの意味。
-Wを-Gにすると正規表現も使えるみたいです。

試しに以下のようなファイルを作ってみました。

_hoge()
{
local arg
COMPREPLY=()
arg=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=($(compgen -W 'hokan1 hokan2 kouho1 kouho2' -- $arg))
}
complete -F _hoge hoge

_hoga()
{
local arg
COMPREPLY=()
arg=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=($(compgen -o dirnames -- $arg))
}
complete -F _hoga hoga

_hogi()
{
local arg
COMPREPLY=()
arg=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=($(compgen -G "${arg}*.txt" -- $arg))
}
complete -F _hogi hogi
これをhoge.sh
として保存して、
$ source hoge.sh
すると
hogeに対してhokan1 hokan2 kouho1 kouho2が、
hogaに対してはディレクトリが、
hogiに対しては*.txtファイルが、
それぞれ出てきます。

これでプログラムの補完ができたら、ちょっとおしゃれですね。

0 件のコメント:

コメントを投稿