subcommand: Use pager for man output if possible.
authorAndre Noll <maan@tuebingen.mpg.de>
Sun, 5 Mar 2017 22:03:36 +0000 (23:03 +0100)
committerAndre Noll <maan@tuebingen.mpg.de>
Mon, 17 Apr 2017 14:11:23 +0000 (16:11 +0200)
The manual can be much longer than one page, and it is easy to tell
whether stdout is associated with a terminal. The new _gsu_isatty()
takes care of that. It has been verified to work on FreeBSD, NetBSD
and Linux.

subcommand

index 71f0614..ab6ae8a 100644 (file)
@@ -267,22 +267,35 @@ com_prefs()
        done
 }
 
+_gsu_isatty()
+{(
+       exec 3<&1
+       stty 0<&3 &> /dev/null
+)}
+
 complete_prefs()
 {
        gsu_complete_options "$com_prefs_options" "$@"
 }
 
-_gsu_man_txt="
+_gsu_man_txt='
 Print the manual.
 
-Usage: man"
+Usage: man
+
+If stdout associated with a terminal device, output is piped to
+$PAGER. If $PAGER is unset, less(1) is assumed.
+'
 
 com_man()
 {
        local equal_signs="=================================================="
        local minus_signs="--------------------------------------------------"
-       local com num
+       local com num pager='cat'
 
+       _gsu_isatty && pager="${PAGER:-less}"
+       [[ "$pager" == 'less' ]] && export LESS=${LESS-RI}
+       {
        echo "$gsu_name (_${gsu_banner_txt}_) manual"
        echo "${equal_signs:0:${#gsu_name} + ${#gsu_banner_txt} + 16}"
        echo
@@ -310,6 +323,7 @@ com_man()
                $0 help $com
                echo
        done
+       } | $pager
        ret=$GSU_SUCCESS
 }