summaryrefslogtreecommitdiffstats
path: root/completions/man
diff options
context:
space:
mode:
Diffstat (limited to 'completions/man')
-rw-r--r--completions/man101
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