X-Git-Url: http://git.tuebingen.mpg.de/?p=gsu.git;a=blobdiff_plain;f=subcommand;h=1b204e0dc3abe0f31ab8de41b6f148acfb6ec0cf;hp=5e55580013dad9ec224e8c11a8e191b18c00428e;hb=refs%2Fheads%2Fpu;hpb=6d2ca9b4375fb6103a49b64f9b4feee72dd44843 diff --git a/subcommand b/subcommand index 5e55580..d37481c 100644 --- a/subcommand +++ b/subcommand @@ -96,7 +96,8 @@ gsu_check_arg_count() # [[ -n "$o_c" ]] && echo "The -c option was given with arg $o_c" gsu_getopts() { - local i c tab=' ' cr=' + local -i i + local c c1 c2 tab=' ' cr=' ' gsu_check_arg_count $# 1 1 @@ -167,20 +168,25 @@ gsu_getopts() _gsu_print_available_commands() { local cmd cmds - local -i count=0 + local -i maxlen=0 cols width=80 count=0 + result=$(stty size 2>/dev/null) + if (($? == 0)); then + gsu_is_a_number "${result#* }" + ((ret >= 0)) && ((result > 0)) && width=$result + fi _gsu_available_commands - cmds="$result" - printf 'Available commands:\n' + cmds=$result + for cmd in $cmds; do + ((${#cmd} > maxlen)) && maxlen=${#cmd} + done + let maxlen++ + ((width < maxlen)) && cols=1 || cols=$((width / maxlen)) + printf 'Available commands:' for cmd in $cmds; do - printf '%s' "$cmd" + ((count % cols == 0)) && printf '\n' + printf '%-*s' $maxlen $cmd let ++count - if ((count % 4)); then - printf '\t' - ((${#cmd} < 8)) && printf '\t' - else - printf '\n' - fi done printf '\n' } @@ -208,9 +214,10 @@ gsu_complete_options() ret=1 } +declare -A _gsu_help_text=() # indexed by autocmd com_prefs_options='e' -_gsu_prefs_txt=" +_gsu_help_text['prefs']=' Print the current preferences. Usage: prefs [-e] @@ -218,7 +225,7 @@ 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 config variables, together with their current value and the default value. -" +' com_prefs() { @@ -237,7 +244,7 @@ com_prefs() (($? != 0)) && return ret=-$E_GSU_EDITOR result="${EDITOR:-vi}" - "$result" "$conf" + "$result" $conf (($? != 0)) && return ret=$GSU_SUCCESS return @@ -289,7 +296,7 @@ complete_man() [[ "$result" == 'm' ]] && printf 'roff\ntext\nhtml\n' } -_gsu_man_txt=' +_gsu_help_text['man']=' Print the manual. Usage: man [-m ] [-b ] @@ -374,7 +381,7 @@ _gsu_roffify_maindoc() fi if [[ "${line:0:1}" == "$TAB" ]]; then # example _gsu_change_roffify_state 'state' 'example' - printf '%s\n' "$line" + _gsu_print_protected_roff_line "$line" line="$next_line" continue fi @@ -451,14 +458,17 @@ _gsu_roffify_cmds() done } -_gsu_roffify_autocmd() +_gsu_roffify_autocmds() { - local cmd="$1" help_txt="$2" + local cmd help_txt - { - printf 'com_%s()\n' "$cmd" - sed -e 's/^/## /g' <<< "$help_txt" - } | _gsu_roffify_cmds + for cmd in "${!_gsu_help_text[@]}"; do + help_txt="${_gsu_help_text["$cmd"]}" + { + printf 'com_%s()\n' "$cmd" + sed -e 's/^/## /g' <<< "$help_txt" + } | _gsu_roffify_cmds + done } _gsu_roff_man() @@ -480,10 +490,7 @@ EOF printf '\n.SH "GENERIC SUBCOMMANDS"\n' printf 'The following commands are automatically created by gsu\n' - _gsu_roffify_autocmd "help" "$_gsu_help_txt" - _gsu_roffify_autocmd "man" "$_gsu_man_txt" - _gsu_roffify_autocmd "prefs" "$_gsu_prefs_txt" - _gsu_roffify_autocmd "complete" "$_gsu_complete_txt" + _gsu_roffify_autocmds printf '\n.SH "LIST OF SUBCOMMANDS"\n' printf 'Each command has its own set of options as described below.\n' @@ -606,15 +613,18 @@ com_man() ret=$GSU_SUCCESS } -_gsu_help_txt=" +_gsu_help_text['help']=' Print online help. -Usage: help [command] +Usage: help [-a] [command] Without arguments, print the list of available commands. Otherwise, -print the help text for the given command." +print the help text for the given command. + +-a: Also show the help of automatic commands. Ignored if a command +is given.' -_gsu_complete_txt=" +_gsu_help_text['complete']=' Command line completion. Usage: complete [ ...] @@ -626,11 +636,16 @@ completion. If at least one argument is given, all possible completions are written to stdout. This can be used from the completion function of the subcommand. -" +' +com_help_options='a' com_help() { - local ere tab=' ' + local ere tab=' ' txt + + gsu_getopts "$com_help_options" + eval "$result" + ((ret < 0)) && return _gsu_get_command_regex ere="$result" @@ -639,10 +654,15 @@ com_help() gsu_short_msg "### $gsu_name -- $gsu_banner_txt ###" _gsu_usage 2>&1 { - printf "com_help()\n%s" "$_gsu_help_txt" | head -n 4; echo "--" - printf "com_man()\n%s" "$_gsu_man_txt" | head -n 4; echo "--" - printf "com_prefs()\n%s" "$_gsu_prefs_txt" | head -n 4; echo "--" - printf "com_complete()\n%s" "$_gsu_complete_txt" | head -n 4; echo "--" + if [[ "$o_a" == 'true' ]]; then + _gsu_mfcb() { printf '%s\n' "$2"; } + for cmd in "${!_gsu_help_text[@]}"; do + printf "com_%s()" "$cmd" + txt="${_gsu_help_text["$cmd"]}" + mapfile -n 3 -c 1 -C _gsu_mfcb <<< "$txt" + printf -- '--\n' + done + fi grep -EA 2 "$ere" "$0" } | grep -v -- '--' \ | sed -En "/$ere/"'!d @@ -664,33 +684,33 @@ com_help() y/\n/'"$tab"'/ # and print the sucker - p' - echo - echo "# Try $gsu_name help for info on ." - ret=$GSU_SUCCESS - return - fi - if test "$1" = "help"; then - echo "$_gsu_help_txt" - ret=$GSU_SUCCESS - return - fi - if test "$1" = "man"; then - echo "$_gsu_man_txt" - ret=$GSU_SUCCESS - return - fi - if test "$1" = "prefs"; then - echo "$_gsu_prefs_txt" + p + ' | { + local -a cmds=() descs=() + local -i i maxlen=1 + local cmd desc + while read cmd desc; do + ((maxlen < ${#cmd})) && maxlen=${#cmd} + cmds[${#cmds[@]}]=$cmd + descs[${#descs[@]}]=$desc + done + for ((i = 0; i < ${#cmds[@]}; i++)); do + printf '%-*s %s\n' $maxlen ${cmds[$i]} \ + "${descs[$i]}" + done + } + printf "\n# Try %s help for info on , or %s help -a to see\n" \ + "$gsu_name" "$gsu_name" + printf '# also the subcommands which are automatically generated by gsu.\n' ret=$GSU_SUCCESS return fi - if test "$1" = "complete"; then - echo "$_gsu_complete_txt" + for cmd in "${!_gsu_help_text[@]}"; do + [[ "$1" != "$cmd" ]] && continue + printf '%s\n' "${_gsu_help_text["$cmd"]}" ret=$GSU_SUCCESS return - fi - ret=$GSU_SUCCESS + done _gsu_get_command_regex "$1" ere="$result" if ! grep -Eq "$ere" "$0"; then @@ -717,6 +737,7 @@ com_help() p } ' "$0" + ret=$GSU_SUCCESS } complete_help() @@ -881,6 +902,6 @@ gsu() ret=-$E_GSU_BAD_COMMAND result="$arg" gsu_err_msg - _gsu_print_available_commands + _gsu_print_available_commands 1>&2 exit 1 }