gsu_complete_options()
{
- local opts="$1" cword="$2" cur
+ local opts="$1" cword="$2" cur opt
local -a words
shift 2
local name= option_type= default_value= required=
local description= help_text=
eval "${gsu_options[$i]}"
- eval val='"$'${gsu_config_var_prefix}_$name'"'
+ eval val='"${'${gsu_config_var_prefix}_$name:-'}"'
case "$required" in
true|yes)
printf "# required"
_gsu_banner_msg()
{
- local txt="### $_gsu_self --"
- if test -z "$gsu_banner_txt"; then
- txt="$txt set \$gsu_banner_txt to customize this message"
- else
- txt="$txt $gsu_banner_txt"
- fi
- gsu_short_msg "$txt ###"
+ gsu_short_msg "### $_gsu_self -- ###"
}
export gsu_help_txt="
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