2011年6月14日火曜日

プライベートなパッケージだけにroscdするotlcdを作ったよ

Minecraftがこのブログのトップにあると色々不安なので更新します。

私は一応趣味でrosのパッケージを作ってみています。
大体パッケージ名はotl_hogehogeという名前になっています。
rosはwikiのドキュメントとかがいきなりパッケージ名なので、これが他の人とかぶると困るからです。

普段、自分が作ったパッケージに移動(cd)するには

$ roscd otl_
と入力して、Tabを押してそこから目的のパッケージを探しています。

これをもっと簡単にするotlcdを作ります。

$ otlcd
と入力して、Tabを押すと
$ otlcd otl_
と展開されて、もう一度Tabを押すと候補("otl_"で始まるパッケージ)一覧が表示される、という状態にしたいです。


というわけでroscdを参考に、というか、ちょっとだけいじって作ってみました。
ソースは以下のような感じ。

function _otlcomplete_sub_dir {
    local arg opts rosvals
    COMPREPLY=()
    arg="${COMP_WORDS[COMP_CWORD]}"
    _ros_decode_path ${arg}
    if [[ -z ${rosvals[2]} ]]; then
        opts=`_ros_list_locations | grep ^${OTLCD_PREFIX}`        IFS=$'\n'
        COMPREPLY=($(compgen -W "${opts}" -S / -- ${rosvals[0]}))
        unset IFS
    else
        if [ -e ${rosvals[1]}${rosvals[2]} ]; then
          opts=`find -H ${rosvals[1]}${rosvals[2]} -maxdepth 1 -mindepth 1 -type d
 ! -regex ".*/[.].*" -print0 | tr '\000' '\n' | sed -e "s/.*\/\(.*\)/\1\//g"`
        else
          opts=''
        fi
        IFS=$'\n'
        COMPREPLY=($(compgen -P ${rosvals[0]}${rosvals[2]} -W "${opts}" -- ${rosvals[3]}))
        unset IFS
    fi
}
alias otlcd=roscd
complete -F "_otlcomplete_sub_dir" -o "nospace" "otlcd"
これをotl_bashパッケージにotlbashというファイル名で作りました。
赤いところをいじってあとはrosbashのコピペです。
(やっつけ感がすごくてすみませんがsubversionにいれておきました)


.bashrcでsetup.bashを読み込んだあとで以下の記述を追加すると使えます。

export OTLCD_PREFIX="otl_"
source `rospack find otl_bash`/otlbash
OTLCD_PREFIXに好きな文字列を入れられるので、もし私と同じようなprefixをパッケージ名に付けている人はいかがでしょうか?

0 件のコメント:

コメントを投稿