mirror of
https://github.com/Gator96100/ProxSpace.git
synced 2025-07-30 11:38:41 -07:00
110 lines
2.8 KiB
Bash
110 lines
2.8 KiB
Bash
#!/bin/bash
|
|
|
|
__inarray() {
|
|
local i
|
|
for i in "${@:2}"; do
|
|
[[ $i == "$1" ]] && return
|
|
done
|
|
}
|
|
|
|
__hasprefix() {
|
|
local i
|
|
for i in "${@:2}"; do
|
|
[[ $i = "$1"* ]] && return
|
|
done
|
|
}
|
|
|
|
_pkgfile() {
|
|
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD - 1]} prevprev=${COMP_WORDS[COMP_CWORD - 2]}
|
|
|
|
local shortopts=(-l -s -u -b -C -D -g -i -q -R -r -h -V -v -w -z -0)
|
|
local longopts=(--list --search --update --binaries --glob --ignorecase
|
|
--quiet --regex --help --version --verbose --raw --null)
|
|
local longoptsarg=(--compress --config --cachedir --repo)
|
|
local allopts=("${shortopts[@]}" "${longopts[@]}" "${longoptsarg[@]}")
|
|
|
|
local compressopts=(none gzip bzip2 lz4 lzma lzop xz)
|
|
|
|
# maybe mangle the arguments in case we're looking at a --longopt=$val
|
|
[[ $cur = '=' ]] && cur=
|
|
if [[ $prev = '=' ]] && __inarray "$prevprev" "${allopts[@]}"; then
|
|
prev=$prevprev
|
|
fi
|
|
|
|
case $prev in
|
|
-C|--config)
|
|
COMPREPLY=($(compgen -f -- "$cur"))
|
|
compopt -o filenames
|
|
return 0
|
|
;;
|
|
-D|--cachedir)
|
|
COMPREPLY=($(compgen -d -- "$cur"))
|
|
compopt -o filenames
|
|
return 0
|
|
;;
|
|
-z|--compress)
|
|
COMPREPLY=($(compgen -W '${compressopts[*]}' -- "$cur"))
|
|
return 0
|
|
;;
|
|
-R|--repo)
|
|
local repos=$(sed '/^\[\(.*\)\]$/!d;s//\1/g;/options/d' /etc/pacman.conf)
|
|
COMPREPLY=($(compgen -W '$repos' -- "$cur"))
|
|
return 0
|
|
;;
|
|
esac
|
|
|
|
case $cur in
|
|
--*)
|
|
if __hasprefix "$cur" "${longoptsarg[@]}"; then
|
|
compopt -o nospace
|
|
COMPREPLY=($(compgen -W '${longoptsarg[*]}' -S = -- "$cur"))
|
|
else
|
|
COMPREPLY=($(compgen -W '${longopts[*]}' -- "$cur"))
|
|
fi
|
|
return 0
|
|
;;
|
|
-*)
|
|
COMPREPLY=($(compgen -W '${allopts[*]}' -- "$cur"))
|
|
return 0
|
|
;;
|
|
*)
|
|
# completion based on mode -- always take the last specified
|
|
local i j w mode
|
|
for (( i = 1; i < ${#COMP_WORDS[*]}; ++i )); do
|
|
w=${COMP_WORDS[i]}
|
|
if (( i == 1 )) || [[ ${COMP_WORDS[i-1]} != -* ]]; then
|
|
case $w in
|
|
# mode from shortopt (possibly a bunch mushed together)
|
|
-[^-]*)
|
|
for (( j = 0; j < ${#w}; j++ )); do
|
|
case ${w:j:1} in
|
|
l|s)
|
|
mode=${w:j:1}
|
|
;;
|
|
esac
|
|
done
|
|
;;
|
|
# mode from long opt
|
|
--list|--search)
|
|
mode=${w#--}
|
|
;;
|
|
esac
|
|
fi
|
|
done
|
|
case $mode in
|
|
l|list)
|
|
# complete based on package matches
|
|
COMPREPLY=($(compgen -W '$(command pacman -Ssq)' -- "$cur"))
|
|
return 0
|
|
;;
|
|
*)
|
|
COMPREPLY=($(compgen -W '${allopts[*]}' -- "$cur"))
|
|
return 0
|
|
;;
|
|
esac
|
|
esac
|
|
}
|
|
|
|
complete -F _pkgfile pkgfile
|
|
|
|
# ex:et ts=2 sw=2 ft=sh
|