README: Mention that the gui example script must be named "lsi".
[gsu.git] / subcommand
index 561ca1a062a16fa1fd7025be7d5f95c4df33bab6..d37481cdbdccb5b62268d3b788de84b61a2ab347 100644 (file)
@@ -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 <mode>] [-b <browser>]
@@ -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 [<cword> <word>...]
@@ -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 <command> for info on <command>."
-               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 <command> for info on <command>, 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()