diff options
Diffstat (limited to 'contrib/man')
-rw-r--r-- | contrib/man | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/contrib/man b/contrib/man new file mode 100644 index 00000000..4804a949 --- /dev/null +++ b/contrib/man @@ -0,0 +1,83 @@ +# man(1) completion + +[ $USERLAND = GNU -o $UNAME = Darwin \ + -o $UNAME = FreeBSD -o $UNAME = SunOS -o $UNAME = Cygwin \ + -o $UNAME = OpenBSD ] && +_man() +{ + local cur i prev sect manpath manext mansect uname + + manext="@([0-9lnp]|[0-9][px]|man|3pm)?(.@(gz|bz2|lzma))" + mansect="@([0-9lnp]|[0-9][px]|3pm)" + + COMPREPLY=() + cur=`_get_cword` + prev=${COMP_WORDS[COMP_CWORD-1]} + + if [[ "$prev" == -l ]]; then + _filedir $manext + return 0 + fi + + _expand || return 0 + + # file based completion if parameter contains / + if [[ "$cur" == */* ]]; then + _filedir $manext + return 0 + fi + + uname=$( uname -s ) + if [[ $uname == @(Linux|GNU|GNU/*|FreeBSD|Cygwin|CYGWIN_*) ]]; then + manpath=$( manpath 2>/dev/null || command man --path ) + else + manpath=$MANPATH + fi + + if [ -z "$manpath" ]; then + COMPREPLY=( $( compgen -c -- "$cur" ) ) + return 0 + fi + + # determine manual section to search + [[ "$prev" == $mansect ]] && sect=$prev || sect='*' + + manpath=$manpath: + if [ -n "$cur" ]; then + manpath="${manpath//://*man$sect/$cur* } ${manpath//://*cat$sect/$cur* }" + else + manpath="${manpath//://*man$sect/ } ${manpath//://*cat$sect/ }" + fi + + # redirect stderr for when path doesn't exist + COMPREPLY=( $( eval command ls "$manpath" 2>/dev/null ) ) + # weed out directory path names and paths to man pages + COMPREPLY=( ${COMPREPLY[@]##*/?(:)} ) + # strip suffix from man pages + COMPREPLY=( ${COMPREPLY[@]%.@(gz|bz2|lzma)} ) + COMPREPLY=( $( compgen -W '${COMPREPLY[@]%.*}' -- "${cur//\\\\/}" ) ) + + if [[ "$prev" != $mansect ]]; then + # File based completion for the rest, prepending ./ if needed + # (man 1.6f needs that for man pages in current dir) + local start=${#COMPREPLY[@]} + _filedir $manext + for (( i=$start; i < ${#COMPREPLY[@]}; i++ )); do + [[ ${COMPREPLY[i]} == */* ]] || COMPREPLY[i]=./${COMPREPLY[i]} + done + fi + + return 0 +} +[ $USERLAND = GNU -o $UNAME = Darwin \ + -o $UNAME = FreeBSD -o $UNAME = SunOS -o $UNAME = Cygwin \ + -o $UNAME = OpenBSD ] && \ +complete -F _man $filenames man apropos whatis + +# Local variables: +# mode: shell-script +# sh-basic-offset: 4 +# sh-indent-comment: t +# indent-tabs-mode: nil +# End: +# ex: ts=4 sw=4 et filetype=sh |