X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=subcommand;h=b12783b1692bff8aba74beed03c19adbc773e096;hb=d4dd63ffba45377ae7ff9fb341e1dce31382ef4f;hp=3ff31f0a6492e6d3420d533de96d9e02e358825a;hpb=ee0253579a48cddcf022a7978afe68bc57311313;p=gsu.git diff --git a/subcommand b/subcommand index 3ff31f0..b12783b 100644 --- a/subcommand +++ b/subcommand @@ -25,7 +25,7 @@ _gsu_usage() # exactly one parenthesized subexpression for matching the command name. _gsu_get_command_regex() { - local cmd="${1:-[-a-zA-Z_0-9]+}" + local cmd="${1:-[-a-zA-Z_0-9]{1,\}}" result="^com_($cmd)\(\)" } @@ -50,13 +50,44 @@ _gsu_available_commands() } | sort | tr '\n' ' ')" } +# Check number of arguments. +# +# Usage: gsu_check_arg_count [] +# +# Check that is between and inclusively. +# If only ist given, num2 is assumed to be infinity. +# +# Examples: +# 0 0 no argument allowed +# 1 1 exactly one argument required +# 0 2 at most two arguments admissible +# 2 at least two arguments required +gsu_check_arg_count() +{ + ret=-$E_GSU_BAD_ARG_COUNT + if (($# == 2)); then # only num1 is given + result="at least $2 args required, $1 given" + (($1 < $2)) && return + ret=$GSU_SUCCESS + return + fi + # num1 and num2 given + result="need at least $2 args, $1 given" + (($1 < $2)) && return + result="need at most $3 args, $1 given" + (($1 > $3)) && return + ret=$GSU_SUCCESS +} + _gsu_print_available_commands() { - local cmd + local cmd cmds local -i count=0 + _gsu_available_commands + cmds="$result" printf 'Available commands:\n' - for cmd in $gsu_cmds; do + for cmd in $cmds; do printf '%s' "$cmd" let ++count if (($count % 4)); then @@ -91,19 +122,23 @@ gsu_complete_options() done } +com_prefs_options='e' + export gsu_prefs_txt=" Print the current preferences. Usage: prefs [-e] -If -e is given, the config file is opened with the default editor. Without -options, the command prints out a list of all cmt config variables, together -with their current value and the default value." -_com_prefs() +If -e is given, the config file is opened with the default editor. +Without options, the command prints out a list of all config variables, +together with their current value and the default value. +" + +com_prefs() { local i conf="${gsu_config_file:=${HOME:-}/.$gsu_name.rc}" - gsu_getopts "e" + gsu_getopts "$com_prefs_options" eval "$result" (($ret < 0)) && return gsu_check_arg_count $# 0 0 @@ -149,7 +184,7 @@ _com_prefs() complete_prefs() { - gsu_complete_options "e" "$@" + gsu_complete_options "$com_prefs_options" "$@" } export gsu_man_txt=" @@ -157,19 +192,20 @@ Print the manual. Usage: man" -_com_man() + +com_man() { local equal_signs="==================================================" local minus_signs="--------------------------------------------------" - local com num + local com num echo "$gsu_name (_${gsu_banner_txt}_) manual" echo "${equal_signs:0:${#gsu_name} + ${#gsu_banner_txt} + 16}" echo - sed -e '1,/^#\{70,\}/d' -e '/^#\{70,\}/,$d' $0 -e 's/^# *//' + sed -e '1,/^#\{70,\}/d' -e '/^#\{70,\}/,$d' $0 -e 's/^# *//' echo "----" - echo + echo echo "$gsu_name usage" echo "${minus_signs:0:${#gsu_name} + 6}" printf "\t" @@ -181,16 +217,16 @@ _com_man() echo "Available commands:" _gsu_available_commands - for com in $result; do + for com in $result; do num=${#com} (($num < 4)) && num=4 - echo "${minus_signs:0:$num}" - echo "$com" - echo "${minus_signs:0:$num}" - $0 help $com + echo "${minus_signs:0:$num}" + echo "$com" + echo "${minus_signs:0:$num}" + $0 help $com echo - done - ret=$GSU_SUCCESS + done + ret=$GSU_SUCCESS } export gsu_help_txt=" @@ -215,7 +251,7 @@ written to stdout. This can be used from the completion function of the subcommand. " -_com_help() +com_help() { local a b ere tab=' ' @@ -397,7 +433,7 @@ gsu_getopts() ret=$GSU_SUCCESS } -_com_complete() +com_complete() { local cmd n cword local -a words @@ -527,8 +563,7 @@ gsu_get_unnamed_arg_num() gsu() { local i - _gsu_available_commands - gsu_cmds="$result" + if (($# == 0)); then _gsu_usage _gsu_print_available_commands @@ -536,60 +571,17 @@ gsu() fi arg="$1" shift - # check internal commands - if [[ "$arg" = "help" || "$arg" = "man" || "$arg" = "prefs" || "$arg" = "complete" ]]; then - _com_$arg "$@" + if [[ "$(type -t com_$arg)" == 'function' ]]; then + com_$arg "$@" if (("$ret" < 0)); then gsu_err_msg exit 1 fi exit 0 fi - - # external commands - for i in $gsu_cmds; do - if test "$arg" = "$i"; then - com_$arg "$@" - if (("$ret" < 0)); then - gsu_err_msg - exit 1 - fi - exit 0 - fi - done - ret=-$E_GSU_BAD_COMMAND result="$arg" gsu_err_msg _gsu_print_available_commands exit 1 } - -# Check number of arguments. -# -# Usage: gsu_check_arg_count [] -# -# Check that is between and inclusively. -# If only ist given, num2 is assumed to be infinity. -# -# Examples: -# 0 0 no argument allowed -# 1 1 exactly one argument required -# 0 2 at most two arguments admissible -# 2 at least two arguments required -gsu_check_arg_count() -{ - ret=-$E_GSU_BAD_ARG_COUNT - if (($# == 2)); then # only num1 is given - result="at least $2 args required, $1 given" - (($1 < $2)) && return - ret=$GSU_SUCCESS - return - fi - # num1 and num2 given - result="need at least $2 args, $1 given" - (($1 < $2)) && return - result="need at most $3 args, $1 given" - (($1 > $3)) && return - ret=$GSU_SUCCESS -}