From: Andre Noll Date: Tue, 29 Nov 2011 22:28:51 +0000 (+0100) Subject: gsu subcommand: Add gsu_get_unnamed_arg_num(). X-Git-Url: http://git.tuebingen.mpg.de/?p=gsu.git;a=commitdiff_plain;h=b8baa7b1efbed81a527f589d3f917f7b518b856a gsu subcommand: Add gsu_get_unnamed_arg_num(). This will be handy for many gsu applications. --- 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