c875723bef
This way it's clearer to users that an argument is expected. It's likely that this commit does not catch all such cases, but it should do it for most of the affected commands I have installed.
109 lines
2.9 KiB
Bash
109 lines
2.9 KiB
Bash
# man(1) completion
|
|
|
|
[[ $USERLAND == GNU || $UNAME == @(Darwin|FreeBSD|SunOS|Cygwin|OpenBSD) ]] &&
|
|
_man()
|
|
{
|
|
local cur prev words cword split
|
|
_init_completion -s -n : || return
|
|
|
|
local i sect manpath manext mansect uname
|
|
|
|
manext="@([0-9lnp]|[0-9][px]|man|3pm)?(.@([gx]z|bz2|lzma|Z))"
|
|
mansect="@([0-9lnp]|[0-9][px]|3pm)"
|
|
|
|
case $prev in
|
|
-C|--config-file)
|
|
_filedir conf
|
|
return
|
|
;;
|
|
-l|--local-file)
|
|
_filedir $manext
|
|
return
|
|
;;
|
|
-M|--manpath)
|
|
_filedir -d
|
|
return
|
|
;;
|
|
-P|--pager)
|
|
COMPREPLY=( $( compgen -c -- "$cur" ) )
|
|
return
|
|
;;
|
|
-p|--preprocessor)
|
|
COMPREPLY=( $( compgen -W 'e p t g r v' -- "$cur" ) )
|
|
return
|
|
;;
|
|
-L|--locale|-m|--systems|-e|--extension|-r|--prompt|-R|--recode|\
|
|
-E|--encoding)
|
|
return
|
|
;;
|
|
esac
|
|
|
|
$split && return
|
|
|
|
if [[ $cur == -* ]]; then
|
|
COMPREPLY=( $( compgen -W '$( _parse_help "$1" -h )' -- "$cur" ) )
|
|
[[ $COMPREPLY == *= ]] && compopt -o nospace
|
|
return
|
|
fi
|
|
|
|
_expand || return 0
|
|
|
|
# file based completion if parameter looks like a path
|
|
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[@]%.@([gx]z|bz2|lzma|Z)} )
|
|
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
|
|
|
|
__ltrim_colon_completions "$cur"
|
|
return 0
|
|
} &&
|
|
complete -F _man 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
|