diff options
Diffstat (limited to 'completions/man')
-rw-r--r-- | completions/man | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/completions/man b/completions/man new file mode 100644 index 0000000..81d06f5 --- /dev/null +++ b/completions/man @@ -0,0 +1,101 @@ +# man(1) completion -*- shell-script -*- + +_man() +{ + local cur prev words cword split + _init_completion -s -n : || return + + local comprsuffix=".@([glx]z|bz2|lzma|Z)" + local manext="@([0-9lnp]|[0-9][px]|man|3?(gl|pm))?($comprsuffix)" + local mansect="@([0-9lnp]|[0-9][px]|3?(gl|pm))" + + case $prev in + --config-file | -!(-*)C) + _filedir conf + return + ;; + --local-file | -!(-*)l) + _filedir "$manext" + return + ;; + --manpath | -!(-*)M) + _filedir -d + return + ;; + --pager | -!(-*)P) + compopt -o filenames + COMPREPLY=($(compgen -c -- "$cur")) + return + ;; + --preprocessor | -!(-*)p) + COMPREPLY=($(compgen -W 'e p t g r v' -- "$cur")) + return + ;; + --locale | --systems | --extension | --prompt | --recode | --encoding | \ + -!(-*)[LmerRE]) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + local opts=$(_parse_help "$1" -h) + COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + # file based completion if parameter looks like a path + if [[ $cur == @(*/|[.~])* ]]; then + _filedir "$manext" + return + fi + + local manpath=$(manpath 2>/dev/null || command man -w 2>/dev/null) + [[ -z $manpath ]] && manpath="/usr/share/man:/usr/local/share/man" + + # determine manual section to search + local sect + # shellcheck disable=SC2053 + [[ $prev == $mansect ]] && sect=$prev || sect='*' + + _expand || return + + manpath=$manpath: + if [[ -n $cur ]]; then + manpath="${manpath//://*man$sect/$cur* } ${manpath//://*cat$sect/$cur* }" + else + manpath="${manpath//://*man$sect/ } ${manpath//://*cat$sect/ }" + fi + + local IFS=$' \t\n' reset=$(shopt -p failglob) + shopt -u failglob + # redirect stderr for when path doesn't exist + COMPREPLY=($(eval command ls "$manpath" 2>/dev/null)) + $reset + + if ((${#COMPREPLY[@]} != 0)); then + # weed out directory path names and paths to man pages + COMPREPLY=(${COMPREPLY[@]##*/?(:)}) + # strip suffix from man pages + COMPREPLY=(${COMPREPLY[@]%$comprsuffix}) + COMPREPLY=($(compgen -W '${COMPREPLY[@]%.*}' -- "${cur//\\\\/}")) + fi + + # shellcheck disable=SC2053 + 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 i start=${#COMPREPLY[@]} + _filedir "$manext" + for ((i = start; i < ${#COMPREPLY[@]}; i++)); do + [[ ${COMPREPLY[i]} == */* ]] || COMPREPLY[i]=./${COMPREPLY[i]} + done + fi + + __ltrim_colon_completions "$cur" +} && + complete -F _man man apropos whatis + +# ex: filetype=sh |