今回はこの補完機能に迫ります。
$ 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()これをhoge.sh
{
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
として保存して、
$ source hoge.shすると
hogeに対してhokan1 hokan2 kouho1 kouho2が、
hogaに対してはディレクトリが、
hogiに対しては*.txtファイルが、
それぞれ出てきます。
これでプログラムの補完ができたら、ちょっとおしゃれですね。
0 件のコメント:
コメントを投稿