Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

More robust completion #12852

Merged
merged 2 commits into from Nov 18, 2019
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file or symbol
Failed to load files and symbols.

Always

Just for now

@@ -60,77 +60,35 @@ _sim_vehicle() {
fi
done

# TODO: generate for waf help
case $prev in
-v | --vehicle)
opts="ArduCopter AntennaTracker APMrover2 ArduSub ArduPlane"
# get the calling program, remove anything after the space == all commands arguments
local caller; caller=$(echo $@ | sed 's/ .*//g');
# get options between "vehicle type " and closing ")", remove line return, remove spaces, anything before the opening (, remove the "|" and closing ")"
opts=$($caller --help | sed -n '/vehicle type (/,/)/p' | tr '\n' ' ' | sed -e 's/ //g' -e 's/.*(//g' -e 's/[|)]/ /g')
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
;;
-f | --frame)
opts=""
if [[ ${COMP_WORDS[@]} == *"ArduCopter"* ]]; then
opts+=" +"
opts+=" X"
opts+=" airsim-copter"
opts+=" coaxcopter"
opts+=" djix"
opts+=" dodeca-hexa"
opts+=" gazebo-iris"
opts+=" heli"
opts+=" heli-compound"
opts+=" heli-dual"
opts+=" hexa"
opts+=" octa"
opts+=" octa-quad"
opts+=" quad"
opts+=" scrimmage-copter"
opts+=" singlecopter"
opts+=" tri"
opts+=" y6"
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
fi
if [[ ${COMP_WORDS[@]} == *"AntennaTracker"* ]]; then
opts+=" tracker"
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
fi
if [[ ${COMP_WORDS[@]} == *"APMrover2"* ]]; then
opts+=" balancebot"
opts+=" gazebo-rover"
opts+=" rover"
opts+=" rover-skid"
opts+=" sailboat"
opts+=" sailboat-motor"
opts+=" balancebot"
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
fi
if [[ ${COMP_WORDS[@]} == *"ArduSub"* ]]; then
opts+=" gazebo-bluerov2"
opts+=" vectored"
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
fi
if [[ ${COMP_WORDS[@]} == *"ArduPlane"* ]]; then
opts+=" CRRCSim"
opts+=" gazebo-zephyr"
opts+=" jsbsim"
opts+=" plane"
opts+=" plane-dspoilers"
opts+=" plane-elevon"
opts+=" plane-jet"
opts+=" plane-tailsitter"
opts+=" plane-vtailjet"
opts+=" quadplane"
opts+=" quadplane-cl84"
opts+=" quadplane-tilttrivec"
opts+=" quadplane-tri"
opts+=" scrimmage-plane"
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
fi
# get the calling program, remove anything after the space == all commands arguments
local caller; caller=$(echo $@ | sed 's/ .*//g');
# Get everything between "frame type" and "-C", remove first and last line, get line starting with caracters and ": " sequence, remove spaces and :
local supported_vehicle_list=$($caller --help | sed -n '/frame type/,/-C/p' | sed -e '1d' -e '$d' | sed -n 's/\(.*: \).*/\1/p' | sed -e 's/ //g' -e 's/://g')
local frames;
local count=1;
for v in $supported_vehicle_list
do
if [[ ${COMP_WORDS[@]} == *"$v"* ]]
then
# Get everything between "frame type" and "-C", remove first and last line and change starting space by " :", change newlines to space, remove spaces then change vehicle type enclose by ":" by newline and change "|" by space, remove first line, get line "count" that match supported_vehicle_list[count]
frames=$($caller --help | sed -n '/frame type/,/-C/p' | sed -e '1d' -e '$d' -e 's/^\s*A/ :A/g' | tr '\n' ' ' | sed -e 's/ //g' -e 's/:\w*:/\n/g' -e 's/[|]/ /g' | sed '1d' | sed "${count}q;d")
break
fi
count=$(( $count + 1 ))
done
COMPREPLY=($(compgen -W "${frames}" -- ${cur}))
return 0

;;
esac

@@ -51,14 +51,14 @@ _waf()
fi
done

# TODO: generate for waf help
case $prev in
--board)
opts="CubeBlack bbbmini fmuv2 fmuv3 fmuv4 iomcu sitl"
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
;;
esac
--board)
# get options between board and debug, remove everything before "are", remove everything after "--debug", remove final dot, remove all comma
opts=$(./waf --help | sed -n '/--board=/,/--debug/p' | sed -e 's/.*are //g' -e 's/\(--debug.*\)//g' -e 's/[.]//g' -e 's/[,]//g')
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
;;
esac

COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
}
@@ -3,6 +3,8 @@

local temp_word
local cur cword prev
local -a vehicles

_sim_vehicle() {
typeset -A opt_args
local context state state_descr line curcontext="$curcontext"
@@ -58,96 +60,61 @@ _sim_vehicle() {

}

# TODO : generate with regex from sim_vehicle help
_get_vehicle_type() {
# get the calling program, remove anything after the space == all commands arguments
local caller; caller=$(echo ${words[@]} | sed 's/ .*//g');
# get options between "vehicle type " and closing ")", remove line return, remove spaces, anything before the opening (, remove the "|" and closing ")"
vehicles=( $($caller --help | sed -n '/vehicle type (/,/)/p' | tr '\n' ' ' | sed -e 's/ //g' -e 's/.*(//g' -e 's/[|)]/ /g') )
}

(( $+functions[_sim_vehicle_vehicles] )) ||
_sim_vehicle_vehicles() {
local vehicles; vehicles=(
'ArduCopter:Copter type' \
'AntennaTracker:Tracker type' \
'APMrover2:Rover type' \
'ArduSub:Sub type' \
'ArduPlane:Plane type'
)
_get_vehicle_type
_describe -t vehicles 'vehicle' vehicles "$@" && ret=0
}

# TODO : generate with regex from sim_vehicle help
(( $+functions[_copter_frames] )) ||
_copter_frames() {
search_vehicle=true
local_current=$CURRENT
vehicle=''
_get_vehicle_type
# search the vehicle type used with -v on previous arguements
# Todo: handle failure
while ( $search_vehicle || $local_current -eq 0 )
do
case $words[$local_current] in
("ArduCopter" | "AntennaTracker" | "APMrover2" | "ArduSub" | "ArduPlane")
search_vehicle=false
vehicle=$words[$local_current]
;;
esac
for w in $vehicles
do
if [ "$w" = "$words[$local_current]" ]
then
vehicle=$words[$local_current]
search_vehicle=false
break
fi
done;
local_current=$(( $local_current - 1 ))
done
local frames;
case $vehicle in
("ArduCopter")
frames=(
'+:Copter type +' \
'X:Copter type X' \
'airsim-copter:Copter for AirSim' \
'coaxcopter:Copter type Coaxial' \
'djix:Copter type DJI X' \
'dodeca-hexa:Copter type Dodeca-hexa' \
'gazebo-iris:Copter type iris for Gazebo' \
'heli:Heli' \
'heli-compound:Heli with compound' \
'heli-dual:Dual Heli' \
'hexa:Copter type hexa' \
'octa:Copter type octa' \
'octa-quad:Copter type octa-quad' \
'quad:Copter type quad' \
'scrimmage-copter:Copter for scrimmage' \
'singlecopter:Copter type singlecopter' \
'tri:Copter type tri' \
'y6:Copter type y6' \

);;
("APMrover2")
frames=(
'balancebot:Balance Bot' \
'gazebo-rover:Rover for Gazebo' \
'rover:Rover type ackerman' \
'rover-skid:Rover type skidsteering' \
'sailboat:Boat type sailboat' \
'sailboat-motor:Boat type sailboat with motor' \
'balancebot:Balance Bot' \
);;
("ArduSub")
frames=(
'gazebo-bluerov2:Sub for Gazebo' \
'vectored:Sub vectored' \
);;
("AntennaTracker")
frames=(
'tracker:Antenna Tracker' \
);;
("ArduPlane")
frames=(
'CRRCSim:Plane for CRRCSim' \
'gazebo-zephyr:Plane for Gazebo' \
'jsbsim:Plane for jsbsim' \
'plane:Plane type plane' \
'plane-dspoilers:Plane with dspoilers' \
'plane-elevon:Plane with elevon' \
'plane-jet:Plane type jet' \
'plane-tailsitter:Plane type tailsitter' \
'plane-vtailjet:Plane type vtail' \
'quadplane:Plane type quadplane' \
'quadplane-cl84:Plane type quadplane-cl84' \
'quadplane-tilttrivec:Plane type quadplane-tilttrivec' \
'quadplane-tri:Plane type quadplane-tri' \
'scrimmage-plane:Plane for scrimmage' \
);;
esac

# get the calling program, remove anything after the space == all commands arguments
local caller; caller=$(echo ${words[@]} | sed 's/ .*//g');

# to get the vehicle list :
# Get everything between "frame type" and "-C", remove first and last line, get line starting with caracters and ": " sequence, remove spaces and :
local supported_vehicle_list=($($caller --help | sed -n '/frame type/,/-C/p' | sed -e '1d' -e '$d' | sed -n 's/\(.*: \).*/\1/p' | sed -e 's/ //g' -e 's/://g'))

local frames;
local count=1;
for v in $supported_vehicle_list
do
if [ "$v" = "$vehicle" ]
then
# Get everything between "frame type" and "-C", remove first and last line and change starting space by " :", change newlines to space, remove spaces then change vehicle type enclose by ":" by newline and change "|" by space, remove first line, get line "count" that match supported_vehicle_list[count]
frames=($($caller --help | sed -n '/frame type/,/-C/p' | sed -e '1d' -e '$d' -e 's/^\s*A/ :A/g' | tr '\n' ' ' | sed -e 's/ //g' -e 's/:\w*:/\n/g' -e 's/[|]/ /g' | sed '1d' | sed "${count}q;d"))
break
fi
count=$(( $count + 1 ))
done

_describe -t frames 'frame' frames "$@" && ret=0
}

@@ -37,18 +37,10 @@ _waf() {
esac
}

# TODO : generate with regex from waf help
(( $+functions[_waf_boards] )) ||
_waf_boards() {
local boards; boards=(
'CubeBlack:builds CubeBlack' \
'bbbmini:build bbbmini' \
'fmuv2:build fmuv2' \
'fmuv3:build fmuv3' \
'fmuv4:build fmuv4' \
'iomcu:build iomcu' \
'sitl:build sitl'
)
# get option between board and debug, remove everything before "are", remove everything after "--debug", remove final dot, remove all comma
local boards; boards=( $(./waf --help | sed -n '/--board=/,/--debug/p' | sed -e 's/.*are //g' -e 's/\(--debug.*\)//g' -e 's/[.]//g' -e 's/[,]//g') )
_describe -t boards 'board' boards "$@" && ret=0
}

ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.