Patch-ID: bash41-003
[bash.git] / examples / functions / manpage
blob60f9aed038f82df12d9be2ab459fb8c806a15801
1 # Written from scratch by Tom Tromey (tromey@cns.caltech.edu)
3 # manpage -- find and print a manual page.
4 # usage: manpage section name [printing]
6 function manpage ()
8   local i h cmd zot sec
9   local num="$1"
10   local page="$2"
11   local printing="$3"
12   local mp
14   mp="${MANPATH:-/usr/man}"
15   if [ "$#" -lt 2 ]; then return 1; fi # should print usage
16   if [ "$num" != "" ]; then
17      sec="${num%%[a-zA-Z]*}"
18   else
19      sec='[168234571lnpo]'
20      num="$sec"
21   fi
22   for i in $(echo "$mp" | tr : ' '); do
23     if [ ! -d "$i" ]; then continue; fi
24     file="$i"/man"$sec"/"$page"."$num"*
25     set $file
26     file="$1"
27     if [ -f "$file" ]; then
28       zot=$(sed 1q "$file")
29       cmd=${MANROFF:-"nroff -man - | col | cat -s"}
30       h=${zot##"'"'\"'}
31       if [ "$h" != "$zot" ]; then
32         while [ "$h" != "" ]; do
33           case "$h" in
34             *e) cmd="${MANEQN:-neqn} | $cmd";;
35             *r) cmd="refer | $cmd";;
36             *t) cmd="tbl | $cmd";;
37             *v) cmd="vgrind | $cmd";;
38             *) ;; # should print error
39           esac
40           h=${h%?}
41         done
42       fi
43       if [ "$printing" != "" ]; then
44         (cd "$i"; eval "$cmd") < "$file" | ${PAGER:-more}
45       else
46         (cd "$i"; eval "$cmd") < "$file" > /tmp/manpage-$$
47         ${PAGER:-more} /tmp/manpage-$$
48         rm -f /tmp/manpage-$$
49       fi
50       break
51     fi
52   done
55 function whatis_internal ()
57   local j
58   for j in $(echo "$MANPATH" | tr : ' '); do
59     if [ -f "$j/whatis" ]; then
60       eval $2 -i -e "$1" $j/whatis
61     fi
62   done
65 function whatis ()
67   local name=$(basename "$1")
68   whatis_internal "$name" "grep -w"
71 function apropos ()
73   whatis_internal "$1" "grep -F"
76 # Note: "-" and "-t" together not supported.  This man could be
77 # made a lot better, but it does everything I want.
78 function man ()
80   local PAGER printing mpath MANROFF num
81   mpath="${MANPATH:-/usr/man}"
82   while true; do
83     case "$1" in
84       -) PAGER=cat
85          printing= ;;
86       -t)
87          MANROFF=${TROFF:-"ptroff -man -t"}
88          PAGER="${TCAT:-lpr}"
89          printing=yes ;;
90       -M)
91          mpath="$2"
92          shift;;
93       *) break;;
94     esac
95     shift
96   done
97   local MANPATH="$mpath"
98   case "$1" in
99     -f | -k)
100       local g a
101       if [ "$1" = "-f" ]; then
102         g="grep -w"
103         a=$(basename "$2")
104       else
105         g="grep -F"
106         a="$2"
107       fi
108       whatis_internal "$a" "$g"
109       ;;
110     [0-9npol] | [0-9][a-z]* | new | public | old | local)
111       if [ "$1" = "new" ]; then
112         num=n
113       elif [ "$1" = "public" ]; then
114         num=p
115       elif [ "$1" = "old" ]; then
116         num=o
117       elif [ "$1" = "local" ]; then
118         num=l
119       else
120         num="$1"
121       fi
122       shift
123       manpage "$num" "$1" "$printing"
124       ;;
125     *)
126       manpage "$num" "$1" "$printing"
127       ;;
128   esac