X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=misc%2Fgsu%2Fsubcommand;h=a13d3b27dd6c32748ff134bd7fffa96defc63937;hb=4e8573c54ef4404c0c0b1f43cdeb4d2f3151c537;hp=a688ed5855c60c47e099b723bf8b060487a7669a;hpb=45ca1b29b59a43524fb3ad6a013c5705ad3bdbde;p=gsu.git diff --git a/misc/gsu/subcommand b/misc/gsu/subcommand index a688ed5..a13d3b2 100644 --- a/misc/gsu/subcommand +++ b/misc/gsu/subcommand @@ -42,7 +42,7 @@ _gsu_available_commands() _gsu_print_available_commands() {( - local i count + local i count=0 gsu_short_msg "Available commands:" for i in $gsu_cmds; do printf "$i" @@ -92,7 +92,13 @@ _com_prefs() { local i conf="${gsu_config_file:=$HOME/.$gsu_name.rc}" - if [[ "$1" = "-e" ]]; then + gsu_getopts "e" + eval "$result" + (($ret < 0)) && return + gsu_check_arg_count $# 0 0 + (($ret < 0)) && return + + if [[ "$o_e" == "true" ]]; then ret=-$E_GSU_MKDIR result="${conf%/*}" mkdir -p "$result" @@ -109,7 +115,7 @@ _com_prefs() 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" @@ -180,13 +186,8 @@ _com_man() _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_banner_txt="${gsu_banner_txt:-set \$gsu_banner_txt to customize this message}" + gsu_short_msg "### $_gsu_self -- ###" } export gsu_help_txt=" @@ -216,7 +217,7 @@ _com_help() _gsu_get_command_regex ere="$result" - if test -z "$1"; then + if (($# == 0)); then _gsu_banner_msg 2>&1 _gsu_usage 2>&1 { @@ -351,21 +352,21 @@ gsu_getopts() exit 1 esac done - result="local opt" + result="local _gsu_getopts_opt" for ((i=0; i < ${#1}; i++)); do c1=${1:$i:1} c2=${1:$(($i + 1)):1} - result+=" o_$c1" + result+=" o_$c1=" if [[ "$c2" = ":" ]]; then let i++ else - result+="=false" + result+="false" fi done result+=" OPTIND=1 - while getopts $1 opt \"\$@\"; do - case \"\$opt\" in + while getopts $1 _gsu_getopts_opt \"\$@\"; do + case \"\$_gsu_getopts_opt\" in " for ((i=0; i < ${#1}; i++)); do c1=${1:$i:1} @@ -394,7 +395,7 @@ gsu_getopts() _com_complete() { - local cmd n cword="$1" + local cmd n cword local -a words if (($# == 0)); then @@ -405,9 +406,13 @@ _com_complete() candidates=(\$($0 complete "\$COMP_CWORD" "\${COMP_WORDS[@]}")); COMPREPLY=(\$(compgen -W "\${candidates[*]}" -- "\$cur")); EOF + ret=$GSU_SUCCESS + return fi - [[ -z "$cword" ]] && return + cword="$1" + gsu_is_a_number "$cword" + (($ret < 0)) && return if (($cword <= 1)); then _gsu_available_commands echo "${result}" @@ -424,6 +429,15 @@ EOF ret=$GSU_SUCCESS } +# Find out if the current word is a parameter for an option. +# +# $1: usual getopts option string. +# $2: The current word number. +# $3..: All words of the current command line. +# +# return: If yes, $result contains the letter of the option for which the +# current word is a parameter. Otherwise, $result is empty. +# gsu_cword_is_option_parameter() { local opts="$1" cword="$2" prev i n @@ -439,7 +453,7 @@ gsu_cword_is_option_parameter() [[ ! "$prev" == -* ]] && return n=$((${#opts} - 1)) - for ((i=0; i < $n; i++)); do + for ((i=0; i <= $n; i++)); do opt="${opts:$i:1}" [[ "${opts:$(($i + 1)):1}" != ":" ]] && continue let i++ @@ -450,6 +464,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