summaryrefslogtreecommitdiffstats
path: root/completions/man
diff options
context:
space:
mode:
Diffstat (limited to 'completions/man')
-rw-r--r--completions/man103
1 files changed, 56 insertions, 47 deletions
diff --git a/completions/man b/completions/man
index 81d06f5..b405f08 100644
--- a/completions/man
+++ b/completions/man
@@ -1,86 +1,95 @@
# man(1) completion -*- shell-script -*-
-_man()
+_comp_cmd_man()
{
- local cur prev words cword split
- _init_completion -s -n : || return
+ local cur prev words cword was_split comp_args
+ _comp_initialize -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))"
+ local comprsuffix=".@([glx]z|bz2|lzma|Z|zst)"
+ local manext="@([0-9]*([a-z])|[lnp]|man)?($comprsuffix)"
+ local mansect="@([0-9]*([a-z])|[lnp])"
+ local noargopts='!(-*|*[ClMSsPpLmerRE]*)'
+ # shellcheck disable=SC2254
case $prev in
- --config-file | -!(-*)C)
- _filedir conf
+ --config-file | -${noargopts}C)
+ _comp_compgen_filedir conf
return
;;
- --local-file | -!(-*)l)
- _filedir "$manext"
+ --local-file | -${noargopts}l)
+ _comp_compgen_filedir "$manext"
return
;;
- --manpath | -!(-*)M)
- _filedir -d
+ --manpath | -${noargopts}M)
+ _comp_compgen_filedir -d
return
;;
- --pager | -!(-*)P)
- compopt -o filenames
- COMPREPLY=($(compgen -c -- "$cur"))
+ --sections | -${noargopts}[Ss])
+ _comp_delimited : -W '{1..9}'
return
;;
- --preprocessor | -!(-*)p)
- COMPREPLY=($(compgen -W 'e p t g r v' -- "$cur"))
+ --pager | -${noargopts}P)
+ _comp_compgen_commands
+ return
+ ;;
+ --preprocessor | -${noargopts}p)
+ _comp_compgen -- -W 'e p t g r v'
return
;;
--locale | --systems | --extension | --prompt | --recode | --encoding | \
- -!(-*)[LmerRE])
+ -${noargopts}[LmerRE])
return
;;
esac
- $split && return
+ [[ $was_split ]] && return
if [[ $cur == -* ]]; then
- local opts=$(_parse_help "$1" -h)
- COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur"))
+ _comp_compgen_help -- -h || _comp_compgen_usage
[[ ${COMPREPLY-} == *= ]] && compopt -o nospace
return
fi
# file based completion if parameter looks like a path
- if [[ $cur == @(*/|[.~])* ]]; then
- _filedir "$manext"
+ if _comp_looks_like_path "$cur"; then
+ _comp_compgen_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"
+ if [[ ! $manpath ]]; then
+ # Note: Both "manpath" and "man -w" may be unavailable, in
+ # which case we determine the man paths based on the
+ # environment variable MANPATH.
+ manpath=:${MANPATH-}:
+ # Note: An empty path (represented by two consecutive colons
+ # or a preceding/trailing colon) represents the system man
+ # paths.
+ manpath=${manpath//::/':/usr/share/man:/usr/local/share/man:'}
+ manpath=${manpath:1:-1}
+ fi
# 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
+ _comp_split -F : manpath "$manpath"
+ if ((${#manpath[@]})); then
+ local manfiles
+ _comp_compgen -Rv manfiles -- -S "/*man$sect/$cur*" -W '"${manpath[@]}"'
+ _comp_compgen -aRv manfiles -- -S "/*cat$sect/$cur*" -W '"${manpath[@]}"'
- 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//\\\\/}"))
+ local IFS=
+ if _comp_expand_glob COMPREPLY '${manfiles[@]}'; then
+ # weed out directory path names and paths to man pages (empty
+ # elements will be removed by the later `compgen -X ''`)
+ COMPREPLY=("${COMPREPLY[@]##*/?(:)}")
+ # strip suffix from man pages
+ COMPREPLY=("${COMPREPLY[@]%$comprsuffix}")
+ _comp_compgen -c "${cur//\\\\/}" -- -W '"${COMPREPLY[@]%.*}"' -X ''
+ fi
+ _comp_unlocal IFS
fi
# shellcheck disable=SC2053
@@ -88,14 +97,14 @@ _man()
# 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"
+ _comp_compgen -a filedir "$manext"
for ((i = start; i < ${#COMPREPLY[@]}; i++)); do
[[ ${COMPREPLY[i]} == */* ]] || COMPREPLY[i]=./${COMPREPLY[i]}
done
fi
- __ltrim_colon_completions "$cur"
+ _comp_ltrim_colon_completions "$cur"
} &&
- complete -F _man man apropos whatis
+ complete -F _comp_cmd_man man apropos whatis
# ex: filetype=sh