_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'
}
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]
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()
{
(($? != 0)) && return
ret=-$E_GSU_EDITOR
result="${EDITOR:-vi}"
- "$result" "$conf"
+ "$result" $conf
(($? != 0)) && return
ret=$GSU_SUCCESS
return
[[ "$result" == 'm' ]] && printf 'roff\ntext\nhtml\n'
}
-_gsu_man_txt='
+_gsu_help_text['man']='
Print the manual.
Usage: man [-m <mode>] [-b <browser>]
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
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()
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'
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>...]
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"
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
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
p
}
' "$0"
+ ret=$GSU_SUCCESS
}
complete_help()