X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=misc%2Fgsu%2Fsubcommand;h=5ccb3fc54fd309065482522b67a22c6e292934f2;hb=b8baa7b1efbed81a527f589d3f917f7b518b856a;hp=84c0174ccbdaaf5b7ef8e22bb1a032b485b4c46e;hpb=0f548f1367bfdba2e270242bb0fccad1da5f8adf;p=gsu.git diff --git a/misc/gsu/subcommand b/misc/gsu/subcommand index 84c0174..5ccb3fc 100644 --- a/misc/gsu/subcommand +++ b/misc/gsu/subcommand @@ -469,6 +469,47 @@ gsu_cword_is_option_parameter() ret=0 } +# Get the word number on which the cursor is, not counting options. +# +# This is useful for completing commands whose possible completions depend +# on the word number, for example mount. +# +# $1: Getopt option string. +# $2: The current word number. +# $3..: All words of the current command line. +# +# return: If the current word is an option, or a parameter to an option, +# this function sets $result to -1. Otherwise, the number of the non-option +# is returned in $result. +# +gsu_get_unnamed_arg_num() +{ + local opts="$1" cword="$2" prev cur + local -i i n=0 + local -a words + + shift 2 + words=("$@") + cur="${words[$cword]}" + prev="${words[$(($cword - 1))]}" + result=-1 + [[ "$cur" == -* ]] && return + [[ "$prev" == -* ]] && [[ "$opts" == *${prev#-}:* ]] && return + + for ((i=1; i <= $cword; i++)); do + prev="${words[$(($i - 1))]}" + cur="${words[$i]}" + [[ "$cur" == -* ]] && continue + if [[ "$prev" == -* ]]; then + opt=${prev#-} + [[ "$opts" != *$opt:* ]] && let n++ + continue + fi + let n++ + done + result="$(($n - 1))" +} + gsu() { local i