gsu: Document gsu().
[gsu.git] / misc / gsu / subcommand
index a13d3b27dd6c32748ff134bd7fffa96defc63937..6b5df0a37c2a676c7c86d74c5a07371fddd2e1bf 100644 (file)
@@ -2,7 +2,7 @@
 # (C) 2006-2011 Andre Noll
 
 if [[ $(type -t gsu_is_a_number) != "function" ]]; then
-       GSU_DIR=${GSU_DIR:=$HOME/.gsu}
+       GSU_DIR=${GSU_DIR:=${HOME-}/.gsu}
        . $GSU_DIR/common || exit 1
 fi
 
@@ -11,8 +11,16 @@ _gsu_usage()
        gsu_short_msg "# Usage: $_gsu_self command [options]"
 }
 
-# Each line matching this is recognized as a subcommand. The name of the may be
-# given as $1. In any case the subcommand is the first subexpression.
+# Return an extended regular expression to match against $0.
+#
+# When called without argument, the expression matches all lines which define a
+# subcommand.
+#
+# If an argument is given, the returned expression matches only the subcommand
+# passed as $1. This is useful to tell if a string is a valid subcommand.
+#
+# Regardless of whether an argument is given, the returned expression contains
+# exactly one parenthesized subexpression for matching the command name.
 _gsu_get_command_regex()
 {
        local cmd="${1:-[-a-zA-Z_0-9]+}"
@@ -62,7 +70,7 @@ _gsu_print_available_commands()
 
 gsu_complete_options()
 {
-       local opts="$1" cword="$2" cur
+       local opts="$1" cword="$2" cur opt
        local -a words
 
        shift 2
@@ -90,7 +98,7 @@ options, the command prints out a list of all cmt config variables, together
 with their current value and the default value."
 _com_prefs()
 {
-       local i conf="${gsu_config_file:=$HOME/.$gsu_name.rc}"
+       local i conf="${gsu_config_file:=${HOME:-}/.$gsu_name.rc}"
 
        gsu_getopts "e"
        eval "$result"
@@ -186,7 +194,6 @@ _com_man()
 
 _gsu_banner_msg()
 {
-       gsu_banner_txt="${gsu_banner_txt:-set \$gsu_banner_txt to customize this message}"
        gsu_short_msg "### $_gsu_self -- ###"
 }
 
@@ -203,11 +210,13 @@ Command line completion.
 
 Usage: complete [<cword> <word>...]
 
-In the first form, the command prints all possible completions to stdout.
-This can be used from the completion function of the shell.
+When executed without argument the command writes bash code to
+stdout. This code is suitable to be evaled from .bashrc to enable
+completion.
 
-Completion code suitable to be evaled is written to stdout if no argument
-was given.
+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()
@@ -307,21 +316,20 @@ complete_help()
        echo "$result"
 }
 
-# Wrapper for bash's getopts.
+# Wrapper for the bash getopts builtin.
 #
 # Aborts on programming errors such as missing or invalid option string.  On
 # success $result contains shell code that can be eval'ed. For each defined
 # option x, the local variable o_x will be created when calling eval "$result".
-# o_x contains true/false for options without an argument or the emtpy string/the
-# given argument, depending on whether this option was contained in the "$@"
-# array.
+# o_x contains true/false for options without argument and either the emtpy
+# string or the given argument for options that take an argument.
 #
 # Example:
 #      gsu_getopts abc:x:y
 #      eval "$result"
-#      [[ $ret -lt 0 ]] && return
+#      (($ret < 0)) && return
 #
-#      [[ "$o_a" = "true ]] && echo "The -a flag was given"
+#      [[ "$o_a" = 'true' ]] && echo 'The -a flag was given'
 #      [[ -n "$o_c" ]] && echo "The -c option was given with arg $o_c"
 gsu_getopts()
 {
@@ -505,6 +513,21 @@ gsu_get_unnamed_arg_num()
        result="$(($n - 1))"
 }
 
+# Entry point for all gsu-based scripts.
+#
+# The startup part of the application script should source this file to load
+# the functions defined here, and then call gsu(). Functions starting with com_
+# are automatically recognized as subcommands.
+#
+# Minimal example:
+#
+#      com_hello()
+#      {
+#              echo 'hello world'
+#      }
+#      gsu_dir=${gsu_dir:-/system/location/where/gsu/is/installed}
+#      . $gsu_dir/subcommand || exit 1
+#      gsu "$@"
 gsu()
 {
        local i