Skip to content

Instantly share code, notes, and snippets.

@mjcarroll
Created March 20, 2012 15:00
Show Gist options
  • Save mjcarroll/2136577 to your computer and use it in GitHub Desktop.
Save mjcarroll/2136577 to your computer and use it in GitHub Desktop.
# rosbash - functions to support ROS users
# Useful things to know:
# 'local' variables get unset after function, all others stay forever
# COMPREPLY is the var used by bash complete builtin
function _rossed {
if [[ `uname` == Darwin || `uname` == FreeBSD ]]; then
sed -E "$@"
else
sed -r "$@"
fi
}
function _rosfind {
if [[ `uname` == Darwin || `uname` == FreeBSD ]]; then
# BSD find needs -E for extended regexp
find -E "$@"
else
find "$@"
fi
}
# _ros_location_find
# based on $ROS_LOCATIONS, which the user can set to any colon
# separated of key=folder pairs also resolves keys 'log' and
# 'test_results' to ROS defaults finally resolves to package, then
# stack echoes its result
function _ros_location_find {
local homedir ROS_LOCATION_KEYS_ARR ROS_LOCATIONS_ARR loc
homedir=`echo $HOME | sed -e "s/\//\t\//g" -e "s/\t/\\\\\/g"`
ROS_LOCATION_KEYS_ARR=(`echo $ROS_LOCATIONS | _rossed -e 's/([^:=]*)=([^:=]*)(:*[^=])*(:|$)/\1 /g'`)
ROS_LOCATIONS_ARR=(`echo $ROS_LOCATIONS | _rossed -e 's/([^:=]*)=([^:=]*)(:*[^=])*(:|$)/\2 /g' -e "s/~/${homedir}/g"`)
for (( i = 0 ; i < ${#ROS_LOCATION_KEYS_ARR[@]} ; i++ )); do
if [[ $1 == ${ROS_LOCATION_KEYS_ARR[$i]} ]]; then
echo ${ROS_LOCATIONS_ARR[i]}
return 0
fi
done
if [[ $1 == log ]]; then
echo `roslaunch-logs`
return 0
elif [[ $1 == test_results ]]; then
echo `rosrun rosunit test_results_dir.py`
return 0
fi
loc=`export ROS_CACHE_TIMEOUT=-1.0 && rospack find $1 2> /dev/null`
if [[ $? != 0 ]]; then
loc=`export ROS_CACHE_TIMEOUT=-1.0 && rosstack find $1 2> /dev/null`
if [[ $? != 0 ]]; then
return 1
fi
echo $loc
return 0
fi
echo $loc
return 0
}
function _ros_list_locations {
local ROS_LOCATION_KEYS packages stacks
ROS_LOCATION_KEYS=`echo $ROS_LOCATIONS | _rossed -e 's/([^:=]*)=([^:=]*)(:*[^=])*(:|$)/\1 /g'`
packages=`export ROS_CACHE_TIMEOUT=-1.0 && rospack list-names`
stacks=`export ROS_CACHE_TIMEOUT=-1.0 && rosstack list-names`
echo $packages $stacks log test_results $ROS_LOCATION_KEYS | tr ' ' '\n'
return 0
}
function _ros_package_find {
local loc
loc=`export ROS_CACHE_TIMEOUT=-1.0 && rospack find $1 2> /dev/null`
if [[ $? != 0 ]]; then
return 1
fi
echo $loc
return 0
}
function _ros_list_packages {
local packages
packages=`export ROS_CACHE_TIMEOUT=-1.0 && rospack list-names`
echo $packages | tr ' ' '\n'
return 0
}
function _ros_list_stacks {
local stacks
stacks=`export ROS_CACHE_TIMEOUT=-1.0 && rosstack list-names`
echo $stacks | tr ' ' '\n'
return 0
}
# takes as argument either just a package-path or just a pkgname
# returns 0 for no argument or if package (+ path) exist, 1 else
# on success with arguments returns [pkgname, abspath, relpath basename]
function _ros_decode_path {
local rosname rosdir reldir last
rosvals=()
if [[ -z $1 ]]; then
return 0
fi
if [[ $1 =~ .+/.* ]]; then
rosname=${1%%/*}
reldir=/${1#*/}
last=${reldir##*/}
reldir=${reldir%/*}/
else
rosname=$1
if [[ -z $2 || $2 != "forceeval" ]]; then
rosvals=(${rosname})
return 1
fi
fi
rosdir=`_ros_location_find $rosname`
if [[ $? != 0 ]]; then
rosvals=(${rosname})
return 1
fi
rosvals=(${rosname} ${rosdir} ${reldir} ${last})
}
function rospython {
local pkgname
if [[ $1 = "--help" ]]; then
echo -e "usage: rospython [package] \n\nRun python loading package manifest first."
return 0
fi
if [[ -z $1 ]]; then
if [[ -f ./manifest.xml ]]; then
pkgname=`basename \`pwd\``
python -i -c "import roslib; roslib.load_manifest('$pkgname')"
else
python
fi
else
python -i -c "import roslib; roslib.load_manifest('$1')"
fi
}
function roscd {
local rosvals
if [[ $1 = "--help" ]] | [[ $# -gt 1 ]]; then
echo -e "usage: roscd package\n\nJump to target package."
return 0
fi
if [ -z $1 ]; then
if [ -z $ROS_WORKSPACE ]; then
echo -e "No ROS_WORKSPACE set. Please set ROS_WORKSPACE to use roscd with no arguments."
return 1
fi
cd ${ROS_WORKSPACE}
return 0
fi
_ros_decode_path $1 forceeval
if [ $? != 0 ]; then
echo "roscd: No such package/stack '$1'"
return 1
elif [ -z $rosvals ]; then
if [ -z $ROS_WORKSPACE ]; then
echo -e "No ROS_WORKSPACE set. Please set ROS_WORKSPACE to use roscd with no arguments."
return 1
fi
cd ${ROS_WORKSPACE}
return 0
else
cd ${rosvals[1]}${rosvals[2]}${rosvals[3]}
return 0
fi
}
function _is_integer {
[ "$1" -eq "$1" ] > /dev/null 2>&1
return $?
}
function rosd {
if [[ $1 = "--help" ]]; then
echo -e "usage: rosd\n\nDisplays the list of currently remembered directories with indexes."
return 0
fi
let count=0;
for items in `dirs`;
do
echo $count $items;
let count=$((count+1));
done
}
function rospd {
if [[ $1 = "--help" ]]; then
echo -e "usage: rospd\n\nLike pushd, also accepts indexes from rosd."
return 0
fi
if _is_integer $1; then
pushd +$1 > /dev/null ;
else
local rosvals
_ros_decode_path $1 forceeval
pushd ${rosvals[1]}${rosvals[2]}${rosvals[3]} > /dev/null ;
fi
rosd
}
function rosls {
local rosvals
if [[ $1 = "--help" ]]; then
echo -e "usage: rosls [package]\n\nLists contents of a package directory."
return 0
fi
_ros_decode_path $1 forceeval
ls ${rosvals[1]}${rosvals[2]}${rosvals[3]} $2
}
# sets arg as return value
function _roscmd {
local pkgdir exepath opt catkin_source_dir catkin_binary_dir opts
if [[ -n $CATKIN_SOURCE_DIR ]]; then
catkin_source_dir=`ROS_ROOT=$CATKIN_SOURCE_DIR ROS_PACKAGE_PATH= _ros_package_find $1`
fi
if [[ -n $CATKIN_BINARY_DIR && -f $CATKIN_BINARY_DIR/etc/packages.list ]]; then
cbd=`grep $1 $CATKIN_BINARY_DIR/etc/packages.list | cut -d " " -f 2`
if [[ -n $cbd ]]; then
catkin_binary_dir=$CATKIN_BINARY_DIR/$cbd
fi
fi
pkgdir=`_ros_package_find $1`
if [[ -z $catkin_source_dir && -z $catkin_binary_dir && -z $pkgdir ]]; then
echo "Couldn't find package [$1]"
return 1
fi
exepath=(`find -L $catkin_source_dir $catkin_binary_dir $pkgdir -name $2 -type f ! -regex .*/[.].* ! -regex .*$pkgdir\/build\/.* | uniq`)
if [[ ${#exepath[@]} == 0 ]] ; then
echo "That file does not exist in that package."
return 1
elif [[ ${#exepath[@]} -gt 1 ]] ; then
echo "You have chosen a non-unique filename, please pick one of the following:"
select opt in ${exepath[@]}; do
echo $opt
break
done
else
opt=${exepath[0]}
fi
arg=${opt}
}
function rosed {
local arg
if [[ $1 = "--help" ]]; then
echo -e "usage: rossed [package] [file]\n\nEdit a file within a package."
return 0
fi
_roscmd ${1} ${2}
if [[ -n ${arg} ]]; then
if [[ -z $EDITOR ]]; then
vim ${arg}
else
$EDITOR ${arg}
fi
fi
}
function roscp {
local arg
if [[ $1 = "--help" ]] | [[ $# -ne 3 ]]; then
echo -e "usage: roscp package filename target\n\nCopy a file from a package to target location."
return 0
fi
_roscmd ${1} ${2}
cp ${arg} ${3}
}
function rosawesome {
alias megamaid=rosrecord
alias suck2blow=rosplay
alias botherder=roscore
}
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
}
function _roscomplete_rosmake {
local arg
COMPREPLY=()
arg="${COMP_WORDS[COMP_CWORD]}"
_roscomplete
if [[ ${arg} =~ \-\-.* ]]; then
COMPREPLY=(${COMPREPLY[@]} $(compgen -W "--test-only --all --mark-installed --unmark-installed --robust --build-everything --specified-only --buildtest --buildtest1 --output --pre-clean --bootstrap --disable-logging --target --pjobs= --threads --profile --skip-blacklist --status-rate" -- ${arg}))
fi
}
function _roscomplete_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`
IFS=$'\n'
COMPREPLY=($(compgen -W "${opts}" -S / -- ${rosvals[0]}))
unset IFS
else
if [ -e ${rosvals[1]}${rosvals[2]} ]; then
opts=`find -L ${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
}
function _msg_opts {
local arg pkgs pkgname msgname searchmsg path
if [[ $1 =~ .+/.* ]]; then
pkgname=${1%%/*}
msgname=${1#*/}
searchmsg=1
else
pkgname=${1}
fi
if [[ -z ${searchmsg} ]]; then
pkgs=(`rospack list`)
for (( i = 0 ; i < ${#pkgs[@]} ; i=i+2 )); do
if [[ -d ${pkgs[i+1]}/msg ]]; then
echo ${pkgs[i]}/
fi
done
else
path=`rospack find ${pkgname}`
if [ -d ${path}/msg ]; then
echo `find -L ${path}/msg -maxdepth 1 -mindepth 1 -name *.msg ! -regex ".*/[.].*" -print0 | tr '\000' '\n' | sed -e "s/.*\/\(.*\)\.msg/${pkgname}\/\1/g"`
fi
fi
}
function _srv_opts {
local arg pkgs pkgname srvname searchsrv path count opts
if [[ $1 =~ .+/.* ]]; then
pkgname=${1%%/*}
srvname=${1#*/}
searchsrv=1
else
pkgname=${1}
fi
if [[ -z ${searchsrv} ]]; then
pkgs=(`rospack list | grep "^${pkgname}"`)
count=0
opts=""
for (( i = 0 ; i < ${#pkgs[@]} ; i=i+2 )); do
if [[ -d ${pkgs[i+1]}/srv ]]; then
opts="$opts ${pkgs[i]}/"
pkgname=${pkgs[i]}
count=$((count+1))
fi
done
if [[ $count -gt 1 ]]; then
echo $opts
return 0
fi
fi
path=`rospack find ${pkgname} 2> /dev/null`
if [ $? -eq 0 ] && [ -d ${path}/srv ]; then
echo `find -L ${path}/srv -maxdepth 1 -mindepth 1 -name *.srv ! -regex ".*/[.].*" -print0 | tr '\000' '\n' | sed -e "s/.*\/\(.*\)\.srv/${pkgname}\/\1/g"`
fi
}
function _roscomplete_rossrv {
COMPREPLY=()
arg="${COMP_WORDS[COMP_CWORD]}"
if [[ $COMP_CWORD == 1 ]]; then
opts="show list md5 package packages"
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
elif [[ $COMP_CWORD == 2 ]]; then
case ${COMP_WORDS[1]} in
show|users|md5)
opts=`_srv_opts ${COMP_WORDS[$COMP_CWORD]}`
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
;;
package)
opts=`rospack list-names`
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
;;
packages|list)
# This shouldn't really have a completion rule
;;
esac
fi
}
function _roscomplete_search_dir {
local arg opts pkgdir catkin_source_dir catkin_binary_dir
COMPREPLY=()
arg="${COMP_WORDS[COMP_CWORD]}"
if [[ $COMP_CWORD == 1 ]]; then
opts=`_ros_list_packages`
IFS=$'\n'
COMPREPLY=($(compgen -W "${opts}" -- ${arg}))
unset IFS
elif [[ $COMP_CWORD == 2 ]]; then
if [[ -n "$CATKIN_SOURCE_DIR" ]]; then
catkin_source_dir=`ROS_ROOT=$CATKIN_SOURCE_DIR ROS_PACKAGE_PATH= _ros_package_find ${COMP_WORDS[1]}`
fi
if [[ -n $CATKIN_BINARY_DIR && -f $CATKIN_BINARY_DIR/etc/packages.list ]]; then
cbd=`grep ${COMP_WORDS[1]} $CATKIN_BINARY_DIR/etc/packages.list | cut -d " " -f 2`
if [[ -n $cbd ]]; then
catkin_binary_dir=$CATKIN_BINARY_DIR/$cbd
fi
fi
pkgdir=`_ros_package_find ${COMP_WORDS[1]}`
if [[ -n "$catkin_source_dir" || -n "$catkin_binary_dir" || -n "$pkgdir" ]]; then
opts=`_rosfind -L $catkin_source_dir $catkin_binary_dir $pkgdir ${1} ! -regex ".*/[.].*" ! -regex ".*$pkgdir\/build\/.*" -print0 | tr '\000' '\n' | sed -e "s/.*\/\(.*\)/\1/g"`
else
opts=""
fi
IFS=$'\n'
COMPREPLY=($(compgen -W "${opts}" -- ${arg}))
unset IFS
else
homedir=`echo $HOME | sed -e "s/\//\t\//g" -e "s/\t/\\\\\/g"`
arg=`echo ${arg} | sed -e "s/~/${homedir}/g"`
if [[ $arg =~ ^/*.+/.* ]]; then
path=${arg%/*}
else
path=.
fi
if [[ -e ${path} ]]; then
opts=`find -L $path -maxdepth 1 -type d ! -regex ".*/[.].*" ! -regex "^[.]/" -print0 | tr '\000' '\n' | sed -e "s/$/\//g" -e "s/^[.]\///g" -e "s/'/\\\\\'/g" -e "s/ /\\\\\ /g"`$'\n'`find -L $path -maxdepth 1 -type f ! -regex ".*/[.][^.]*" ! -regex "^[.]/" -print0 | tr '\000' '\n' | sed -e "s/^[.]\///g" -e "s/'/\\\\\'/g" -e "s/ /\\\\\ /g"`
else
opts=""
fi
IFS=$'\n'
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
unset IFS
if [[ ${#COMPREPLY[*]} = 1 ]]; then
newpath=${COMPREPLY[0]%/*}
if [[ -d ${newpath} ]]; then
opts=`find -L $newpath -maxdepth 1 -type d ! -regex ".*/[.].*" ! -regex "^[.]/" -print0 | tr '\000' '\n' | sed -e "s/$/\//g" -e "s/^[.]\///g" -e "s/'/\\\\\'/g" -e "s/ /\\\\\ /g"`$'\n'`find -L $newpath -maxdepth 1 -type f ! -regex ".*/[.][^.]*" ! -regex "^[.]/" -print0 | tr '\000' '\n' | sed -e "s/^[.]\///g" -e "s/'/\\\\\'/g" -e "s/ /\\\\\ /g"`
IFS=$'\n'
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
unset IFS
fi
fi
fi
}
function _roscomplete_exe {
_roscomplete_search_dir "-type f -perm +111"
}
function _roscomplete_file {
_roscomplete_search_dir "-type f ! -regex .*[.][oa]$"
}
function _roscomplete_launch {
arg="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=()
if [[ ${arg} =~ \-\-.* ]]; then
COMPREPLY=(${COMPREPLY[@]} $(compgen -W "--files --args --nodes --find-node --child --local --screen --server_uri --run_id --wait --port --core --pid --dump-params" -- ${arg}))
else
_roscomplete_search_dir "( -type f -regex .*\.launch$ -o -type f -regex .*\.test$ )"
if [[ $COMP_CWORD == 1 ]]; then
COMPREPLY=($(compgen -o plusdirs -f -X "!*.launch" -- ${arg}) ${COMPREPLY[@]} $(compgen -o plusdirs -f -X "!*.test" -- ${arg}) ${COMPREPLY[@]})
fi
fi
}
function _roscomplete_test {
arg="${COMP_WORDS[COMP_CWORD]}"
if [[ ${arg} =~ \-\-.* ]]; then
COMPREPLY=(${COMPREPLY[@]} $(compgen -W "--bare --bare-limit --bare-name --pkgdir --package" -- ${arg}))
else
_roscomplete_search_dir "( -type f -regex .*\.launch$ -o -type f -regex .*\.test$ )"
if [[ $COMP_CWORD == 1 ]]; then
COMPREPLY=($(compgen -o plusdirs -f -X "!*.launch" -- ${arg}) ${COMPREPLY[@]} $(compgen -o plusdirs -f -X "!*.test" -- ${arg}) ${COMPREPLY[@]})
fi
fi
}
function _roscomplete_rosbag {
local opts
COMPREPLY=()
arg="${COMP_WORDS[COMP_CWORD]}"
if [[ $COMP_CWORD == 1 ]]; then
opts="check compress decompress filter fix help info play record reindex"
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
else
if [[ ${arg} =~ \-\-.* ]]; then
case ${COMP_WORDS[1]} in
check)
opts="--genrules --append --noplugins --help"
;;
compress|decompress)
opts="--output-dir --force --quiet --help"
;;
filter)
opts="--print --help"
;;
fix)
opts="--force --noplugins --help"
;;
info)
opts="--yaml --key --freq --help"
;;
play)
opts="--help --quiet --immediate --pause --queue --clock --hz --delay --rate --start --skip-empty --loop --keep-alive --try-future-version --topics --bags"
;;
record)
opts="--help --all --regex --exclude --quiet --output-prefix --output-name --split --size --duration --buffsize --limit --node --bz2"
;;
reindex)
opts="--help --force --quiet --output-dir"
;;
esac
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
fi
fi
}
function _roscomplete_rospack {
local arg opts
COMPREPLY=()
arg="${COMP_WORDS[COMP_CWORD]}"
if [[ $COMP_CWORD == 1 ]]; then
opts="help find list list-names list-duplicates langs depends depends-manifests depends1 depends-indent depends-msgsrv depends-why rosdep rosdep0 vcs vcs0 depends-on depends-on1 export plugins cflags-only-I cflags-only-other libs-only-L libs-only-l libs-only-other profile"
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
else
opts=`rospack list-names`
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
fi
}
function _roscomplete_rosnode {
local arg opts
COMPREPLY=()
arg="${COMP_WORDS[COMP_CWORD]}"
if [[ $COMP_CWORD == 1 ]]; then
opts="ping list info machine kill"
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
elif [[ $COMP_CWORD == 2 ]]; then
case ${COMP_WORDS[1]} in
info)
opts=`rosnode list 2> /dev/null`
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
;;
ping|list|kill)
if [[ ${arg} =~ \-\-.* ]]; then
opts="--all --help"
else
opts=`rosnode list 2> /dev/null`
fi
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
;;
machine)
# This takes more logic to determine which machines are present.
;;
esac
else
case ${COMP_WORDS[1]} in
kill)
# complete on node name
opts=`rosnode list 2> /dev/null`
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
;;
esac
fi
}
function _roscomplete_rosparam {
local arg opts
COMPREPLY=()
arg="${COMP_WORDS[COMP_CWORD]}"
if [[ $COMP_CWORD == 1 ]]; then
opts="set get load dump delete list"
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
elif [[ $COMP_CWORD == 2 ]]; then
case ${COMP_WORDS[1]} in
set|get|delete|list)
opts=`rosparam list 2> /dev/null`
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
;;
load|dump)
# complete on files
COMPREPLY=($(compgen -f -- ${arg}))
;;
esac
elif [[ $COMP_CWORD == 3 ]]; then
case ${COMP_WORDS[1]} in
load|dump)
# complete on namespace
opts=`rosparam list 2> /dev/null`
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
;;
esac
fi
}
function _roscomplete_rostopic {
local arg opts
COMPREPLY=()
arg="${COMP_WORDS[COMP_CWORD]}"
if [[ $COMP_CWORD == 1 ]]; then
opts="bw echo hz list pub type find info"
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
elif [[ $COMP_CWORD -ge 2 ]]; then
if [[ ${arg} =~ \-\-.* ]]; then
case ${COMP_WORDS[1]} in
pub)
COMPREPLY=($(compgen -W "--rate --once --file --latch" -- ${arg}))
;;
bw)
COMPREPLY=($(compgen -W "--window" -- ${arg}))
;;
echo)
COMPREPLY=($(compgen -W "--bag --filter --nostr --noarr --clear --all offset" -- ${arg}))
;;
hz)
COMPREPLY=($(compgen -W "--window --filter" -- ${arg}))
;;
list)
COMPREPLY=($(compgen -W "--bag --verbose --host" -- ${arg}))
;;
esac
else
case ${COMP_WORDS[1]} in
bw|echo|hz|list|type|info)
if [[ ${COMP_WORDS[$(( $COMP_CWORD - 1 ))]} == "-b" ]]; then
COMPREPLY=($(compgen -f -- ${arg}))
else
opts=`rostopic list 2> /dev/null`
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
fi
;;
find)
opts=`_msg_opts ${COMP_WORDS[$COMP_CWORD]}`
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
;;
pub)
if [[ $COMP_CWORD == 2 ]]; then
opts=`rostopic list 2> /dev/null`
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
elif [[ $COMP_CWORD == 3 ]]; then
opts=`_msg_opts ${COMP_WORDS[$COMP_CWORD]}`
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
elif [[ $COMP_CWORD == 4 ]]; then
opts=`rosmsg-proto msg 2> /dev/null -s ${COMP_WORDS[3]}`
if [ 0 -eq $? ]; then
COMPREPLY="$opts"
fi
fi
;;
esac
fi
fi
}
function _roscomplete_rosservice {
local arg opts
COMPREPLY=()
arg="${COMP_WORDS[COMP_CWORD]}"
if [[ $COMP_CWORD == 1 ]]; then
opts="list call type find uri"
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
elif [[ $COMP_CWORD == 2 ]]; then
case ${COMP_WORDS[1]} in
uri|list|type|call)
opts=`rosservice list 2> /dev/null`
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
;;
find)
# Need a clever way to do message searching
opts=`_srv_opts ${COMP_WORDS[$COMP_CWORD]}`
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
;;
esac
elif [[ $COMP_CWORD == 3 ]]; then
case ${COMP_WORDS[1]} in
call)
type=`rosservice type ${COMP_WORDS[2]}`
opts=`rosmsg-proto srv 2> /dev/null -s ${type}`
if [ 0 -eq $? ]; then
COMPREPLY="$opts"
fi
;;
esac
fi
}
function _msg_opts {
local arg pkgs pkgname msgname searchmsg path count opts
if [[ $1 =~ .+/.* ]]; then
pkgname=${1%%/*}
msgname=${1#*/}
searchmsg=1
else
pkgname=${1}
fi
if [[ -z ${searchmsg} ]]; then
pkgs=(`rospack list | grep "^${pkgname}"`)
count=0
opts=""
for (( i = 0 ; i < ${#pkgs[@]} ; i=i+2 )); do
if [[ -d ${pkgs[i+1]}/msg ]]; then
opts="$opts ${pkgs[i]}/"
pkgname=${pkgs[i]}
count=$((count+1))
fi
done
if [[ $count -gt 1 ]]; then
echo $opts
return 0
fi
fi
path=`rospack find ${pkgname} 2> /dev/null`
if [ $? -eq 0 ] && [ -d ${path}/msg ]; then
echo `find -L ${path}/msg -maxdepth 1 -mindepth 1 -name *.msg ! -regex ".*/[.].*" -print0 | tr '\000' '\n' | sed -e "s/.*\/\(.*\)\.msg/${pkgname}\/\1/g"`
fi
}
function _roscomplete_rosmsg {
local arg opts
COMPREPLY=()
arg="${COMP_WORDS[COMP_CWORD]}"
if [[ $COMP_CWORD == 1 ]]; then
opts="show list md5 package packages"
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
elif [[ $COMP_CWORD == 2 ]]; then
case ${COMP_WORDS[1]} in
show|users|md5)
opts=`_msg_opts ${COMP_WORDS[$COMP_CWORD]}`
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
;;
package)
opts=`rospack list-names`
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
;;
packages|list)
# This shouldn't really have a completion rule
;;
esac
fi
}
function _roscomplete_roscreate_pkg {
local arg opts
COMPREPLY=()
arg="${COMP_WORDS[COMP_CWORD]}"
if [[ $COMP_CWORD != 1 ]]; then
opts=`rospack list-names`
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
fi
}
function _roscomplete_roswtf {
local arg
COMPREPLY=()
arg="${COMP_WORDS[COMP_CWORD]}"
if [[ ${arg} =~ \-\-.* ]]; then
COMPREPLY=($(compgen -W "--all --no-plugins --offline" -- ${arg}))
else
if [[ $COMP_CWORD == 1 ]]; then
COMPREPLY=($(compgen -o plusdirs -f -X "!*.launch" -- ${arg}))
fi
fi
}
function _roscomplete_rosclean {
local arg opts
COMPREPLY=()
arg="${COMP_WORDS[COMP_CWORD]}"
if [[ $COMP_CWORD == 1 ]]; then
opts="check purge"
COMPREPLY=($(compgen -W "$opts" -- ${arg}))
fi
}
complete -F "_roscomplete_sub_dir" -o "nospace" "roscd"
complete -F "_roscomplete_sub_dir" -o "nospace" "rospd"
complete -F "_roscomplete_sub_dir" -o "nospace" "rosls"
complete -F "_roscomplete_rosmake" "rosmake"
complete -F "_roscomplete_rosclean" "rosclean"
complete -F "_roscomplete_exe" "rosrun"
complete -F "_roscomplete_file" "rosed"
complete -F "_roscomplete_file" "roscp"
complete -F "_roscomplete_launch" -o filenames "roslaunch"
complete -F "_roscomplete_test" -o filenames "rostest"
complete -F "_roscomplete_rospack" "rospack"
complete -F "_roscomplete_rosbag" -o default "rosbag"
complete -F "_roscomplete_rosnode" "rosnode"
complete -F "_roscomplete_rosparam" "rosparam"
complete -F "_roscomplete_rostopic" "rostopic"
complete -F "_roscomplete_rosservice" "rosservice"
complete -F "_roscomplete_rosmsg" "rosmsg"
complete -F "_roscomplete_rossrv" "rossrv"
complete -F "_roscomplete_roscreate_pkg" "roscreate-pkg"
complete -F "_roscomplete_roswtf" -o filenames "roswtf"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment