diff options
Diffstat (limited to '')
502 files changed, 11593 insertions, 9589 deletions
diff --git a/completions/.gitignore b/completions/.gitignore index 5edc172..0837060 100644 --- a/completions/.gitignore +++ b/completions/.gitignore @@ -1,235 +1,351 @@ -7za -aclocal-1.1[0123456] -alpine -alternatives -animate -apropos -aptitude-curses -arm-koji -asciidoc.py -autoheader -automake-1.1[0123456] -autossh -autoupdate -bmake -bsdtar -btdownloadcurses.py -btdownloadgui.py -c++ -cc -cdrecord -chrome -chromium -ci -ciptool -civclient -civserver -clzip -co -colormake -compare -compgen -composite -conjure -cowthink -createdb -createuser -dcop -declare -dfutool -display -dpkg-deb -dpkg-query -dpkg-reconfigure -dropdb -dropuser -edquota -etherwake -f77 -f95 -filebucket -freeciv-gtk2 -freeciv-gtk3 -freeciv-sdl -freeciv-xaw -g++ -g++-[5678] -g4 -g77 -g95 -gcc-[5678] -gccgo -gccgo-[5678] -gcj -geoiplookup6 -gfortran -gfortran-[5678] -gkrellm2 -gmake -gmplayer -gnumake -google-chrome -google-chrome-stable -gpc -gpgv2 -gtar -hciattach -hciconfig -hd -host -hping -hping3 -iceweasel -identify -ifdown -ifquery -ifstatus -import -inotifywatch -insmod.static -iperf3 -javac -javadoc -kplayer -l2ping -lbzip2 -ldapadd -ldapcompare -ldapdelete -ldapmodify -ldapmodrdn -ldappasswd -ldapwhoami -links2 -lintian-info -lusermod -lvchange -lvcreate -lvdisplay -lvextend -lvmdiskscan -lvreduce -lvremove -lvrename -lvresize -lvs -lvscan -lz4c -mailsnarf -mdecrypt -mencoder -micropython -mkisofs -mogrify -montage -mozilla-firefox -mplayer2 -msgsnarf -muttng -ncal -pbzip2 -pccardctl -pdlzip -perldoc -phing -pigz -pinfo -ping6 -pkg_deinstall -pkg_info -pkill -plzip -pm-suspend -pm-suspend-hybrid -pmake -postalias -ppc-koji -puppetca -puppetd -puppetdoc -puppetmasterd -puppetqd -puppetrun -pvchange -pvcreate -pvdisplay -pvmove -pvremove -pvs -pvscan -pxz -py.test -py.test-[23] -pydoc3 -pylint-[23] -pytest-[23] -python2 -python2.7 -python3 -python3.[345678] -pypy -pypy3 -pyvenv-3.[45678] -qemu-kvm -qemu-system-i386 -qemu-system-x86_64 -quotacheck -quotaoff -quotaon -ralsh -rcsdiff -rdict -repquota -rfcomm -rlog -rpm2targz -rpm2txz -rpmbuild -rpmbuild-md5 -s390-koji -sbcl-mt -scp -sdptool -setquota -sftp -sidedoor -slogin -smbcacls -smbcquotas -smbget -smbpasswd -smbtar -smbtree -sparc-koji -spovray -star -stream -sudoedit -tightvncviewer -tracepath6 -typeset -vgcfgbackup -vgcfgrestore -vgchange -vgck -vgconvert -vgcreate -vgdisplay -vgexport -vgextend -vgimport -vgmerge -vgmknodes -vgreduce -vgremove -vgrename -vgs -vgscan -vgsplit -vigr -whatis -wine-development -wine-stable -xpovray -xvnc4viewer -ypcat +/7za +/7zr +/7zz +/7zzs +/aclocal-1.1[0123456] +/_airflow +/_allero +/alpine +/alternatives +/animate +/_ansible +/_ansible-config +/_ansible-console +/_ansible-doc +/_ansible-galaxy +/_ansible-inventory +/_ansible-playbook +/_ansible-pull +/_ansible-vault +/apropos +/aptitude-curses +/_arduino-cli +/arm-koji +/asciidoc.py +/autoheader +/automake-1.1[0123456] +/autossh +/autoupdate +/avahi-browse-domains +/b2sum +/_black +/_blackd +/bmake +/bsdtar +/btdownloadcurses.py +/btdownloadgui.py +/_buf +/c++ +/cc +/cdrecord +/_chezmoi +/chrome +/chromium +/ci +/_cilium +/ciptool +/civclient +/civserver +/_cloudquery +/clzip +/co +/colormake +/compare +/compgen +/composite +/_conda +/conjure +/_constellation +/_consul +/cowthink +/_crc +/createdb +/createuser +/_cz +/_datree +/dcop +/_deno +/dfutool +/_diesel +/display +/_docker +/dpkg-deb +/dpkg-query +/dpkg-reconfigure +/_dprint +/dropdb +/dropuser +/edquota +/etherwake +/f77 +/f95 +/filebucket +/firefox-esr +/_flask +/freeciv-gtk2 +/freeciv-gtk3 +/freeciv-sdl +/freeciv-xaw +/g++ +/g++-[5678] +/g4 +/g77 +/g95 +/_gaiad +/_gardenctl +/gcc-[5678] +/gccgo +/gccgo-[5678] +/gcj +/geoiplookup6 +/gfortran +/gfortran-[5678] +/_gh-label +/_git-bump +/gkrellm2 +/gmake +/gmplayer +/gnumake +/_go-licenses +/google-chrome +/google-chrome-stable +/_gopherjs +/_goreleaser +/gpc +/gpgv2 +/gssdp-device-sniffer +/gtar +/hciattach +/hciconfig +/hd +/_helm +/host +/hping +/hping3 +/_httpx +/_hugo +/iceweasel +/identify +/ifdown +/ifquery +/ifstatus +/_ignite +/import +/_infracost +/inotifywatch +/insmod.static +/iperf3 +/_istioctl +/javac +/javadoc +/_k3s +/_kn +/_kool +/kplayer +/_kratos +/_kubeadm +/_kubectl +/_kubescape +/l2ping +/lbzip2 +/ldapadd +/ldapcompare +/ldapdelete +/ldapmodify +/ldapmodrdn +/ldappasswd +/ldapwhoami +/_lefthook +/_linkerd +/links2 +/lintian-info +/lua5[0-4] +/lua5.[0-4] +/luac5[0-4] +/luac5.[0-4] +/lusermod +/lvchange +/lvcreate +/lvdisplay +/lvextend +/lvmdiskscan +/lvreduce +/lvremove +/lvrename +/lvresize +/lvs +/lvscan +/lz4c +/mailsnarf +/_mattermost +/md5sum +/mdecrypt +/mencoder +/_metalctl +/micropython +/_minikube +/_mise +/mkisofs +/_mmctl +/mogrify +/_moldy +/montage +/mozilla-firefox +/mplayer2 +/msgsnarf +/_multi-gitter +/muttng +/ncal +/neomutt +/_nfpm +/_nomad +/_npm +/_oc +/_okteto +/_op +/_ory +/_packer +/pbzip2 +/pccardctl +/pdlzip +/perldoc +/phing +/pigz +/pinfo +/ping4 +/ping6 +/_pip3 +/pkg_deinstall +/pkg_info +/pkgconf +/pkill +/plzip +/pm-suspend +/pm-suspend-hybrid +/pmake +/_polygon-edge +/postalias +/ppc-koji +/_pulumi +/puppetca +/puppetd +/puppetdoc +/puppetmasterd +/puppetqd +/puppetrun +/pushd +/pvchange +/pvcreate +/pvdisplay +/pvmove +/pvremove +/pvs +/pvscan +/_px +/pxz +/py.test +/py.test-[23] +/pydoc3 +/pylint-[23] +/pytest-[23] +/python2 +/python2.7 +/python3 +/python3.[3456789] +/python3.1[012] +/pypy +/pypy3 +/pyston +/pyston3 +/pyvenv-3.[456789] +/pyvenv-3.1[012] +/qemu-kvm +/qemu-system-i386 +/qemu-system-x86_64 +/_qrpc +/quotacheck +/quotaoff +/quotaon +/ralsh +/_random +/_rclone +/rcsdiff +/rdict +/repquota +/rfcomm +/rlog +/rpm2targz +/rpm2txz +/rpmbuild +/rpmbuild-md5 +/s390-koji +/sbcl-mt +/scp +/sdptool +/setquota +/sftp +/shasum +/sha1sum +/sha224sum +/sha384sum +/sha512sum +/sidedoor +/_skaffold +/slogin +/smbcacls +/smbcquotas +/smbget +/smbpasswd +/smbtar +/smbtree +/sparc-koji +/spovray +/_sshi +/_ssh-inscribe +/star +/_starship +/stream +/sudoedit +/_tanzu +/_tanzu-core +/_tendermint +/_terraform +/_tkn +/_tkn-pac +/tightvncviewer +/tracepath6 +/_trivy +/typeset +/_upctl +/_vacuum +/vgcfgbackup +/vgcfgrestore +/vgchange +/vgck +/vgconvert +/vgcreate +/vgdisplay +/vgexport +/vgextend +/vgimport +/vgmerge +/vgmknodes +/vgreduce +/vgremove +/vgrename +/vgs +/vgscan +/vgsplit +/vigr +/_virtctl +/_watchexec +/whatis +/wine-development +/wine-stable +/wine64 +/wine64-development +/wine64-stable +/xpovray +/xvnc4viewer +/ypcat +/_zitadel diff --git a/completions/2to3 b/completions/2to3 index 7c5b330..0a60e1f 100644 --- a/completions/2to3 +++ b/completions/2to3 @@ -1,39 +1,42 @@ # bash completion for 2to3 -*- shell-script -*- -_2to3() +_comp_cmd_2to3() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -h | --help | --add-suffix) return ;; -f | --fix | -x | --nofix) - COMPREPLY=($(compgen -W \ - "$($1 --list-fixes 2>/dev/null | command sed -e 1d)" -- "$cur")) + _comp_compgen_split -- "$( + "$1" --list-fixes 2>/dev/null | command sed -e 1d + )" return ;; -j | --processes) - COMPREPLY=($(compgen -W "{1..$(_ncpus)}" -- "$cur")) + local REPLY + _comp_get_ncpus + _comp_compgen -- -W "{1..$REPLY}" return ;; -o | --output-dir) - _filedir -d + _comp_compgen_filedir -d return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir py + _comp_compgen_filedir py } && - complete -F _2to3 2to3 + complete -F _comp_cmd_2to3 2to3 # ex: filetype=sh diff --git a/completions/7z b/completions/7z index a8acbc5..027f84b 100644 --- a/completions/7z +++ b/completions/7z @@ -1,21 +1,21 @@ # 7z(1) completion -*- shell-script -*- -_7z() +_comp_cmd_7z() { - local cur prev words cword - _init_completion -n = || return + local cur prev words cword comp_args + _comp_initialize -n = -- "$@" || return if ((cword == 1)); then - COMPREPLY=($(compgen -W 'a b d e l t u x' -- "$cur")) + _comp_compgen -- -W 'a b d e h i l rn t u x' return fi local mode - [[ ${words[1]} == [adu] ]] && mode=w || mode=r + [[ ${words[1]} == @(a|d|rn|u) ]] && mode=w || mode=r case $cur in -ao*) - COMPREPLY=($(compgen -P${cur:0:3} -W 'a s t u' -- "${cur:3}")) + _comp_compgen -c "${cur:3}" -- -P"${cur:0:3}" -W 'a s t u' return ;; -?(a)[ix]*) @@ -26,59 +26,48 @@ _7z() opt=${cur:0:2} cur=${cur:2} fi if [[ $cur != *[@\!]* ]]; then - COMPREPLY=($(compgen -P$opt -W '@ ! r@ r-@ r0@ r! r-! r0!' \ - -- "$cur")) + _comp_compgen -- -P"$opt" -W '@ ! r@ r-@ r0@ r! r-! r0!' elif [[ $cur == ?(r@(-|0|))@* ]]; then - local IFS=$' \t\n' reset=$(shopt -po noglob) - set -o noglob - COMPREPLY=($(compgen -P"${opt}${cur%%@*}@" -f -- "${cur#*@}")) - $reset + _comp_compgen -c "${cur#*@}" -- -P"${opt}${cur%%@*}@" -f compopt -o filenames fi return ;; -mhe=* | -mhc=* | -ms=* | -mt=*) - COMPREPLY=($(compgen -W 'on off' -- "${cur#*=}")) + _comp_compgen -c "${cur#*=}" -- -W 'on off' return ;; -mx=*) - COMPREPLY=($(compgen -W '0 1 3 5 7 9' -- "${cur#*=}")) + _comp_compgen -c "${cur#*=}" -- -W '0 1 3 5 7 9' return ;; -o* | -w?*) - local reset=$(shopt -po noglob) - set -o noglob compopt -o filenames - local ifs=$IFS IFS=$'\n' - COMPREPLY=($(compgen -d -P${cur:0:2} -S/ -- "${cur:2}")) - IFS=$ifs - $reset + _comp_compgen -c "${cur:2}" -- -d -P"${cur:0:2}" -S/ compopt -o nospace return ;; -r?*) - COMPREPLY=($(compgen -P${cur:0:2} -W '- 0' -- "${cur:2}")) + _comp_compgen -c "${cur:2}" -- -P"${cur:0:2}" -W '- 0' return ;; -scs*) - COMPREPLY=($(compgen -P${cur:0:4} -W 'UTF-8 WIN DOS' \ - -- "${cur:4}")) + _comp_compgen -c "${cur:4}" -- -P"${cur:0:4}" -W 'UTF-8 WIN DOS' return ;; -ssc?*) - COMPREPLY=($(compgen -P${cur:0:4} -W '-' -- "${cur:4}")) + _comp_compgen -c "${cur:4}" -- -P"${cur:0:4}" -W '-' return ;; -t*) if [[ $mode == w ]]; then - COMPREPLY=($(compgen -P${cur:0:2} -W '7z bzip2 gzip swfc - tar wim xz zip' -- "${cur:2}")) + _comp_compgen -c "${cur:2}" -- -P"${cur:0:2}" -W '7z bzip2 gzip + swfc tar wim xz zip' else - COMPREPLY=($(compgen -P${cur:0:2} -W '7z apm arj bzip2 cab - chm cpio cramfs deb dmg elf fat flv gzip hfs iso lzh lzma - lzma86 macho mbr mslz mub nsis ntfs pe ppmd rar rpm - squashfs swf swfc tar udf vhd wim xar xz z zip' \ - -- "${cur:2}")) + _comp_compgen -c "${cur:2}" -- -P"${cur:0:2}" -W '7z apm arj + bzip2 cab chm cpio cramfs deb dmg elf fat flv gzip hfs iso + lzh lzma lzma86 macho mbr mslz mub nsis ntfs pe ppmd rar + rpm squashfs swf swfc tar udf vhd wim xar xz z zip' fi return ;; @@ -88,18 +77,17 @@ _7z() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-ai -an -ao -ax -bd -i -m{x,s,f,he,hc,mt}= - -o -p -r -scs -sfx -si -slp -slt -so -ssc -t -u -v -w -x -y' \ - -- "$cur")) + _comp_compgen -- -W '-ai -an -ao -ax -bd -i -m{x,s,f,he,hc,mt}= + -o -p -r -scs -sfx -si -slp -slt -so -ssc -t -u -v -w -x -y' [[ ${COMPREPLY-} == -@(an|bd|sfx|si|slt|so|ssc|[rwy]) ]] || compopt -o nospace return fi - local args - _count_args = - if ((args == 2)); then - _filedir_xspec unzip + local REPLY + _comp_count_args + if ((REPLY == 2)); then + _comp_compgen_filedir_xspec unzip # TODO: parsing 7z i output? # - how to figure out if the format is input or output? # - find string Formats:, read until next empty line @@ -109,20 +97,20 @@ _7z() # - terminate on token containing anything [^a-z0-9] # (assumption: extensions are all lowercase) [[ $mode == w ]] && - _filedir '@(7z|bz2|swf|?(g)tar|?(t)[bglx]z|tb?(z)2|wim)' || - _filedir '@(7z|arj|bz2|cab|chm|cpio|deb|dmg|flv|gem|img|iso|lz[ah]|lzma?(86)|msi|pmd|[rx]ar|rpm|sw[fm]|?(g)tar|taz|?(t)[bglx]z|tb?(z)2|vhd|wim|Z)' + _comp_compgen -a filedir '@(7z|bz2|swf|?(g)tar|?(t)[bglx]z|tb?(z)2|wim)' || + _comp_compgen -a filedir '@(7z?(.001)|arj|bz2|cab|cb7|chm|cpio|deb|dmg|flv|gem|img|iso|lz[ah]|lzma?(86)|msi|pmd|[rx]ar|rpm|sw[fm]|?(g)tar|taz|?(t)[bglx]z|tb?(z)2|vhd|wim|Z)' else if [[ ${words[1]} == d ]]; then - local IFS=$'\n' - COMPREPLY=($(compgen -W "$(printf '%s\n' "$($1 l ${words[2]} \ - -slt 2>/dev/null | command sed -n '/^Path =/s/^Path = \(.*\)$/\1/p' \ - 2>/dev/null | tail -n+2)")" -- "$cur")) + _comp_compgen_split -l -- "$( + "$1" l "${words[2]}" -slt 2>/dev/null | command sed -n \ + '/^Path =/s/^Path = \(.*\)$/\1/p' 2>/dev/null | tail -n+2 + )" compopt -o filenames else - _filedir + _comp_compgen_filedir fi fi } && - complete -F _7z 7z 7za + complete -F _comp_cmd_7z 7z 7za 7zr 7zz 7zzs # ex: filetype=sh diff --git a/completions/Makefile.am b/completions/Makefile.am index 723b42f..8f11291 100644 --- a/completions/Makefile.am +++ b/completions/Makefile.am @@ -14,6 +14,7 @@ bashcomp_DATA = 2to3 \ apt-build \ apt-cache \ apt-get \ + apt-mark \ aptitude \ arch \ arp \ @@ -26,6 +27,7 @@ bashcomp_DATA = 2to3 \ autoreconf \ autorpm \ autoscan \ + avahi-browse \ avctrl \ badblocks \ bind \ @@ -36,10 +38,12 @@ bashcomp_DATA = 2to3 \ bzip2 \ _cal \ cancel \ + _cargo \ cardctl \ carton \ ccache \ ccze \ + cd \ cfagent \ cfrun \ chage \ @@ -75,6 +79,7 @@ bashcomp_DATA = 2to3 \ cvs \ cvsps \ dd \ + declare \ deja-dup \ desktop-file-validate \ dhclient \ @@ -113,11 +118,13 @@ bashcomp_DATA = 2to3 \ fio \ firefox \ flake8 \ + _flamegraph \ freebsd-update \ freeciv \ freeciv-server \ function \ fusermount \ + _gaiacli \ gcc \ gcl \ gdb \ @@ -127,12 +134,14 @@ bashcomp_DATA = 2to3 \ geoiplookup \ getconf \ getent \ + _gh \ gkrellm \ gm \ gnatmake \ gnokii \ gnome-mplayer \ gnome-screenshot \ + _golangci-lint \ gpasswd \ gpg \ gpg2 \ @@ -145,10 +154,13 @@ bashcomp_DATA = 2to3 \ groupmod \ growisofs \ grpck \ + _gsctl \ gssdp-discover \ gzip \ + hash \ hcitool \ hddtemp \ + help \ _hexdump \ hid2hci \ hostname \ @@ -196,13 +208,16 @@ bashcomp_DATA = 2to3 \ jshint \ json_xs \ jsonschema \ + _jungle \ k3b \ kcov \ + _keyring \ kill \ killall \ kldload \ kldunload \ koji \ + _kontena \ ktutil \ larch \ lastlog \ @@ -243,6 +258,7 @@ bashcomp_DATA = 2to3 \ mc \ mcrypt \ mdadm \ + _mdbook \ mdtool \ medusa \ mii-diag \ @@ -280,12 +296,13 @@ bashcomp_DATA = 2to3 \ ngrep \ nmap \ _nmcli \ + _nox \ nproc \ nslookup \ nsupdate \ ntpdate \ + _nvm \ oggdec \ - op \ openssl \ opera \ optipng \ @@ -293,6 +310,7 @@ bashcomp_DATA = 2to3 \ pack200 \ passwd \ patch \ + pdftoppm \ pdftotext \ perl \ perlcritic \ @@ -301,6 +319,8 @@ bashcomp_DATA = 2to3 \ pidof \ pine \ ping \ + _pip \ + _pipenv \ pkg-config \ pkg-get \ pkg_delete \ @@ -325,6 +345,7 @@ bashcomp_DATA = 2to3 \ prelink \ printenv \ protoc \ + ps \ psql \ puppet \ pv \ @@ -367,16 +388,19 @@ bashcomp_DATA = 2to3 \ rrdtool \ rsync \ _rtcwake \ + _ruff \ _runuser \ + _rustup \ sbcl \ sbopkg \ screen \ scrub \ secret-tool \ sh \ + sha256sum \ shellcheck \ sitecopy \ - slackpkg \ + _slackpkg \ slapt-get \ slapt-src \ smartctl \ @@ -388,6 +412,7 @@ bashcomp_DATA = 2to3 \ ssh-add \ ssh-copy-id \ ssh-keygen \ + ssh-keyscan \ sshfs \ sshmitm \ sshow \ @@ -410,8 +435,11 @@ bashcomp_DATA = 2to3 \ tcpnice \ timeout \ tipc \ + _tokio-console \ tox \ tracepath \ + tree \ + truncate \ tshark \ tsig-keygen \ tune2fs \ @@ -431,6 +459,7 @@ bashcomp_DATA = 2to3 \ userdel \ usermod \ valgrind \ + _vault \ vipw \ vmstat \ vncviewer \ @@ -448,6 +477,7 @@ bashcomp_DATA = 2to3 \ wvdial \ xdg-mime \ xdg-settings \ + xev \ xfreerdp \ xgamma \ xhost \ @@ -464,6 +494,7 @@ bashcomp_DATA = 2to3 \ xz \ xzdec \ ypmatch \ + _yq \ _yum \ yum-arch \ zopfli \ @@ -473,6 +504,9 @@ EXTRA_DIST = $(bashcomp_DATA) CLEANFILES = \ 7za \ + 7zr \ + 7zz \ + 7zzs \ aclocal-1.10 \ aclocal-1.11 \ aclocal-1.12 \ @@ -480,11 +514,23 @@ CLEANFILES = \ aclocal-1.14 \ aclocal-1.15 \ aclocal-1.16 \ + _airflow \ + _allero \ alpine \ alternatives \ animate \ + _ansible \ + _ansible-config \ + _ansible-console \ + _ansible-doc \ + _ansible-galaxy \ + _ansible-inventory \ + _ansible-playbook \ + _ansible-pull \ + _ansible-vault \ apropos \ aptitude-curses \ + _arduino-cli \ arm-koji \ asciidoc.py \ autoheader \ @@ -497,36 +543,52 @@ CLEANFILES = \ automake-1.16 \ autossh \ autoupdate \ + avahi-browse-domains \ + _black \ + _blackd \ bmake \ bsdtar \ btdownloadcurses.py \ btdownloadgui.py \ + _buf \ c++ \ cc \ cdrecord \ + _chezmoi \ chrome \ chromium \ ci \ + _cilium \ ciptool \ civclient \ civserver \ + _cloudquery \ clzip \ co \ colormake \ compare \ compgen \ composite \ + _conda \ conjure \ + _constellation \ + _consul \ cowthink \ + _crc \ createdb \ createuser \ + _cz \ + _datree \ dcop \ - declare \ + _deno \ dfutool \ + _diesel \ display \ + _docker \ dpkg-deb \ dpkg-query \ dpkg-reconfigure \ + _dprint \ dropdb \ dropuser \ edquota \ @@ -534,6 +596,8 @@ CLEANFILES = \ f77 \ f95 \ filebucket \ + firefox-esr \ + _flask \ freeciv-gtk2 \ freeciv-gtk3 \ freeciv-sdl \ @@ -546,6 +610,8 @@ CLEANFILES = \ g4 \ g77 \ g95 \ + _gaiad \ + _gardenctl \ gcc-5 \ gcc-6 \ gcc-7 \ @@ -562,33 +628,52 @@ CLEANFILES = \ gfortran-6 \ gfortran-7 \ gfortran-8 \ + _gh-label \ + _git-bump \ gkrellm2 \ gmake \ gmplayer \ gnumake \ + _go-licenses \ google-chrome \ google-chrome-stable \ + _gopherjs \ + _goreleaser \ gpc \ gpgv2 \ + gssdp-device-sniffer \ gtar \ hciattach \ hciconfig \ hd \ + _helm \ host \ hping \ hping3 \ + _httpx \ + _hugo \ iceweasel \ identify \ ifdown \ ifquery \ ifstatus \ + _ignite \ import \ + _infracost \ inotifywatch \ insmod.static \ iperf3 \ + _istioctl \ javac \ javadoc \ + _k3s \ + _kn \ + _kool \ kplayer \ + _kratos \ + _kubeadm \ + _kubectl \ + _kubescape \ l2ping \ lbzip2 \ ldapadd \ @@ -598,8 +683,30 @@ CLEANFILES = \ ldapmodrdn \ ldappasswd \ ldapwhoami \ + _lefthook \ + _linkerd \ links2 \ lintian-info \ + lua50 \ + lua5.0 \ + lua51 \ + lua5.1 \ + lua52 \ + lua5.2 \ + lua53 \ + lua5.3 \ + lua54 \ + lua5.4 \ + luac50 \ + luac5.0 \ + luac51 \ + luac5.1 \ + luac52 \ + luac5.2 \ + luac53 \ + luac5.3 \ + luac54 \ + luac5.4 \ lusermod \ lvchange \ lvcreate \ @@ -614,17 +721,34 @@ CLEANFILES = \ lvscan \ lz4c \ mailsnarf \ + _mattermost \ + md5sum \ mdecrypt \ mencoder \ + _metalctl \ micropython \ + _minikube \ + _mise \ mkisofs \ + _mmctl \ mogrify \ + _moldy \ montage \ mozilla-firefox \ mplayer2 \ msgsnarf \ + _multi-gitter \ muttng \ ncal \ + neomutt \ + _nfpm \ + _nomad \ + _npm \ + _oc \ + _okteto \ + _op \ + _ory \ + _packer \ pbzip2 \ pccardctl \ pdlzip \ @@ -632,22 +756,28 @@ CLEANFILES = \ phing \ pigz \ pinfo \ + ping4 \ ping6 \ + _pip3 \ pkg_deinstall \ pkg_info \ + pkgconf \ pkill \ plzip \ pm-suspend \ pm-suspend-hybrid \ pmake \ + _polygon-edge \ postalias \ ppc-koji \ + _pulumi \ puppetca \ puppetd \ puppetdoc \ puppetmasterd \ puppetqd \ puppetrun \ + pushd \ pvchange \ pvcreate \ pvdisplay \ @@ -655,6 +785,7 @@ CLEANFILES = \ pvremove \ pvs \ pvscan \ + _px \ pxz \ py.test \ py.test-2 \ @@ -664,6 +795,8 @@ CLEANFILES = \ pylint-3 \ pypy \ pypy3 \ + pyston \ + pyston3 \ pytest-2 \ pytest-3 \ python2 \ @@ -675,18 +808,29 @@ CLEANFILES = \ python3.6 \ python3.7 \ python3.8 \ + python3.9 \ + python3.10 \ + python3.11 \ + python3.12 \ pyvenv-3.4 \ pyvenv-3.5 \ pyvenv-3.6 \ pyvenv-3.7 \ pyvenv-3.8 \ + pyvenv-3.9 \ + pyvenv-3.10 \ + pyvenv-3.11 \ + pyvenv-3.12 \ qemu-kvm \ qemu-system-i386 \ qemu-system-x86_64 \ + _qrpc \ quotacheck \ quotaoff \ quotaon \ ralsh \ + _random \ + _rclone \ rcsdiff \ rdict \ repquota \ @@ -702,7 +846,13 @@ CLEANFILES = \ sdptool \ setquota \ sftp \ + shasum \ + sha1sum \ + sha224sum \ + sha384sum \ + sha512sum \ sidedoor \ + _skaffold \ slogin \ smbcacls \ smbcquotas \ @@ -712,12 +862,24 @@ CLEANFILES = \ smbtree \ sparc-koji \ spovray \ + _sshi \ + _ssh-inscribe \ star \ + _starship \ stream \ sudoedit \ + _tanzu \ + _tanzu-core \ + _tendermint \ + _terraform \ + _tkn \ + _tkn-pac \ tightvncviewer \ tracepath6 \ + _trivy \ typeset \ + _upctl \ + _vacuum \ vgcfgbackup \ vgcfgrestore \ vgchange \ @@ -737,14 +899,25 @@ CLEANFILES = \ vgscan \ vgsplit \ vigr \ + _virtctl \ + _watchexec \ whatis \ + wine-development \ + wine-stable \ + wine64 \ + wine64-development \ + wine64-stable \ xpovray \ xvnc4viewer \ - ypcat + ypcat \ + _zitadel symlinks: $(DATA) $(ss) 7z \ - 7za + 7za \ + 7zr \ + 7zz \ + 7zzs $(ss) aclocal \ aclocal-1.10 aclocal-1.11 aclocal-1.12 aclocal-1.13 \ aclocal-1.14 aclocal-1.15 aclocal-1.16 @@ -761,6 +934,8 @@ symlinks: $(DATA) autoheader $(ss) autoscan \ autoupdate + $(ss) avahi-browse \ + avahi-browse-domains $(ss) btdownloadheadless.py \ btdownloadcurses.py btdownloadgui.py $(ss) bzip2 \ @@ -769,6 +944,8 @@ symlinks: $(DATA) ncal $(ss) cardctl \ pccardctl + $(ss) cd \ + pushd $(ss) chromium-browser \ chrome chromium google-chrome google-chrome-stable $(ss) complete \ @@ -778,6 +955,8 @@ symlinks: $(DATA) mogrify montage stream $(ss) cowsay \ cowthink + $(ss) declare \ + typeset $(ss) dict \ rdict $(ss) dpkg \ @@ -787,13 +966,15 @@ symlinks: $(DATA) $(ss) filesnarf \ mailsnarf msgsnarf $(ss) firefox \ - iceweasel mozilla-firefox + firefox-esr iceweasel mozilla-firefox + $(ss) _flamegraph \ + _watchexec $(ss) freeciv \ civclient freeciv-gtk2 freeciv-gtk3 freeciv-sdl freeciv-xaw $(ss) freeciv-server \ civserver - $(ss) function \ - declare typeset + $(ss) _gaiacli \ + _gaiad _npm _tendermint $(ss) gcc \ c++ cc f77 f95 g++ g++-5 g++-6 g++-7 g++-8 g77 g95 gcc-5 \ gcc-6 gcc-7 gcc-8 gccgo gccgo-5 gccgo-6 gccgo-7 gccgo-8 gcj \ @@ -802,10 +983,74 @@ symlinks: $(DATA) mkisofs $(ss) geoiplookup \ geoiplookup6 + $(ss) _gh \ + _infracost $(ss) gkrellm \ gkrellm2 + $(ss) _golangci-lint \ + _allero \ + _arduino-cli \ + _buf \ + _chezmoi \ + _cilium \ + _cloudquery \ + _constellation \ + _crc \ + _datree \ + _docker \ + _gardenctl \ + _gh-label \ + _git-bump \ + _go-licenses \ + _gopherjs \ + _goreleaser \ + _helm \ + _hugo \ + _ignite \ + _istioctl \ + _k3s \ + _kn \ + _kool \ + _kratos \ + _kubeadm \ + _kubectl \ + _kubescape \ + _lefthook \ + _linkerd \ + _mattermost \ + _metalctl \ + _minikube \ + _mise \ + _mmctl \ + _moldy \ + _multi-gitter \ + _nfpm \ + _oc \ + _okteto \ + _op \ + _ory \ + _polygon-edge \ + _pulumi \ + _px \ + _qrpc \ + _random \ + _rclone \ + _skaffold \ + _sshi \ + _ssh-inscribe \ + _tanzu \ + _tanzu-core \ + _tkn \ + _tkn-pac \ + _trivy \ + _upctl \ + _vacuum \ + _virtctl \ + _zitadel $(ss) gpgv \ gpgv2 + $(ss) gssdp-discover \ + gssdp-device-sniffer $(ss) gzip \ pigz $(ss) hcitool \ @@ -835,6 +1080,12 @@ symlinks: $(DATA) links2 $(ss) lintian \ lintian-info + $(ss) lua \ + lua50 lua5.0 lua51 lua5.1 lua52 lua5.2 lua53 lua5.3 lua54 \ + lua5.4 + $(ss) luac \ + luac50 luac5.0 luac51 luac5.1 luac52 luac5.2 luac53 luac5.3 \ + luac54 luac5.4 $(ss) luseradd \ lusermod $(ss) lvm \ @@ -854,10 +1105,25 @@ symlinks: $(DATA) apropos whatis $(ss) mcrypt \ mdecrypt + $(ss) _mdbook \ + _deno _diesel _dprint _starship $(ss) mplayer \ gmplayer kplayer mencoder mplayer2 $(ss) mutt \ - muttng + muttng neomutt + $(ss) _nox \ + _airflow \ + _ansible \ + _ansible-config \ + _ansible-console \ + _ansible-doc \ + _ansible-galaxy \ + _ansible-inventory \ + _ansible-playbook \ + _ansible-pull \ + _ansible-vault \ + _conda \ + _cz $(ss) nslookup \ host $(ss) p4 \ @@ -867,7 +1133,13 @@ symlinks: $(DATA) $(ss) pine \ alpine $(ss) ping \ - ping6 + ping4 ping6 + $(ss) _pip \ + _pip3 + $(ss) _pipenv \ + _black _blackd _flask _httpx + $(ss) pkg-config \ + pkgconf $(ss) pkg_delete \ pkg_deinstall pkg_info $(ss) pgrep \ @@ -890,9 +1162,12 @@ symlinks: $(DATA) $(ss) pylint \ pylint-2 pylint-3 $(ss) python \ - micropython pypy pypy3 python2 python2.7 python3 python3.3 python3.4 python3.5 python3.6 python3.7 python3.8 + micropython pypy pypy3 pyston pyston3 python2 python2.7 \ + python3 python3.3 python3.4 python3.5 python3.6 python3.7 \ + python3.8 python3.9 python3.10 python3.11 python3.12 $(ss) pyvenv \ - pyvenv-3.4 pyvenv-3.5 pyvenv-3.6 pyvenv-3.7 pyvenv-3.8 + pyvenv-3.4 pyvenv-3.5 pyvenv-3.6 pyvenv-3.7 pyvenv-3.8 \ + pyvenv-3.9 pyvenv-3.10 pyvenv-3.11 pyvenv-3.12 $(ss) qdbus \ dcop $(ss) qemu \ @@ -909,6 +1184,8 @@ symlinks: $(DATA) smbcacls smbcquotas smbget smbpasswd smbtar smbtree $(ss) sbcl \ sbcl-mt + $(ss) sha256sum \ + b2sum md5sum shasum sha1sum sha224sum sha384sum sha512sum $(ss) ssh \ autossh scp sftp sidedoor slogin $(ss) sudo \ @@ -919,12 +1196,15 @@ symlinks: $(DATA) tracepath6 $(ss) update-alternatives \ alternatives + $(ss) _vault \ + _consul _nomad _packer _terraform $(ss) vipw \ vigr $(ss) vncviewer \ tightvncviewer xvnc4viewer $(ss) wine \ - wine-development wine-stable + wine-development wine-stable \ + wine64 wine64-development wine64-stable $(ss) wodim \ cdrecord $(ss) xz \ @@ -942,9 +1222,9 @@ install-data-hook: ss = $(SETUP_SYMLINKS) $(DESTDIR)$(bashcompdir) install-data-hook: symlinks check-local: - ret=0; \ + REPLY=0; \ for file in $(bashcomp_DATA); do \ $${bashcomp_bash:-$${BASH:-bash}} \ - -O extglob -n $(srcdir)/$$file || ret=$$?; \ + -O extglob -n $(srcdir)/$$file || REPLY=$$?; \ done; \ - exit $$ret + exit $$REPLY diff --git a/completions/_adb b/completions/_adb index e8ebab1..0189331 100644 --- a/completions/_adb +++ b/completions/_adb @@ -3,67 +3,67 @@ # Use of this file is deprecated. Upstream completion is available in # the Android SDK, use that instead. -_adb_command_usage() +_comp_cmd_adb__command_usage() { - COMPREPLY=($(compgen -W \ - '$("$1" help 2>&1 | command grep "^ *\(adb \)\? *$2 " \ - | command sed -e "s/[]|[]/\n/g" | _parse_help -)' -- "$cur")) + _comp_compgen_help - <<<"$("$1" help 2>&1 | + command sed -e "/^ *\(adb \)\{0,1\} *$2 /!d;s/[]|[]/\n/g")" } -_adb() +_comp_cmd_adb() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -s | -p | --algo | --key | --iv) return ;; -f) - _filedir + _comp_compgen_filedir return ;; esac - local cmd i + local cmd has_cmd="" i for ((i = 1; i < cword; i++)); do if [[ ${words[i]} != -* && ${words[i - 1]} != -[sp] ]]; then cmd="${words[i]}" + has_cmd=set break fi done - if [[ ! -v cmd ]]; then + if [[ ! $has_cmd ]]; then local tmp=() if [[ ! $cur || $cur == -* ]]; then - tmp+=($(compgen -W '$(_parse_help "$1" help)' -- "$cur")) + _comp_compgen -av tmp help -- help fi if [[ ! $cur || $cur != -* ]]; then - tmp+=($($1 help 2>&1 | awk '$1 == "adb" { print $2 }')) + _comp_split -a tmp "$("$1" help 2>&1 | _comp_awk '$1 == "adb" { print $2 }')" tmp+=(devices connect disconnect sideload) fi - COMPREPLY=($(compgen -W '${tmp[@]}' -- "$cur")) + ((${#tmp[@]})) && + _comp_compgen -- -W '"${tmp[@]}"' return fi # TODO: more and better command completions - _adb_command_usage "$1" $cmd + _comp_cmd_adb__command_usage "$1" "$cmd" case $cmd in push | restore | sideload) - _filedir + _comp_compgen -a filedir ;; forward) - COMPREPLY=($(compgen -W \ - '$("$1" help 2>&1 | command sed -ne "s/^ *adb *forward *-/-/p" | \ - _parse_help -)' -- "$cur")) + _comp_compgen_help - <<<"$("$1" help 2>&1 | + command sed -ne "s/^ *adb *forward *-/-/p")" ;; reboot) - COMPREPLY=($(compgen -W 'bootloader recovery' -- "$cur")) + _comp_compgen -- -W 'bootloader recovery' ;; esac } && - complete -F _adb adb + complete -F _comp_cmd_adb adb # ex: filetype=sh diff --git a/completions/_cal b/completions/_cal index 1eec267..3f8b3ca 100644 --- a/completions/_cal +++ b/completions/_cal @@ -3,15 +3,15 @@ # Use of this file is deprecated on Linux. Upstream completion is # available in util-linux >= 2.23, use that instead. -_cal() +_comp_cmd_cal() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -m) if [[ $OSTYPE == *bsd* ]]; then - COMPREPLY=($(compgen -W '{1..12}' -- "$cur")) + _comp_compgen -- -W '{1..12}' return fi ;; @@ -24,15 +24,14 @@ _cal() esac if [[ $cur == -* ]]; then - local opts=$(_parse_help "$1") - COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage return fi - local args - _count_args - ((args == 1)) && COMPREPLY=($(compgen -W '{1..12}' -- "$cur")) + local REPLY + _comp_count_args + ((REPLY == 1)) && _comp_compgen -- -W '{1..12}' } && - complete -F _cal cal ncal + complete -F _comp_cmd_cal cal ncal # ex: filetype=sh diff --git a/completions/_cargo b/completions/_cargo new file mode 100644 index 0000000..257eb35 --- /dev/null +++ b/completions/_cargo @@ -0,0 +1,9 @@ +# 3rd party completion loader for cargo -*- shell-script -*- +# +# This serves as a fallback in case the completion is not installed otherwise. + +# shellcheck disable=SC2168 # "local" is ok, assume sourced by _comp_load +local rustup="${1%cargo}rustup" # use rustup from same dir +eval -- "$("$rustup" completions bash cargo 2>/dev/null)" + +# ex: filetype=sh diff --git a/completions/_chsh b/completions/_chsh index 8f8a807..4e243ba 100644 --- a/completions/_chsh +++ b/completions/_chsh @@ -1,31 +1,43 @@ # chsh(1) completion -*- shell-script -*- -# Use of this file is deprecated on Linux. Upstream completion is -# available in util-linux >= 2.23, use that instead. +# Use of this file is deprecated on Linux systems whose chsh is from +# util-linux. Upstream completion is in util-linux >= 2.23, use that instead. -_chsh() +_comp_cmd_chsh() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + + local word chroot="" has_chroot="" + for word in "${words[@]}"; do + if [[ $has_chroot ]]; then + chroot=$word + break + fi + [[ $word != -@(R|-root) ]] || has_chroot=set + done case $prev in --list-shells | --help | -v | --version) return ;; + -R | --root) + _comp_compgen_filedir -d + return + ;; -s | --shell) - _shells + _comp_compgen_shells "${chroot-}" return ;; esac if [[ $cur == -* ]]; then - local opts=$(_parse_help "$1") - COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage else - _allowed_users + _comp_compgen_allowed_users fi } && - complete -F _chsh chsh + complete -F _comp_cmd_chsh chsh # ex: filetype=sh diff --git a/completions/_dmesg b/completions/_dmesg index 8306654..ad90fcc 100644 --- a/completions/_dmesg +++ b/completions/_dmesg @@ -3,31 +3,29 @@ # Use of this file is deprecated on Linux. Upstream completion is # available in util-linux >= 2.23, use that instead. -_dmesg() +_comp_cmd_dmesg() { [[ $OSTYPE == *solaris* ]] && return # no args there - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -h | --help | -V | --version | -s | --buffer-size | -M | -N) return ;; -f | --facility) - COMPREPLY=($(compgen -W 'kern user mail daemon auth syslog lpr - news' -- "$cur")) + _comp_compgen -- -W 'kern user mail daemon auth syslog lpr news' return ;; -l | --level | -n | --console-level) - COMPREPLY=($(compgen -W '{1..8}' -- "$cur")) + _comp_compgen -- -W '{1..8}' return ;; esac - local opts=$(_parse_help "$1") - COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage } && - complete -F _dmesg dmesg + complete -F _comp_cmd_dmesg dmesg # ex: filetype=sh diff --git a/completions/_eject b/completions/_eject index 52168f7..76ae0f8 100644 --- a/completions/_eject +++ b/completions/_eject @@ -3,31 +3,31 @@ # Use of this file is deprecated on Linux. Upstream completion is # available in util-linux >= 2.23, use that instead. -_eject() +_comp_cmd_eject() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -h | --help | -V | --version | -c | --changerslot | -x | --cdspeed) return ;; -a | --auto | -i | --manualeject) - COMPREPLY=($(compgen -W 'on off' -- "$cur")) + _comp_compgen -- -W 'on off' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return elif [[ $prev == @(-d|--default) ]]; then return fi - _cd_devices - _dvd_devices + _comp_compgen_cd_devices + _comp_compgen -a dvd_devices } && - complete -F _eject eject + complete -F _comp_cmd_eject eject # ex: filetype=sh diff --git a/completions/_flamegraph b/completions/_flamegraph new file mode 100644 index 0000000..95c86c0 --- /dev/null +++ b/completions/_flamegraph @@ -0,0 +1,8 @@ +# 3rd party completion loader for commands emitting -*- shell-script -*- +# their completion using "$cmd --completions bash". +# +# This serves as a fallback in case the completion is not installed otherwise. + +eval -- "$("$1" --completions bash 2>/dev/null)" + +# ex: filetype=sh diff --git a/completions/_gaiacli b/completions/_gaiacli new file mode 100644 index 0000000..2f48598 --- /dev/null +++ b/completions/_gaiacli @@ -0,0 +1,8 @@ +# 3rd party completion loader for commands emitting -*- shell-script -*- +# their completion using "$cmd completion". +# +# This serves as a fallback in case the completion is not installed otherwise. + +eval -- "$("$1" completion 2>/dev/null)" + +# ex: filetype=sh diff --git a/completions/_gh b/completions/_gh new file mode 100644 index 0000000..8a0376d --- /dev/null +++ b/completions/_gh @@ -0,0 +1,8 @@ +# 3rd party completion loader for commands emitting -*- shell-script -*- +# their completion using "$cmd completion --shell bash". +# +# This serves as a fallback in case the completion is not installed otherwise. + +eval -- "$("$1" completion --shell bash 2>/dev/null)" + +# ex: filetype=sh diff --git a/completions/_golangci-lint b/completions/_golangci-lint new file mode 100644 index 0000000..40fc5c3 --- /dev/null +++ b/completions/_golangci-lint @@ -0,0 +1,9 @@ +# 3rd party completion loader for commands emitting -*- shell-script -*- +# their completion using "$cmd completion bash". +# For example, many Go programs using https://github.com/spf13/cobra do. +# +# This serves as a fallback in case the completion is not installed otherwise. + +eval -- "$("$1" completion bash 2>/dev/null)" + +# ex: filetype=sh diff --git a/completions/_gsctl b/completions/_gsctl new file mode 100644 index 0000000..3b1a040 --- /dev/null +++ b/completions/_gsctl @@ -0,0 +1,8 @@ +# 3rd party completion loader for commands emitting -*- shell-script -*- +# their completion using "$cmd completion bash --stdout". +# +# This serves as a fallback in case the completion is not installed otherwise. + +eval -- "$("$1" completion bash --stdout 2>/dev/null)" + +# ex: filetype=sh diff --git a/completions/_hexdump b/completions/_hexdump index 785f597..939cfa6 100644 --- a/completions/_hexdump +++ b/completions/_hexdump @@ -3,29 +3,28 @@ # Use of this file is deprecated on Linux. Upstream completion is # available in util-linux >= 2.23, use that instead. -_hexdump() +_comp_cmd_hexdump() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -V | -e | -n | -s) return ;; -f) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - local opts="$(_parse_help "$1")" - COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage return fi - _filedir + _comp_compgen_filedir } && - complete -F _hexdump hexdump hd + complete -F _comp_cmd_hexdump hexdump hd # ex: filetype=sh diff --git a/completions/_hwclock b/completions/_hwclock index ef437a2..a0fd831 100644 --- a/completions/_hwclock +++ b/completions/_hwclock @@ -3,24 +3,24 @@ # Use of this file is deprecated. Upstream completion is available in # util-linux >= 2.23, use that instead. -_hwclock() +_comp_cmd_hwclock() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -h | --help | -V | --version | --date | --epoch) return ;; -f | --rtc | --adjfile) - _filedir + _comp_compgen_filedir return ;; esac - COMPREPLY=( - $(PATH="$PATH:/sbin" compgen -W '$(_parse_help "$1")' -- "$cur")) + local PATH=$PATH:/sbin + _comp_compgen_help } && - complete -F _hwclock hwclock + complete -F _comp_cmd_hwclock hwclock # ex: filetype=sh diff --git a/completions/_ionice b/completions/_ionice index b0d96a1..42fcd39 100644 --- a/completions/_ionice +++ b/completions/_ionice @@ -3,10 +3,10 @@ # Use of this file is deprecated. Upstream completion is available in # util-linux >= 2.23, use that instead. -_ionice() +_comp_cmd_ionice() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local offset=0 i for ((i = 1; i <= cword; i++)); do @@ -31,30 +31,30 @@ _ionice() done if ((offset > 0)); then - _command_offset $offset + _comp_command_offset $offset return fi case $prev in -c) - COMPREPLY=($(compgen -W '{0..3}' -- "$cur")) + _comp_compgen -- -W '{0..3}' return ;; -n) - COMPREPLY=($(compgen -W '{0..7}' -- "$cur")) + _comp_compgen -- -W '{0..7}' return ;; -p) - _pids + _comp_compgen_pids return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + _comp_compgen_help -- -h return fi } && - complete -F _ionice ionice + complete -F _comp_cmd_ionice ionice # ex: filetype=sh diff --git a/completions/_jungle b/completions/_jungle new file mode 100644 index 0000000..f08ae91 --- /dev/null +++ b/completions/_jungle @@ -0,0 +1,16 @@ +# 3rd party completion loader for commands emitting -*- shell-script -*- +# their completion using "_${cmdname^^}_COMPLETE=source $cmd". +# This pattern is very similar to `completions/_pipenv`, but the value of the +# environment variable is slightly different. +# +# This serves as a fallback in case the completion is not installed otherwise. + +eval -- "$( + # shellcheck disable=SC2154 + ucname="${cmdname^^}" + ucname=${ucname//-/_} + export "_${ucname}_COMPLETE=source" + "$1" 2>/dev/null +)" + +# ex: filetype=sh diff --git a/completions/_keyring b/completions/_keyring new file mode 100644 index 0000000..4dcc58f --- /dev/null +++ b/completions/_keyring @@ -0,0 +1,9 @@ +# 3rd party completion loader for commands emitting -*- shell-script -*- +# their completion using "$cmd --print-completion bash". +# For example, many Python programs using https://github.com/iterative/shtab do. +# +# This serves as a fallback in case the completion is not installed otherwise. + +eval -- "$("$1" --print-completion bash 2>/dev/null)" + +# ex: filetype=sh diff --git a/completions/_kontena b/completions/_kontena new file mode 100644 index 0000000..94918fe --- /dev/null +++ b/completions/_kontena @@ -0,0 +1,14 @@ +# 3rd party completion loader for kontena -*- shell-script -*- +# +# This serves as a fallback in case the completion is not installed otherwise. + +# To avoid sourcing an empty string with `. "$(...)"` on failing to obtain the +# path, we assign the output to a variable `_comp_cmd_kontena__completion_path` +# and test it before sourcing. The variable is removed on successful loading +# but left on a failure for the debugging purpose. +_comp_cmd_kontena__completion_path=$("$1" whoami --bash-completion-path 2>/dev/null) && + [[ -r $_comp_cmd_kontena__completion_path ]] && + . "$_comp_cmd_kontena__completion_path" && + unset -v _comp_cmd_kontena__completion_path + +# ex: filetype=sh diff --git a/completions/_look b/completions/_look index 9788dec..20613ff 100644 --- a/completions/_look +++ b/completions/_look @@ -3,15 +3,15 @@ # Use of this file is deprecated on Linux. Upstream completion is # available in util-linux >= 2.23, use that instead. -_look() +_comp_cmd_look() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if ((cword == 1)); then - COMPREPLY=($(compgen -W '$(look "$cur" 2>/dev/null)' -- "$cur")) + _comp_compgen_split -- "$(look "$cur" 2>/dev/null)" fi } && - complete -F _look -o default look + complete -F _comp_cmd_look -o default look # ex: filetype=sh diff --git a/completions/_mdbook b/completions/_mdbook new file mode 100644 index 0000000..fe32688 --- /dev/null +++ b/completions/_mdbook @@ -0,0 +1,8 @@ +# 3rd party completion loader for commands emitting -*- shell-script -*- +# their completion using "$cmd completions bash". +# +# This serves as a fallback in case the completion is not installed otherwise. + +eval -- "$("$1" completions bash 2>/dev/null)" + +# ex: filetype=sh diff --git a/completions/_mock b/completions/_mock index b468148..df778a8 100644 --- a/completions/_mock +++ b/completions/_mock @@ -3,10 +3,10 @@ # Use of this file is deprecated. Upstream completion is available in # mock > 1.1.0, use that instead. -_mock() +_comp_cmd_mock() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return local plugins='tmpfs root_cache yum_cache bind_mount ccache' local cfgdir=/etc/mock count=0 i @@ -27,43 +27,45 @@ _mock() return ;; -r | --root) - COMPREPLY=($(compgen -W "$(command ls $cfgdir)" -- "$cur")) - COMPREPLY=(${COMPREPLY[@]/%.cfg/}) + _comp_compgen_split -- "$(command ls "$cfgdir")" && + COMPREPLY=("${COMPREPLY[@]/%.cfg/}") return ;; --configdir | --resultdir) - _filedir -d + _comp_compgen_filedir -d return ;; --spec) - _filedir spec + _comp_compgen_filedir spec return ;; --target) + # Case-insensitive BRE to match "compatible archs" + local regex_header='[cC][oO][mM][pP][aA][tT][iI][bB][lL][eE][[:space:]]\{1,\}[aA][rR][cC][hH][sS]' + # Yep, compatible archs, not compatible build archs # (e.g. ix86 chroot builds in x86_64 mock host) # This would actually depend on what the target root # can be used to build for... - COMPREPLY=($(compgen -W "$(command rpm --showrc | - command sed -ne 's/^\s*compatible\s\s*archs\s*:\s*\(.*\)/\1/i p')" \ - -- "$cur")) + _comp_compgen_split -- "$(command rpm --showrc | command sed -ne \ + "s/^[[:space:]]*${regex_header}[[:space:]]*:[[:space:]]*\(.*\)/\1/p")" return ;; --enable-plugin | --disable-plugin) - COMPREPLY=($(compgen -W "$plugins" -- "$cur")) + _comp_compgen -- -W "$plugins" return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - _filedir '@(?(no)src.r|s)pm' + _comp_compgen_filedir '@(?(no)src.r|s)pm' fi } && - complete -F _mock mock + complete -F _comp_cmd_mock mock # ex: filetype=sh diff --git a/completions/_modules b/completions/_modules index 4f7c4d4..830ddfe 100644 --- a/completions/_modules +++ b/completions/_modules @@ -19,67 +19,66 @@ # Test for existence of /etc/profile.d/modules.sh too because we may end up # being sourced before it and thus before the `module' alias has been defined. -[ -f /etc/profile.d/modules.sh ] || return 1 +[[ -f /etc/profile.d/modules.sh ]] || return 1 -_module_list() +_comp_cmd_module__compgen_list() { - local modules="$(command sed 's/:/ /g' <<<$LOADEDMODULES | sort)" - compgen -W "$modules" -- $1 + local modules="$(command sed 's/:/ /g' <<<"$LOADEDMODULES" | sort)" + _comp_compgen -- -W "$modules" } -_module_path() +_comp_cmd_module__compgen_path() { - local modules="$(command sed 's/:/ /g' <<<$MODULEPATH | sort)" - compgen -W "$modules" -- $1 + local modules="$(command sed 's/:/ /g' <<<"$MODULEPATH" | sort)" + _comp_compgen -- -W "$modules" } -_module_avail() +_comp_cmd_module__compgen_avail() { local modules="$( module avail 2>&1 | command grep -E -v '^(-|$)' | xargs printf '%s\n' | command sed -e 's/(default)//g' | sort )" - - compgen -W "$modules" -- $1 + _comp_compgen -- -W "$modules" } # A completion function for the module alias -_module() +_comp_cmd_module() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if ((cword == 1)); then # First parameter on line -- we expect it to be a mode selection local options options="$(module help 2>&1 | command grep -E '^[[:space:]]*\+' | - awk '{print $2}' | command sed -e 's/|/ /g' | sort)" + _comp_awk '{print $2}' | command sed -e 's/|/ /g' | sort)" - COMPREPLY=($(compgen -W "$options" -- "$cur")) + _comp_compgen -- -W "$options" elif ((cword == 2)); then case $prev in add | display | help | load | show | whatis) - COMPREPLY=($(_module_avail "$cur")) + _comp_cmd_module__compgen_avail ;; rm | switch | swap | unload | update) - COMPREPLY=($(_module_list "$cur")) + _comp_cmd_module__compgen_list ;; unuse) - COMPREPLY=($(_module_path "$cur")) + _comp_cmd_module__compgen_path ;; esac elif ((cword == 3)); then case ${words[1]} in swap | switch) - COMPREPLY=($(_module_avail "$cur")) + _comp_cmd_module__compgen_avail ;; esac fi } && - complete -F _module -o default module + complete -F _comp_cmd_module -o default module # ex: filetype=sh diff --git a/completions/_mount b/completions/_mount index 85f5490..ab385f1 100644 --- a/completions/_mount +++ b/completions/_mount @@ -14,16 +14,16 @@ fi # query the server for a list of all available exports and complete on # that instead. # -_mount() +_comp_cmd_mount() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return local sm host case $prev in -t | --types) - _fstypes + _comp_compgen_fstypes return ;; esac @@ -33,8 +33,9 @@ _mount() if [[ $cur == *:* ]]; then for sm in "$(type -P showmount)" {,/usr}/{,s}bin/showmount; do [[ -x $sm ]] || continue - COMPREPLY=($(compgen -W "$("$sm" -e ${cur%%:*} | - awk 'NR>1 {print $1}')" -- "${cur#*:}")) + _comp_compgen -c "${cur#*:}" split -- "$( + "$sm" -e ${cur%%:*} | _comp_awk 'NR>1 {print $1}' + )" return done fi @@ -42,24 +43,30 @@ _mount() if [[ $cur == //* ]]; then host=${cur#//} host=${host%%/*} - if [[ -n $host ]]; then - COMPREPLY=($(compgen -P "//$host" -W \ - "$(smbclient -d 0 -NL $host 2>/dev/null | + if [[ $host ]]; then + _comp_compgen -c "${cur#//"$host"}" split -P "//$host" -- "$( + smbclient -d 0 -NL "$host" 2>/dev/null | command sed -ne '/^[[:blank:]]*Sharename/,/^$/p' | - command sed -ne '3,$s|^[^A-Za-z]*\([^[:blank:]]*\).*$|/\1|p')" \ - -- "${cur#//$host}")) + command sed -ne '3,$s|^[^A-Za-z]*\([^[:blank:]]*\).*$|/\1|p' + )" fi elif [[ -r /etc/vfstab ]]; then # Solaris - COMPREPLY=($(compgen -W "$(awk '! /^[ \t]*#/ {if ($3 ~ /\//) print $3}' /etc/vfstab)" -- "$cur")) + _comp_compgen_split -- "$( + _comp_awk '! /^[ \t]*#/ {if ($3 ~ /\//) print $3}' /etc/vfstab + )" elif [[ ! -e /etc/fstab ]]; then # probably Cygwin - COMPREPLY=($(compgen -W "$($1 | awk '! /^[ \t]*#/ {if ($3 ~ /\//) print $3}')" -- "$cur")) + _comp_compgen_split -- "$( + "$1" | _comp_awk '! /^[ \t]*#/ {if ($3 ~ /\//) print $3}' + )" else # probably BSD - COMPREPLY=($(compgen -W "$(awk '! /^[ \t]*#/ {if ($2 ~ /\//) print $2}' /etc/fstab)" -- "$cur")) + _comp_compgen_split -- "$( + _comp_awk '! /^[ \t]*#/ {if ($2 ~ /\//) print $2}' /etc/fstab + )" fi } && - complete -F _mount -o default -o dirnames mount + complete -F _comp_cmd_mount -o default -o dirnames mount # ex: filetype=sh diff --git a/completions/_mount.linux b/completions/_mount.linux index f40865e..3d4c307 100644 --- a/completions/_mount.linux +++ b/completions/_mount.linux @@ -3,12 +3,12 @@ # Use of this file is deprecated on Linux. Upstream completion is # available in util-linux >= 2.28, use that instead. -_mount() +_comp_cmd_mount() { - local cur prev words cword - _init_completion -n =: || return + local cur prev words cword comp_args + _comp_initialize -n =: -- "$@" || return - local split=false + local split="" case "$prev" in -t | --types) # find /lib/modules/$(uname -r)/ -type f -path '*/fs/*.ko' -printf '%f\n' | cut -d. -f1 @@ -16,38 +16,33 @@ _mount() if [[ $cur == ?*,* ]]; then prev="${cur%,*}" cur="${cur##*,}" - split=true + split=set fi - COMPREPLY=($(compgen -W 'auto adfs affs autofs btrfs cifs coda - cramfs davfs debugfs devpts efs ext2 ext3 ext4 fuse hfs hfsplus - hpfs iso9660 jffs2 jfs minix msdos ncpfs nfs nfs4 ntfs ntfs-3g - proc qnx4 ramfs reiserfs romfs squashfs smbfs sysv tmpfs ubifs - udf ufs umsdos usbfs vfat xfs' -- "$cur")) - _fstypes - $split && COMPREPLY=(${COMPREPLY[@]/#/$prev,}) + _comp_compgen -- -W 'auto adfs affs autofs btrfs cifs coda cramfs + davfs debugfs devpts efs ext2 ext3 ext4 fuse hfs hfsplus hpfs + iso9660 jffs2 jfs minix msdos ncpfs nfs nfs4 ntfs ntfs-3g proc + qnx4 ramfs reiserfs romfs squashfs smbfs sysv tmpfs ubifs udf + ufs umsdos usbfs vfat xfs' + _comp_compgen -a fstypes + [[ $split ]] && ((${#COMPREPLY[@]})) && + _comp_compgen -Rv COMPREPLY -- -P "$prev," -W '"${COMPREPLY[@]}"' return ;; --bind | -B | --rbind | -R) - _filedir -d + _comp_compgen_filedir -d return ;; -p | --pass-fd) - COMPREPLY=($(compgen -W '{0..9}')) + _comp_compgen -R -- -W '{0..9}' compopt -o nospace return ;; -L) - COMPREPLY=($( - cd "/dev/disk/by-label/" 2>/dev/null || return - compgen -f -- "$cur" - )) + _comp_compgen -C "/dev/disk/by-label/" -- -f return ;; -U) - COMPREPLY=($( - cd "/dev/disk/by-uuid/" 2>/dev/null || return - compgen -f -- "$cur" - )) + _comp_compgen -C "/dev/disk/by-uuid/" -- -f return ;; -O | --test-opts) @@ -74,149 +69,152 @@ _mount() if [[ $cur == ?*,* ]]; then prev="${cur%,*}" cur="${cur##*,}" - split=true + split=set fi # no completion if $cur is opt=smth [[ $cur == *=* ]] && return # mount options - COMPREPLY=($(compgen -W 'loop {,a}sync {,no}atime {,no}auto + _comp_compgen -- -W 'loop {,a}sync {,no}atime {,no}auto {,fs,def,root}context= defaults {,no}dev {,no}diratime dirsync {,no}exec group {,no}iversion {,no}mand _netdev nofail {,no}relatime {,no}strictatime {,no}suid owner remount ro rw - {,no}user users' -- "$cur")) + {,no}user users' case "$fstype" in adfs | auto) - COMPREPLY+=($(compgen -W '{u,g}id= {own,oth}mask=' -- "$cur")) + _comp_compgen -a -- -W '{u,g}id= {own,oth}mask=' ;;& affs | auto) - COMPREPLY+=($(compgen -W '{u,g}id= set{u,g}id= mode= protect - usemp verbose prefix= volume= reserved= root= bs= - {,no,usr,grp}quota' -- "$cur")) + _comp_compgen -a -- -W '{u,g}id= set{u,g}id= mode= protect + usemp verbose prefix= volume= reserved= root= bs= + {,no,usr,grp}quota' ;;& btrfs | auto) - COMPREPLY+=($(compgen -W 'degraded subvol= subvolid= device= - nodatasum nodatacow nobarrier max_inline= alloc_start= - thread_pool= compress= compress-force= ssd noacl notreelog - flushoncommit metadata_ratio= {,no}space_cache clear_cache - user_subvol_rm_allowed autodefrag inode_cache' -- "$cur")) + _comp_compgen -a -- -W 'degraded subvol= subvolid= device= + nodatasum nodatacow nobarrier max_inline= alloc_start= + thread_pool= compress= compress-force= ssd noacl + notreelog flushoncommit metadata_ratio= + {,no}space_cache clear_cache user_subvol_rm_allowed + autodefrag inode_cache' ;;& cifs | auto) - COMPREPLY+=($(compgen -W 'user= password= credentials= {u,g}id= - force{u,g}id port= servern= netbiosname= {file,dir}_mode= - ip= domain= guest iocharset {,no}setuids {,no,dyn}perm - directio {,no}mapchars {,no}intr hard soft noacl nocase sec= - nobrl sfu {,no}serverino nounix nouser_xattr {r,w}size= - rwpidforward backup{u,g}id cache=' -- "$cur")) + _comp_compgen -a -- -W 'user= password= credentials= + {u,g}id= force{u,g}id port= servern= netbiosname= + {file,dir}_mode= ip= domain= guest iocharset + {,no}setuids {,no,dyn}perm directio {,no}mapchars + {,no}intr hard soft noacl nocase sec= nobrl sfu + {,no}serverino nounix nouser_xattr {r,w}size= + rwpidforward backup{u,g}id cache=' ;;& davfs | auto) - COMPREPLY+=($(compgen -W 'conf= {file,dir}_mode= {u,g}id= - username=' -- "$cur")) + _comp_compgen -a -- -W 'conf= {file,dir}_mode= {u,g}id= + username=' ;;& ext[2-4] | auto) - COMPREPLY+=($(compgen -W '{,no}acl bsddf minixdf check= debug - errors= {,no}grpid {bsd,sysv}groups {,no,usr,grp}quota - nobh nouid32 oldalloc orlov res{u,g}id= sb= - {,no}user_xattr' -- "$cur")) + _comp_compgen -a -- -W '{,no}acl bsddf minixdf check= debug + errors= {,no}grpid {bsd,sysv}groups {,no,usr,grp}quota + nobh nouid32 oldalloc orlov res{u,g}id= sb= + {,no}user_xattr' ;;& ext[34] | auto) - COMPREPLY+=($(compgen -W 'journal= journal_dev= norecovery - noload data= barrier= commit=' -- "$cur")) + _comp_compgen -a -- -W 'journal= journal_dev= norecovery + noload data= barrier= commit=' ;;& ext4 | auto) - COMPREPLY+=($(compgen -W 'journal_checksum journal_async_commit - nobarrier inode_readahead= stripe= {,no}delalloc abort - {max,min}_batch_time= journal_ioprio= {,no}auto_da_alloc - {,no}discard nouid32 resize {,no}block_validity - dioread_{,no}lock max_dir_size_kb= i_version' -- "$cur")) + _comp_compgen -a -- -W 'journal_checksum + journal_async_commit nobarrier inode_readahead= stripe= + {,no}delalloc abort {max,min}_batch_time= + journal_ioprio= {,no}auto_da_alloc {,no}discard nouid32 + resize {,no}block_validity dioread_{,no}lock + max_dir_size_kb= i_version' ;;& msdos | umsdos | vfat | auto) - COMPREPLY+=($(compgen -W 'blocksize= {u,g}id= {u,d,f}mask= - allow_utime= check= codepage= conv= cvf_format= cvf_option= - debug fat= iocharset= tz= quiet showexec sys_immutable flush - usefree {,no}dots dotsOK=' -- "$cur")) + _comp_compgen -a -- -W 'blocksize= {u,g}id= {u,d,f}mask= + allow_utime= check= codepage= conv= cvf_format= + cvf_option= debug fat= iocharset= tz= quiet showexec + sys_immutable flush usefree {,no}dots dotsOK=' ;;& vfat | auto) - COMPREPLY+=($(compgen -W 'uni_xlate posix nonumtail utf8 - shortname=' -- "$cur")) + _comp_compgen -a -- -W 'uni_xlate posix nonumtail utf8 + shortname=' ;;& iso9660 | auto) - COMPREPLY+=($(compgen -W 'norock nojoliet check= {u,g}id= map= - mode= unhide block= conv= cruft session= sbsector= - iocharset= utf8' -- "$cur")) + _comp_compgen -a -- -W 'norock nojoliet check= {u,g}id= + map= mode= unhide block= conv= cruft session= sbsector= + iocharset= utf8' ;;& jffs2 | auto) - COMPREPLY+=($(compgen -W 'compr= rp_size=' -- "$cur")) + _comp_compgen -a -- -W 'compr= rp_size=' ;;& jfs | auto) - COMPREPLY+=($(compgen -W 'iocharset= resize= {,no}integrity - errors= {,no,usr,grp}quota' -- "$cur")) + _comp_compgen -a -- -W 'iocharset= resize= {,no}integrity + errors= {,no,usr,grp}quota' ;;& nfs | nfs4 | auto) - COMPREPLY+=($(compgen -W 'soft hard timeo= retrans= {r,w}size= - {,no}ac acreg{min,max}= acdir{min,max}= actimeo= bg fg - retry= sec= {,no}sharecache {,no}resvport lookupcache= - proto= port= {,no}intr {,no}cto {,nfs}vers= ' -- "$cur")) + _comp_compgen -a -- -W 'soft hard timeo= retrans= {r,w}size= + {,no}ac acreg{min,max}= acdir{min,max}= actimeo= bg fg + retry= sec= {,no}sharecache {,no}resvport lookupcache= + proto= port= {,no}intr {,no}cto {,nfs}vers=' ;;& nfs | auto) - COMPREPLY+=($(compgen -W 'udp tcp rdma mount{port,proto,host}= - mountvers= namlen={,no}lock {,no}acl {,no}rdirplus - {,no}fsc' -- "$cur")) + _comp_compgen -a -- -W 'udp tcp rdma mount{port,proto,host}= + mountvers= namlen={,no}lock {,no}acl {,no}rdirplus + {,no}fsc' ;;& nfs4 | auto) - COMPREPLY+=($(compgen -W 'clientaddr= {,no}migration' \ - -- "$cur")) + _comp_compgen -a -- -W 'clientaddr= {,no}migration' ;;& ntfs-3g) - COMPREPLY+=($(compgen -W '{u,g}id= {u,f,d}mask= usermapping= - permissions inherit locale= force {,no}recover - ignore_case remove_hiberfile show_sys_files - hide_{hid,dot}_files windows_names allow_other max_read= - silent no_def_opts streams_interface= user_xattr efs_raw - {,no}compression debug no_detach' -- "$cur")) + _comp_compgen -a -- -W '{u,g}id= {u,f,d}mask= usermapping= + permissions inherit locale= force {,no}recover + ignore_case remove_hiberfile show_sys_files + hide_{hid,dot}_files windows_names allow_other + max_read= silent no_def_opts streams_interface= + user_xattr efs_raw {,no}compression debug no_detach' ;;& proc | auto) - COMPREPLY+=($(compgen -W '{u,g}id=' -- "$cur")) + _comp_compgen -a -- -W '{u,g}id=' ;;& reiserfs | auto) - COMPREPLY+=($(compgen -W 'conv hash= {,no_un}hashed_relocation - noborder nolog notail replayonly resize= user_xattr acl - barrier=' -- "$cur")) + _comp_compgen -a -- -W 'conv hash= + {,no_un}hashed_relocation noborder nolog notail + replayonly resize= user_xattr acl barrier=' ;;& tmpfs | auto) - COMPREPLY+=($(compgen -W 'size= nr_blocks= nr_inodes= mode= - {u,g}id= mpol=' -- "$cur")) + _comp_compgen -a -- -W 'size= nr_blocks= nr_inodes= mode= + {u,g}id= mpol=' ;;& udf | auto) - COMPREPLY+=($(compgen -W '{u,g}id= umask= unhide undelete - nostrict iocharset bs= novrs session= anchor= volume= - partition= lastblock= fileset= rootdir=' -- "$cur")) + _comp_compgen -a -- -W '{u,g}id= umask= unhide undelete + nostrict iocharset bs= novrs session= anchor= volume= + partition= lastblock= fileset= rootdir=' ;;& usbfs | auto) - COMPREPLY+=($(compgen -W 'dev{u,g}id= devmode= bus{u,g}id= - busmode= list{u,g}id= listmode=' -- "$cur")) + _comp_compgen -a -- -W 'dev{u,g}id= devmode= bus{u,g}id= + busmode= list{u,g}id= listmode=' ;;& xfs | auto) - COMPREPLY+=($(compgen -W 'allocsize= {,no}attr2 barrier dmapi - {,no}grpid {bsd,sysv}groups ihashsize= {,no}ikeep - inode{32,64} {,no}largeio logbufs= logbsize= logdev= - rtdev= mtpt= noalign norecovery nouuid osyncisosync - {u,g,p}qnoenforce {,u,usr,g,grp,p,prj}quota sunit= swidth= - swalloc' -- "$cur")) + _comp_compgen -a -- -W 'allocsize= {,no}attr2 barrier dmapi + {,no}grpid {bsd,sysv}groups ihashsize= {,no}ikeep + inode{32,64} {,no}largeio logbufs= logbsize= logdev= + rtdev= mtpt= noalign norecovery nouuid osyncisosync + {u,g,p}qnoenforce {,u,usr,g,grp,p,prj}quota sunit= + swidth= swalloc' ;;& esac # COMP_WORDBREAKS is a real pain in the ass - prev="${prev##*[$COMP_WORDBREAKS]}" - $split && COMPREPLY=(${COMPREPLY[@]/#/"$prev,"}) + prev="${prev##*["$COMP_WORDBREAKS"]}" + [[ $split ]] && ((${COMPREPLY[@]})) && + _comp_compgen -Rv COMPREPLY -- -P "$prev," -W '"${COMPREPLY[@]}"' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--version --help --verbose --all --fork - --fake --internal-only -l --no-mtab --no-canonicalize --pass-fd -s + _comp_compgen -- -W '--version --help --verbose --all --fork --fake + --internal-only -l --no-mtab --no-canonicalize --pass-fd -s --read-only --rw -L -U --types --test-opts --options --bind --rbind - --move' -- "$cur")) + --move' [[ ${COMPREPLY-} ]] && return fi @@ -227,8 +225,9 @@ _mount() if [[ $cur == *:* ]]; then for sm in "$(type -P showmount)" {,/usr}/{,s}bin/showmount; do [[ -x $sm ]] || continue - COMPREPLY=($(compgen -W "$("$sm" -e ${cur%%:*} | - awk 'NR>1 {print $1}')" -- "${cur#*:}")) + _comp_compgen -c "${cur#*:}" split -- "$( + "$sm" -e ${cur%%:*} | _comp_awk 'NR>1 {print $1}' + )" return done fi @@ -236,17 +235,17 @@ _mount() if [[ $cur == //* ]]; then host=${cur#//} host=${host%%/*} - if [[ -n $host ]]; then - COMPREPLY=($(compgen -P "//$host" -W \ - "$(smbclient -d 0 -NL $host 2>/dev/null | + if [[ $host ]]; then + _comp_compgen -c "${cur#//"$host"}" split -P "//$host" -- "$( + smbclient -d 0 -NL "$host" 2>/dev/null | command sed -ne '/^[[:blank:]]*Sharename/,/^$/p' | - command sed -ne '3,$s|^[^A-Za-z]*\([^[:blank:]]*\).*$|/\1|p')" \ - -- "${cur#//$host}")) + command sed -ne '3,$s|^[^A-Za-z]*\([^[:blank:]]*\).*$|/\1|p' + )" fi fi - _filedir + _comp_compgen -a filedir } && - complete -F _mount mount + complete -F _comp_cmd_mount mount # ex: filetype=sh diff --git a/completions/_newgrp b/completions/_newgrp index a2dc3ed..7e86672 100644 --- a/completions/_newgrp +++ b/completions/_newgrp @@ -3,17 +3,17 @@ # Use of this file is deprecated on Linux. Upstream completion is # available in util-linux >= 2.23, use that instead. -_newgrp() +_comp_cmd_newgrp() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == "-" ]]; then COMPREPLY=(-) else - _allowed_groups "$cur" + _comp_compgen_allowed_groups fi } && - complete -F _newgrp newgrp + complete -F _comp_cmd_newgrp newgrp # ex: filetype=sh diff --git a/completions/_nmcli b/completions/_nmcli index eac285b..835db99 100644 --- a/completions/_nmcli +++ b/completions/_nmcli @@ -3,83 +3,76 @@ # Use of this file is deprecated. Upstream completion is available in # NetworkManager >= 0.9.8.0, use that instead. -_nmcli_list() +_comp_cmd_nmcli__con_id() { - COMPREPLY=($(compgen -W '$1' -- "$cur")) + _comp_compgen_split -l -- "$(nmcli con list 2>/dev/null | + tail -n +2 | _comp_awk -F ' {2,}' '{print $1}')" } -_nmcli_con_id() +_comp_cmd_nmcli__con_uuid() { - local IFS=$'\n' - COMPREPLY=($(compgen -W "$(nmcli con list 2>/dev/null | - tail -n +2 | awk -F ' {2,}' '{print $1 }')" -- "$cur")) + _comp_compgen_split -- "$(nmcli con list 2>/dev/null | + tail -n +2 | _comp_awk -F ' {2,}' '{print $2}')" } -_nmcli_con_uuid() +_comp_cmd_nmcli__ap_ssid() { - COMPREPLY=($(compgen -W "$(nmcli con list 2>/dev/null | - tail -n +2 | awk -F ' {2,}' '{print $2}')" -- "$cur")) + _comp_compgen_split -l -- "$(nmcli dev wifi list 2>/dev/null | + tail -n +2 | _comp_awk -F ' {2,}' '{print $1}')" } -_nmcli_ap_ssid() +_comp_cmd_nmcli__ap_bssid() { - local IFS=$'\n' - COMPREPLY=($(compgen -W "$(nmcli dev wifi list 2>/dev/null | - tail -n +2 | awk -F ' {2,}' '{print $1}')" -- "$cur")) + _comp_compgen_split -- "$(nmcli dev wifi list 2>/dev/null | + tail -n +2 | _comp_awk -F ' {2,}' '{print $2}')" } -_nmcli_ab_bssid() +_comp_cmd_nmcli() { - COMPREPLY=($(compgen -W "$(nmcli dev wifi list 2>/dev/null | - tail -n +2 | awk -F ' {2,}' '{print $2}')" -- "$cur")) -} - -_nmcli() -{ - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -m | --mode) - COMPREPLY=($(compgen -W 'tabular multiline' -- "$cur")) + _comp_compgen -- -W 'tabular multiline' return ;; -f | --fields) - COMPREPLY=($(compgen -W 'all common' -- "$cur")) + _comp_compgen -- -W 'all common' return ;; -e | --escape) - _nmcli_list "yes no" + _comp_compgen -- -W "yes no" return ;; id) - _nmcli_con_id + _comp_cmd_nmcli__con_id return ;; uuid) - _nmcli_con_uuid + _comp_cmd_nmcli__con_uuid return ;; iface) - _available_interfaces + _comp_compgen_available_interfaces return ;; bssid) - _nmcli_ab_bssid + _comp_cmd_nmcli__ap_bssid return ;; wep-key-type) - _nmcli_list "key phrase" + _comp_compgen -- -W "key phrase" return ;; esac if ((cword == 1)); then if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--terse --pretty --mode --fields - --escape --version --help' -- "$cur")) + _comp_compgen -- -W '--terse --pretty --mode --fields --escape + --version --help' else - COMPREPLY=($(compgen -W "nm con dev" -- "$cur")) + _comp_compgen -- -W "nm con dev" fi else local object=${words[1]} @@ -89,71 +82,67 @@ _nmcli() nm) case $command in enable) - _nmcli_list "true false" + _comp_compgen -- -W "true false" return ;; sleep) - _nmcli_list "true false" + _comp_compgen -- -W "true false" return ;; wifi) - _nmcli_list "on off" + _comp_compgen -- -W "on off" return ;; wwan) - _nmcli_list "on off" + _comp_compgen -- -W "on off" return ;; wimax) - _nmcli_list "on off" + _comp_compgen -- -W "on off" return ;; esac - COMPREPLY=($(compgen -W 'status permissions enable sleep - wifi wwan wimax' -- "$cur")) + _comp_compgen -- -W 'status permissions enable sleep wifi wwan + wimax' ;; con) case $command in list) - COMPREPLY=($(compgen -W 'id uuid' -- "$cur")) + _comp_compgen -- -W 'id uuid' return ;; up) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--nowait --timeout' \ - -- "$cur")) + _comp_compgen -- -W '--nowait --timeout' else - COMPREPLY=($(compgen -W 'id uuid iface ap nsp' \ - -- "$cur")) + _comp_compgen -- -W 'id uuid iface ap nsp' fi return ;; down) - COMPREPLY=($(compgen -W 'id uuid' -- "$cur")) + _comp_compgen -- -W 'id uuid' return ;; delete) - COMPREPLY=($(compgen -W 'id uuid' -- "$cur")) + _comp_compgen -- -W 'id uuid' return ;; esac - COMPREPLY=($(compgen -W 'list status up down delete' \ - -- "$cur")) + _comp_compgen -- -W 'list status up down delete' ;; dev) case $command in list) - COMPREPLY=($(compgen -W 'iface' -- "$cur")) + _comp_compgen -- -W 'iface' return ;; disconnect) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--nowait --timeout' \ - -- "$cur")) + _comp_compgen -- -W '--nowait --timeout' else - COMPREPLY=($(compgen -W 'iface' -- "$cur")) + _comp_compgen -- -W 'iface' fi return ;; @@ -162,40 +151,37 @@ _nmcli() case $subcommand in list) - COMPREPLY=($(compgen -W 'iface bssid' \ - -- "$cur")) + _comp_compgen -- -W 'iface bssid' return ;; connect) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--private - --nowait --timeout' -- "$cur")) + _comp_compgen -- -W '--private --nowait + --timeout' else if [[ $prev == "connect" ]]; then - _nmcli_ap_ssid + _comp_cmd_nmcli__ap_ssid else - COMPREPLY=($(compgen -W 'password - wep-key-type iface bssid name' \ - -- "$cur")) + _comp_compgen -- -W 'password + wep-key-type iface bssid name' fi fi return ;; esac - COMPREPLY=($(compgen -W 'list connect' -- "$cur")) + _comp_compgen -- -W 'list connect' return ;; esac - COMPREPLY=($(compgen -W 'status list disconnect wifi' \ - -- "$cur")) + _comp_compgen -- -W 'status list disconnect wifi' ;; esac fi } && - complete -F _nmcli nmcli + complete -F _comp_cmd_nmcli nmcli # ex: filetype=sh diff --git a/completions/_nox b/completions/_nox new file mode 100644 index 0000000..40b8bb1 --- /dev/null +++ b/completions/_nox @@ -0,0 +1,13 @@ +# 3rd party completion loader for argcomplete commands -*- shell-script -*- +# sourced using no args to `register-python-argcomplete`. +# +# This serves as a fallback in case the completion is not installed otherwise. + +eval -- "$( + bin_path=$(type -P "$1" 2>/dev/null | command sed 's,/[^/]*$,,') + [[ $bin_path ]] && PATH=$bin_path${PATH:+:$PATH} + register-python-argcomplete --shell bash "$1" 2>/dev/null || + register-python-argcomplete3 --shell bash "$1" 2>/dev/null +)" + +# ex: filetype=sh diff --git a/completions/_nvm b/completions/_nvm new file mode 100644 index 0000000..e5c2a46 --- /dev/null +++ b/completions/_nvm @@ -0,0 +1,8 @@ +# 3rd party completion loader for nvm -*- shell-script -*- +# +# This serves as a fallback in case the completion is not installed otherwise. + +# shellcheck disable=SC1091 +[[ ${NVM_DIR-} && -r $NVM_DIR/bash_completion ]] && . "$NVM_DIR"/bash_completion + +# ex: filetype=sh diff --git a/completions/_pip b/completions/_pip new file mode 100644 index 0000000..4439aa7 --- /dev/null +++ b/completions/_pip @@ -0,0 +1,9 @@ +# 3rd party completion loader for commands emitting -*- shell-script -*- +# their completion using "$cmd completion --bash". For example, pip uses this +# form of dynamic completions. +# +# This serves as a fallback in case the completion is not installed otherwise. + +eval -- "$("$1" completion --bash 2>/dev/null)" + +# ex: filetype=sh diff --git a/completions/_pipenv b/completions/_pipenv new file mode 100644 index 0000000..e6d2df6 --- /dev/null +++ b/completions/_pipenv @@ -0,0 +1,15 @@ +# 3rd party completion loader for commands emitting -*- shell-script -*- +# their completion using "_${cmdname^^}_COMPLETE=bash_source $cmd". +# This pattern is used by programs built with https://click.palletsprojects.com +# +# This serves as a fallback in case the completion is not installed otherwise. + +eval -- "$( + # shellcheck disable=SC2154 + ucname="${cmdname^^}" + ucname=${ucname//-/_} + export "_${ucname}_COMPLETE=bash_source" + "$1" 2>/dev/null +)" + +# ex: filetype=sh diff --git a/completions/_renice b/completions/_renice index a416744..06811ed 100644 --- a/completions/_renice +++ b/completions/_renice @@ -3,10 +3,10 @@ # Use of this file is deprecated on Linux. Upstream completion is # available in util-linux >= 2.23, use that instead. -_renice() +_comp_cmd_renice() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local command=$1 curopt i=0 @@ -15,18 +15,18 @@ _renice() curopt=${words[cword - i]} case "$curopt" in -u) - _allowed_users + _comp_compgen_allowed_users ;; -g) - _pgids + _comp_compgen_pgids ;; -p | "$command") - _pids + _comp_compgen_pids ;; esac ((i++)) done } && - complete -F _renice renice + complete -F _comp_cmd_renice renice # ex: filetype=sh diff --git a/completions/_repomanage b/completions/_repomanage index ba0787e..3a7c5ad 100644 --- a/completions/_repomanage +++ b/completions/_repomanage @@ -3,22 +3,22 @@ # Use of this file is deprecated. Upstream completion is available in # yum-utils >= 1.1.24, use that instead. -_repomanage() +_comp_cmd_repomanage() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return [[ $prev == -@([hk]|-help|-keep) ]] && return - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - _filedir -d + _comp_compgen_filedir -d fi } && - complete -F _repomanage repomanage + complete -F _comp_cmd_repomanage repomanage # ex: filetype=sh diff --git a/completions/_reptyr b/completions/_reptyr index 01d61b2..266a545 100644 --- a/completions/_reptyr +++ b/completions/_reptyr @@ -3,10 +3,10 @@ # Use of this file is deprecated. Upstream completion is available in # reptyr > 0.6.2, use that instead. -_reptyr() +_comp_cmd_reptyr() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -l) @@ -15,12 +15,12 @@ _reptyr() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - [[ $prev != +([0-9]) ]] && _pids + [[ $prev != +([0-9]) ]] && _comp_compgen_pids } && - complete -F _reptyr reptyr + complete -F _comp_cmd_reptyr reptyr # ex: filetype=sh diff --git a/completions/_rfkill b/completions/_rfkill index 96a6c09..c4733e7 100644 --- a/completions/_rfkill +++ b/completions/_rfkill @@ -3,29 +3,28 @@ # Use of this file is deprecated on systems with util-linux >= 2.31, which # ships completion for the rfkill included with it. -_rfkill() +_comp_cmd_rfkill() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--version' -- "$cur")) + _comp_compgen -- -W '--version' else case $cword in 1) - COMPREPLY=($(compgen -W "help event list block unblock" \ - -- "$cur")) + _comp_compgen -- -W "help event list block unblock" ;; 2) if [[ $prev == block || $prev == unblock ]]; then - COMPREPLY=($(compgen -W "$($1 list | awk -F: \ - '/^[0-9]/ {print $1}') all wifi bluetooth uwb wimax \ - wwan gps" -- "$cur")) + _comp_compgen_split -- " + $("$1" list | _comp_awk -F : '/^[0-9]/ {print $1}') + all wifi bluetooth uwb wimax wwan gps" fi ;; esac fi } && - complete -F _rfkill rfkill + complete -F _comp_cmd_rfkill rfkill # ex: filetype=sh diff --git a/completions/_rtcwake b/completions/_rtcwake index 4ca452d..535079e 100644 --- a/completions/_rtcwake +++ b/completions/_rtcwake @@ -3,30 +3,30 @@ # Use of this file is deprecated. Upstream completion is available in # util-linux >= 2.23, use that instead. -_rtcwake() +_comp_cmd_rtcwake() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case "$prev" in --help | -h | --version | -V | --seconds | -s | --time | -t) return ;; --mode | -m) - COMPREPLY=($(compgen -W 'standby mem disk on no off' -- "$cur")) + _comp_compgen -- -W 'standby mem disk on no off' return ;; --device | -d) - COMPREPLY=($(command ls -d /dev/rtc?* 2>/dev/null)) - COMPREPLY=($(compgen -W '${COMPREPLY[@]#/dev/}' -- "$cur")) + _comp_expand_glob COMPREPLY '/dev/rtc?*' && + _comp_compgen -- -W '"${COMPREPLY[@]#/dev/}"' return ;; esac - $split && return + [[ $was_split ]] && return - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help } && - complete -F _rtcwake rtcwake + complete -F _comp_cmd_rtcwake rtcwake # ex: filetype=sh diff --git a/completions/_ruff b/completions/_ruff new file mode 100644 index 0000000..b5fd1a5 --- /dev/null +++ b/completions/_ruff @@ -0,0 +1,8 @@ +# 3rd party completion loader for commands emitting -*- shell-script -*- +# their completion using "$cmd generate-shell-completion bash". +# +# This serves as a fallback in case the completion is not installed otherwise. + +eval -- "$("$1" generate-shell-completion bash 2>/dev/null)" + +# ex: filetype=sh diff --git a/completions/_rustup b/completions/_rustup new file mode 100644 index 0000000..1bcf44d --- /dev/null +++ b/completions/_rustup @@ -0,0 +1,7 @@ +# 3rd party completion loader for rustup -*- shell-script -*- +# +# This serves as a fallback in case the completion is not installed otherwise. + +eval -- "$("$1" completions bash rustup 2>/dev/null)" + +# ex: filetype=sh diff --git a/completions/_slackpkg b/completions/_slackpkg new file mode 100644 index 0000000..f8f7810 --- /dev/null +++ b/completions/_slackpkg @@ -0,0 +1,111 @@ +# bash completion for slackpkg(8) -*- shell-script -*- +# options list is based on `grep '\-.*\=.*)' /usr/sbin/slackpkg | cut -f1 -d\)` + +# Use of this file is deprecated. +# Upstream completion is available in slackpkg >= 15.0.4, use that instead. + +_comp_cmd_slackpkg() +{ + local cur prev words cword comp_args + _comp_initialize -n = -- "$@" || return + + local split="" + if [[ $cur == -?*=* ]]; then + prev="${cur%%?(\\)=*}" + cur="${cur#*=}" + split=set + fi + + case "$prev" in + -delall | -checkmd5 | -checkgpg | -checksize | -postinst | -onoff | \ + -download_all | -dialog | -batch | -only_new_dotnew | \ + -use_includes | -spinning) + _comp_compgen -- -W 'on off' + return + ;; + -default_answer) + _comp_compgen -- -W 'yes no' + return + ;; + -dialog_maxargs | -mirror) + # argument required but no completions available + return + ;; + esac + + [[ $split ]] && return + + if [[ $cur == -* ]]; then + compopt -o nospace + _comp_compgen -- -W '-delall= -checkmd5= -checkgpg= -checksize= + -postinst= -onoff= -download_all= -dialog= -dialog_maxargs= -batch= + -only_new_dotnew= -use_includes= -spinning= -default_answer= + -mirror=' + return + fi + + local confdir="/etc/slackpkg" + local config="$confdir/slackpkg.conf" + + [[ -r $config ]] || return + . "$config" + + local i action + for ((i = 1; i < cword; i++)); do + if [[ ${words[i]} != -* ]]; then + action="${words[i]}" + break + fi + done + + case "$action" in + generate-template | search | file-search) + # argument required but no completions available + return + ;; + install-template | remove-template) + if [[ -e $confdir/templates ]]; then + _comp_compgen -C "$confdir/templates" -- -f -X \ + "!?*.template" && COMPREPLY=("${COMPREPLY[@]%.template}") + fi + return + ;; + remove) + _comp_compgen_filedir + _comp_compgen -a -- -W 'a ap d e f k kde kdei l n t tcl x xap xfce + y' + _comp_compgen -aC /var/log/packages -- -f + return + ;; + install | reinstall | upgrade | blacklist | download) + _comp_compgen_filedir + _comp_compgen -a -- -W 'a ap d e f k kde kdei l n t tcl x xap xfce + y' + _comp_compgen -a split -l -- "$( + cut -f 6 -d\ "${WORKDIR}/pkglist" 2>/dev/null + )" + return + ;; + info) + _comp_compgen_split "$( + cut -f 6 -d\ "${WORKDIR}/pkglist" 2>/dev/null + )" + return + ;; + update) + # we should complete the same as the next `list` + "gpg" + _comp_compgen -- -W 'gpg' + ;& + *) + _comp_compgen -a -- -W 'install reinstall upgrade remove blacklist + download update install-new upgrade-all clean-system new-config + check-updates help generate-template install-template + remove-template search file-search info' + return + ;; + esac + +} && + complete -F _comp_cmd_slackpkg slackpkg + +# ex: filetype=sh diff --git a/completions/_su b/completions/_su index 1a03c8f..3354447 100644 --- a/completions/_su +++ b/completions/_su @@ -8,34 +8,32 @@ if [[ $OSTYPE != *linux* ]]; then return fi -_su() +_comp_cmd_su() { # linux-specific completion - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case "$prev" in -s | --shell) - _shells + _comp_compgen_shells return ;; -c | --command | --session-command) - local IFS=$'\n' - compopt -o filenames - COMPREPLY=($(compgen -d -c -- "$cur")) + _comp_compgen_commands return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" --help)' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen -- -u } && - complete -F _su su + complete -F _comp_cmd_su su # ex: filetype=sh diff --git a/completions/_svn b/completions/_svn index 5d85c2b..862b62c 100644 --- a/completions/_svn +++ b/completions/_svn @@ -3,10 +3,10 @@ # Use of this file is deprecated. Upstream completion is available in # subversion >= 0.12.0, use that instead. -_svn() +_comp_cmd_svn() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local commands commands='add blame praise annotate ann cat checkout co cleanup commit \ @@ -18,28 +18,27 @@ _svn() if ((cword == 1)); then if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--version' -- "$cur")) + _comp_compgen -- -W '--version' else - COMPREPLY=($(compgen -W "$commands" -- "$cur")) + _comp_compgen -- -W "$commands" fi else case $prev in --config-dir) - _filedir -d + _comp_compgen_filedir -d return ;; -F | --file | --targets) - _filedir + _comp_compgen_filedir return ;; --encoding) - _xfunc iconv _iconv_charsets + _comp_compgen -x iconv charsets return ;; --editor-cmd | --diff-cmd | --diff3-cmd) - compopt -o filenames - COMPREPLY=($(compgen -c -- "$cur")) + _comp_compgen_commands return ;; esac @@ -194,17 +193,17 @@ _svn() esac options+=" --help --config-dir" - COMPREPLY=($(compgen -W "$options" -- "$cur")) + _comp_compgen -- -W "$options" else if [[ $command == @(help|[h?]) ]]; then - COMPREPLY=($(compgen -W "$commands" -- "$cur")) + _comp_compgen -- -W "$commands" else - _filedir + _comp_compgen_filedir fi fi fi } && - complete -F _svn svn + complete -F _comp_cmd_svn svn # ex: filetype=sh diff --git a/completions/_svnadmin b/completions/_svnadmin index 654fd3e..6b4a423 100644 --- a/completions/_svnadmin +++ b/completions/_svnadmin @@ -3,10 +3,10 @@ # Use of this file is deprecated. Upstream completion is available in # subversion >= 0.12.0, use that instead. -_svnadmin() +_comp_cmd_svnadmin() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local commands commands='create deltify dump help ? hotcopy list-dblogs list-unused-dblogs @@ -14,18 +14,18 @@ _svnadmin() if ((cword == 1)); then if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--version' -- "$cur")) + _comp_compgen -- -W '--version' else - COMPREPLY=($(compgen -W "$commands" -- "$cur")) + _comp_compgen -- -W "$commands" fi else case $prev in --config-dir) - _filedir -d + _comp_compgen_filedir -d return ;; --fs-type) - COMPREPLY=($(compgen -W 'fsfs bdb' -- "$cur")) + _comp_compgen -- -W 'fsfs bdb' return ;; esac @@ -62,17 +62,17 @@ _svnadmin() esac options+=" --help" - COMPREPLY=($(compgen -W "$options" -- "$cur")) + _comp_compgen -- -W "$options" else if [[ $command == @(help|[h?]) ]]; then - COMPREPLY=($(compgen -W "$commands" -- "$cur")) + _comp_compgen -- -W "$commands" else - _filedir + _comp_compgen_filedir fi fi fi } && - complete -F _svnadmin -o default svnadmin + complete -F _comp_cmd_svnadmin -o default svnadmin # ex: filetype=sh diff --git a/completions/_svnlook b/completions/_svnlook index 36188a5..f0c01df 100644 --- a/completions/_svnlook +++ b/completions/_svnlook @@ -3,10 +3,10 @@ # Use of this file is deprecated. Upstream completion is available in # subversion >= 0.12.0, use that instead. -_svnlook() +_comp_cmd_svnlook() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local commands commands='author cat changed date diff dirs-changed help ? h history info @@ -14,9 +14,9 @@ _svnlook() if ((cword == 1)); then if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--version' -- "$cur")) + _comp_compgen -- -W '--version' else - COMPREPLY=($(compgen -W "$commands" -- "$cur")) + _comp_compgen -- -W "$commands" fi else local command=${words[1]} @@ -47,17 +47,17 @@ _svnlook() esac options+=" --help" - COMPREPLY=($(compgen -W "$options" -- "$cur")) + _comp_compgen -- -W "$options" else if [[ $command == @(help|[h?]) ]]; then - COMPREPLY=($(compgen -W "$commands" -- "$cur")) + _comp_compgen -- -W "$commands" else - _filedir + _comp_compgen_filedir fi fi fi } && - complete -F _svnlook -o default svnlook + complete -F _comp_cmd_svnlook -o default svnlook # ex: filetype=sh diff --git a/completions/_tokio-console b/completions/_tokio-console new file mode 100644 index 0000000..c170044 --- /dev/null +++ b/completions/_tokio-console @@ -0,0 +1,8 @@ +# 3rd party completion loader for commands emitting -*- shell-script -*- +# their completion using "$cmd gen-completion bash". +# +# This serves as a fallback in case the completion is not installed otherwise. + +eval -- "$("$1" gen-completion bash 2>/dev/null)" + +# ex: filetype=sh diff --git a/completions/_udevadm b/completions/_udevadm index 19624be..6a3c351 100644 --- a/completions/_udevadm +++ b/completions/_udevadm @@ -3,75 +3,73 @@ # Use of this file is deprecated. Upstream completion is available in # systemd >= 196, use that instead. -_udevadm() +_comp_cmd_udevadm() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return - local i udevcmd + local i udevcmd="" has_udevcmd="" for ((i = 1; i < cword; i++)); do if [[ ${words[i]} != -* ]]; then udevcmd=${words[i]} + has_udevcmd=set break fi done case $prev in - --help | --version | --property | --children-max | --timeout | --seq-start | \ - --seq-end | --attr-match | --attr-nomatch | --parent-match | --property-match | \ - --tag-match | --subsystem-match | --subsystem-nomatch | --sysname-match | \ - --path) + --help | --version | --property | --children-max | --timeout | \ + --seq-start | --seq-end | --attr-match | --attr-nomatch | \ + --parent-match | --property-match | --tag-match | \ + --subsystem-match | --subsystem-nomatch | --sysname-match | --path) return ;; --log-priority) - COMPREPLY=($(compgen -W 'err info debug' -- "$cur")) + _comp_compgen -- -W 'err info debug' return ;; --query) - COMPREPLY=($(compgen -W 'name symlink path property all' \ - -- "$cur")) + _comp_compgen -- -W 'name symlink path property all' return ;; --name) - cur=${cur:=/dev/} - _filedir + _comp_compgen -c "${cur:-/dev/}" filedir return ;; --device-id-of-file | --exit-if-exists) - _filedir + _comp_compgen_filedir return ;; --action) - COMPREPLY=($(compgen -W 'add change remove' -- "$cur")) + _comp_compgen -- -W 'add change remove' return ;; --type) - COMPREPLY=($(compgen -W 'devices subsystems failed' -- "$cur")) + _comp_compgen -- -W 'devices subsystems failed' return ;; esac - $split && return + [[ $was_split ]] && return - if [[ ! -v udevcmd ]]; then + if [[ ! $has_udevcmd ]]; then case $cur in -*) - COMPREPLY=($(compgen -W '--help --version --debug' -- "$cur")) + _comp_compgen -- -W '--help --version --debug' ;; *) - COMPREPLY=($(compgen -W "$("$1" --help 2>/dev/null | - awk '/^[ \t]/ { print $1 }')" -- "$cur")) + _comp_compgen_split -- "$("$1" --help 2>/dev/null | + _comp_awk '/^[ \t]/ { print $1 }')" ;; esac return fi if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W \ - '$("$1" ${udevcmd-} --help 2>/dev/null | _parse_help -)' -- "$cur")) + _comp_compgen_help -- ${has_udevcmd:+"$udevcmd"} --help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _udevadm udevadm + complete -F _comp_cmd_udevadm udevadm # ex: filetype=sh diff --git a/completions/_umount b/completions/_umount index 36d5703..5a453a8 100644 --- a/completions/_umount +++ b/completions/_umount @@ -11,14 +11,13 @@ fi # umount(8) completion. This relies on the mount point being the third # space-delimited field in the output of mount(8) # -_umount() +_comp_cmd_umount() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - local IFS=$'\n' - COMPREPLY=($(compgen -W '$(mount | cut -d" " -f 3)' -- "$cur")) + _comp_compgen_split -l -- "$(mount | cut -d" " -f 3)" } && - complete -F _umount -o dirnames umount + complete -F _comp_cmd_umount -o dirnames umount # ex: filetype=sh diff --git a/completions/_umount.linux b/completions/_umount.linux index cf8a259..ca515c8 100644 --- a/completions/_umount.linux +++ b/completions/_umount.linux @@ -6,7 +6,7 @@ # Just like COMPREPLY=(`compgen -W "${COMPREPLY[*]}" -- "$cur"`), only better! # # This will correctly escape special characters in COMPREPLY. -_reply_compgen_array() +_comp_cmd_umount__reply_compgen_array() { # Create the argument for compgen -W by escaping twice. # @@ -15,8 +15,10 @@ _reply_compgen_array() # argument. local i wlist for i in ${!COMPREPLY[*]}; do - local q=$(quote "$(printf %q "${COMPREPLY[i]}")") - wlist+=$q$'\n' + local REPLY + printf -v REPLY %q "${COMPREPLY[i]}" + _comp_quote "$REPLY" + wlist+=$REPLY$'\n' done # We also have to add another round of escaping to $cur. @@ -25,16 +27,14 @@ _reply_compgen_array() ecur=${ecur//\'/\\\'} # Actually generate completions. - local ifs=$IFS - IFS=$'\n' eval 'COMPREPLY=(`compgen -W "$wlist" -- "${ecur}"`)' - IFS=$ifs + _comp_compgen -lc "${ecur}" -- -W "$wlist" } # Unescape strings in the linux fstab(5) format (with octal escapes). -__linux_fstab_unescape() +_comp_cmd_umount__linux_fstab_unescape() { - eval $1="'${!1//\'/\\047}'" - eval $1="'${!1/%\\/\\\\}'" + eval "$1='${!1//\'/\\047}'" + eval "$1='${!1/%\\/\\\\}'" eval "$1=$'${!1}'" } @@ -43,30 +43,25 @@ __linux_fstab_unescape() # Reads a file from stdin in the linux fstab(5) format; as used by /etc/fstab # and /proc/mounts. With 1st arg -L, look for entries by label. # shellcheck disable=SC2120 -_linux_fstab() +_comp_cmd_umount__linux_fstab() { COMPREPLY=() # Read and unescape values into COMPREPLY local fs_spec fs_file fs_other - local ifs="$IFS" while read -r fs_spec fs_file fs_other; do if [[ $fs_spec == [#]* ]]; then continue; fi if [[ ${1-} == -L ]]; then local fs_label=${fs_spec/#LABEL=/} if [[ $fs_label != "$fs_spec" ]]; then - __linux_fstab_unescape fs_label - IFS=$'\0' + _comp_cmd_umount__linux_fstab_unescape fs_label COMPREPLY+=("$fs_label") - IFS=$ifs fi else - __linux_fstab_unescape fs_spec - __linux_fstab_unescape fs_file - IFS=$'\0' + _comp_cmd_umount__linux_fstab_unescape fs_spec + _comp_cmd_umount__linux_fstab_unescape fs_file [[ $fs_spec == */* ]] && COMPREPLY+=("$fs_spec") [[ $fs_file == */* ]] && COMPREPLY+=("$fs_file") - IFS=$ifs fi done @@ -86,37 +81,37 @@ _linux_fstab() local i for i in ${!COMPREPLY[*]}; do [[ ${COMPREPLY[i]} == "$realcur"* ]] && - COMPREPLY+=($(cd "$dircur" 2>/dev/null && - compgen -f -d -P "$dircur" \ - -X "!${COMPREPLY[i]##"$dirrealcur"}" -- "$basecur")) + _comp_compgen -aC "$dircur" -c "$basecur" -- \ + -f -d -P "$dircur" -X "!${COMPREPLY[i]##"$dirrealcur"}" done fi fi - _reply_compgen_array + _comp_cmd_umount__reply_compgen_array } -_umount() +_comp_cmd_umount() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case "$prev" in -t) # FIXME: no<fstype> - local split=false + local split="" if [[ $cur == ?*,* ]]; then prev="${cur%,*}" cur="${cur##*,}" - split=true + split=set fi - COMPREPLY=($(compgen -W 'adfs affs autofs btrfs cifs coda - cramfs debugfs devpts efs ext2 ext3 ext4 fuse hfs hfsplus hpfs - iso9660 jfs minix msdos ncpfs nfs nfs4 ntfs ntfs-3g proc qnx4 - ramfs reiserfs romfs squashfs smbfs sysv tmpfs ubifs udf ufs - umsdos usbfs vfat xfs' -- "$cur")) - _fstypes - $split && COMPREPLY=(${COMPREPLY[@]/#/$prev,}) + _comp_compgen -- -W 'adfs affs autofs btrfs cifs coda cramfs + debugfs devpts efs ext2 ext3 ext4 fuse hfs hfsplus hpfs iso9660 + jfs minix msdos ncpfs nfs nfs4 ntfs ntfs-3g proc qnx4 ramfs + reiserfs romfs squashfs smbfs sysv tmpfs ubifs udf ufs umsdos + usbfs vfat xfs' + _comp_compgen -a fstypes + [[ $split ]] && ((${#COMPREPLY[@]})) && + _comp_compgen -Rv COMPREPLY -- -P "$prev," -W '"${COMPREPLY[@]}"' return ;; -O) @@ -126,20 +121,19 @@ _umount() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-V -h -v -n -r -d -i -a -t -O -f -l - --no-canonicalize --fake' -- "$cur")) + _comp_compgen -- -W '-V -h -v -n -r -d -i -a -t -O -f -l + --no-canonicalize --fake' [[ ${COMPREPLY-} ]] && return fi if [[ -r /proc/mounts ]]; then # Linux /proc/mounts is properly quoted. This is important when # unmounting usb devices with pretty names. - _linux_fstab </proc/mounts + _comp_cmd_umount__linux_fstab </proc/mounts else - local IFS=$'\n' - COMPREPLY=($(compgen -W '$(mount | cut -d" " -f 3)' -- "$cur")) + _comp_compgen_split -l -- "$(mount | cut -d" " -f 3)" fi } && - complete -F _umount -o dirnames umount + complete -F _comp_cmd_umount -o dirnames umount # ex: filetype=sh diff --git a/completions/_vault b/completions/_vault new file mode 100644 index 0000000..25abbc2 --- /dev/null +++ b/completions/_vault @@ -0,0 +1,8 @@ +# 3rd party completion loader for commands -*- shell-script -*- +# supporting their use of as a `complete -C` handler. +# +# This serves as a fallback in case the completion is not installed otherwise. + +type "$1" &>/dev/null && complete -C "\"$1\" 2>/dev/null" "$1" + +# ex: filetype=sh diff --git a/completions/_xm b/completions/_xm index 06b25d3..7577efd 100644 --- a/completions/_xm +++ b/completions/_xm @@ -4,26 +4,20 @@ # provided by upstream. It has been replaced with the 'xl' command, for # which upstream provides completion, use that instead. -_xen_domain_names() +_comp_cmd_xm__domain_names() { - COMPREPLY=($(compgen -W "$(xm list 2>/dev/null | - awk '!/Name|Domain-0/ { print $1 }')" -- "$cur")) + _comp_compgen_split -- "$(xm list 2>/dev/null | + _comp_awk '!/Name|Domain-0/ { print $1 }')" } -_xen_domain_ids() +_comp_cmd_xm() { - COMPREPLY=($(compgen -W "$(xm list 2>/dev/null | - awk '!/Name|Domain-0/ { print $2 }')" -- "$cur")) -} - -_xm() -{ - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - # TODO: _split_longopt + # TODO: split longopt - local args command commands options + local REPLY command commands options commands='console vncviewer create new delete destroy domid domname dump-core list mem-max mem-set migrate pause reboot rename reset @@ -37,7 +31,7 @@ _xm() resetpolicy getpolicy shell help' if ((cword == 1)); then - COMPREPLY=($(compgen -W "$commands" -- "$cur")) + _comp_compgen -- -W "$commands" else if [[ $cur == *=* ]]; then prev=${cur/=*/} @@ -78,140 +72,139 @@ _xm() -s --skipdtd -p --paused -c --console_autoconnect' ;; esac - COMPREPLY=($(compgen -W "$options" -- "$cur")) + _comp_compgen -- -W "$options" else case $command in - console | destroy | domname | domid | list | mem-set | mem-max | \ - pause | reboot | rename | shutdown | unpause | vcpu-list | vcpu-pin | \ - vcpu-set | block-list | network-list | vtpm-list) - _count_args - case $args in + console | destroy | domname | domid | list | mem-set | \ + mem-max | pause | reboot | rename | shutdown | unpause | \ + vcpu-list | vcpu-pin | vcpu-set | block-list | \ + network-list | vtpm-list) + _comp_count_args + case $REPLY in 2) - _xen_domain_names + _comp_cmd_xm__domain_names ;; esac ;; migrate) - _count_args - case $args in + _comp_count_args + case $REPLY in 2) - _xen_domain_names + _comp_cmd_xm__domain_names ;; 3) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" ;; esac ;; restore | dry-run | vnet-create) - _filedir + _comp_compgen_filedir ;; save) - _count_args - case $args in + _comp_count_args + case $REPLY in 2) - _xen_domain_names + _comp_cmd_xm__domain_names ;; 3) - _filedir + _comp_compgen_filedir ;; esac ;; sysrq) - _count_args - case $args in + _comp_count_args + case $REPLY in 2) - _xen_domain_names + _comp_cmd_xm__domain_names ;; 3) - COMPREPLY=($(compgen -W "r s e i u b" -- "$cur")) + _comp_compgen -- -W "r s e i u b" ;; esac ;; block-attach) - _count_args - case $args in + _comp_count_args + case $REPLY in 2) - _xen_domain_names + _comp_cmd_xm__domain_names ;; 3) - COMPREPLY=($(compgen -W "phy: file:" -- "$cur")) + _comp_compgen -- -W "phy: file:" ;; 5) - COMPREPLY=($(compgen -W "w r" -- "$cur")) + _comp_compgen -- -W "w r" ;; 6) - _xen_domain_names + _comp_cmd_xm__domain_names ;; esac ;; block-detach) - _count_args - case $args in + _comp_count_args + case $REPLY in 2) - _xen_domain_names + _comp_cmd_xm__domain_names ;; 3) - COMPREPLY=($(compgen -W "$(xm block-list $prev \ - 2>/dev/null | awk '!/Vdev/ { print $1 }')" \ - -- "$cur")) + _comp_compgen_split -- "$(xm block-list "$prev" \ + 2>/dev/null | _comp_awk '!/Vdev/ { print $1 }')" ;; esac ;; network-attach) - _count_args - case $args in + _comp_count_args + case $REPLY in 2) - _xen_domain_names + _comp_cmd_xm__domain_names ;; *) - COMPREPLY=($(compgen -W "script= ip= mac= bridge= - backend=" -- "$cur")) + _comp_compgen -- -W "script= ip= mac= bridge= + backend=" ;; esac ;; network-detach) - _count_args - case $args in + _comp_count_args + case $REPLY in 2) - _xen_domain_names + _comp_cmd_xm__domain_names ;; 3) - COMPREPLY=($(compgen -W "$(xm network-list $prev \ - 2>/dev/null | awk '!/Idx/ { print $1 }')" \ - -- "$cur")) + _comp_compgen_split -- "$(xm network-list "$prev" \ + 2>/dev/null | _comp_awk '!/Idx/ { print $1 }')" ;; esac ;; sched-credit) case $prev in -d) - _xen_domain_names + _comp_cmd_xm__domain_names return ;; esac ;; create) - _filedir - COMPREPLY+=( - $(compgen -W '$(command ls /etc/xen 2>/dev/null)' \ - -- "$cur")) + _comp_compgen_filedir + _comp_compgen -a split -- "$( + command ls /etc/xen 2>/dev/null + )" ;; new) case $prev in -f | -F | --defconfig | --config) - _filedir + _comp_compgen_filedir return ;; --path) - _filedir -d + _comp_compgen_filedir -d return ;; esac - _count_args - case $args in + _comp_count_args + case $REPLY in 2) - _xen_domain_names + _comp_cmd_xm__domain_names ;; esac ;; @@ -219,6 +212,6 @@ _xm() fi fi } && - complete -F _xm xm + complete -F _comp_cmd_xm xm # ex: filetype=sh diff --git a/completions/_yq b/completions/_yq new file mode 100644 index 0000000..c357bd9 --- /dev/null +++ b/completions/_yq @@ -0,0 +1,8 @@ +# 3rd party completion loader for commands emitting -*- shell-script -*- +# their completion using "$cmd shell-completion bash". +# +# This serves as a fallback in case the completion is not installed otherwise. + +eval -- "$("$1" shell-completion bash 2>/dev/null)" + +# ex: filetype=sh diff --git a/completions/_yum b/completions/_yum index 224ea25..2899cb3 100644 --- a/completions/_yum +++ b/completions/_yum @@ -3,72 +3,79 @@ # Use of this file is deprecated. Upstream completion is available in # yum > 3.2.25, use that instead. -_yum_list() +_comp_cmd_yum__list() { if [[ $1 == all ]]; then # Try to strip in between headings like "Available Packages" # This will obviously only work for English :P - COMPREPLY=($(yum -d 0 -C list $1 "$cur*" 2>/dev/null | - command sed -ne '/^Available /d' -e '/^Installed /d' -e '/^Updated /d' \ - -e 's/[[:space:]].*//p')) + _comp_split COMPREPLY "$(yum -d 0 -C list "$1" "$cur*" 2>/dev/null | + command sed -ne '/^Available /d' -e '/^Installed /d' \ + -e '/^Updated /d' -e 's/[[:space:]].*//p')" else # Drop first line (e.g. "Updated Packages") - COMPREPLY=($(yum -d 0 -C list $1 "$cur*" 2>/dev/null | - command sed -ne 1d -e 's/[[:space:]].*//p')) + _comp_split COMPREPLY "$(yum -d 0 -C list "$1" "$cur*" 2>/dev/null | + command sed -ne 1d -e 's/[[:space:]].*//p')" fi } -_yum_repolist() +_comp_cmd_yum__compgen_repolist() { # -d 0 causes repolist to output nothing as of yum 3.2.22: # http://yum.baseurl.org/ticket/83 # Drop first ("repo id repo name") and last ("repolist: ...") rows - yum --noplugins -C repolist $1 2>/dev/null | - command sed -ne '/^repo\s\s*id/d' -e '/^repolist:/d' -e 's/[[:space:]].*//p' + _comp_compgen_split -- "$( + yum --noplugins -C repolist "$1" 2>/dev/null | + command sed -ne '/^repo[[:space:]]\{1,\}id/d' -e '/^repolist:/d' \ + -e 's/[[:space:]].*//p' + )" } -_yum_plugins() +_comp_cmd_yum__compgen_plugins() { - command ls /usr/lib/yum-plugins/*.py{,c,o} 2>/dev/null | - command sed -ne 's|.*/\([^./]*\)\.py[co]\{0,1\}$|\1|p' | sort -u + local -a files + _comp_expand_glob files '/usr/lib/yum-plugins/*.py{,c,o}' || return + _comp_compgen -U files split -- "$( + printf '%s\n' "${files[@]}" | + command sed -ne 's|.*/\([^./]*\)\.py[co]\{0,1\}$|\1|p' | sort -u + )" } -_yum() +_comp_cmd_yum() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return - local special i - for ((i = 1; i < ${#words[@]} - 1; i++)); do + local special="" i + for ((i = 1; i < cword; i++)); do if [[ ${words[i]} == @(install|update|upgrade|remove|erase|deplist|info) ]]; then special=${words[i]} break fi done - if [[ -v special ]]; then + if [[ $special ]]; then # TODO: install|update|upgrade should not match *src.rpm - if [[ $cur == @(*/|[.~])* && \ + if [[ $cur == @(*/|[.~])* && $special == @(deplist|install|update|upgrade) ]]; then - _filedir rpm + _comp_compgen_filedir rpm return fi case $special in install) - _yum_list available + _comp_cmd_yum__list available return ;; deplist | info) - _yum_list all + _comp_cmd_yum__list all return ;; upgrade | update) - _yum_list updates + _comp_cmd_yum__list updates return ;; remove | erase) - # _rpm_installed_packages is not arch-qualified - _yum_list installed + # _comp_xfunc_rpm_installed_packages is not arch-qualified + _comp_cmd_yum__list installed return ;; esac @@ -76,44 +83,43 @@ _yum() case $prev in list) - COMPREPLY=($(compgen -W 'all available updates installed extras - obsoletes recent' -- "$cur")) + _comp_compgen -- -W 'all available updates installed extras + obsoletes recent' ;; clean) - COMPREPLY=($(compgen -W 'packages headers metadata cache dbcache - all' -- "$cur")) + _comp_compgen -- -W 'packages headers metadata cache dbcache all' ;; repolist) - COMPREPLY=($(compgen -W 'all enabled disabled' -- "$cur")) + _comp_compgen -- -W 'all enabled disabled' ;; localinstall | localupdate) # TODO: should not match *src.rpm - _filedir rpm + _comp_compgen_filedir rpm ;; -d | -e) - COMPREPLY=($(compgen -W '{0..10}' -- "$cur")) + _comp_compgen -- -W '{0..10}' ;; -c) - _filedir + _comp_compgen_filedir ;; --installroot) - _filedir -d + _comp_compgen_filedir -d ;; --enablerepo) - COMPREPLY=($(compgen -W '$(_yum_repolist disabled)' -- "$cur")) + _comp_cmd_yum__compgen_repolist disabled ;; --disablerepo) - COMPREPLY=($(compgen -W '$(_yum_repolist enabled)' -- "$cur")) + _comp_cmd_yum__compgen_repolist enabled ;; --disableexcludes) - COMPREPLY=($(compgen -W '$(_yum_repolist all) all main' \ - -- "$cur")) + _comp_cmd_yum__compgen_repolist all + _comp_compgen -a -- -W "all main" ;; --enableplugin | --disableplugin) - COMPREPLY=($(compgen -W '$(_yum_plugins)' -- "$cur")) + _comp_cmd_yum__compgen_plugins ;; --color) - COMPREPLY=($(compgen -W 'always auto never' -- "$cur")) + _comp_compgen -- -W 'always auto never' ;; -R | -x | --exclude) # argument required but no completions available @@ -124,21 +130,21 @@ _yum() return ;; *) - COMPREPLY=($(compgen -W 'install update check-update upgrade - remove erase list info provides whatprovides clean makecache - groupinstall groupupdate grouplist groupremove groupinfo - search shell resolvedep localinstall localupdate deplist - repolist help' -- "$cur")) + _comp_compgen -- -W 'install update check-update upgrade remove + erase list info provides whatprovides clean makecache + groupinstall groupupdate grouplist groupremove groupinfo search + shell resolvedep localinstall localupdate deplist repolist + help' ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _yum yum + complete -F _comp_cmd_yum yum # ex: filetype=sh diff --git a/completions/a2x b/completions/a2x index b59c786..ed1a206 100644 --- a/completions/a2x +++ b/completions/a2x @@ -1,39 +1,41 @@ # a2x(1) completion -*- shell-script -*- -_a2x() +_comp_cmd_a2x() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[aDd]*)' + # shellcheck disable=SC2254 case $prev in --attribute | --asciidoc-opts | --dblatex-opts | --fop-opts | --help | \ - --version | --xsltproc-opts | -!(-*)[ah]) + --version | --xsltproc-opts | -${noargopts}[ah]) return ;; - --destination-dir | --icons-dir | -!(-*)D) - _filedir -d + --destination-dir | --icons-dir | -${noargopts}D) + _comp_compgen_filedir -d return ;; - --doctype | -!(-*)d) - _xfunc asciidoc _asciidoc_doctype + --doctype | -${noargopts}d) + _comp_compgen -x asciidoc doctype return ;; --stylesheet) - _filedir css + _comp_compgen_filedir css return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" --help)' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir + _comp_compgen_filedir } && - complete -F _a2x a2x + complete -F _comp_cmd_a2x a2x # ex: filetype=sh diff --git a/completions/abook b/completions/abook index 42197d1..5e4c2f4 100644 --- a/completions/abook +++ b/completions/abook @@ -1,12 +1,12 @@ # abook(1) completion -*- shell-script -*- -_abook() +_comp_cmd_abook() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return # abook only takes options, tabbing after command name adds a single dash - [[ $cword -eq 1 && -z $cur ]] && + [[ $cword -eq 1 && ! $cur ]] && { compopt -o nospace COMPREPLY=("-") @@ -15,35 +15,33 @@ _abook() case $cur in -*) - _longopt "$1" + _comp_complete_longopt "$@" return ;; esac case $prev in --informat) - COMPREPLY=($(compgen -W "$($1 --formats | - command sed -n -e 's/^'$'\t''\([a-z]*\).*/\1/p' -e '/^$/q')" \ - -- "$cur")) + _comp_compgen_split -- "$("$1" --formats | + command sed -n -e 's/^'$'\t''\([a-z]*\).*/\1/p' -e '/^$/q')" ;; --outformat) - COMPREPLY=($(compgen -W "$($1 --formats | - command sed -n -e '/^$/,$s/^'$'\t''\([a-z]*\).*/\1/p')" \ - -- "$cur")) + _comp_compgen_split -- "$("$1" --formats | + command sed -n -e '/^$/,$s/^'$'\t''\([a-z]*\).*/\1/p')" ;; --infile) - COMPREPLY=($(compgen -W stdin -- "$cur")) - _filedir + _comp_compgen -- -W stdin + _comp_compgen -a filedir ;; --outfile) - COMPREPLY=($(compgen -W stdout -- "$cur")) - _filedir + _comp_compgen -- -W stdout + _comp_compgen -a filedir ;; --config | --datafile) - _filedir + _comp_compgen_filedir ;; esac } && - complete -F _abook abook + complete -F _comp_cmd_abook abook # ex: filetype=sh diff --git a/completions/aclocal b/completions/aclocal index 010862f..b23ff72 100644 --- a/completions/aclocal +++ b/completions/aclocal @@ -1,35 +1,35 @@ # aclocal(1) completion -*- shell-script -*- -_aclocal() +_comp_cmd_aclocal() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case "$prev" in --help | --print-ac-dir | --version) return ;; --acdir | -I) - _filedir -d + _comp_compgen_filedir -d return ;; --output) - _filedir + _comp_compgen_filedir return ;; --warnings | -W) local cats=(syntax unsupported) - COMPREPLY=($(compgen -W \ - '${cats[@]} ${cats[@]/#/no-} all none error' -- "$cur")) + _comp_compgen -- -W '"${cats[@]}" "${cats[@]/#/no-}" all none + error' return ;; esac - $split && return + [[ $was_split ]] && return - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace } && - complete -F _aclocal aclocal aclocal-1.1{0..6} + complete -F _comp_cmd_aclocal aclocal aclocal-1.1{0..6} # ex: filetype=sh diff --git a/completions/acpi b/completions/acpi index f2c38b2..3d131da 100644 --- a/completions/acpi +++ b/completions/acpi @@ -1,22 +1,24 @@ -# acpi(1) completion -*- shell-script -*- +# acpi(1) completion -*- shell-script -*- -_acpi() +_comp_cmd_acpi() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[d]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | -!(-*)[hv]) + --help | --version | -${noargopts}[hv]) return ;; - --directory | -!(-*)d) - _filedir -d + --directory | -${noargopts}d) + _comp_compgen_filedir -d return ;; esac - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help } && - complete -F _acpi acpi + complete -F _comp_cmd_acpi acpi # ex: filetype=sh diff --git a/completions/add_members b/completions/add_members index efa4f1e..d691884 100644 --- a/completions/add_members +++ b/completions/add_members @@ -1,31 +1,34 @@ # mailman add_members completion -*- shell-script -*- -_add_members() +_comp_cmd_add_members() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -r | -d | --regular-members-file | --digest-members-file) - _filedir + _comp_compgen_filedir return ;; -w | -a | --welcome-msg | --admin-notify) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + _comp_compgen -- -W 'y n' return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--regular-members-file --digest-members-file - --welcome-msg --admin-notify --help' -- "$cur")) + _comp_compgen -- -W '--regular-members-file --digest-members-file + --welcome-msg --admin-notify --help' else - _xfunc list_lists _mailman_lists + # Prefer `list_lists` in the same dir as command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_xfunc list_lists mailman_lists fi } && - complete -F _add_members add_members + complete -F _comp_cmd_add_members add_members # ex: filetype=sh diff --git a/completions/alias b/completions/alias index 92211d8..9a0f3d2 100644 --- a/completions/alias +++ b/completions/alias @@ -1,20 +1,28 @@ # bash alias completion -*- shell-script -*- -_alias() +_comp_cmd_alias() { - local cur prev words cword - _init_completion -n = || return + local cur prev words cword comp_args + _comp_initialize -n = -- "$@" || return - case ${words[@]} in + case "${words[*]}" in + *" -p "*) + return + ;; *[^=]) - COMPREPLY=($(compgen -A alias -- "$cur")) + _comp_compgen -- -A alias ;; *=) - COMPREPLY=("$(alias ${cur%=} 2>/dev/null | command sed \ + COMPREPLY=("$(alias "${cur%=}" 2>/dev/null | command sed \ -e 's|^alias '"$cur"'\(.*\)$|\1|')") ;; esac + + if [[ $cur == -* ]]; then + _comp_compgen_usage -c help -s "$1" + ((${#COMPREPLY[*]} != 1)) || compopt +o nospace + fi } && - complete -F _alias -o nospace alias + complete -F _comp_cmd_alias -o nospace alias # ex: filetype=sh diff --git a/completions/ant b/completions/ant index 197c0e9..e4f9f29 100644 --- a/completions/ant +++ b/completions/ant @@ -1,6 +1,6 @@ # bash completion for ant and phing -*- shell-script -*- -_ant_parse_targets() +_comp_cmd_ant__targets() { local line basedir @@ -9,9 +9,9 @@ _ant_parse_targets() # parse buildfile for targets while read -rd '>' line; do if [[ $line =~ \<(target|extension-point)[[:space:]].*name=[\"\']([^\"\']+) ]]; then - targets+=" ${BASH_REMATCH[2]}" + REPLY+=("${BASH_REMATCH[2]}") fi - done <$1 + done <"$1" # parse imports while read -rd '>' line; do @@ -19,39 +19,39 @@ _ant_parse_targets() local imported_buildfile imported_buildfile="${basedir}/${BASH_REMATCH[1]}" if [[ -f $imported_buildfile ]]; then - _ant_parse_targets $imported_buildfile + "$FUNCNAME" "$imported_buildfile" fi fi - done <$1 + done <"$1" } -_ant() +_comp_cmd_ant() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -h | -help | --h | --help | -projecthelp | -p | -version | -diagnostics) return ;; -buildfile | -file | -f) - _filedir 'xml' + _comp_compgen_filedir 'xml' return ;; -logfile | -l) - [[ $1 != *phing || $prev != -l ]] && _filedir + [[ $1 != *phing || $prev != -l ]] && _comp_compgen_filedir return ;; -propertyfile) - _filedir properties + _comp_compgen_filedir properties return ;; -nice) - COMPREPLY=($(compgen -W '{1..10}' -- "$cur")) + _comp_compgen -- -W '{1..10}' return ;; -lib) - _filedir -d + _comp_compgen_filedir -d return ;; -logger | -listener | -inputhandler | -main | -find | -s) @@ -64,8 +64,7 @@ _ant() elif [[ $cur == -* ]]; then # The </dev/null prevents "phing -" weirdness/getting just a literal # tab displayed on complete on CentOS 6 with phing 2.6.1. - COMPREPLY=( - $(compgen -W '$(_parse_help "$1" -h </dev/null)' -- "$cur")) + _comp_compgen_help -- -h </dev/null else # available targets completion # find which buildfile to use @@ -77,6 +76,7 @@ _ant() fi done if ((i == cword)); then + local IFS=$' \t\n' for i in ${ANT_ARGS-}; do if [[ $prev == -@(?(build)file|f) ]]; then buildfile=$i @@ -87,16 +87,17 @@ _ant() fi [[ ! -f $buildfile ]] && return - local targets + local REPLY=() # fill targets - _ant_parse_targets $buildfile + _comp_cmd_ant__targets "$buildfile" - COMPREPLY=($(compgen -W '$targets' -- "$cur")) + _comp_compgen -- -W '"${REPLY[@]}"' fi } && - complete -F _ant ant phing -type complete-ant-cmd.pl &>/dev/null && - complete -C complete-ant-cmd.pl -F _ant ant || : + complete -F _comp_cmd_ant ant phing +if type complete-ant-cmd.pl &>/dev/null; then + complete -C complete-ant-cmd.pl -F _comp_cmd_ant ant +fi # ex: filetype=sh diff --git a/completions/apache2ctl b/completions/apache2ctl index 980b3c5..0807788 100644 --- a/completions/apache2ctl +++ b/completions/apache2ctl @@ -1,16 +1,16 @@ # apache2ctl(1) completion -*- shell-script -*- -_apache2ctl() +_comp_cmd_apache2ctl() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local APWORDS - APWORDS=$($1 2>&1 >/dev/null | awk 'NR<2 { print $3; exit }' | + APWORDS=$("$1" 2>&1 >/dev/null | _comp_awk 'NR<2 { print $3; exit }' | tr "|" " ") - COMPREPLY=($(compgen -W "$APWORDS" -- "$cur")) + _comp_compgen -- -W "$APWORDS" } && - complete -F _apache2ctl apache2ctl + complete -F _comp_cmd_apache2ctl apache2ctl # ex: filetype=sh diff --git a/completions/appdata-validate b/completions/appdata-validate index 03d8cc9..1b6149e 100644 --- a/completions/appdata-validate +++ b/completions/appdata-validate @@ -1,32 +1,31 @@ # appdata-validate(1) completion -*- shell-script -*- -_appdata_validate() +_comp_cmd_appdata_validate() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -h | --help | --version) return ;; --output-format) - COMPREPLY=($(compgen -W "$($1 --help | - command sed -ne 's/--output-format.*\[\(.*\)\]/\1/' -e 's/|/ /gp')" \ - -- "$cur")) + _comp_compgen_split -- "$("$1" --help | command sed -ne \ + 's/--output-format.*\[\(.*\)\]/\1/' -e 's/|/ /gp')" return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir appdata.xml + _comp_compgen_filedir appdata.xml } && - complete -F _appdata_validate appdata-validate + complete -F _comp_cmd_appdata_validate appdata-validate # ex: filetype=sh diff --git a/completions/apt-build b/completions/apt-build index 713f4c3..5327780 100644 --- a/completions/apt-build +++ b/completions/apt-build @@ -1,26 +1,25 @@ # Debian apt-build(1) completion -*- shell-script -*- -_apt_build() +_comp_cmd_apt_build() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - local special i - for ((i = 1; i < ${#words[@]} - 1; i++)); do + local special="" i + for ((i = 1; i < cword; i++)); do if [[ ${words[i]} == @(install|remove|source|info|clean) ]]; then special=${words[i]} break fi done - if [[ -v special ]]; then + if [[ $special ]]; then case $special in install | source | info) - COMPREPLY=($(_xfunc apt-cache _apt_cache_packages)) + _comp_compgen -x apt-cache packages ;; remove) - COMPREPLY=( - $(_xfunc dpkg _comp_dpkg_installed_packages "$cur")) + _comp_compgen -x dpkg installed_packages ;; esac return @@ -28,7 +27,7 @@ _apt_build() case $prev in --patch | --build-dir | --repository-dir) - _filedir + _comp_compgen_filedir return ;; -h | --help) @@ -37,18 +36,17 @@ _apt_build() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--help --show-upgraded -u --build-dir + _comp_compgen -- -W '--help --show-upgraded -u --build-dir --repository-dir --build-only --build-command --reinstall --rebuild --remove-builddep --no-wrapper --purge --patch --patch-strip -p - --yes -y --version -v --no-source' -- "$cur")) + --yes -y --version -v --no-source' else - COMPREPLY=($(compgen -W 'update upgrade install remove source - dist-upgrade world clean info clean-build update-repository' \ - -- "$cur")) + _comp_compgen -- -W 'update upgrade install remove source dist-upgrade + world clean info clean-build update-repository' fi } && - complete -F _apt_build apt-build + complete -F _comp_cmd_apt_build apt-build # ex: filetype=sh diff --git a/completions/apt-cache b/completions/apt-cache index 61aa07b..1f47d7d 100644 --- a/completions/apt-cache +++ b/completions/apt-cache @@ -1,32 +1,69 @@ # Debian apt-cache(8) completion -*- shell-script -*- # List APT binary packages +# @since 2.12 +_comp_xfunc_apt_cache_compgen_packages() +{ + _comp_cmd_apt_cache__compgen_packages apt-cache +} + +# List APT binary packages +# @param $1 Name of executable +_comp_cmd_apt_cache__compgen_packages() +{ + _comp_compgen_split -- "$("$1" --no-generate pkgnames "$cur" 2>/dev/null)" +} + +# List APT source packages +# @since 2.12 +_comp_xfunc_apt_cache_compgen_sources() +{ + _comp_cmd_apt_cache__compgen_sources apt-cache +} + +# List APT source packages +# @param $1 Name of executable +_comp_cmd_apt_cache__compgen_sources() +{ + _comp_compgen_split -- "$("$1" dumpavail | + _comp_awk '$1 == "Source:" { print $2 }' | sort -u)" +} + +# List APT binary packages +# @deprecated 2.12 _apt_cache_packages() { - apt-cache --no-generate pkgnames "$cur" 2>/dev/null || : + local packages + _comp_compgen -v packages -i apt-cache packages apt-cache && + printf '%s\n' "${packages[@]}" } # List APT source packages +# @deprecated 2.12 _apt_cache_sources() { - compgen -W "$(apt-cache dumpavail | - awk '$1 == "Source:" { print $2 }' | sort -u)" -- "$1" + local sources + _comp_compgen -v sources -c "$1" -i apt-cache sources apt-cache && + printf '%s\n' "${sources[@]}" } # List APT source packages +# @deprecated 2.12 _apt_cache_src_packages() { - compgen -W '$(_apt_cache_sources "$cur")' -- "$cur" + local sources + _comp_compgen -v sources -i apt-cache sources apt-cache && + printf '%s\n' "${sources[@]}" } -_apt_cache() +_comp_cmd_apt_cache() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - local special ispecial + local special="" ispecial if [[ $cur != show ]]; then - for ((ispecial = 1; ispecial < ${#words[@]} - 1; ispecial++)); do + for ((ispecial = 1; ispecial < ${#words[@]}; ispecial++)); do if [[ ${words[ispecial]} == @(add|depends|dotty|madison|policy|rdepends|show?(pkg|src|)) ]]; then special=${words[ispecial]} break @@ -34,27 +71,34 @@ _apt_cache() done fi - if [[ -v special && $ispecial -lt $cword ]]; then + if [[ $special && $ispecial -lt $cword ]]; then case $special in add) - _filedir + _comp_compgen_filedir ;; showsrc) - COMPREPLY=($(_apt_cache_sources "$cur")) + _comp_cmd_apt_cache__compgen_sources "$1" ;; *) - COMPREPLY=($(_apt_cache_packages)) + _comp_cmd_apt_cache__compgen_packages "$1" ;; esac return fi + local noargopts='!(-*|*[cps]*)' + # shellcheck disable=SC2254 case $prev in - --config-file | --pkg-cache | --src-cache | -!(-*)[cps]) - _filedir + --config-file | --pkg-cache | --src-cache | -${noargopts}[cps]) + _comp_compgen_filedir + return + ;; + --with-source) + _comp_compgen_filedir '@(deb|dsc|changes)' + _comp_compgen -a -- -f -o plusdirs -X '!?(*/)@(Sources|Packages)' return ;; search) @@ -65,21 +109,19 @@ _apt_cache() esac if [[ $cur == -* ]]; then - - COMPREPLY=($(compgen -W '-h -v -p -s -q -i -f -a -g -c -o --help - --version --pkg-cache --src-cache --quiet --important --full - --all-versions --no-all-versions --generate --no-generate - --names-only --all-names --recurse --config-file --option - --installed' -- "$cur")) - elif [[ ! -v special ]]; then - - COMPREPLY=($(compgen -W 'add gencaches show showpkg showsrc stats - dump dumpavail unmet search search depends rdepends pkgnames - dotty xvcg policy madison' -- "$cur")) - + _comp_compgen -- -W '--pkg-cache --src-cache --quiet --important + --no-pre-depends --no-depends --no-recommends --no-suggests + --no-conflicts --no-breaks --no-replaces --no-enhances --implicit + --full --all-versions --no-all-versions --generate --no-generate + --names-only --all-names --recurse --installed --with-source + --help --version --config-file --option' + elif [[ ! $special ]]; then + _comp_compgen -- -W 'gencaches showpkg stats showsrc dump dumpavail + unmet show search depends rdepends pkgnames dotty xvcg policy + madison' fi } && - complete -F _apt_cache apt-cache + complete -F _comp_cmd_apt_cache apt-cache # ex: filetype=sh diff --git a/completions/apt-get b/completions/apt-get index 4aee263..f59c62b 100644 --- a/completions/apt-get +++ b/completions/apt-get @@ -1,83 +1,93 @@ # Debian apt-get(8) completion -*- shell-script -*- -_apt_get() +# @since 2.12 +_comp_xfunc_apt_get_compgen_installed_packages() { - local cur prev words cword package - _init_completion -n ':=' || return + if [[ -f /etc/debian_version ]]; then + # Debian system + _comp_compgen -x dpkg installed_packages + else + # assume RPM based + _comp_compgen -x rpm installed_packages + fi +} - local special i - for ((i = 1; i < ${#words[@]} - 1; i++)); do - if [[ ${words[i]} == @(install|remove|autoremove|purge|source|build-dep|download|changelog) ]]; then +_comp_cmd_apt_get() +{ + local cur prev words cword comp_args package + _comp_initialize -n ':=' -- "$@" || return + + local special="" i + for ((i = 1; i < cword; i++)); do + if [[ ${words[i]} == @(install|remove|auto?(-)remove|purge|source|build-dep|download|changelog) ]]; then special=${words[i]} break fi done - if [[ -v special ]]; then + if [[ $special ]]; then case $special in - remove | autoremove | purge) - if [[ -f /etc/debian_version ]]; then - # Debian system - COMPREPLY=($( - _xfunc dpkg _comp_dpkg_installed_packages $cur - )) - else - # assume RPM based - _xfunc rpm _rpm_installed_packages - fi + remove | auto?(-)remove | purge) + _comp_xfunc_apt_get_compgen_installed_packages ;; source) - COMPREPLY=($(_xfunc apt-cache _apt_cache_packages) - $(compgen -W "$(apt-cache dumpavail | - awk '$1 == "Source:" { print $2 }' | sort -u)" -- "$cur")) + # Prefer `apt-cache` in the same dir as command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_compgen -x apt-cache packages + _comp_compgen -a split -- "$(apt-cache dumpavail | + _comp_awk '$1 == "Source:" { print $2 }' | sort -u)" ;; - install) - if [[ $cur == */* ]]; then - _filedir deb + install | reinstall) + if _comp_looks_like_path "$cur"; then + _comp_compgen_filedir deb return elif [[ $cur == *=* ]]; then package="${cur%%=*}" cur="${cur#*=}" - COMPREPLY=($(IFS=$'\n' compgen -W "$( + _comp_compgen_split -l -- "$( apt-cache --no-generate madison "$package" 2>/dev/null | while IFS=' |' read -r _ version _; do echo "$version" done - )" \ - -- "$cur")) - __ltrim_colon_completions "$cur" + )" + _comp_ltrim_colon_completions "$cur" return fi ;;& build-dep) - _filedir -d - [[ $cur != */* ]] || return + _comp_compgen_filedir -d + _comp_looks_like_path "$cur" && return ;;& *) - COMPREPLY+=($(_xfunc apt-cache _apt_cache_packages)) + _comp_compgen -ax apt-cache packages ;; esac return fi + local noargopts='!(-*|*[eoct]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | --option | -!(-*)[hvo]) + --error-on | --help | --version | --option | -${noargopts}[ehvo]) return ;; - --config-file | -!(-*)c) - _filedir + --config-file | -${noargopts}c) + _comp_compgen_filedir return ;; - --target-release | --default-release | -!(-*)t) - COMPREPLY=($(compgen -W "$(apt-cache policy | command sed -ne \ - 's/^ *release.*[ ,]o=\(Debian\|Ubuntu\),a=\(\w*\).*/\2/p')" \ - -- "$cur")) + --target-release | --default-release | -${noargopts}t) + # Prefer `apt-cache` in the same dir as command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_compgen_split -- "$(apt-cache policy | command sed -ne \ + 's/^ *release.*[ ,]o=\(Debian\|Ubuntu\),a=\(\w*\).*/\2/p')" return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--no-install-recommends --install-suggests + _comp_compgen -- -W '--no-install-recommends --install-suggests --download-only --fix-broken --ignore-missing --fix-missing --no-download --quiet --simulate --just-print --dry-run --recon --no-act --yes --assume-yes --assume-no --no-show-upgraded @@ -89,16 +99,15 @@ _apt_get() --trivial-only --no-remove --auto-remove --autoremove --only-source --diff-only --dsc-only --tar-only --arch-only --indep-only --allow-unauthenticated --no-allow-insecure-repositories - --allow-releaseinfo-change --show-progress --with-source --help - --version --config-file --option' -- "$cur")) + --allow-releaseinfo-change --show-progress --with-source --error-on + --help --version --config-file --option' else - COMPREPLY=($(compgen -W 'update upgrade dist-upgrade - dselect-upgrade install remove purge source build-dep check - download clean autoclean autoremove changelog indextargets' \ - -- "$cur")) + _comp_compgen -- -W 'update upgrade dist-upgrade dselect-upgrade + install reinstall remove purge source build-dep satisfy check + download clean autoclean autoremove changelog indextargets' fi } && - complete -F _apt_get apt-get + complete -F _comp_cmd_apt_get apt-get # ex: filetype=sh diff --git a/completions/apt-mark b/completions/apt-mark new file mode 100644 index 0000000..7ef3f76 --- /dev/null +++ b/completions/apt-mark @@ -0,0 +1,64 @@ +# Debian apt-mark(8) completion -*- shell-script -*- + +_comp_cmd_apt_mark() +{ + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + + local special="" i + for ((i = 1; i < cword; i++)); do + if [[ ${words[i]} == @(auto|manual|minimize-manual|showauto|showmanual|hold|unhold|showhold|install|remove|deinstall|purge|showinstall|showremove|showpurge) ]]; then + special=${words[i]} + break + fi + done + + if [[ $special ]]; then + case $special in + auto | manual | unhold) + local -A showcmds=([auto]=manual [manual]=auto [unhold]=hold) + local showcmd=${showcmds[$special]} + _comp_compgen_split -- "$("$1" "show$showcmd" 2>/dev/null)" + return + ;; + minimize-manual) + return + ;; + *) + _comp_compgen -x apt-get installed_packages + ;; + esac + return + fi + + local noargopts='!(-*|*[ocf]*)' + # shellcheck disable=SC2254 + case $prev in + --help | --version | --option | -${noargopts}[hvo]) + return + ;; + --config-file | -${noargopts}c) + _comp_compgen_filedir conf + return + ;; + --file | -${noargopts}f) + _comp_compgen_filedir + return + ;; + esac + + [[ $was_split ]] && return + + if [[ $cur == -* ]]; then + _comp_compgen -- -W '--file= --help --version --config-file --option' + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + else + _comp_compgen -- -W 'auto manual minimize-manual showauto showmanual + hold unhold showhold install remove purge showinstall showremove + showpurge' + fi + +} && + complete -F _comp_cmd_apt_mark apt-mark + +# ex: filetype=sh diff --git a/completions/aptitude b/completions/aptitude index e5ea163..827395a 100644 --- a/completions/aptitude +++ b/completions/aptitude @@ -1,24 +1,11 @@ # Debian aptitude(1) completion -*- shell-script -*- -_have grep-status && { - _comp_dpkg_hold_packages() - { - grep-status -P -e "^$1" -a -FStatus 'hold' -n -s Package - } -} || { - _comp_dpkg_hold_packages() - { - command grep -B 2 'hold' /var/lib/dpkg/status | - awk "/Package: $1/ { print \$2 }" - } -} - -_aptitude() +_comp_cmd_aptitude() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - local special i + local special="" i for ((i = 1; i < ${#words[@]} - 1; i++)); do if [[ ${words[i]} == @(@(|re)install|@(|un)hold|@(|un)markauto|@(dist|full|safe)-upgrade|download|show|forbid-version|purge|remove|changelog|why@(|-not)|keep@(|-all)|build-dep|@(add|remove)-user-tag|versions) ]]; then special=${words[i]} @@ -26,65 +13,65 @@ _aptitude() fi done - if [[ -v special ]]; then + if [[ $special ]]; then case $special in install | hold | markauto | unmarkauto | dist-upgrade | full-upgrade | \ safe-upgrade | download | show | changelog | why | why-not | build-dep | \ add-user-tag | remove-user-tag | versions) - COMPREPLY=($(_xfunc apt-cache _apt_cache_packages)) + _comp_compgen -x apt-cache packages return ;; purge | remove | reinstall | forbid-version) - COMPREPLY=( - $(_xfunc dpkg _comp_dpkg_installed_packages "$cur")) + _comp_compgen -x dpkg installed_packages return ;; unhold) - COMPREPLY=($(_comp_dpkg_hold_packages "$cur")) + _comp_compgen -x dpkg held_packages return ;; esac fi + local noargopts='!(-*|*[SwFoOt]*)' + # shellcheck disable=SC2254 case $prev in # don't complete anything if these options are found autoclean | clean | forget-new | search | upgrade | update | keep-all) return ;; - -!(-*)S) - _filedir + -${noargopts}S) + _comp_compgen_filedir return ;; - --display-format | --width | -!(-*)[wFo]) + --display-format | --width | -${noargopts}[wFo]) return ;; - --sort | -!(-*)O) - COMPREPLY=($(compgen -W 'installsize installsizechange debsize - name priority version' -- "$cur")) + --sort | -${noargopts}O) + _comp_compgen -- -W 'installsize installsizechange debsize name + priority version' return ;; - --target-release | --default-release | -!(-*)t) - COMPREPLY=($(apt-cache policy | - command grep "release.o=Debian,a=$cur" | - command sed -e "s/.*a=\(\w*\).*/\1/" | uniq 2>/dev/null)) + --target-release | --default-release | -${noargopts}t) + _comp_compgen_split -l -- "$(apt-cache policy | + command sed -ne 's/.*release.o=Debian,a=\([_[:alnum:]]*\).*/\1/p')" return ;; esac if [[ $cur == -* ]]; then - local opts=" $($1 --help 2>&1 | command sed -e \ - 's/--with(out)-recommends/--without-recommends\n--with-recommends/' | - _parse_help - | tr '\n' ' ') " + _comp_compgen -R help - <<<"$("$1" --help 2>&1 | command sed -e \ + 's/--with(out)-recommends/--without-recommends\n--with-recommends/')" + ((${#COMPREPLY[@]})) || return 0 # Exclude some mutually exclusive options + local exclude_flags="" for i in "${words[@]}"; do - [[ $i == -u ]] && opts=${opts/ -i / } - [[ $i == -i ]] && opts=${opts/ -u / } + [[ $i == -u ]] && exclude_flags+=i + [[ $i == -i ]] && exclude_flags+=u done # Do known short -> long replacements; at least up to 0.8.12, --help # outputs mostly only short ones. - COMPREPLY=($opts) for i in "${!COMPREPLY[@]}"; do case ${COMPREPLY[i]} in -h) COMPREPLY[i]=--help ;; @@ -104,16 +91,17 @@ _aptitude() esac done - COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur")) + _comp_compgen -- -W '"${COMPREPLY[@]}"' \ + ${exclude_flags:+-X "-[$exclude_flags]"} else - COMPREPLY=($(compgen -W 'update upgrade safe-upgrade forget-new - clean autoclean install reinstall remove hold unhold purge markauto + _comp_compgen -- -W 'update upgrade safe-upgrade forget-new clean + autoclean install reinstall remove hold unhold purge markauto unmarkauto why why-not dist-upgrade full-upgrade download search show forbid-version changelog keep keep-all build-dep add-user-tag - remove-user-tag versions' -- "$cur")) + remove-user-tag versions' fi } && - complete -F _aptitude -o default aptitude aptitude-curses + complete -F _comp_cmd_aptitude -o default aptitude aptitude-curses # ex: filetype=sh diff --git a/completions/arch b/completions/arch index afeed05..7ca9738 100644 --- a/completions/arch +++ b/completions/arch @@ -2,27 +2,27 @@ # Try to detect whether this is the mailman "arch" to avoid installing # it for the coreutils/util-linux-ng one. -_have mailmanctl && - _arch() +_comp_have_command mailmanctl && + _comp_cmd_arch() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -w | -g | -d | --welcome-msg | --goodbye-msg | --digest) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + _comp_compgen -- -W 'y n' return ;; --file) - _filedir + _comp_compgen_filedir return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help else local args=$cword for ((i = 1; i < cword; i++)); do @@ -32,15 +32,18 @@ _have mailmanctl && done case $args in 1) - _xfunc list_lists _mailman_lists + # Prefer `list_lists` in the same dir as command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_compgen -x list_lists mailman_lists ;; 2) - _filedir + _comp_compgen_filedir ;; esac fi } && - complete -F _arch arch + complete -F _comp_cmd_arch arch # ex: filetype=sh diff --git a/completions/arp b/completions/arp index 922e800..3d1669a 100644 --- a/completions/arp +++ b/completions/arp @@ -1,43 +1,45 @@ -# arp(8) completion -*- shell-script -*- +# arp(8) completion -*- shell-script -*- -_arp() +_comp_cmd_arp() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[iApfHt]*)' + # shellcheck disable=SC2254 case $prev in - --device | -!(-*)i) - _available_interfaces -a + --device | -${noargopts}i) + _comp_compgen_available_interfaces -a return ;; - --protocol | -!(-*)[Ap]) + --protocol | -${noargopts}[Ap]) # TODO protocol/address family return ;; - --file | -!(-*)f) - _filedir + --file | -${noargopts}f) + _comp_compgen_filedir return ;; - --hw-type | -!(-*)[Ht]) + --hw-type | -${noargopts}[Ht]) # TODO: parse from --help output? - COMPREPLY=($(compgen -W 'ash ether ax25 netrom rose arcnet \ - dlci fddi hippi irda x25 eui64' -- "$cur")) + _comp_compgen -- -W 'ash ether ax25 netrom rose arcnet dlci fddi + hippi irda x25 eui64' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage return fi - local args - _count_args "" "@(--device|--protocol|--file|--hw-type|-!(-*)[iApfHt])" - case $args in + local REPLY + _comp_count_args -a "@(--device|--protocol|--file|--hw-type|-${noargopts}[iApfHt])" + case $REPLY in 1) local ips=$("$1" -an | command sed -ne \ 's/.*(\([0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{3\}\)).*/\1/p') - COMPREPLY=($(compgen -W '$ips' -- "$cur")) + _comp_compgen -- -W '$ips' ;; 2) # TODO if -d mode: "pub"; if not -f mode: hw_addr @@ -54,6 +56,6 @@ _arp() ;; esac } && - complete -F _arp arp + complete -F _comp_cmd_arp arp # ex: filetype=sh diff --git a/completions/arping b/completions/arping index 57e1e19..c69fc2d 100644 --- a/completions/arping +++ b/completions/arping @@ -1,31 +1,31 @@ # arping(8) completion -*- shell-script -*- -_arping() +_comp_cmd_arping() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*c | -*w) return ;; -*I) - _available_interfaces -a + _comp_compgen_available_interfaces -a return ;; -*s) - _ip_addresses + _comp_compgen_ip_addresses return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + _comp_compgen_help -- -h return fi - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" } && - complete -F _arping arping + complete -F _comp_cmd_arping arping # ex: filetype=sh diff --git a/completions/arpspoof b/completions/arpspoof index d1a1373..8939f2d 100644 --- a/completions/arpspoof +++ b/completions/arpspoof @@ -1,28 +1,28 @@ # arpspoof completion -*- shell-script -*- -_arpspoof() +_comp_cmd_arpspoof() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -i) - _available_interfaces -a + _comp_compgen_available_interfaces -a return ;; -t) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage else - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" fi } && - complete -F _arpspoof arpspoof + complete -F _comp_cmd_arpspoof arpspoof # ex: filetype=sh diff --git a/completions/asciidoc b/completions/asciidoc index 1ea4abf..7e77857 100644 --- a/completions/asciidoc +++ b/completions/asciidoc @@ -1,52 +1,60 @@ # asciidoc(1) completion -*- shell-script -*- +# @since 2.12 +_comp_xfunc_asciidoc_compgen_doctype() +{ + _comp_compgen -- -W 'article book manpage' +} + +# @deprecated 2.12 _asciidoc_doctype() { - COMPREPLY+=($(compgen -W 'article book manpage' -- "$cur")) + _comp_compgen -ax asciidoc doctype } -_asciidoc() +_comp_cmd_asciidoc() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[abfdo]*)' + # shellcheck disable=SC2254 case $prev in - --attribute | -!(-*)a) + --attribute | -${noargopts}a) return ;; - --backend | -!(-*)b) - COMPREPLY=($(compgen -W 'docbook html4 xhtml11' -- "$cur")) + --backend | -${noargopts}b) + _comp_compgen -- -W 'docbook html4 xhtml11' return ;; - --conf-file | -!(-*)f) - _filedir conf + --conf-file | -${noargopts}f) + _comp_compgen_filedir conf return ;; - --doctype | -!(-*)d) - _asciidoc_doctype + --doctype | -${noargopts}d) + _comp_xfunc_asciidoc_compgen_doctype return ;; - --help | -!(-*)h) - COMPREPLY=($(compgen -W 'manpage syntax topics' -- "$cur")) + --help | -${noargopts}h) + _comp_compgen -- -W 'manpage syntax topics' return ;; - --out-file | -!(-*)o) - _filedir + --out-file | -${noargopts}o) + _comp_compgen_filedir return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" "--help manpage")' \ - -- "$cur")) + _comp_compgen_help -- --help manpage [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir + _comp_compgen_filedir } && - complete -F _asciidoc asciidoc asciidoc.py + complete -F _comp_cmd_asciidoc asciidoc asciidoc.py # ex: filetype=sh diff --git a/completions/aspell b/completions/aspell index e080a07..89dae17 100644 --- a/completions/aspell +++ b/completions/aspell @@ -1,65 +1,66 @@ # bash completion for aspell -*- shell-script -*- -_aspell_dictionary() +_comp_cmd_aspell__dictionary() { - local datadir aspell=${1:-aspell} - datadir=$($aspell config data-dir 2>/dev/null || echo /usr/lib/aspell) + local datadir aspell=$1 + datadir=$("$aspell" config data-dir 2>/dev/null || echo /usr/lib/aspell) # First, get aliases (dicts dump does not list them) - COMPREPLY=($(printf '%s\n' $datadir/*.alias)) - COMPREPLY=("${COMPREPLY[@]%.alias}") - COMPREPLY=("${COMPREPLY[@]#$datadir/}") + if _comp_expand_glob COMPREPLY '"$datadir"/*.alias'; then + COMPREPLY=("${COMPREPLY[@]%.alias}") + COMPREPLY=("${COMPREPLY[@]#$datadir/}") + fi # Then, add the canonical dicts - COMPREPLY+=($($aspell dicts 2>/dev/null)) - COMPREPLY=($(compgen -X '\*' -W '${COMPREPLY[@]}' -- "$cur")) + _comp_split -a COMPREPLY "$("$aspell" dicts 2>/dev/null)" + ((${#COMPREPLY[@]})) && + _comp_compgen -- -X '\*' -W '"${COMPREPLY[@]}"' } -_aspell() +_comp_cmd_aspell() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -c | -p | check | --conf | --personal | --repl | --per-conf) - _filedir + _comp_compgen_filedir return ;; --conf-dir | --data-dir | --dict-dir | --home-dir | --local-data-dir | --prefix) - _filedir -d + _comp_compgen_filedir -d return ;; dump | create | merge) - COMPREPLY=($(compgen -W 'master personal repl' -- "$cur")) + _comp_compgen -- -W 'master personal repl' return ;; --mode) - COMPREPLY=($(compgen -W "$($1 modes 2>/dev/null | - awk '{ print $1 }')" -- "$cur")) + _comp_compgen_split -- "$("$1" modes 2>/dev/null | + _comp_awk '{ print $1 }')" return ;; --sug-mode) - COMPREPLY=($(compgen -W 'ultra fast normal bad-speller' \ - -- "$cur")) + _comp_compgen -- -W 'ultra fast normal bad-speller' return ;; --keymapping) - COMPREPLY=($(compgen -W 'aspell ispell' -- "$cur")) + _comp_compgen -- -W 'aspell ispell' return ;; -d | --master) - _aspell_dictionary "$1" + _comp_cmd_aspell__dictionary "$1" return ;; --add-filter | --rem-filter) - COMPREPLY=($(compgen -W "$($1 filters 2>/dev/null | - awk '{ print $1 }')" -- "$cur")) + _comp_compgen_split -- "$("$1" filters 2>/dev/null | + _comp_awk '{ print $1 }')" return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--conf= --conf-dir= --data-dir= --dict-dir= + _comp_compgen -- -W '--conf= --conf-dir= --data-dir= --dict-dir= --encoding= --add-filter= --rem-filter= --mode= --add-extra-dicts= --rem-extra-dicts= --home-dir= --ignore= --ignore-accents --dont-ignore-accents --ignore-case --dont-ignore-case @@ -76,13 +77,13 @@ _aspell() --add-tex-command= --rem-tex-command= --tex-check-comments --dont-tex-check-comments --add-tex-extension --rem-tex-extension --add-sgml-check= --rem-sgml-check= --add-sgml-extension - --rem-sgml-extension' -- "$cur")) + --rem-sgml-extension' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - COMPREPLY=($(compgen -W 'usage help check pipe list config soundslike - filter version dump create merge' -- "$cur")) + _comp_compgen -- -W 'usage help check pipe list config soundslike + filter version dump create merge' fi } && - complete -F _aspell aspell + complete -F _comp_cmd_aspell aspell # ex: filetype=sh diff --git a/completions/autoconf b/completions/autoconf index b51e797..ac27886 100644 --- a/completions/autoconf +++ b/completions/autoconf @@ -1,40 +1,40 @@ # autoconf(1) completion -*- shell-script -*- -_autoconf() +_comp_cmd_autoconf() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case "$prev" in --help | -h | --version | -V | --trace | -t) return ;; --output | -o) - _filedir + _comp_compgen_filedir return ;; --warnings | -W) local cats=(cross obsolete syntax) - COMPREPLY=($(compgen -W \ - '${cats[@]} ${cats[@]/#/no-} all none error' -- "$cur")) + _comp_compgen -- -W '"${cats[@]}" "${cats[@]/#/no-}" all none + error' return ;; --prepend-include | -B | --include | -I) - _filedir -d + _comp_compgen_filedir -d return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir '@(ac|in)' + _comp_compgen_filedir '@(ac|in)' } && - complete -F _autoconf autoconf + complete -F _comp_cmd_autoconf autoconf # ex: filetype=sh diff --git a/completions/automake b/completions/automake index 5fe5f4f..e20ab4f 100644 --- a/completions/automake +++ b/completions/automake @@ -1,9 +1,9 @@ # automake(1) completion -*- shell-script -*- -_automake() +_comp_cmd_automake() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case "$prev" in --help | --version) @@ -11,26 +11,26 @@ _automake() ;; --warnings | -W) local cats=(gnu obsolete override portability syntax unsupported) - COMPREPLY=($(compgen -W \ - '${cats[@]} ${cats[@]/#/no-} all none error' -- "$cur")) + _comp_compgen -- -W '"${cats[@]}" "${cats[@]/#/no-}" all none + error' return ;; --libdir) - _filedir -d + _comp_compgen_filedir -d return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir + _comp_compgen_filedir } && - complete -F _automake automake automake-1.1{0..6} + complete -F _comp_cmd_automake automake automake-1.1{0..6} # ex: filetype=sh diff --git a/completions/autoreconf b/completions/autoreconf index 9b0f0dc..ef43a5c 100644 --- a/completions/autoreconf +++ b/completions/autoreconf @@ -1,9 +1,9 @@ # autoreconf(1) completion -*- shell-script -*- -_autoreconf() +_comp_cmd_autoreconf() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case "$prev" in --help | -h | --version | -V) @@ -12,30 +12,30 @@ _autoreconf() --warnings | -W) local cats=(cross gnu obsolete override portability syntax unsupported) - COMPREPLY=($(compgen -W \ - '${cats[@]} ${cats[@]/#/no-} all none error' -- "$cur")) + _comp_compgen -- -W '"${cats[@]}" "${cats[@]/#/no-}" all none + error' return ;; --prepend-include | -B | --include | -I) - _filedir -d + _comp_compgen_filedir -d return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi if [[ $1 == *autoheader ]]; then - _filedir '@(ac|in)' + _comp_compgen_filedir '@(ac|in)' else - _filedir -d + _comp_compgen_filedir -d fi } && - complete -F _autoreconf autoreconf autoheader + complete -F _comp_cmd_autoreconf autoreconf autoheader # ex: filetype=sh diff --git a/completions/autorpm b/completions/autorpm index d55322a..3e67091 100644 --- a/completions/autorpm +++ b/completions/autorpm @@ -1,14 +1,14 @@ # autorpm(8) completion -*- shell-script -*- -_autorpm() +_comp_cmd_autorpm() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - COMPREPLY=($(compgen -W '--notty --debug --help --version auto add - fullinfo info help install list remove set' -- "$cur")) + _comp_compgen -- -W '--notty --debug --help --version auto add fullinfo + info help install list remove set' } && - complete -F _autorpm autorpm + complete -F _comp_cmd_autorpm autorpm # ex: filetype=sh diff --git a/completions/autoscan b/completions/autoscan index e007143..fe48b56 100644 --- a/completions/autoscan +++ b/completions/autoscan @@ -1,34 +1,36 @@ # autoscan(1) completion -*- shell-script -*- -_autoscan() +_comp_cmd_autoscan() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[BI]*)' + # shellcheck disable=SC2254 case "$prev" in - --help | --version | -!(-*)[hV]) + --help | --version | -${noargopts}[hV]) return ;; - --prepend-include | --include | -!(-*)[BI]) - _filedir -d + --prepend-include | --include | -${noargopts}[BI]) + _comp_compgen_filedir -d return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi if [[ $1 == *autoupdate ]]; then - _filedir '@(ac|in)' + _comp_compgen_filedir '@(ac|in)' else - _filedir -d + _comp_compgen_filedir -d fi } && - complete -F _autoscan autoscan autoupdate + complete -F _comp_cmd_autoscan autoscan autoupdate # ex: filetype=sh diff --git a/completions/avahi-browse b/completions/avahi-browse new file mode 100644 index 0000000..8e4ece7 --- /dev/null +++ b/completions/avahi-browse @@ -0,0 +1,42 @@ +# bash completion for avahi-browse(1) -*- shell-script -*- + +_comp_cmd_avahi_browse() +{ + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + + local noargopts='!(-*|*[D]*)' + # shellcheck disable=SC2254 + case $prev in + --domain | -${noargopts}D) + return + ;; + --help | --version | -${noargopts}[hV]*) + return + ;; + esac + + [[ $was_split ]] && return + + if [[ $cur == -* ]]; then + _comp_compgen_help + [[ ${COMPREPLY-} != *= ]] || compopt -o nospace + return + fi + + # Complete service types except with -a/-D/-b + [[ $1 != *-domains ]] || return + local word + for word in "${words[@]}"; do + case $word in + --all | --browse-domains | --dump-db | -${noargopts}[aDb]*) + return + ;; + esac + done + _comp_compgen_split -- "$("$1" --dump-db --no-db-lookup)" + +} && + complete -F _comp_cmd_avahi_browse avahi-browse avahi-browse-domains + +# ex: filetype=sh diff --git a/completions/avctrl b/completions/avctrl index 89c24e4..2bb2755 100644 --- a/completions/avctrl +++ b/completions/avctrl @@ -1,20 +1,20 @@ # avctrl completion -*- shell-script -*- -_avctrl() +_comp_cmd_avctrl() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--help --quiet' -- "$cur")) + _comp_compgen -- -W '--help --quiet' else - local args - _count_args - if ((args == 1)); then - COMPREPLY=($(compgen -W 'discover switch' -- "$cur")) + local REPLY + _comp_count_args + if ((REPLY == 1)); then + _comp_compgen -- -W 'discover switch' fi fi } && - complete -F _avctrl avctrl + complete -F _comp_cmd_avctrl avctrl # ex: filetype=sh diff --git a/completions/badblocks b/completions/badblocks index 29c4e00..14e4e05 100644 --- a/completions/badblocks +++ b/completions/badblocks @@ -1,29 +1,30 @@ # badblocks(8) completion -*- shell-script -*- -_badblocks() +_comp_cmd_badblocks() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*[bcedpt]) return ;; -*[io]) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then # Filter out -w (dangerous) and -X (internal use) - COMPREPLY=($(compgen -X -[wX] -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen -R usage + ((${#COMPREPLY[@]})) && + _comp_compgen -- -X '-[wX]' -W '"${COMPREPLY[@]}"' return fi - cur=${cur:=/dev/} - _filedir + _comp_compgen -c "${cur:-/dev/}" filedir } && - complete -F _badblocks badblocks + complete -F _comp_cmd_badblocks badblocks # ex: filetype=sh diff --git a/completions/bind b/completions/bind index 2ee428b..12d2343 100644 --- a/completions/bind +++ b/completions/bind @@ -1,36 +1,36 @@ # bash bind completion -*- shell-script -*- -_bind() +_comp_cmd_bind() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*[lpPsSvVrxX]) return ;; -*m) - COMPREPLY=($(compgen -W "emacs emacs-standard emacs-meta - emacs-ctlx vi vi-move vi-command vi-insert" -- "$cur")) + _comp_compgen -- -W "emacs emacs-standard emacs-meta emacs-ctlx vi + vi-move vi-command vi-insert" return ;; -*f) - _filedir + _comp_compgen_filedir return ;; -*[qu]) - COMPREPLY=($(compgen -W '$("$1" -l)' -- "$cur")) + _comp_compgen_split -- "$("$1" -l)" return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage -c help -s "$1" return fi - COMPREPLY=($(compgen -A binding -- "$cur")) + _comp_compgen -- -A binding } && - complete -F _bind bind + complete -F _comp_cmd_bind bind # ex: filetype=sh diff --git a/completions/bk b/completions/bk index 4e4d140..e848c04 100644 --- a/completions/bk +++ b/completions/bk @@ -1,18 +1,18 @@ # BitKeeper completion -*- shell-script -*- # adapted from code by Bart Trojanowski <bart@jukie.net> -_bk() +_comp_cmd_bk() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local BKCMDS="$(bk help topics 2>/dev/null | - awk '/^ bk/ { print $2 }' | xargs printf '%s ')" + _comp_awk '/^ bk/ { print $2 }' | xargs printf '%s ')" - COMPREPLY=($(compgen -W "$BKCMDS" -- "$cur")) - _filedir + _comp_compgen -- -W "$BKCMDS" + _comp_compgen -a filedir } && - complete -F _bk bk + complete -F _comp_cmd_bk bk # ex: filetype=sh diff --git a/completions/brctl b/completions/brctl index 14569b6..0394fa5 100644 --- a/completions/brctl +++ b/completions/brctl @@ -1,40 +1,40 @@ # bash completion for brctl -*- shell-script -*- -_brctl() +_comp_cmd_brctl() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local command=${words[1]} case $cword in 1) - COMPREPLY=($(compgen -W "addbr delbr addif delif setageing + _comp_compgen -- -W "addbr delbr addif delif setageing setbridgeprio setfd sethello setmaxage setpathcost setportprio - show showmacs showstp stp" -- "$cur")) + show showmacs showstp stp" ;; 2) case $command in show) ;; *) - COMPREPLY=($(compgen -W "$($1 show | - awk 'NR>1 {print $1}')" -- "$cur")) + _comp_compgen_split -- "$("$1" show | + _comp_awk 'NR>1 {print $1}')" ;; esac ;; 3) case $command in addif | delif) - _configured_interfaces + _comp_compgen_configured_interfaces ;; stp) - COMPREPLY=($(compgen -W 'on off' -- "$cur")) + _comp_compgen -- -W 'on off' ;; esac ;; esac } && - complete -F _brctl -o default brctl + complete -F _comp_cmd_brctl -o default brctl # ex: filetype=sh diff --git a/completions/btdownloadheadless.py b/completions/btdownloadheadless.py index a470e53..f5b791e 100644 --- a/completions/btdownloadheadless.py +++ b/completions/btdownloadheadless.py @@ -1,32 +1,31 @@ # btdownloadheadless(1) completion -*- shell-script -*- -_btdownload() +_comp_cmd_btdownload() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --responsefile | --saveas) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--max_uploads --keepalive_interval + _comp_compgen -- -W '--max_uploads --keepalive_interval --download_slice_size --request_backlog --max_message_length --ip --minport --maxport --responsefile --url --saveas --timeout --timeout_check_interval --max_slice_length --max_rate_period --bind --upload_rate_fudge --display_interval --rerequest_interval --min_peers --http_timeout --max_initiate --max_allow_in --check_hashes --max_upload_rate --snub_time --spew - --rarest_first_cutoff --min_uploads --report_hash_failures' \ - -- "$cur")) + --rarest_first_cutoff --min_uploads --report_hash_failures' else - _filedir + _comp_compgen_filedir fi } && - complete -F _btdownload btdownloadheadless.py btdownloadcurses.py \ + complete -F _comp_cmd_btdownload btdownloadheadless.py btdownloadcurses.py \ btdownloadgui.py # ex: filetype=sh diff --git a/completions/bts b/completions/bts index d535d13..e4f8079 100644 --- a/completions/bts +++ b/completions/bts @@ -1,81 +1,85 @@ -# bts completion -*- shell-script -*- +# bts completion -*- shell-script -*- -# List bug numbers from bugs cache in ~/.devscripts_cache/bts -_cached_bugs() +# Generate bug numbers from bugs cache in ~/.devscripts_cache/bts +_comp_cmd_bts__compgen_cached_bugs() { - [[ -d $HOME/.devscripts_cache/bts ]] && - find $HOME/.devscripts_cache/bts -maxdepth 1 -name "${cur}[0-9]*.html" \ + [[ -d $HOME/.devscripts_cache/bts ]] || return 1 + local bugs=$( + find "$HOME/.devscripts_cache/bts" -maxdepth 1 \ + -name "${cur}[0-9]*.html" \ -printf "%f\n" | cut -d'.' -f1 + ) + _comp_compgen -RU bugs -- -W '$bugs' } -# List APT source packages prefixed with "src:" -_src_packages_with_prefix() +# Generate APT source packages prefixed with "src:" +_comp_cmd_bts__compgen_src_packages_with_prefix() { - ppn=${cur:4} # partial package name, after stripping "src:" - compgen -P "src:" -W '$(_xfunc apt-cache _apt_cache_sources "$ppn")' \ - -- "$ppn" + local _ppn=${cur:4} # partial package name, after stripping "src:" + local sources + _comp_compgen -v sources -c "$_ppn" -x apt-cache sources && + _comp_compgen -U sources -- -P "src:" -W '"${sources[@]}"' } -_bts() +_comp_cmd_bts() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in show | bugs) - COMPREPLY=($(compgen -W 'release-critical RC from: tag: - usertag:' -- "$cur") $(_cached_bugs) - $(_src_packages_with_prefix)) + _comp_compgen -- -W 'release-critical RC from: tag: usertag:' + _comp_compgen -ai bts cached_bugs + _comp_compgen -ai bts src_packages_with_prefix return ;; select) - COMPREPLY=($(compgen -W 'package: source: maintainer: submitter: + _comp_compgen -- -W 'package: source: maintainer: submitter: severity: status: tag: owner: correspondent: affects: bugs: - users: archive:' -- "$cur")) + users: archive:' return ;; status) - COMPREPLY=($(compgen -W 'file: fields: verbose' -- "$cur") - $(_cached_bugs)) + _comp_compgen -- -W 'file: fields: verbose' + _comp_compgen -ai bts cached_bugs return ;; block | unblock) - COMPREPLY=($(compgen -W 'by with' -- "$cur")) + _comp_compgen -- -W 'by with' return ;; severity) - COMPREPLY=($(compgen -W 'wishlist minor normal important serious - grave critical' -- "$cur")) + _comp_compgen -- -W 'wishlist minor normal important serious grave + critical' return ;; limit) - COMPREPLY=($(compgen -W 'submitter date subject msgid package - source tag severity owner affects archive' -- "$cur")) + _comp_compgen -- -W 'submitter date subject msgid package source + tag severity owner affects archive' return ;; clone | "done" | reopen | archive | unarchive | retitle | summary | submitter | found | notfound | fixed | notfixed | merge | forcemerge | unmerge | claim | unclaim | forwarded | notforwarded | owner | noowner | subscribe | unsubscribe | reportspam | spamreport | affects | usertag | usertags | reassign | tag | tags) - COMPREPLY=($(_cached_bugs)) + _comp_compgen -i bts cached_bugs return ;; package) - COMPREPLY=($(_xfunc apt-cache _apt_cache_packages)) + _comp_compgen -x apt-cache packages return ;; cache) - COMPREPLY=($(_xfunc apt-cache _apt_cache_packages) - $(_src_packages_with_prefix) - $(compgen -W 'from: release-critical RC' -- "$cur")) + _comp_compgen -x apt-cache packages + _comp_compgen -ai bts src_packages_with_prefix + _comp_compgen -a -- -W 'from: release-critical RC' return ;; cleancache) - COMPREPLY=($(_xfunc apt-cache _apt_cache_packages) - $(_src_packages_with_prefix) - $(compgen -W 'from: tag: usertag: ALL' -- "$cur")) + _comp_compgen -x apt-cache packages + _comp_compgen -ai bts src_packages_with_prefix + _comp_compgen -a -- -W 'from: tag: usertag: ALL' return ;; user) # non-predicible arguments - COMPREPLY=() return ;; :) @@ -83,30 +87,30 @@ _bts() # COMP_WORDS would be: "bts cleancache src : <partial_pkg_name>" pos=$((COMP_CWORD - 2)) if [[ $pos -gt 0 && ${COMP_WORDS[pos]} == "src" ]]; then - COMPREPLY=($(_xfunc apt-cache _apt_cache_src_packages)) + _comp_compgen -x apt-cache sources + return fi ;; esac - $split && return + [[ $was_split ]] && return - COMPREPLY=($(compgen -W '--offline --online --no-offline - --no-action --cache --no-cache --cache-mode --cache-delay --mbox - --mailreader --cc-addr --use-default-cc --no-use-default-cc - --sendmail --mutt --no-mutt --smtp-host --smtp-username - --smtp-helo --bts-server --force-refresh --no-force-refresh - --only-new --include-resolved --no-include-resolved --no-ack --ack - --interactive --force-interactive --no-interactive --quiet - --no-conf --noconf + _comp_compgen -- -W '--offline --online --no-offline --no-action --cache + --no-cache --cache-mode --cache-delay --mbox --mailreader --cc-addr + --use-default-cc --no-use-default-cc --sendmail --mutt --no-mutt + --smtp-host --smtp-username --smtp-helo --bts-server --force-refresh + --no-force-refresh --only-new --include-resolved --no-include-resolved + --no-ack --ack --interactive --force-interactive --no-interactive + --quiet --no-conf --noconf show bugs select status clone done reopen archive unarchive retitle summary submitter reassign found notfound fixed notfixed block unblock merge forcemerge unmerge tag tags affects user usertag usertags claim unclaim severity forwarded notforwarded package limit owner noowner subscribe unsubscribe reportspam spamreport cache cleancache version - help' -- "$cur")) + help' } && - complete -F _bts bts + complete -F _comp_cmd_bts bts # ex: filetype=sh diff --git a/completions/bzip2 b/completions/bzip2 index 40e50fe..0e5d98f 100644 --- a/completions/bzip2 +++ b/completions/bzip2 @@ -1,28 +1,32 @@ # bash completion for bzip2 -*- shell-script -*- -_bzip2() +_comp_cmd_bzip2() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[bpn]*)' + # shellcheck disable=SC2254 case $prev in - --help | -!(-*)[bhp]) + --help | -${noargopts}[bhp]) return ;; - -!(-*)n) - COMPREPLY=($(compgen -W "{1..$(_ncpus)}" -- "$cur")) + -${noargopts}n) + local REPLY + _comp_get_ncpus + _comp_compgen -- -W "{1..$REPLY}" return ;; esac if [[ $cur == -* ]]; then - local helpopts=$(_parse_help "$1") - COMPREPLY=($(compgen -W "${helpopts//#/} -2 -3 -4 -5 -6 -7 -8 -9" \ - -- "$cur")) + local helpopts + _comp_compgen -Rv helpopts help + _comp_compgen -- -W '${helpopts[*]//#/} -{2..9}' return fi - local IFS=$'\n' xspec="*.?(t)bz2" + local xspec="*.?(t)bz2" if [[ $prev == --* ]]; then [[ $prev == --@(decompress|list|test) ]] && xspec="!"$xspec @@ -32,11 +36,11 @@ _bzip2() [[ $prev == -*z* ]] && xspec= fi - _tilde "$cur" || return + _comp_compgen_tilde && return compopt -o filenames - COMPREPLY=($(compgen -f -X "$xspec" -- "$cur") $(compgen -d -- "$cur")) + _comp_compgen -- -f -X "$xspec" -o plusdirs } && - complete -F _bzip2 bzip2 pbzip2 lbzip2 + complete -F _comp_cmd_bzip2 bzip2 pbzip2 lbzip2 # ex: filetype=sh diff --git a/completions/cancel b/completions/cancel index 3e0c1d5..38571c5 100644 --- a/completions/cancel +++ b/completions/cancel @@ -1,27 +1,26 @@ # cancel(1) completion -*- shell-script -*- -_cancel() +_comp_cmd_cancel() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -h) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -U) return ;; -u) - COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen -- -u return ;; esac - COMPREPLY=($(compgen -W \ - "$(lpstat 2>/dev/null | cut -d' ' -f1)" -- "$cur")) + _comp_compgen_split -- "$(lpstat 2>/dev/null | cut -d' ' -f1)" } && - complete -F _cancel cancel + complete -F _comp_cmd_cancel cancel # ex: filetype=sh diff --git a/completions/cardctl b/completions/cardctl index bb3a0db..222f7b1 100644 --- a/completions/cardctl +++ b/completions/cardctl @@ -1,15 +1,15 @@ # Linux cardctl(8) completion -*- shell-script -*- -_cardctl() +_comp_cmd_cardctl() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if ((cword == 1)); then - COMPREPLY=($(compgen -W 'status config ident suspend resume reset - eject insert scheme' -- "$cur")) + _comp_compgen -- -W 'status config ident suspend resume reset eject + insert scheme' fi } && - complete -F _cardctl cardctl pccardctl + complete -F _comp_cmd_cardctl cardctl pccardctl # ex: filetype=sh diff --git a/completions/carton b/completions/carton index 5d700c8..7f99c90 100644 --- a/completions/carton +++ b/completions/carton @@ -1,81 +1,95 @@ # carton(3pm) completion -*- shell-script -*- -_carton_commands() +_comp_cmd_carton__commands() { - local cmds=$("${1:-carton}" usage 2>&1 | + local cmds=$("$1" usage 2>&1 | command sed -ne '/.*command.* is one of/{n;p;q;}') - COMPREPLY+=($(IFS="$IFS," compgen -W "$cmds" -- "$cur")) + _comp_compgen -aF $' \t\n,' -- -W "$cmds" } -_carton_command_help() +_comp_cmd_carton__command_help() { - local help=$(PERLDOC_PAGER=cat PERLDOC=-otext "${1:-carton}" -h $2 2>&1) - COMPREPLY+=($(compgen -W '$help' -- "$cur")) + local help=$(PERLDOC_PAGER=cat PERLDOC=-otext "$1" -h "$2" 2>&1) + _comp_compgen -a -- -W '$help' } -_carton() +_comp_cmd_carton() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return - local i command + local i command="" has_command="" for ((i = 1; i < cword; i++)); do case ${words[i]} in -*) ;; *) command=${words[i]} + has_command=set break ;; esac done - if [[ ! -v command ]]; then - _carton_commands "$1" + if [[ ! $has_command ]]; then + _comp_cmd_carton__commands "$1" return fi case $prev in - --version | -v) - return - ;; - --help | -h) - [[ -n $command ]] || _carton_commands "$1" + --version | --help | -[vh]) return ;; --cpanfile) if [[ $command == install ]]; then - _filedir + _comp_compgen_filedir return fi ;; --path) if [[ $command == install ]]; then - _filedir -d + _comp_compgen_filedir -d return fi ;; --without) if [[ $command == install ]]; then local phases="configure build test runtime develop" - COMPREPLY+=($(compgen -W '$phases' -- "$cur")) + _comp_compgen -a -- -W '$phases' return fi ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then [[ $command == @(help|usage) ]] || COMPREPLY=(--help) - _carton_command_help "$1" $command + _comp_cmd_carton__command_help "$1" "$command" fi case $command in + exec) + # skip all the options --, -v, etc. and identify the command name + # position. + for ((i++; i < cword; i++)); do + case ${words[i]} in + --) + ((i++)) + break + ;; + -*) ;; + *) break ;; + esac + done + + _comp_command_offset "$i" + return + ;; show | update) : # TODO modules completion ;; esac } && - complete -F _carton carton + complete -F _comp_cmd_carton carton # ex: filetype=sh diff --git a/completions/ccache b/completions/ccache index 80c39de..fb3f3e4 100644 --- a/completions/ccache +++ b/completions/ccache @@ -1,38 +1,40 @@ # ccache(1) completion -*- shell-script -*- -_ccache() +_comp_cmd_ccache() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return local i - for ((i = 1; i <= COMP_CWORD; i++)); do - if [[ ${COMP_WORDS[i]} != -* ]]; then - _command_offset $i + for ((i = 1; i <= cword; i++)); do + if [[ ${words[i]} != -* ]]; then + _comp_command_offset $i return fi - [[ ${COMP_WORDS[i]} == -*[oFM] ]] && ((i++)) + [[ ${words[i]} == -*[oFM] ]] && ((i++)) done + local noargopts='!(-*|*[FMo]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | --max-files | --max-size | -!(-*)[hVFM]) + --help | --version | --max-files | --max-size | -${noargopts}[hVFM]) return ;; - --set-config | -!(-*)o) + --set-config | -${noargopts}o) if [[ $cur != *=* ]]; then - COMPREPLY=($(compgen -S = -W "$($1 -p 2>/dev/null | - awk '$3 = "=" { print $2 }')" -- "$cur")) + _comp_compgen_split -S = -- "$("$1" -p 2>/dev/null | + _comp_awk '$3 = "=" { print $2 }')" [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi return ;; esac - $split && return + [[ $was_split ]] && return - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace } && - complete -F _ccache ccache + complete -F _comp_cmd_ccache ccache # ex: filetype=sh diff --git a/completions/ccze b/completions/ccze index 35f4c3f..31602b0 100644 --- a/completions/ccze +++ b/completions/ccze @@ -1,44 +1,45 @@ # ccze(1) completion -*- shell-script -*- -_ccze() +_comp_cmd_ccze() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[acFmop]*)' + # shellcheck disable=SC2254 case $prev in -'?' | --help | --usage | -V | --version) return ;; - --argument | --color | -!(-*)[ac]) + --argument | --color | -${noargopts}[ac]) # TODO? return ;; - --rcfile | -!(-*)F) - _filedir + --rcfile | -${noargopts}F) + _comp_compgen_filedir return ;; - --mode | -!(-*)m) - COMPREPLY=($(compgen -W "curses ansi html" -- "$cur")) + --mode | -${noargopts}m) + _comp_compgen -- -W "curses ansi html" return ;; - --option | -!(-*)o) + --option | -${noargopts}o) local -a opts=(scroll wordcolor lookups transparent cssfile) - COMPREPLY=($(compgen -W '${opts[@]} ${opts[@]/#/no}' -- "$cur")) + _comp_compgen -- -W '"${opts[@]}" "${opts[@]/#/no}"' return ;; - --plugin | -!(-*)p) - COMPREPLY=($(compgen -W '$("$1" --list-plugins | command \ - sed -ne "s/^\([a-z0-9]\{1,\}\)[[:space:]]\{1,\}|.*/\1/p")' \ - -- "$cur")) + --plugin | -${noargopts}p) + _comp_compgen_split -- "$("$1" --list-plugins | command \ + sed -ne 's/^\([a-z0-9]\{1,\}\)[[:space:]]\{1,\}|.*/\1/p')" return ;; esac - $split && return + [[ $was_split ]] && return - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace } && - complete -F _ccze ccze + complete -F _comp_cmd_ccze ccze # ex: filetype=sh diff --git a/completions/cd b/completions/cd new file mode 100644 index 0000000..67dc3de --- /dev/null +++ b/completions/cd @@ -0,0 +1,59 @@ +# cd(1) completion -*- shell-script -*- + +# This meta-cd function observes the CDPATH variable, so that `cd` +# additionally completes on directories under those specified in CDPATH. +_comp_cmd_cd() +{ + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + + if [[ $cur == -* ]]; then + _comp_compgen_help -c help "$1" + compopt +o nospace + return + fi + + local i j k + + compopt -o filenames + + # Use standard dir completion if no CDPATH or parameter starts with /, + # ./ or ../ + if [[ ! ${CDPATH-} || $cur == ?(.)?(.)/* ]]; then + _comp_compgen_filedir -d + return + fi + + local mark_dirs="" mark_symdirs="" + _comp_readline_variable_on mark-directories && mark_dirs=set + _comp_readline_variable_on mark-symlinked-directories && mark_symdirs=set + + # we have a CDPATH, so loop on its contents + local paths dirs + _comp_split -F : paths "$CDPATH" + for i in "${paths[@]}"; do + # create an array of matched subdirs + k=${#COMPREPLY[@]} + _comp_compgen -v dirs -c "$i/$cur" -- -d + for j in "${dirs[@]}"; do + if [[ ($mark_symdirs && -L $j || $mark_dirs && ! -L $j) && ! -d ${j#"$i/"} ]]; then + j+="/" + fi + COMPREPLY[k++]=${j#"$i/"} + done + done + + _comp_compgen -a filedir -d + + if ((${#COMPREPLY[@]} == 1)); then + i=${COMPREPLY[0]} + if [[ $i == "$cur" && $i != "*/" ]]; then + COMPREPLY[0]="${i}/" + fi + fi +} +if shopt -q cdable_vars; then + complete -v -F _comp_cmd_cd -o nospace cd pushd +else + complete -F _comp_cmd_cd -o nospace cd pushd +fi diff --git a/completions/cfagent b/completions/cfagent index e7ba04d..113e417 100644 --- a/completions/cfagent +++ b/completions/cfagent @@ -1,21 +1,21 @@ # cfagent completion -*- shell-script -*- -_cfagent() +_comp_cmd_cfagent() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -f | --file) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help fi } && - complete -F _cfagent cfagent + complete -F _comp_cmd_cfagent cfagent # ex: filetype=sh diff --git a/completions/cfrun b/completions/cfrun index 72b6138..445bccd 100644 --- a/completions/cfrun +++ b/completions/cfrun @@ -1,9 +1,9 @@ # cfrun completion -*- shell-script -*- -_cfrun() +_comp_cmd_cfrun() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local i section=1 for ((i = 1; i < cword; i++)); do @@ -16,13 +16,13 @@ _cfrun() 1) case $prev in -f) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-f -h -d -S -T -v' -- "$cur")) + _comp_compgen -- -W '-f -h -d -S -T -v' else local hostfile=${CFINPUTS:-/var/lib/cfengine/inputs}/cfrun.hosts for ((i = 1; i < cword; i++)); do @@ -33,15 +33,15 @@ _cfrun() done [[ ! -f $hostfile ]] && return - COMPREPLY=($(compgen -W "$(command grep -v \ - -E '(=|^$|^#)' $hostfile)" -- "$cur")) + _comp_compgen_split -- "$(command grep -v -E '(=|^$|^#)' \ + "$hostfile")" fi ;; 2) - COMPREPLY=($(compgen -W '$(_parse_help cfagent)' -- "$cur")) + _comp_compgen_help -c cfagent --help ;; esac } && - complete -F _cfrun cfrun + complete -F _comp_cmd_cfrun cfrun # ex: filetype=sh diff --git a/completions/chage b/completions/chage index fcf87cd..f00433d 100644 --- a/completions/chage +++ b/completions/chage @@ -1,30 +1,32 @@ # chage(1) completion -*- shell-script -*- -_chage() +_comp_cmd_chage() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[dEImMWR]*)' + # shellcheck disable=SC2254 case $prev in --lastday | --expiredate | --help | --inactive | --mindays | --maxdays | \ - --warndays | -!(-*)[dEhImMW]) + --warndays | -${noargopts}[dEhImMW]) return ;; - --root | -!(-*)R) - _filedir -d + --root | -${noargopts}R) + _comp_compgen_filedir -d return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen -- -u } && - complete -F _chage chage + complete -F _comp_cmd_chage chage # ex: filetype=sh diff --git a/completions/change_pw b/completions/change_pw index 04837ea..819c082 100644 --- a/completions/change_pw +++ b/completions/change_pw @@ -1,25 +1,28 @@ # mailman change_pw completion -*- shell-script -*- -_change_pw() +_comp_cmd_change_pw() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -l | --listname) - _xfunc list_lists _mailman_lists + # Prefer `list_lists` in the same dir as command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_compgen -x list_lists mailman_lists return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--all --domain --listname --password --quiet - --help' -- "$cur")) + _comp_compgen -- -W '--all --domain --listname --password --quiet + --help' fi } && - complete -F _change_pw change_pw + complete -F _comp_cmd_change_pw change_pw # ex: filetype=sh diff --git a/completions/check_db b/completions/check_db index aaec99f..6480a11 100644 --- a/completions/check_db +++ b/completions/check_db @@ -1,17 +1,20 @@ # mailman check_db completion -*- shell-script -*- -_check_db() +_comp_cmd_check_db() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--all --verbose --help' -- "$cur")) + _comp_compgen -- -W '--all --verbose --help' else - _xfunc list_lists _mailman_lists + # Prefer `list_lists` in the same dir as command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_compgen -x list_lists mailman_lists fi } && - complete -F _check_db check_db + complete -F _comp_cmd_check_db check_db # ex: filetype=sh diff --git a/completions/check_perms b/completions/check_perms index 8ff276e..0ff1ffd 100644 --- a/completions/check_perms +++ b/completions/check_perms @@ -1,15 +1,15 @@ # mailman check_perms completion -*- shell-script -*- -_check_perms() +_comp_cmd_check_perms() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-f -v -h' -- "$cur")) + _comp_compgen -- -W '-f -v -h' fi } && - complete -F _check_perms check_perms + complete -F _comp_cmd_check_perms check_perms # ex: filetype=sh diff --git a/completions/checksec b/completions/checksec index fc2fef7..95e2dce 100644 --- a/completions/checksec +++ b/completions/checksec @@ -1,37 +1,48 @@ # bash completion for checksec -*- shell-script -*- -_checksec() +_comp_cmd_checksec() { - local cur prev words cword - _init_completion || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in --version | --help) return ;; --file | --fortify-file) - _filedir + _comp_compgen_filedir return ;; --dir) - _filedir -d + _comp_compgen_filedir -d return ;; --proc) - _pnames + _comp_compgen_pnames return ;; --proc-libs | --fortify-proc) - _pids + _comp_compgen_pids return ;; + --format) + _comp_compgen_split -- "$("$1" --help 2>/dev/null | + command sed -ne 's/[{,}]/ /g;s/^[[:space:]]*--format=//p')" + ;; + --output) + _comp_compgen_split -- "$("$1" --help 2>/dev/null | + command sed -ne 's/[{,}]/ /g;s/^[[:space:]]*--output=//p')" + ;; esac + [[ $was_split ]] && return + if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi } && - complete -F _checksec checksec + complete -F _comp_cmd_checksec checksec # ex: filetype=sh diff --git a/completions/chgrp b/completions/chgrp index 4793a45..1e19750 100644 --- a/completions/chgrp +++ b/completions/chgrp @@ -1,39 +1,39 @@ # chgrp(1) completion -*- shell-script -*- -_chgrp() +_comp_cmd_chgrp() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return cur=${cur//\\\\/} if [[ $prev == --reference ]]; then - _filedir + _comp_compgen_filedir return fi - $split && return + [[ $was_split ]] && return # options completion if [[ $cur == -* ]]; then - local w opts + local w opts="" for w in "${words[@]}"; do [[ $w == -@(R|-recursive) ]] && opts="-H -L -P" && break done - COMPREPLY=($(compgen -W '-c -h -f -R -v --changes --dereference + _comp_compgen -- -W '-c -h -f -R -v --changes --dereference --no-dereference --silent --quiet --reference --recursive --verbose - --help --version $opts' -- "$cur")) + --help --version $opts' return fi # first parameter on line or first since an option? if [[ $cword -eq 1 && $cur != -* || $prev == -* ]]; then - _allowed_groups "$cur" + _comp_compgen_allowed_groups else - _filedir + _comp_compgen_filedir fi } && - complete -F _chgrp chgrp + complete -F _comp_cmd_chgrp chgrp # ex: filetype=sh diff --git a/completions/chkconfig b/completions/chkconfig index 8ff6637..32c3392 100644 --- a/completions/chkconfig +++ b/completions/chkconfig @@ -1,37 +1,35 @@ # chkconfig(8) completion -*- shell-script -*- -_chkconfig() +_comp_cmd_chkconfig() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in --level=[1-6] | [1-6] | --list | --add | --del | --override) - _services - _xinetd_services + _comp_compgen_services + _comp_compgen -a xinetd_services return ;; --level) - COMPREPLY=($(compgen -W '{1..6}' -- "$cur")) + _comp_compgen -- -W '{1..6}' return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--list --add --del --override --level' \ - -- "$cur")) + _comp_compgen -- -W '--list --add --del --override --level' else if ((cword == 2 || cword == 4)); then - COMPREPLY=($(compgen -W 'on off reset resetpriorities' \ - -- "$cur")) + _comp_compgen -- -W 'on off reset resetpriorities' else - _services - _xinetd_services + _comp_compgen_services + _comp_compgen -a xinetd_services fi fi } && - complete -F _chkconfig chkconfig + complete -F _comp_cmd_chkconfig chkconfig # ex: filetype=sh diff --git a/completions/chmod b/completions/chmod index d3fc349..3dbc16f 100644 --- a/completions/chmod +++ b/completions/chmod @@ -1,41 +1,40 @@ # chmod(1) completion -*- shell-script -*- -_chmod() +_comp_cmd_chmod() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in --help | --version) return ;; --reference) - _filedir + _comp_compgen_filedir return ;; esac - $split && return + [[ $was_split ]] && return # Adapted from coreutils 8.28 chmod man page local modearg="-@(@(+([rwxXst])|[ugo])|+([0-7]))" # shellcheck disable=SC2053 if [[ $cur == -* && $cur != $modearg ]]; then - local opts=$(_parse_help "$1") - COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - local args - _count_args "" "" "$modearg" + local REPLY + _comp_count_args -i "$modearg" - case $args in + case $REPLY in 1) ;; # mode - *) _filedir ;; + *) _comp_compgen_filedir ;; esac } && - complete -F _chmod chmod + complete -F _comp_cmd_chmod chmod # ex: filetype=sh diff --git a/completions/chown b/completions/chown index 1d746b7..25d0d67 100644 --- a/completions/chown +++ b/completions/chown @@ -1,46 +1,46 @@ # chown(1) completion -*- shell-script -*- -_chown() +_comp_cmd_chown() { - local cur prev words cword split + local cur prev words cword was_split comp_args # Don't treat user:group as separate words. - _init_completion -s -n : || return + _comp_initialize -s -n : -- "$@" || return case "$prev" in --from) - _usergroup + _comp_compgen_usergroups return ;; --reference) - _filedir + _comp_compgen_filedir return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then # Complete -options - local w opts + local w opts="" for w in "${words[@]}"; do [[ $w == -@(R|-recursive) ]] && opts="-H -L -P" && break done - COMPREPLY=($(compgen -W '-c -h -f -R -v --changes --dereference + _comp_compgen -- -W '-c -h -f -R -v --changes --dereference --no-dereference --from --silent --quiet --reference --recursive - --verbose --help --version $opts' -- "$cur")) + --verbose --help --version $opts' else - local args + local REPLY - # The first argument is an usergroup; the rest are filedir. - _count_args : + # The first argument is a usergroup; the rest are filedir. + _comp_count_args - if ((args == 1)); then - _usergroup -u + if ((REPLY == 1)); then + _comp_compgen_usergroups -u else - _filedir + _comp_compgen_filedir fi fi } && - complete -F _chown chown + complete -F _comp_cmd_chown chown # ex: filetype=sh diff --git a/completions/chpasswd b/completions/chpasswd index 3abea99..996bff0 100644 --- a/completions/chpasswd +++ b/completions/chpasswd @@ -1,30 +1,31 @@ # chpasswd(8) completion -*- shell-script -*- -_chpasswd() +_comp_cmd_chpasswd() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[csR]*)' + # shellcheck disable=SC2254 case $prev in - --crypt | -!(-*)c) - COMPREPLY=($(compgen -W 'DES MD5 NONE SHA256 SHA512' \ - -- "$cur")) + --crypt | -${noargopts}c) + _comp_compgen -- -W 'DES MD5 NONE SHA256 SHA512' return ;; - --sha-rounds | -!(-*)s) + --sha-rounds | -${noargopts}s) return ;; - --root | -!(-*)R) - _filedir -d + --root | -${noargopts}R) + _comp_compgen_filedir -d return ;; esac - $split && return + [[ $was_split ]] && return - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace } && - complete -F _chpasswd chpasswd + complete -F _comp_cmd_chpasswd chpasswd # ex: filetype=sh diff --git a/completions/chromium-browser b/completions/chromium-browser index 9ee9896..2126ac6 100644 --- a/completions/chromium-browser +++ b/completions/chromium-browser @@ -1,50 +1,50 @@ # chromium-browser completion -*- shell-script -*- -_chromium_browser() +_comp_cmd_chromium_browser() { - 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 case $prev in --help | --app | --proxy-pac-url | -h) return ;; --user-data-dir) - _filedir -d + _comp_compgen_filedir -d return ;; --proxy-server) case $cur in *://*) local prefix="${cur%%://*}://" - _known_hosts_real -- "${cur#*://}" - COMPREPLY=("${COMPREPLY[@]/#/$prefix}") - __ltrim_colon_completions "$cur" + _comp_compgen_known_hosts -- "${cur#*://}" && + _comp_compgen -Rv COMPREPLY -- -P "$prefix" -W '"${COMPREPLY[@]}"' + _comp_ltrim_colon_completions "$cur" ;; *) compopt -o nospace - COMPREPLY=($(compgen -S :// -W 'http socks socks4 socks5' -- "$cur")) + _comp_compgen -- -S :// -W 'http socks socks4 socks5' ;; esac return ;; --password-store) - COMPREPLY=($(compgen -W 'basic gnome kwallet' -- "$cur")) + _comp_compgen -- -W 'basic gnome kwallet' return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir "@(?([mxs])htm?(l)|pdf|txt)" + _comp_compgen_filedir "@(?([mxs])htm?(l)|pdf|txt)" } && - complete -F _chromium_browser chromium-browser google-chrome \ + complete -F _comp_cmd_chromium_browser chromium-browser google-chrome \ google-chrome-stable chromium chrome # ex: filetype=sh diff --git a/completions/chronyc b/completions/chronyc index e6bb8e9..15a784b 100644 --- a/completions/chronyc +++ b/completions/chronyc @@ -1,34 +1,36 @@ # chronyc(1) completion -*- shell-script -*- -_chronyc_command_args() +_comp_cmd_chronyc__command_args() { local -a args - args=($(compgen -W "$($1 help 2>/dev/null | - awk '/^'$prev'\s[^ []/ { gsub("\\|", " ", $2); print $2 }')")) + _comp_split args "$("$1" help 2>/dev/null | + _comp_awk '/^'"$prev"'[ \t][^ []/ { gsub("\\|", " ", $2); print $2 }')" case $args in - \<address\>) _known_hosts_real -- "$cur" ;; + \<address\>) _comp_compgen_known_hosts -- "$cur" ;; \<*) ;; - *) COMPREPLY+=($(compgen -W '${args[@]}' -- "$cur")) ;; + *) ((${#args[@]})) && + _comp_compgen -a -- -W '"${args[@]}"' ;; esac } -_chronyc() +_comp_cmd_chronyc() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --help | -*p) return ;; -*h) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1") -6' -- "$cur")) + _comp_compgen_usage + _comp_compgen -a -- -W '-6' return fi @@ -40,22 +42,21 @@ _chronyc() case $args in 0) - COMPREPLY=($(compgen -W "$($1 help 2>/dev/null | - awk '!/(^ |: *$)/ { sub("\\|", " ", $1); print $1 }')" \ - -- "$cur")) + _comp_compgen_split -- "$("$1" help 2>/dev/null | + _comp_awk '!/(^ |: *$)/ { sub("\\|", " ", $1); print $1 }')" ;; 1) - _chronyc_command_args "$1" + _comp_cmd_chronyc__command_args "$1" if [[ ! ${COMPREPLY-} && $prev == sources?(tats) ]]; then - # [-v] not handled by _chronyc_command_args yet - COMPREPLY=($(compgen -W '-v' -- "$cur")) + # [-v] not handled by _comp_cmd_chronyc__command_args yet + _comp_compgen -- -W '-v' fi ;; 2) - [[ $prev == @(peer|server) ]] && _known_hosts_real -- "$cur" + [[ $prev == @(peer|server) ]] && _comp_compgen_known_hosts -- "$cur" ;; esac } && - complete -F _chronyc chronyc + complete -F _comp_cmd_chronyc chronyc # ex: filetype=sh diff --git a/completions/chrpath b/completions/chrpath index 2883967..c248a05 100644 --- a/completions/chrpath +++ b/completions/chrpath @@ -1,27 +1,29 @@ # chrpath(1) completion -*- shell-script -*- -_chrpath() +_comp_cmd_chrpath() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[r]*)' + # shellcheck disable=SC2254 case $prev in - --version | --help | -!(-*)[vh]) + --version | --help | -${noargopts}[vh]) return ;; - --replace | -!(-*)r) - _filedir -d + --replace | -${noargopts}r) + _comp_compgen_filedir -d return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - _filedir + _comp_compgen_filedir } && - complete -F _chrpath chrpath + complete -F _comp_cmd_chrpath chrpath # ex: filetype=sh diff --git a/completions/cksfv b/completions/cksfv index da404dd..406c8de 100644 --- a/completions/cksfv +++ b/completions/cksfv @@ -1,29 +1,29 @@ # cksfv completion by Chris <xris@forevermore.net> -*- shell-script -*- -_cksfv() +_comp_cmd_cksfv() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if ((cword == 1)); then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi case "$prev" in -*C | -*g) - _filedir -d + _comp_compgen_filedir -d return ;; -*f) - _filedir 'sfv' + _comp_compgen_filedir 'sfv' return ;; esac - _filedir + _comp_compgen_filedir } && - complete -F _cksfv cksfv + complete -F _comp_cmd_cksfv cksfv # ex: filetype=sh diff --git a/completions/cleanarch b/completions/cleanarch index 0f7d5f5..c34d038 100644 --- a/completions/cleanarch +++ b/completions/cleanarch @@ -1,16 +1,15 @@ # mailman cleanarch completion -*- shell-script -*- -_cleanarch() +_comp_cmd_cleanarch() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--status --dry-run --quiet --help' \ - -- "$cur")) + _comp_compgen -- -W '--status --dry-run --quiet --help' fi } && - complete -F _cleanarch cleanarch + complete -F _comp_cmd_cleanarch cleanarch # ex: filetype=sh diff --git a/completions/clisp b/completions/clisp index c4259a0..73bf8b2 100644 --- a/completions/clisp +++ b/completions/clisp @@ -2,21 +2,21 @@ # bash brogrammable completion for various Common Lisp implementations by # Nikodemus Siivola <nikodemus@random-state.net> -_clisp() +_comp_cmd_clisp() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return # completing an option (may or may not be separated by a space) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-h --help --version --license -B -K -M -m -L - -N -E -q --quiet --silent -w -I -ansi -traditional -p -C -norc -i - -c -l -o -x ' -- "$cur")) + _comp_compgen -- -W '-h --help --version --license -B -K -M -m -L -N -E + -q --quiet --silent -w -I -ansi -traditional -p -C -norc -i -c -l + -o -x ' else - _filedir + _comp_compgen_filedir fi } && - complete -F _clisp -o default clisp + complete -F _comp_cmd_clisp -o default clisp # ex: filetype=sh diff --git a/completions/clone_member b/completions/clone_member index a3ca2b3..01f87e6 100644 --- a/completions/clone_member +++ b/completions/clone_member @@ -1,25 +1,28 @@ # mailman clone_member completion -*- shell-script -*- -_clone_member() +_comp_cmd_clone_member() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -l | --listname) - _xfunc list_lists _mailman_lists + # Prefer `list_lists` in the same dir as command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_compgen -x list_lists mailman_lists return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--listname --remove --admin --quiet - --nomodify --help' -- "$cur")) + _comp_compgen -- -W '--listname --remove --admin --quiet --nomodify + --help' fi } && - complete -F _clone_member clone_member + complete -F _comp_cmd_clone_member clone_member # ex: filetype=sh diff --git a/completions/complete b/completions/complete index a57f366..74ae3f9 100644 --- a/completions/complete +++ b/completions/complete @@ -1,49 +1,49 @@ # bash complete completion -*- shell-script -*- -_complete() +_comp_cmd_complete() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*o) - COMPREPLY=($(compgen -W 'bashdefault default dirnames filenames - nospace plusdirs' -- "$cur")) + _comp_compgen -- -W 'bashdefault default dirnames filenames nospace + plusdirs' return ;; -*A) - COMPREPLY=($(compgen -W 'alias arrayvar binding builtin command + _comp_compgen -- -W 'alias arrayvar binding builtin command directory disabled enabled export file function group helptopic hostname job keyword running service setopt shopt signal - stopped user variable' -- "$cur")) + stopped user variable' return ;; -*C) - COMPREPLY=($(compgen -A command -- "$cur")) + _comp_compgen -- -A command return ;; -*F) - COMPREPLY=($(compgen -A function -- "$cur")) + _comp_compgen -- -A function return ;; -*p | -*r) - COMPREPLY=($(complete -p | command sed -e 's|.* ||')) - COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur")) + _comp_compgen_split -l -- "$(complete -p | command sed -e 's|.* ||')" return ;; esac if [[ $cur == -* ]]; then - # relevant options completion - local opts="-a -b -c -d -e -f -g -j -k -o -s -u -v -A -G -W -P -S -X" - [[ $1 != compgen ]] && opts+=" -F -C" - COMPREPLY=($(compgen -W "$opts" -- "$cur")) + local -a opts + _comp_compgen -v opts usage -c help -s "$1" + # -F, -C do not work the expected way with compgen + [[ $1 != *compgen ]] || opts=("${opts[@]//-[FC]/}") + _comp_compgen -- -W '"${opts[@]}"' -X '' else - COMPREPLY=($(compgen -A command -- "$cur")) + _comp_compgen -- -A command fi } && - complete -F _complete compgen complete + complete -F _comp_cmd_complete compgen complete # ex: filetype=sh diff --git a/completions/config_list b/completions/config_list index 1807e33..d75ef2e 100644 --- a/completions/config_list +++ b/completions/config_list @@ -1,27 +1,30 @@ # mailman config_list completion -*- shell-script -*- -_config_list() +_comp_cmd_config_list() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -i | -o | --inputfile | --outputfile) - _filedir + _comp_compgen_filedir return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--inputfile --outputfile --checkonly - --verbose --help' -- "$cur")) + _comp_compgen -- -W '--inputfile --outputfile --checkonly + --verbose --help' else - _xfunc list_lists _mailman_lists + # Prefer `list_lists` in the same dir as command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_xfunc list_lists mailman_lists fi } && - complete -F _config_list config_list + complete -F _comp_cmd_config_list config_list # ex: filetype=sh diff --git a/completions/configure b/completions/configure index 3f59a01..a61a05d 100644 --- a/completions/configure +++ b/completions/configure @@ -1,9 +1,12 @@ # bash completion for configure -*- shell-script -*- -_configure() +_comp_deprecate_var 2.12 \ + COMP_CONFIGURE_HINTS BASH_COMPLETION_CMD_CONFIGURE_HINTS + +_comp_cmd_configure() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -h | --help | -V | --version | --program-prefix | --program-suffix | \ @@ -11,32 +14,32 @@ _configure() return ;; --*file) - _filedir + _comp_compgen_filedir return ;; --*prefix | --*dir) - _filedir -d + _comp_compgen_filedir -d return ;; esac - $split && return - - # if $COMP_CONFIGURE_HINTS is not null, then completions of the form - # --option=SETTING will include 'SETTING' as a contextual hint - [[ $cur != -* ]] && return + if [[ $was_split || $cur != -* ]]; then + _comp_compgen_filedir + return + fi - if [[ ${COMP_CONFIGURE_HINTS-} ]]; then - COMPREPLY=($(compgen -W "$($1 --help 2>&1 | - awk '/^ --[A-Za-z]/ { print $1; \ - if ($2 ~ /--[A-Za-z]/) print $2 }' | command sed -e 's/[[,].*//g')" \ - -- "$cur")) + # if $BASH_COMPLETION_CMD_CONFIGURE_HINTS is not null, then completions of + # the form --option=SETTING will include 'SETTING' as a contextual hint + if [[ ${BASH_COMPLETION_CMD_CONFIGURE_HINTS-} ]]; then + _comp_compgen_split -- "$("$1" --help 2>&1 | + _comp_awk '/^ --[A-Za-z]/ { print $1; \ + if ($2 ~ /--[A-Za-z]/) print $2 }' | command sed -e 's/[[,].*//g')" [[ ${COMPREPLY-} == *=* ]] && compopt -o nospace else - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _configure configure + complete -F _comp_cmd_configure configure # ex: filetype=sh diff --git a/completions/convert b/completions/convert index ef7baea..b01633b 100644 --- a/completions/convert +++ b/completions/convert @@ -1,125 +1,118 @@ # bash completion for ImageMagick -*- shell-script -*- -_ImageMagick() +_comp_cmd_convert__common_options() { case $prev in -channel) - COMPREPLY=($(compgen -W 'Red Green Blue Opacity Matte Cyan - Magenta Yellow Black' -- "$cur")) + _comp_compgen -- -W 'Red Green Blue Opacity Matte Cyan Magenta + Yellow Black' return ;; -colormap) - COMPREPLY=($(compgen -W 'shared private' -- "$cur")) + _comp_compgen -- -W 'shared private' return ;; -colorspace) - COMPREPLY=($(compgen -W 'GRAY OHTA RGB Transparent XYZ YCbCr YIQ - YPbPr YUV CMYK' -- "$cur")) + _comp_compgen -- -W 'GRAY OHTA RGB Transparent XYZ YCbCr YIQ YPbPr + YUV CMYK' return ;; -compose) - COMPREPLY=($(compgen -W 'Over In Out Atop Xor Plus Minus Add - Subtract Difference Multiply Bumpmap Copy CopyRed CopyGreen - CopyBlue CopyOpacity' -- "$cur")) + _comp_compgen -- -W 'Over In Out Atop Xor Plus Minus Add Subtract + Difference Multiply Bumpmap Copy CopyRed CopyGreen CopyBlue + CopyOpacity' return ;; -compress) - COMPREPLY=($(compgen -W 'None BZip Fax Group4 JPEG Lossless LZW - RLE Zip' -- "$cur")) + _comp_compgen -- -W 'None BZip Fax Group4 JPEG Lossless LZW RLE + Zip' return ;; -dispose) - COMPREPLY=($(compgen -W 'Undefined None Background Previous' \ - -- "$cur")) + _comp_compgen -- -W 'Undefined None Background Previous' return ;; -encoding) - COMPREPLY=($(compgen -W 'AdobeCustom AdobeExpert AdobeStandard + _comp_compgen -- -W 'AdobeCustom AdobeExpert AdobeStandard AppleRoman BIG5 GB2312 Latin2 None SJIScode Symbol Unicode - Wansung' -- "$cur")) + Wansung' return ;; -endian) - COMPREPLY=($(compgen -W 'MSB LSB' -- "$cur")) + _comp_compgen -- -W 'MSB LSB' return ;; -filter) - COMPREPLY=($(compgen -W 'Point Box Triangle Hermite Hanning - Hamming Blackman Gaussian Quadratic Cubic Catrom Mitchell - Lanczos Bessel Sinc' -- "$cur")) + _comp_compgen -- -W 'Point Box Triangle Hermite Hanning Hamming + Blackman Gaussian Quadratic Cubic Catrom Mitchell Lanczos + Bessel Sinc' return ;; -format) - COMPREPLY=($(compgen -W "$(convert -list format | awk \ - '/ [r-][w-][+-] / { sub("[*]$","",$1); print tolower($1) }')" \ - -- "$cur")) + _comp_compgen_split -- "$(convert -list format | _comp_awk \ + '/ [r-][w-][+-] / { sub("[*]$","",$1); print tolower($1) }')" return ;; -gravity) - COMPREPLY=($(compgen -W 'Northwest North NorthEast West Center - East SouthWest South SouthEast' -- "$cur")) + _comp_compgen -- -W 'Northwest North NorthEast West Center East + SouthWest South SouthEast' return ;; -intent) - COMPREPLY=($(compgen -W 'Absolute Perceptual Relative - Saturation' -- "$cur")) + _comp_compgen -- -W 'Absolute Perceptual Relative Saturation' return ;; -interlace) - COMPREPLY=($(compgen -W 'None Line Plane Partition' -- "$cur")) + _comp_compgen -- -W 'None Line Plane Partition' return ;; -limit) - COMPREPLY=($(compgen -W 'Disk File Map Memory' -- "$cur")) + _comp_compgen -- -W 'Disk File Map Memory' return ;; -list) - COMPREPLY=($(compgen -W 'Delegate Format Magic Module Resource - Type' -- "$cur")) + _comp_compgen -- -W 'Delegate Format Magic Module Resource Type' return ;; -map) - COMPREPLY=($(compgen -W 'best default gray red green blue' \ - -- "$cur")) - _filedir + _comp_compgen -- -W 'best default gray red green blue' + _comp_compgen -a filedir return ;; -noise) - COMPREPLY=($(compgen -W 'Uniform Gaussian Multiplicative - Impulse Laplacian Poisson' -- "$cur")) + _comp_compgen -- -W 'Uniform Gaussian Multiplicative Impulse + Laplacian Poisson' return ;; -preview) - COMPREPLY=($(compgen -W 'Rotate Shear Roll Hue Saturation - Brightness Gamma Spiff Dull Grayscale Quantize Despeckle - ReduceNoise AddNoise Sharpen Blur Treshold EdgeDetect Spread - Shade Raise Segment Solarize Swirl Implode Wave OilPaint - CharcoalDrawing JPEG' -- "$cur")) + _comp_compgen -- -W 'Rotate Shear Roll Hue Saturation Brightness + Gamma Spiff Dull Grayscale Quantize Despeckle ReduceNoise + AddNoise Sharpen Blur Threshold EdgeDetect Spread Shade Raise + Segment Solarize Swirl Implode Wave OilPaint CharcoalDrawing + JPEG' return ;; -mask | -profile | -texture | -tile | -write) - _filedir + _comp_compgen_filedir return ;; -type) - COMPREPLY=($(compgen -W 'Bilevel Grayscale Palette PaletteMatte + _comp_compgen -- -W 'Bilevel Grayscale Palette PaletteMatte TrueColor TrueColorMatte ColorSeparation ColorSeparationlMatte - Optimize' -- "$cur")) + Optimize' return ;; -units) - COMPREPLY=($(compgen -W 'Undefined PixelsPerInch - PixelsPerCentimeter' -- "$cur")) + _comp_compgen -- -W 'Undefined PixelsPerInch PixelsPerCentimeter' return ;; -virtual-pixel) - COMPREPLY=($(compgen -W 'Constant Edge mirror tile' -- "$cur")) + _comp_compgen -- -W 'Constant Edge mirror tile' return ;; -visual) - COMPREPLY=($(compgen -W 'StaticGray GrayScale StaticColor - PseudoColor TrueColor DirectColor defaut visualid' \ - -- "$cur")) + _comp_compgen -- -W 'StaticGray GrayScale StaticColor PseudoColor + TrueColor DirectColor default visualid' return ;; esac @@ -127,198 +120,197 @@ _ImageMagick() return 1 } -_convert() +_comp_cmd_convert() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - _ImageMagick && return + _comp_cmd_convert__common_options && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help elif [[ $cur == +* ]]; then - COMPREPLY=($(compgen -W '+adjoin +append +compress +contrast +debug - +dither +endian +gamma +label +map +mask +matte +negate +noise - +page +raise +render +write' -- "$cur")) + _comp_compgen -- -W '+adjoin +append +compress +contrast +debug +dither + +endian +gamma +label +map +mask +matte +negate +noise +page +raise + +render +write' else - _filedir + _comp_compgen_filedir fi } && - complete -F _convert convert + complete -F _comp_cmd_convert convert -_mogrify() +_comp_cmd_mogrify() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - _ImageMagick && return + _comp_cmd_convert__common_options && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help elif [[ $cur == +* ]]; then - COMPREPLY=($(compgen -W '+compress +contrast +debug +dither +endian - +gamma +label +map +mask +matte +negate +page +raise' -- "$cur")) + _comp_compgen -- -W '+compress +contrast +debug +dither +endian +gamma + +label +map +mask +matte +negate +page +raise' else - _filedir + _comp_compgen_filedir fi } && - complete -F _mogrify mogrify + complete -F _comp_cmd_mogrify mogrify -_display() +_comp_cmd_display() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - _ImageMagick && return + _comp_cmd_convert__common_options && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help elif [[ $cur == +* ]]; then - COMPREPLY=($(compgen -W '+compress +contrast +debug +dither +endian - +gamma +label +map +matte +negate +page +raise +write' -- "$cur")) + _comp_compgen -- -W '+compress +contrast +debug +dither +endian +gamma + +label +map +matte +negate +page +raise +write' else - _filedir + _comp_compgen_filedir fi } && - complete -F _display display + complete -F _comp_cmd_display display -_animate() +_comp_cmd_animate() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - _ImageMagick && return + _comp_cmd_convert__common_options && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help elif [[ $cur == +* ]]; then - COMPREPLY=($(compgen -W '+debug +dither +gamma +map +matte' \ - -- "$cur")) + _comp_compgen -- -W '+debug +dither +gamma +map +matte' else - _filedir + _comp_compgen_filedir fi } && - complete -F _animate animate + complete -F _comp_cmd_animate animate -_identify() +_comp_cmd_identify() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - _ImageMagick && return + _comp_cmd_convert__common_options && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help elif [[ $cur == +* ]]; then - COMPREPLY=($(compgen -W '+debug' -- "$cur")) + _comp_compgen -- -W '+debug' else - _filedir + _comp_compgen_filedir fi } && - complete -F _identify identify + complete -F _comp_cmd_identify identify -_montage() +_comp_cmd_montage() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - _ImageMagick && return + _comp_cmd_convert__common_options && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help elif [[ $cur == +* ]]; then - COMPREPLY=($(compgen -W '+adjoin +compress +debug +dither +endian - +gamma +label +matte +page' -- "$cur")) + _comp_compgen -- -W '+adjoin +compress +debug +dither +endian +gamma + +label +matte +page' else - _filedir + _comp_compgen_filedir fi } && - complete -F _montage montage + complete -F _comp_cmd_montage montage -_composite() +_comp_cmd_composite() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - _ImageMagick && return + _comp_cmd_convert__common_options && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help elif [[ $cur == +* ]]; then - COMPREPLY=($(compgen -W '+compress +debug +dither +endian +label - +matte +negate +page +write' -- "$cur")) + _comp_compgen -- -W '+compress +debug +dither +endian +label +matte + +negate +page +write' else - _filedir + _comp_compgen_filedir fi } && - complete -F _composite composite + complete -F _comp_cmd_composite composite -_compare() +_comp_cmd_compare() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - _ImageMagick && return + _comp_cmd_convert__common_options && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help elif [[ $cur == +* ]]; then - COMPREPLY=($(compgen -W '+debug' -- "$cur")) + _comp_compgen -- -W '+debug' else - _filedir + _comp_compgen_filedir fi } && - complete -F _compare compare + complete -F _comp_cmd_compare compare -_conjure() +_comp_cmd_conjure() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - _ImageMagick && return + _comp_cmd_convert__common_options && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help elif [[ $cur == +* ]]; then - COMPREPLY=($(compgen -W '+debug' -- "$cur")) + _comp_compgen -- -W '+debug' else - _filedir + _comp_compgen_filedir fi } && - complete -F _conjure conjure + complete -F _comp_cmd_conjure conjure -_import() +_comp_cmd_import() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - _ImageMagick && return + _comp_cmd_convert__common_options && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help elif [[ $cur == +* ]]; then - COMPREPLY=($(compgen -W '+debug' -- "$cur")) + _comp_compgen -- -W '+debug' else - _filedir + _comp_compgen_filedir fi } && - complete -F _import import + complete -F _comp_cmd_import import -_stream() +_comp_cmd_stream() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - _ImageMagick && return + _comp_cmd_convert__common_options && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help elif [[ $cur == +* ]]; then - COMPREPLY=($(compgen -W '+debug' -- "$cur")) + _comp_compgen -- -W '+debug' else - _filedir + _comp_compgen_filedir fi } && - complete -F _stream stream + complete -F _comp_cmd_stream stream # ex: filetype=sh diff --git a/completions/cowsay b/completions/cowsay index 6ba1d0f..ea1468c 100644 --- a/completions/cowsay +++ b/completions/cowsay @@ -1,23 +1,21 @@ # bash completion for cowsay -*- shell-script -*- -_cowsay() +_comp_cmd_cowsay() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -f) - COMPREPLY=($(compgen -W \ - '$(cowsay -l 2>/dev/null | tail -n +2)' -- "$cur")) + _comp_compgen_split -- "$(cowsay -l 2>/dev/null | tail -n +2)" return ;; esac # relevant options completion - COMPREPLY=($(compgen -W '-b -d -g -p -s -t -w -y -e -f -h -l -n -T -W' \ - -- "$cur")) + _comp_compgen -- -W '-b -d -g -p -s -t -w -y -e -f -h -l -n -T -W' } && - complete -F _cowsay -o default cowsay cowthink + complete -F _comp_cmd_cowsay -o default cowsay cowthink # ex: filetype=sh diff --git a/completions/cpan2dist b/completions/cpan2dist index b5e59da..e53933d 100644 --- a/completions/cpan2dist +++ b/completions/cpan2dist @@ -1,37 +1,37 @@ # bash completion for cpan2dist -*- shell-script -*- -_cpan2dist() +_comp_cmd_cpan2dist() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --format) # should remove ":" from COMP_WORDBREAKS, but doesn't work (?) - COMPREPLY=($(compgen -W '$(perl -MCPANPLUS::Dist -e \ - "print map { \"\$_\n\" } CPANPLUS::Dist->dist_types")' \ - -- "$cur")) + _comp_compgen_split -- "$(perl -MCPANPLUS::Dist -e \ + 'print map { "$_n" } CPANPLUS::Dist->dist_types')" return ;; --banlist | --ignorelist | --modulelist | --logfile) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help else local cpandirs=("$HOME/.cpanplus/" "$HOME/.cpan/source/modules/") - local packagelist + local dir packagelist= for dir in "${cpandirs[@]}"; do [[ -d $dir && -r "$dir/02packages.details.txt.gz" ]] && packagelist="$dir/02packages.details.txt.gz" done - [[ -v packagelist ]] && COMPREPLY=($(zgrep "^${cur//-/::}" \ - $packagelist 2>/dev/null | awk '{print $1}' | command sed -e 's/::/-/g')) + [[ $packagelist ]] && _comp_split COMPREPLY "$(zgrep "^${cur//-/::}" \ + "$packagelist" 2>/dev/null | _comp_awk '{print $1}' | + command sed -e 's/::/-/g')" fi } && - complete -F _cpan2dist -o default cpan2dist + complete -F _comp_cmd_cpan2dist -o default cpan2dist # ex: filetype=sh diff --git a/completions/cpio b/completions/cpio index d6fde0c..e7b70cd 100644 --- a/completions/cpio +++ b/completions/cpio @@ -1,78 +1,75 @@ # bash completion for cpio -*- shell-script -*- -_cpio() +_comp_cmd_cpio() { - 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 # --name value style option + local noargopts='!(-*|*[HEFIR]*)' + # shellcheck disable=SC2254 case $prev in - --format | -!(-*)H) - COMPREPLY=($(compgen -W \ - 'bin odc newc crc tar ustar hpbin hpodc' -- "$cur")) + --format | -${noargopts}H) + _comp_compgen -- -W 'bin odc newc crc tar ustar hpbin hpodc' return ;; - --file | --pattern-file | -!(-*)[EFI]) - _filedir + --file | --pattern-file | -${noargopts}[EFI]) + _comp_compgen_filedir return ;; - --owner | -!(-*)R) - _usergroup + --owner | -${noargopts}R) + _comp_compgen_usergroups return ;; --rsh-command) - compopt -o filenames - COMPREPLY=($(compgen -c -- "$cur")) + _comp_compgen_commands return ;; esac - $split && return + [[ $was_split ]] && return if ((cword == 1)); then - COMPREPLY=($(compgen -W '-o --create -i --extract -p --pass-through - -? --help --license --usage --version' -- "$cur")) + _comp_compgen -- -W '-o --create -i --extract -p --pass-through -? + --help --license --usage --version' else case ${words[1]} in -o | --create) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-0 -a -c -v -A -B -L -V -C -H -M - -O -F --file --format --message --null - --reset-access-time --verbose --dot --append - --block-size --dereference --io-size --quiet - --force-local --rsh-command --help --version' \ - -- "$cur")) + _comp_compgen -- -W '-0 -a -c -v -A -B -L -V -C -H -M -O -F + --file --format --message --null --reset-access-time + --verbose --dot --append --block-size --dereference + --io-size --quiet --force-local --rsh-command --help + --version' fi ;; -i | --extract) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-b -c -d -f -m -n -r -t -s -u -v - -B -S -V -C -E -H -M -R -I -F --file --make-directories + _comp_compgen -- -W '-b -c -d -f -m -n -r -t -s -u -v -B -S + -V -C -E -H -M -R -I -F --file --make-directories --nonmatching --preserve-modification-time --numeric-uid-gid --rename --list --swap-bytes --swap --dot --unconditional --verbose --block-size --swap-halfwords --io-size --pattern-file --format --owner --no-preserve-owner --message --force-local --no-absolute-filenames --sparse --only-verify-crc - --quiet --rsh-command --help --to-stdout --version' \ - -- "$cur")) + --quiet --rsh-command --help --to-stdout --version' fi ;; -p* | --pass-through) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-0 -a -d -l -m -u -v -L -V -R - --null --reset-access-time --make-directories --link - --quiet --preserve-modification-time --unconditional - --verbose --dot --dereference --owner - --no-preserve-owner --sparse --help --version' \ - -- "$cur")) + _comp_compgen -- -W '-0 -a -d -l -m -u -v -L -V -R --null + --reset-access-time --make-directories --link --quiet + --preserve-modification-time --unconditional --verbose + --dot --dereference --owner --no-preserve-owner + --sparse --help --version' else - _filedir -d + _comp_compgen_filedir -d fi ;; esac fi } && - complete -F _cpio cpio + complete -F _comp_cmd_cpio cpio # ex: filetype=sh diff --git a/completions/cppcheck b/completions/cppcheck index 8ea9571..5867fc7 100644 --- a/completions/cppcheck +++ b/completions/cppcheck @@ -1,14 +1,14 @@ # bash completion for cppcheck(1) -*- shell-script -*- -_cppcheck() +_comp_cmd_cppcheck() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in --append | --exitcode-suppressions | --rule-file | --config-excludes-file | \ --suppressions-list | --includes-file | --include | -i) - _filedir + _comp_compgen_filedir return ;; -D | -U | --rule | --suppress | --template | --max-configs | -h | --help | --version | \ @@ -17,75 +17,75 @@ _cppcheck() ;; --enable) # split comma-separated list - split=false + local split="" if [[ $cur == ?*,* ]]; then prev="${cur%,*}" cur="${cur##*,}" - split=true + split="set" fi - COMPREPLY=($(compgen -W 'all warning style performance - portability information unusedFunction missingInclude' \ - -- "$cur")) - $split && COMPREPLY=(${COMPREPLY[@]/#/"$prev,"}) + _comp_compgen -- -W 'all warning style performance portability + information unusedFunction missingInclude' && + [[ $split ]] && + _comp_compgen -Rv COMPREPLY -- -P "$prev," -W '"${COMPREPLY[@]}"' return ;; --error-exitcode) - COMPREPLY=($(compgen -W '{0..255}' -- "$cur")) + _comp_compgen -- -W '{0..255}' return ;; --file-list) - _filedir - [[ -z $cur || $cur == - ]] && COMPREPLY+=(-) + _comp_compgen_filedir + [[ ! $cur || $cur == - ]] && COMPREPLY+=(-) return ;; -I) - _filedir -d + _comp_compgen_filedir -d return ;; -j) - COMPREPLY=($(compgen -W "{2..$(_ncpus)}" -- "$cur")) + local REPLY + _comp_get_ncpus + _comp_compgen -- -W "{1..$REPLY}" return ;; --language | -x) - COMPREPLY=($(compgen -W 'c c++' -- "$cur")) + _comp_compgen -- -W 'c c++' return ;; --std) - COMPREPLY=($(compgen -W 'c89 c99 c11 c++03 c++11 c++14 c++17 - c++20' -- "$cur")) + _comp_compgen -- -W 'c89 c99 c11 c++03 c++11 c++14 c++17 c++20' return ;; --platform) - _filedir - COMPREPLY+=($(compgen -W 'unix32 unix64 win32A win32W win64 - native' -- "$cur")) + _comp_compgen_filedir + _comp_compgen -a -- -W 'unix32 unix64 win32A win32W win64 native' return ;; -rp | --relative-paths) - if $split; then # -rp without argument is allowed - _filedir -d + if [[ $was_split ]]; then # -rp without argument is allowed + _comp_compgen_filedir -d return fi ;; --library) - _filedir cfg + _comp_compgen_filedir cfg return ;; --xml-version) - COMPREPLY=($(compgen -W '1 2' -- "$cur")) + _comp_compgen -- -W '1 2' return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - _filedir '@([cht]pp|[cht]xx|cc|[ch]++|[ch])' + _comp_compgen_filedir '@([cht]pp|[cht]xx|cc|[ch]++|[ch])' fi } && - complete -F _cppcheck cppcheck + complete -F _comp_cmd_cppcheck cppcheck # ex: filetype=sh diff --git a/completions/crontab b/completions/crontab index cac7853..4f80347 100644 --- a/completions/crontab +++ b/completions/crontab @@ -1,13 +1,13 @@ # crontab(1) completion -*- shell-script -*- -_crontab() +_comp_cmd_crontab() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*u) - _allowed_users + _comp_compgen_allowed_users return ;; esac @@ -18,31 +18,31 @@ _crontab() local i for i in "${!words[@]}"; do - [[ ${words[i]} && $i -ne $cword ]] && unset "opts[${words[i]}]" + [[ ${words[i]} && $i -ne $cword ]] && unset -v "opts[${words[i]}]" case "${words[i]}" in -l) - unset 'opts[-r]' 'opts[-e]' 'opts[-i]' 'opts[-s]' + unset -v 'opts[-r]' 'opts[-e]' 'opts[-i]' 'opts[-s]' ;; -e) - unset 'opts[-l]' 'opts[-r]' 'opts[-i]' + unset -v 'opts[-l]' 'opts[-r]' 'opts[-i]' ;; -r) - unset 'opts[-l]' 'opts[-e]' + unset -v 'opts[-l]' 'opts[-e]' ;; -u) - unset 'opts[-i]' + unset -v 'opts[-i]' ;; esac done if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '${!opts[@]}' -- "$cur")) + _comp_compgen -- -W '"${!opts[@]}"' return fi # do filenames only if we did not have -l, -r, or -e - [[ ${words[*]} == *\ -[lre]* ]] || _filedir + [[ ${words[*]} == *\ -[lre]* ]] || _comp_compgen_filedir } && - complete -F _crontab crontab + complete -F _comp_cmd_crontab crontab # ex: filetype=sh diff --git a/completions/cryptsetup b/completions/cryptsetup index e73e165..9d23bfa 100644 --- a/completions/cryptsetup +++ b/completions/cryptsetup @@ -1,61 +1,52 @@ # bash completion for cryptsetup -*- shell-script -*- -_cryptsetup_name() +_comp_cmd_cryptsetup__name() { - COMPREPLY=($(compgen -X control -W '$(command ls /dev/mapper)' -- "$cur")) + _comp_compgen_split -X control -- "$(command ls /dev/mapper)" } -_cryptsetup_device() +_comp_cmd_cryptsetup__device() { - cur=${cur:=/dev/} - _filedir + _comp_compgen -c "${cur:-/dev/}" filedir } -_cryptsetup() +_comp_cmd_cryptsetup() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[cslSbopitTdM]*)' + # shellcheck disable=SC2254 case $prev in --help | --version | --cipher | --hash | --*-size | --key-slot | --size | --offset | \ - --skip | --iter-time | --timeout | --tries | -!(-*)[chslSbopitT]) + --skip | --iter-time | --timeout | --tries | -${noargopts}[chslSbopitT]) return ;; - --key-file | --master-key-file | --header-backup-file | -!(-*)d) - _filedir + --key-file | --master-key-file | --header-backup-file | -${noargopts}d) + _comp_compgen_filedir return ;; - --type | -!(-*)M) - COMPREPLY=($(compgen -W "luks plain loopaes tcrypt" -- "$cur")) + --type | -${noargopts}M) + _comp_compgen -- -W "luks plain loopaes tcrypt" return ;; esac - $split && return + [[ $was_split ]] && return - local arg - _get_first_arg - if [[ -z $arg ]]; then - if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) - [[ ${COMPREPLY-} == *= ]] && compopt -o nospace - else - COMPREPLY=($(compgen -W 'open close resize status benchmark - repair erase luksFormat luksAddKey luksRemoveKey luksChangeKey - luksKillSlot luksUUID isLuks luksDump tcryptDump luksSuspend - luksResume luksHeaderBackup luksHeaderRestore' -- "$cur")) - fi - else - local args - _count_args "" "-!(-*)[chslSbopitTdM]" + local REPLY + if _comp_get_first_arg; then + local arg=$REPLY + _comp_count_args -a "-${noargopts}[chslSbopitTdM]" + local args=$REPLY case $arg in open | create | luksOpen | loopaesOpen | tcryptOpen) case $args in 2) - _cryptsetup_device + _comp_cmd_cryptsetup__device ;; 3) - _cryptsetup_name + _comp_cmd_cryptsetup__name ;; esac ;; @@ -63,31 +54,31 @@ _cryptsetup() luksSuspend | luksResume) case $args in 2) - _cryptsetup_name + _comp_cmd_cryptsetup__name ;; esac ;; luksFormat | luksAddKey | luksRemoveKey | luksChangeKey) case $args in 2) - _cryptsetup_device + _comp_cmd_cryptsetup__device ;; 3) - _filedir + _comp_compgen_filedir ;; esac ;; luksKillSlot | luksDelKey | luksUUID | isLuks | luksDump) case $args in 2) - _cryptsetup_device + _comp_cmd_cryptsetup__device ;; esac ;; luksHeaderBackup | luksHeaderRestore) case $args in 2) - _cryptsetup_device + _comp_cmd_cryptsetup__device ;; 3) COMPREPLY=('--header-backup-file') @@ -95,9 +86,19 @@ _cryptsetup() esac ;; esac + else + if [[ $cur == -* ]]; then + _comp_compgen_help + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + else + _comp_compgen -- -W 'open close resize status benchmark repair + erase luksFormat luksAddKey luksRemoveKey luksChangeKey + luksKillSlot luksUUID isLuks luksDump tcryptDump luksSuspend + luksResume luksHeaderBackup luksHeaderRestore' + fi fi } && - complete -F _cryptsetup cryptsetup + complete -F _comp_cmd_cryptsetup cryptsetup # ex: filetype=sh diff --git a/completions/curl b/completions/curl index 6e84269..6cbbca4 100644 --- a/completions/curl +++ b/completions/curl @@ -1,48 +1,59 @@ # curl(1) completion -*- shell-script -*- -_curl() +_comp_cmd_curl() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return + local noargopts='!(-*|*[KbcDoTCFmQreYytzuAwEdHPxX]*)' + # shellcheck disable=SC2254 case $prev in - --ciphers | --connect-timeout | --continue-at | --form | --form-string | \ - --ftp-account | --ftp-alternative-to-user | --ftp-port | --header | --help | \ - --hostpubmd5 | --keepalive-time | --krb | --limit-rate | --local-port | \ - --mail-from | --mail-rcpt | --max-filesize | --max-redirs | --max-time | --pass | \ - --proto | --proto-redir | --proxy-user | --proxy1.0 | --quote | --range | \ - --request | --retry | --retry-delay | --retry-max-time | \ - --socks5-gssapi-service | --telnet-option | --tftp-blksize | --time-cond | \ - --url | --user | --user-agent | --version | --write-out | --resolve | --tlsuser | \ - --tlspassword | -!(-*)[CFPHhmQrXtzuAVw]) + --abstract-unix-socket | --alt-svc | --config | --cookie | \ + --cookie-jar | --dump-header | --egd-file | --etag-compare | \ + --etag-save | --hsts | --key | --libcurl | --netrc-file | \ + --output | --proxy-key | --random-file | --trace | --trace-ascii | \ + --unix-socket | --upload-file | -${noargopts}[KbcDoT]) + _comp_compgen_filedir return ;; - --config | --cookie | --cookie-jar | --dump-header | --egd-file | \ - --key | --libcurl | --output | --random-file | --upload-file | --trace | \ - --trace-ascii | --netrc-file | -!(-*)[KbcDoT]) - _filedir + --ciphers | --connect-timeout | --connect-to | --continue-at | \ + --curves | --data-raw | --doh-url | --expect100-timeout | --form | \ + --form-string | --ftp-account | --ftp-alternative-to-user | \ + --happy-eyeballs-timeout-ms | --hostpubmd5 | --keepalive-time | \ + --limit-rate | --local-port | --login-options | --mail-auth | \ + --mail-from | --mail-rcpt | --max-filesize | --max-redirs | \ + --max-time | --pass | --proto | --proto-default | --proto-redir | \ + --proxy-ciphers | --proxy-pass | --proxy-service-name | \ + --proxy-tls13-ciphers | --proxy-tlspassword | --proxy-tlsuser | \ + --proxy-user | --proxy1.0 | --quote | --range | --referer | \ + --resolve | --retry | --retry-delay | --retry-max-time | \ + --sasl-authzid | --service-name | --socks5-gssapi-service | \ + --speed-limit | --speed-time | --telnet-option | --tftp-blksize | \ + --time-cond | --tls13-ciphers | --tlspassword | --tlsuser | \ + --url | --user | --user-agent | --version | --write-out | \ + -${noargopts}[CFmQreYytzuAVw]) return ;; - --cacert | --cert | -!(-*)E) - _filedir '@(c?(e)rt|cer|pem|der)' + --cacert | --cert | --proxy-cacert | --proxy-cert | -${noargopts}E) + _comp_compgen_filedir '@(c?(e)rt|cer|pem|der)' return ;; - --capath) - _filedir -d + --capath | --output-dir | --proxy-capath) + _comp_compgen_filedir -d return ;; - --cert-type | --key-type) - COMPREPLY=($(compgen -W 'DER PEM ENG' -- "$cur")) + --cert-type | --key-type | --proxy-cert-type | --proxy-key-type) + _comp_compgen -- -W 'DER PEM ENG' return ;; - --crlfile) - _filedir crl + --crlfile | --proxy-crlfile) + _comp_compgen_filedir crl return ;; - --data | --data-ascii | --data-binary | --data-urlencode | -!(-*)d) + --data | --data-ascii | --data-binary | --data-urlencode | --header | \ + --proxy-header | -${noargopts}[dH]) if [[ $cur == \@* ]]; then - cur=${cur:1} - _filedir + _comp_compgen -c "${cur:1}" filedir if [[ ${#COMPREPLY[@]} -eq 1 && -d ${COMPREPLY[0]} ]]; then COMPREPLY[0]+=/ compopt -o nospace @@ -52,48 +63,100 @@ _curl() return ;; --delegation) - COMPREPLY=($(compgen -W 'none policy always' -- "$cur")) + _comp_compgen -- -W 'none policy always' + return + ;; + --dns-ipv[46]-addr) + _comp_compgen_ip_addresses -"${prev:9:1}" + return + ;; + --dns-servers | --noproxy) + _comp_compgen_known_hosts -- "${cur##*,}" + ((${#COMPREPLY[@]})) && + _comp_delimited , -W '"${COMPREPLY[@]}"' return ;; --engine) - COMPREPLY=($(compgen -W 'list' -- "$cur")) + local engines=$( + "$1" --engine list 2>/dev/null | + command grep "^[[:space:]]" + ) + _comp_compgen -- -W '$engines list' + return + ;; + --ftp-port | -${noargopts}P) + _comp_compgen_available_interfaces -a + _comp_compgen -a known_hosts -- "$cur" + _comp_compgen -a ip_addresses -a return ;; --ftp-method) - COMPREPLY=($(compgen -W 'multicwd nocwd singlecwd' -- "$cur")) + _comp_compgen -- -W 'multicwd nocwd singlecwd' return ;; --ftp-ssl-ccc-mode) - COMPREPLY=($(compgen -W 'active passive' -- "$cur")) + _comp_compgen -- -W 'active passive' return ;; --interface) - _available_interfaces -a + _comp_compgen_available_interfaces -a + return + ;; + --help | -${noargopts}h) + local x categories + if _comp_split categories "$("$1" --help non-existent-category 2>&1 | + _comp_awk '/^[ \t]/ {print $1}')"; then + for x in "${categories[@]}"; do + # Looks like an option? Likely no --help category support + [[ $x != -* ]] || return + done + _comp_compgen -- -W '"${categories[@]}"' + fi return ;; - --proxy | --socks4 | --socks4a | --socks5 | --socks5-hostname | -!(-*)x) - _known_hosts_real -- "$cur" + --krb) + _comp_compgen -- -W 'clear safe confidential private' + return + ;; + --pinnedpubkey | --proxy-pinnedpubkey) + _comp_compgen_filedir '@(pem|der|key)' + return + ;; + --preproxy | --proxy | --socks4 | --socks4a | --socks5 | \ + --socks5-hostname | -${noargopts}x) + _comp_compgen_known_hosts -- "$cur" return ;; --pubkey) - _xfunc ssh _ssh_identityfile pub + _comp_compgen -x ssh identityfile pub + return + ;; + --request | -${noargopts}X) + # TODO: these are valid for http(s) only + _comp_compgen -- -W 'GET HEAD POST PUT DELETE CONNECT OPTIONS TRACE + PATCH' return ;; --stderr) - COMPREPLY=($(compgen -W '-' -- "$cur")) - _filedir + _comp_compgen -- -W '-' + _comp_compgen -a filedir + return + ;; + --tls-max) + _comp_compgen -- -W 'default 1.0 1.1 1.2 1.3' return ;; - --tlsauthtype) - COMPREPLY=($(compgen -W 'SRP' -- "$cur")) + --tlsauthtype | --proxy-tlsauthtype) + _comp_compgen -- -W 'SRP' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help -- --help all + [[ ${COMPREPLY-} ]] || _comp_compgen_help fi } && - complete -F _curl curl + complete -F _comp_cmd_curl curl # ex: filetype=sh diff --git a/completions/cvs b/completions/cvs index ba1f062..5629dfe 100644 --- a/completions/cvs +++ b/completions/cvs @@ -1,58 +1,65 @@ # cvs(1) completion -*- shell-script -*- -_cvs_entries() +_comp_deprecate_var 2.12 \ + COMP_CVS_REMOTE BASH_COMPLETION_CMD_CVS_REMOTE + +# Usage: _comp_cmd_cvs__compgen_entries [base_path] +# @param[opt] $1 +# shellcheck disable=SC2120 +_comp_cmd_cvs__compgen_entries() { - local prefix=${cur%/*}/ IFS=$'\n' - [[ -e ${prefix:-}CVS/Entries ]] || prefix="" - entries=($(cut -d/ -f2 -s ${prefix:-}CVS/Entries 2>/dev/null)) - if [[ $entries ]]; then - entries=("${entries[@]/#/${prefix:-}}") + local base_path=${1-$cur} + local _prefix=${base_path%/*}/ + [[ -e ${_prefix-}CVS/Entries ]] || _prefix="" + _comp_compgen -c "${cur#"$_prefix"}" split -lP "$_prefix" -- "$(cut -d/ -f2 -s "${_prefix-}CVS/Entries" 2>/dev/null)" && compopt -o filenames - fi } -_cvs_modules() +_comp_cmd_cvs__modules() { - if [[ -n $prefix ]]; then - COMPREPLY=($(command ls -d ${cvsroot}/${prefix}/!(CVSROOT))) - else - COMPREPLY=($(command ls -d ${cvsroot}/!(CVSROOT))) - fi + _comp_expand_glob COMPREPLY '"$cvsroot${prefix:+/$prefix}"/!(CVSROOT)' } -_cvs_commands() +_comp_cmd_cvs__compgen_commands() { - cvs --help-commands 2>&1 | awk '/^( *|\t)/ { print $1 }' + _comp_compgen_split -- "$( + "$1" --help-commands 2>&1 | _comp_awk '/^( *|\t)/ { print $1 }' + )" } -_cvs_command_options() +_comp_cmd_cvs__compgen_command_options() { - COMPREPLY=($(compgen -W '$(_parse_help "$1" "--help $2")' -- "$cur")) + _comp_compgen_help -- --help "$2" } -_cvs_kflags() +_comp_cmd_cvs__compgen_kflags() { - COMPREPLY=($(compgen -W 'kv kvl k o b v' -- "$cur")) + _comp_compgen -- -W 'kv kvl k o b v' } -_cvs_roots() +# @since 2.12 +_comp_xfunc_cvs_compgen_roots() { - local -a cvsroots + local -a cvsroots=() [[ -v CVSROOT ]] && cvsroots=("$CVSROOT") - [[ -r ~/.cvspass ]] && cvsroots+=($(awk '{ print $2 }' ~/.cvspass)) - [[ -r CVS/Root ]] && mapfile -tO ${#cvsroots[@]} cvsroots <CVS/Root - COMPREPLY=($(compgen -W '${cvsroots[@]}' -- "$cur")) - __ltrim_colon_completions "$cur" + [[ -r ~/.cvspass ]] && _comp_split -a cvsroots "$(_comp_awk '{ print $2 }' ~/.cvspass)" + [[ -r CVS/Root ]] && mapfile -tO "${#cvsroots[@]}" cvsroots <CVS/Root + ((${#cvsroots[@]})) && + _comp_compgen -U cvsroots -- -W '"${cvsroots[@]}"' + _comp_ltrim_colon_completions "$cur" } -_cvs() +_comp_deprecate_func 2.12 _cvs_roots _comp_xfunc_cvs_compgen_roots + +_comp_cmd_cvs() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return - local count mode i cvsroot cvsroots pwd - local -a flags files entries changed newremoved + local count mode="" i cvsroot="" has_cvsroot="" pwd + local -a flags files entries + local noargopts='!(-*|*[d]*)' count=0 for i in "${words[@]}"; do ((count == cword)) && break @@ -60,15 +67,17 @@ _cvs() if [[ ${words[count]} == "${cvsroot-}" && ${mode-} == cvsroot ]]; then mode="" fi - if [[ ! -v mode ]]; then + if [[ ! $mode ]]; then + # shellcheck disable=SC2254 case $i in - --help | -!(-*)H) - COMPREPLY=($(compgen -W "$(_cvs_commands)" -- "$cur")) + --help | -${noargopts}H) + _comp_cmd_cvs__compgen_commands "$1" return ;; - -!(-*)d) + -${noargopts}d) mode=cvsroot cvsroot=${words[count + 1]} + has_cvsroot=set ;; add | ad | new) mode=add @@ -132,7 +141,7 @@ _cvs() ;; esac elif [[ $i == -* ]]; then - flags+=($i) + flags+=("$i") fi ((count++)) done @@ -145,32 +154,36 @@ _cvs() return ;; -*k) - _cvs_kflags + _comp_cmd_cvs__compgen_kflags return ;; esac if [[ $cur != -* ]]; then - _cvs_entries - [[ -z $cur ]] && files=(!(CVS)) || - files=($(command ls -d ${cur}* 2>/dev/null)) + _comp_compgen -Rv entries -i cvs entries "${cur-}" + if [[ ! $cur ]]; then + _comp_expand_glob files '!(CVS)' + else + _comp_expand_glob files '"${cur}"*' + fi local f for i in "${!files[@]}"; do if [[ ${files[i]} == ?(*/)CVS ]]; then - unset 'files[i]' - else + unset -v 'files[i]' + elif ((${#entries[@]})); then for f in "${entries[@]}"; do if [[ ${files[i]} == "$f" && ! -d $f ]]; then - unset 'files[i]' + unset -v 'files[i]' break fi done fi done - COMPREPLY=($(compgen -X "$_backup_glob" -W '${files[@]}' \ - -- "$cur")) + # shellcheck disable=SC2154 # global var _comp_backup_glob + ((${#files[@]})) && + _comp_compgen -- -X "$_comp_backup_glob" -W '"${files[@]}"' else - _cvs_command_options "$1" $mode + _comp_cmd_cvs__compgen_command_options "$1" "$mode" fi ;; admin) @@ -180,30 +193,28 @@ _cvs() return ;; -*t) - _filedir + _comp_compgen_filedir return ;; -*k) - _cvs_kflags + _comp_cmd_cvs__compgen_kflags return ;; esac if [[ $cur == -* ]]; then - _cvs_command_options "$1" $mode + _comp_cmd_cvs__compgen_command_options "$1" "$mode" else - _cvs_entries - COMPREPLY=($(compgen -W '${entries[@]}' -- "$cur")) + _comp_cmd_cvs__compgen_entries fi ;; annotate) [[ $prev == -[rD] ]] && return if [[ $cur == -* ]]; then - _cvs_command_options "$1" $mode + _comp_cmd_cvs__compgen_command_options "$1" "$mode" else - _cvs_entries - COMPREPLY=($(compgen -W '${entries[@]}' -- "$cur")) + _comp_cmd_cvs__compgen_entries fi ;; checkout) @@ -213,22 +224,21 @@ _cvs() return ;; -*d) - _filedir -d + _comp_compgen_filedir -d return ;; -*k) - _cvs_kflags + _comp_cmd_cvs__compgen_kflags return ;; esac if [[ $cur != -* ]]; then - [[ ! -v cvsroot ]] && cvsroot=${CVSROOT-} - COMPREPLY=($(cvs -d "$cvsroot" co -c 2>/dev/null | - awk '{print $1}')) - COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur")) + [[ ! $has_cvsroot ]] && cvsroot=${CVSROOT-} + _comp_compgen_split -- "$(cvs -d "$cvsroot" co -c 2>/dev/null | + _comp_awk '{print $1}')" else - _cvs_command_options "$1" $mode + _comp_cmd_cvs__compgen_command_options "$1" "$mode" fi ;; commit) @@ -238,51 +248,49 @@ _cvs() return ;; -*F) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur != -* ]]; then - # if $COMP_CVS_REMOTE is not null, 'cvs commit' will - # complete on remotely checked-out files (requires + # if $BASH_COMPLETION_CMD_CVS_REMOTE is not null, 'cvs commit' + # will complete on remotely checked-out files (requires # passwordless access to the remote repository - if [[ -n ${COMP_CVS_REMOTE:-} ]]; then + if [[ ${BASH_COMPLETION_CMD_CVS_REMOTE-} ]]; then # this is the least computationally intensive way found so # far, but other changes (something other than - # changed/removed/new) may be missing - changed=($(cvs -q diff --brief 2>&1 | - command sed -ne 's/^Files [^ ]* and \([^ ]*\) differ$/\1/p')) - newremoved=($(cvs -q diff --brief 2>&1 | - command sed -ne 's/^cvs diff: \([^ ]*\) .*, no comparison available$/\1/p')) - COMPREPLY=($(compgen -W '${changed[@]:-} \ - ${newremoved[@]:-}' -- "$cur")) + # changed/removed/new) may be missing. + _comp_compgen -a split -- "$(cvs -q diff --brief 2>&1 | + command sed -ne ' + # changed + s/^Files [^ ]* and \([^ ]*\) differ$/\1/p + # new/removed + s/^cvs diff: \([^ ]*\) .*, no comparison available$/\1/p + ')" else - _cvs_entries - COMPREPLY=($(compgen -W '${entries[@]}' -- "$cur")) + _comp_cmd_cvs__compgen_entries fi else - _cvs_command_options "$1" $mode + _comp_cmd_cvs__compgen_command_options "$1" "$mode" fi ;; cvsroot) - _cvs_roots + _comp_xfunc_cvs_compgen_roots ;; - diff | log) + diff | log | status) if [[ $cur == -* ]]; then - _cvs_command_options "$1" $mode + _comp_cmd_cvs__compgen_command_options "$1" "$mode" [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - _cvs_entries - COMPREPLY=($(compgen -W '${entries[@]:-}' -- "$cur")) + _comp_cmd_cvs__compgen_entries fi ;; editors | watchers) if [[ $cur == -* ]]; then - _cvs_command_options "$1" $mode + _comp_cmd_cvs__compgen_command_options "$1" "$mode" else - _cvs_entries - COMPREPLY=($(compgen -W '${entries[@]}' -- "$cur")) + _comp_cmd_cvs__compgen_entries fi ;; export) @@ -292,21 +300,21 @@ _cvs() return ;; -*d) - _filedir -d + _comp_compgen_filedir -d return ;; -*k) - _cvs_kflags + _comp_cmd_cvs__compgen_kflags return ;; esac if [[ $cur != -* ]]; then - [[ ! -v cvsroot ]] && cvsroot=${CVSROOT-} - COMPREPLY=($(cvs -d "$cvsroot" co -c | awk '{print $1}')) - COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur")) + [[ ! $has_cvsroot ]] && cvsroot=${CVSROOT-} + _comp_compgen_split -- "$(cvs -d "$cvsroot" co -c | + _comp_awk '{print $1}')" else - _cvs_command_options "$1" $mode + _comp_cmd_cvs__compgen_command_options "$1" "$mode" fi ;; import) @@ -316,39 +324,42 @@ _cvs() return ;; -*k) - _cvs_kflags + _comp_cmd_cvs__compgen_kflags return ;; esac if [[ $cur != -* ]]; then # starts with same algorithm as checkout - [[ ! -v cvsroot ]] && cvsroot=${CVSROOT-} + [[ ! $has_cvsroot ]] && cvsroot=${CVSROOT-} local prefix=${cur%/*} if [[ -r ${cvsroot}/${prefix} ]]; then - _cvs_modules - COMPREPLY=(${COMPREPLY[@]#$cvsroot}) - COMPREPLY=(${COMPREPLY[@]#\/}) + _comp_cmd_cvs__modules + COMPREPLY=("${COMPREPLY[@]#"$cvsroot"}") + COMPREPLY=("${COMPREPLY[@]#\/}") fi pwd=$(pwd) pwd=${pwd##*/} - COMPREPLY=($(compgen -W '${COMPREPLY[@]} $pwd' -- "$cur")) + [[ $pwd ]] && COMPREPLY+=("$pwd") + ((${#COMPREPLY[@]})) && + _comp_compgen -- -W '"${COMPREPLY[@]}"' else - _cvs_command_options "$1" $mode + _comp_cmd_cvs__compgen_command_options "$1" "$mode" fi ;; remove) if [[ $cur != -* ]]; then - _cvs_entries + _comp_compgen -Rv entries -i cvs entries "${cur-}" if [[ $prev != -f ]]; then # find out what files are missing for i in "${!entries[@]}"; do - [[ -r ${entries[i]} ]] && unset 'entries[i]' + [[ -r ${entries[i]} ]] && unset -v 'entries[i]' done fi - COMPREPLY=($(compgen -W '${entries[@]:-}' -- "$cur")) + ((${#entries[@]})) && + _comp_compgen -- -W '"${entries[@]}"' else - _cvs_command_options "$1" $mode + _comp_cmd_cvs__compgen_command_options "$1" "$mode" fi ;; update) @@ -358,41 +369,41 @@ _cvs() return ;; -*k) - _cvs_kflags + _comp_cmd_cvs__compgen_kflags return ;; esac if [[ $cur == -* ]]; then - _cvs_command_options "$1" $mode + _comp_cmd_cvs__compgen_command_options "$1" "$mode" else - _cvs_entries - COMPREPLY=($(compgen -W '${entries[@]}' -- "$cur")) + _comp_cmd_cvs__compgen_entries fi ;; "") case $prev in --*) ;; -*T) - _filedir -d + _comp_compgen_filedir -d return ;; -*[es]) return ;; -*z) - COMPREPLY=($(compgen -W '{1..9}' -- "$cur")) + _comp_compgen -- -W '{1..9}' return ;; esac - COMPREPLY=($(compgen -W '$(_cvs_commands) - $(_parse_help "$1" --help-options) --help --help-commands - --help-options --version' -- "$cur")) + _comp_compgen_help -- --help-options + _comp_compgen -a -i cvs commands "$1" + _comp_compgen -a -- -W \ + "--help --help-commands --help-options --version" ;; esac } && - complete -F _cvs cvs + complete -F _comp_cmd_cvs cvs # ex: filetype=sh diff --git a/completions/cvsps b/completions/cvsps index 4fdfefc..c9e6199 100644 --- a/completions/cvsps +++ b/completions/cvsps @@ -1,58 +1,58 @@ # bash completion for cvsps -*- shell-script -*- -_cvsps() +_comp_cmd_cvsps() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return case $prev in -h | -z | -f | -d | -l | --diff-opts | --debuglvl) return ;; -s) - COMPREPLY=($(compgen -W "$($1 2>/dev/null | - awk '/^PatchSet:?[ \t]/ { print $2 }')" -- "$cur")) + _comp_compgen_split -- "$("$1" 2>/dev/null | + _comp_awk '/^PatchSet:?[ \t]/ { print $2 }')" return ;; -a) - COMPREPLY=($(compgen -W "$($1 2>/dev/null | - awk '/^Author:[ \t]/ { print $2 }')" -- "$cur")) + _comp_compgen_split -- "$("$1" 2>/dev/null | + _comp_awk '/^Author:[ \t]/ { print $2 }')" return ;; -b) - COMPREPLY=($(compgen -W "$($1 2>/dev/null | - awk '/^Branch:[ \t]/ { print $2 }')" -- "$cur")) + _comp_compgen_split -- "$("$1" 2>/dev/null | + _comp_awk '/^Branch:[ \t]/ { print $2 }')" return ;; -r) - COMPREPLY=($(compgen -W "$($1 2>/dev/null | - awk '/^Tag:[ \t]+[^(]/ { print $2 }')" -- "$cur")) + _comp_compgen_split -- "$("$1" 2>/dev/null | + _comp_awk '/^Tag:[ \t]+[^(]/ { print $2 }')" return ;; -p) - _filedir -d + _comp_compgen_filedir -d return ;; --test-log) - _filedir + _comp_compgen_filedir return ;; -Z) - COMPREPLY=($(compgen -W '{1..9}' -- "$cur")) + _comp_compgen -- -W '{1..9}' return ;; --root) - _xfunc cvs _cvs_roots + _comp_compgen -x cvs roots return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + _comp_compgen_help -- -h else - _xfunc cvs _cvs_roots + _comp_compgen -x cvs roots fi } && - complete -F _cvsps cvsps + complete -F _comp_cmd_cvsps cvsps # ex: filetype=sh diff --git a/completions/dd b/completions/dd index 04d876a..a9985b1 100644 --- a/completions/dd +++ b/completions/dd @@ -1,42 +1,39 @@ # bash completion for dd -*- shell-script -*- -_dd() +_comp_cmd_dd() { - local cur prev words cword - _init_completion -n = || return + local cur prev words cword comp_args + _comp_initialize -n = -- "$@" || return case $cur in if=* | of=*) - cur=${cur#*=} - _filedir + _comp_compgen -c "${cur#*=}" filedir return ;; conv=*) - cur=${cur#*=} - COMPREPLY=($(compgen -W 'ascii ebcdic ibm block unblock lcase - ucase sparse swab sync excl nocreat notrunc noerror fdatasync - fsync' -- "$cur")) + _comp_compgen -c "${cur#*=}" -- -W 'ascii ebcdic ibm block unblock + lcase ucase sparse swab sync excl nocreat notrunc noerror + fdatasync fsync' return ;; iflag=* | oflag=*) - cur=${cur#*=} - COMPREPLY=($(compgen -W 'append direct directory dsync sync - fullblock nonblock noatime nocache noctty nofollow count_bytes - skip_bytes seek_bytes' -- "$cur")) + _comp_compgen -c "${cur#*=}" -- -W 'append direct directory dsync + sync fullblock nonblock noatime nocache noctty nofollow + count_bytes skip_bytes seek_bytes' return ;; status=*) cur=${cur#*=} - COMPREPLY=($(compgen -W 'none noxfer progress' -- "$cur")) + _comp_compgen -- -W 'none noxfer progress' return ;; esac - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur") - $(compgen -W 'bs cbs conv count ibs if iflag obs of oflag - seek skip status' -S '=' -- "$cur")) + _comp_compgen_help + _comp_compgen -a -- -W 'bs cbs conv count ibs if iflag obs of oflag + seek skip status' -S '=' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace } && - complete -F _dd dd + complete -F _comp_cmd_dd dd # ex: filetype=sh diff --git a/completions/declare b/completions/declare new file mode 100644 index 0000000..128cb30 --- /dev/null +++ b/completions/declare @@ -0,0 +1,41 @@ +# bash declare completion -*- shell-script -*- + +_comp_cmd_declare() +{ + local cur prev words cword comp_args + _comp_initialize -n := -- "$@" || return + + if [[ $cur == [-+]* ]]; then + local opts + _comp_compgen -Rv opts usage -c help -s "$1" + # Most options also have a '+' form. + # We'll exclude the ones that don't with compgen. + opts+=("${opts[@]/-/+}") + _comp_compgen -- -W "${opts[*]}" -X '+[Ffgp]' + return + fi + + local i=1 + while [[ ${words[i]} == [-+]* ]]; do + case ${words[i]} in + -*[aA]*) + _comp_compgen -- -A arrayvar + return + ;; + -*[fF]*) + _comp_compgen -- -A function + return + ;; + esac + ((i++)) + done + if ((i > 1)); then + # There was at least one option and it was not one that limited + # operations to functions and array variables + _comp_variable_assignments "$cur" && return + _comp_compgen -- -A variable + fi +} && + complete -F _comp_cmd_declare declare typeset + +# ex: filetype=sh diff --git a/completions/deja-dup b/completions/deja-dup index 1854d6a..0b28928 100644 --- a/completions/deja-dup +++ b/completions/deja-dup @@ -1,32 +1,32 @@ # bash completion for deja-dup(1) -*- shell-script -*- -_deja_dup() +_comp_cmd_deja_dup() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -'?' | --help | --help-*) return ;; --restore) - _filedir + _comp_compgen_filedir return ;; --restore-missing) - _filedir -d + _comp_compgen_filedir -d return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" --help-all)' -- "$cur")) + _comp_compgen_help -- --help-all [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi } && - complete -F _deja_dup deja-dup + complete -F _comp_cmd_deja_dup deja-dup # ex: filetype=sh diff --git a/completions/desktop-file-validate b/completions/desktop-file-validate index 8f4e139..ef1fe9a 100644 --- a/completions/desktop-file-validate +++ b/completions/desktop-file-validate @@ -1,9 +1,9 @@ # desktop-file-validate completion -*- shell-script -*- -_desktop_file_validate() +_comp_cmd_desktop_file_validate() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --help) @@ -12,12 +12,12 @@ _desktop_file_validate() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - _filedir desktop + _comp_compgen_filedir desktop } && - complete -F _desktop_file_validate desktop-file-validate + complete -F _comp_cmd_desktop_file_validate desktop-file-validate # ex: filetype=sh diff --git a/completions/dhclient b/completions/dhclient index ce4b745..330a298 100644 --- a/completions/dhclient +++ b/completions/dhclient @@ -1,34 +1,34 @@ # bash completion for dhclient -*- shell-script -*- -_dhclient() +_comp_cmd_dhclient() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -p | -e) return ;; -D) - COMPREPLY=($(compgen -W 'LL LLT' -- "$cur")) + _comp_compgen -- -W 'LL LLT' return ;; -*f) - _filedir + _comp_compgen_filedir return ;; -s) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage else - _available_interfaces + _comp_compgen_available_interfaces fi } && - complete -F _dhclient dhclient + complete -F _comp_cmd_dhclient dhclient # ex: filetype=sh diff --git a/completions/dict b/completions/dict index f3426ff..f3b0cb6 100644 --- a/completions/dict +++ b/completions/dict @@ -1,47 +1,54 @@ # dict(1) completion -*- shell-script -*- -_dictdata() +_comp_cmd_dict__compgen_dictdata() { - dict $host $port $1 2>/dev/null | command sed -ne \ - 's/^[[:blank:]]\{1,\}\([^[:blank:]]*\).*$/\1/p' + # shellcheck disable=SC2086 + _comp_compgen_split -- "$( + "$@" 2>/dev/null | command sed -ne \ + 's/^[[:blank:]]\{1,\}\([^[:blank:]]*\).*$/\1/p' + )" } -_dict() +_comp_cmd_dict() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - local host port db i + local -a dict_command=("$1") + local host="" port="" db i + local noargopts='!(-*|*[hpdis]*)' for ((i = 1; i < cword; i++)); do + # shellcheck disable=SC2254 case ${words[i]} in - --host | -!(-*)h) + --host | -${noargopts}h) host=${words[++i]} - [[ -n $host ]] && host="-h $host" + [[ $host ]] && dict_command+=(-h "$host") ;; - --port | -!(-*)p) + --port | -${noargopts}p) port=${words[++i]} - [[ -n $port ]] && port="-p $port" + [[ $port ]] && dict_command+=(-p "$port") ;; - --database | -!(-*)d) + --database | -${noargopts}d) db=${words[++i]} - [[ -n $db ]] && host="-d $db" + [[ $db ]] && dict_command+=(-d "$db") ;; esac done if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi + # shellcheck disable=SC2254 case $prev in - --database | -info | -!(-*)[di]) - COMPREPLY=($(compgen -W '$(_dictdata -D)' -- "$cur")) + --database | -info | -${noargopts}[di]) + _comp_cmd_dict__compgen_dictdata "${dict_command[@]}" -D return ;; - --strategy | -!(-*)s) - COMPREPLY=($(compgen -W '$(_dictdata -S)' -- "$cur")) + --strategy | -${noargopts}s) + _comp_cmd_dict__compgen_dictdata "${dict_command[@]}" -S return ;; esac @@ -52,13 +59,14 @@ _dict() # it down with grep if $cur looks like something that's safe to embed # in a pattern instead. if [[ $cur == +([-A-Za-z0-9/.]) ]]; then - COMPREPLY=($(compgen -W \ - '$(command grep "^${cur//./\\.}" $dictfile)' -- "$cur")) + _comp_compgen_split -- "$( + command grep "^${cur//./\\.}" "$dictfile" + )" else - COMPREPLY=($(compgen -W '$(cat $dictfile)' -- "$cur")) + _comp_compgen_split -- "$(cat "$dictfile")" fi fi } && - complete -F _dict -o default dict rdict + complete -F _comp_cmd_dict -o default dict rdict # ex: filetype=sh diff --git a/completions/dmypy b/completions/dmypy index 5abe37d..7fab74f 100644 --- a/completions/dmypy +++ b/completions/dmypy @@ -1,48 +1,49 @@ # dmypy completion -*- shell-script -*- -_dmypy() +_comp_cmd_dmypy() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --help | --version | -[hV]) return ;; --status-file) - _filedir + _comp_compgen_filedir return ;; esac - local cmd i + local cmd="" has_cmd="" i for ((i = 1; i < cword; i++)); do if [[ ${words[i]} != -* && ${words[i - 1]} != --status-file ]]; then cmd=${words[i]} + has_cmd=set break fi done case ${cmd-} in check | run) - _filedir '@(py|pyi)' + _comp_compgen_filedir '@(py|pyi)' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - if [[ ! -v cmd ]]; then - local cmds=$($1 --help 2>&1 | - command sed -ne '/positional arguments/{p;n;p;q}' | + if [[ ! $has_cmd ]]; then + local cmds=$("$1" --help 2>&1 | + command sed -ne '/positional arguments/{p;n;p;q;}' | command sed -ne 's/{\(.*\)}/\1/p') - COMPREPLY=($(IFS="," compgen -W '$cmds' -- "$cur")) + _comp_compgen -F , -- -W '$cmds' return fi } && - complete -F _dmypy dmypy + complete -F _comp_cmd_dmypy dmypy # ex: filetype=sh diff --git a/completions/dnssec-keygen b/completions/dnssec-keygen index 3f68a68..9db55b5 100644 --- a/completions/dnssec-keygen +++ b/completions/dnssec-keygen @@ -1,48 +1,48 @@ # bash completion for dnssec-keygen(8) -*- shell-script -*- -_dnssec_keygen_optarg() +_comp_cmd_dnssec_keygen__optarg() { local args=$("$1" -h 2>&1 | command sed -e 's/|/ /g' -e 's/(.*//' \ - -ne '/^[[:space:]]*'$2'/,/^[[:space:]]*[(-]/p' | - command sed -e 's/^[[:space:]]*'$2'.*://' -e '/^[[:space:]]*-/d') - COMPREPLY+=($(compgen -W '$args' -- "$cur")) + -ne '/^[[:space:]]*'"$2"'/,/^[[:space:]]*[(-]/p' | + command sed -e 's/^[[:space:]]*'"$2"'.*://' -e '/^[[:space:]]*-/d') + _comp_compgen -a -- -W '$args' } -_dnssec_keygen() +_comp_cmd_dnssec_keygen() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -[hbEgLpsPARIDSi]) return ;; -K) - _filedir -d + _comp_compgen_filedir -d return ;; -[ancdfTtm]) - _dnssec_keygen_optarg "$1" $prev + _comp_cmd_dnssec_keygen__optarg "$1" "$prev" return ;; -r) - cur=${cur:=/dev/} - _filedir + _comp_compgen -c "${cur:-/dev/}" filedir return ;; -v) - COMPREPLY=($(compgen -W '{0..10}' -- "$cur")) + _comp_compgen -- -W '{0..10}' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" | \ - command sed -e "s/:\$//")' -- "$cur")) + _comp_compgen -R help + ((${#COMPREPLY[@]})) && + _comp_compgen -- -W '"${COMPREPLY[@]%:}"' return fi } && - complete -F _dnssec_keygen dnssec-keygen + complete -F _comp_cmd_dnssec_keygen dnssec-keygen # ex: filetype=sh diff --git a/completions/dnsspoof b/completions/dnsspoof index 86ade91..9117b72 100644 --- a/completions/dnsspoof +++ b/completions/dnsspoof @@ -1,26 +1,26 @@ # dnsspoof completion -*- shell-script -*- -_dnsspoof() +_comp_cmd_dnsspoof() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -i) - _available_interfaces -a + _comp_compgen_available_interfaces -a return ;; -f) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage fi } && - complete -F _dnsspoof dnsspoof + complete -F _comp_cmd_dnsspoof dnsspoof # ex: filetype=sh diff --git a/completions/dot b/completions/dot index 8122229..dcb8436 100644 --- a/completions/dot +++ b/completions/dot @@ -1,9 +1,9 @@ # dot(1) completion -*- shell-script -*- -_dot() +_comp_cmd_dot() { - local cur prev words cword - _init_completion -n := || return + local cur prev words cword comp_args + _comp_initialize -n := -- "$@" || return [[ $prev == -[V?] ]] && return @@ -12,34 +12,35 @@ _dot() return ;; -T*) - local langs=($("$1" -TNON_EXISTENT 2>&1 | - command sed -ne 's/.*one of://p')) - COMPREPLY=($(compgen -P -T -W '${langs[@]}' -- "${cur#-T}")) + # generate langs + _comp_compgen -c "${cur#-T}" split -P "-T" -- "$( + "$1" -TNON_EXISTENT 2>&1 | command sed -ne 's/.*one of://p' + )" return ;; -K*) - local layouts=($("$1" -KNON_EXISTENT 2>&1 | - command sed -ne 's/.*one of://p')) - COMPREPLY=($(compgen -P -K -W '${layouts[@]}' -- "${cur#-K}")) + # generate layouts + _comp_compgen -c "${cur#-K}" split -P "-K" -- "$( + "$1" -KNON_EXISTENT 2>&1 | command sed -ne 's/.*one of://p' + )" return ;; -o*) - cur=${cur#-o} - _filedir - COMPREPLY=($(compgen -P -o -W '${COMPREPLY[@]}' -- "$cur")) + _comp_compgen -c "${cur#-o}" filedir && + COMPREPLY=("${COMPREPLY[@]/#/-o}") return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-V -v -G -N -E -T -K -l -o -O -P -q -s -y -n - -n1 -n2 -x -Lg -LO -Ln -LU -LC -LT -m -c -?' -- "$cur")) + _comp_compgen -- -W '-V -v -G -N -E -T -K -l -o -O -P -q -s -y -n -n1 + -n2 -x -Lg -LO -Ln -LU -LC -LT -m -c -?' [[ ${COMPREPLY-} == -@([GNETKo]|L[nUCT]) ]] && compopt -o nospace return fi - _filedir dot + _comp_compgen_filedir '@(gv|dot)' } && - complete -F _dot dot + complete -F _comp_cmd_dot dot # ex: filetype=sh diff --git a/completions/dpkg b/completions/dpkg index 0b90b14..7ce5c19 100644 --- a/completions/dpkg +++ b/completions/dpkg @@ -1,43 +1,67 @@ -# This function is required by _dpkg and _dpkg-reconfigure -*- shell-script -*- +# dpkg(1) and related commands completion -*- shell-script -*- -_have grep-status && { - _comp_dpkg_installed_packages() - { - grep-status -P -e "^$1" -a -FStatus 'ok installed' -n -s Package - } -} || { - _comp_dpkg_installed_packages() - { - command grep -A 1 "Package: $1" /var/lib/dpkg/status 2>/dev/null | - command grep -B 1 -Ee "ok installed|half-installed|unpacked| \ - half-configured" \ - -Ee "^Essential: yes" | - awk "/Package: $1/ { print \$2 }" 2>/dev/null - } +# @since 2.12 +_comp_xfunc_dpkg_compgen_installed_packages() +{ + _comp_compgen_split -- "$( + grep-status -P -e "^${cur-}" -a \ + -FStatus 'ok installed' \ + -n -s Package 2>/dev/null || + _comp_awk -F '\n' -v RS="" " + index(\$1, \"Package: ${cur-}\") == 1 && + \$2 ~ /ok installed|half-installed|unpacked|half-configured|^Essential: yes/ { + print(substr(\$1, 10)); + }" /var/lib/dpkg/status 2>/dev/null + )" +} + +# @since 2.12 +_comp_xfunc_dpkg_compgen_purgeable_packages() +{ + _comp_compgen_split -- "$( + grep-status -P -e "^${cur-}" -a \ + -FStatus 'ok installed' -o -FStatus 'ok config-files' \ + -n -s Package 2>/dev/null || + _comp_awk -F '\n' -v RS="" " + index(\$1, \"Package: ${cur-}\") == 1 && + \$2 ~ /ok installed|half-installed|unpacked|half-configured|config-files|^Essential: yes/ { + print(substr(\$1, 10)); + }" /var/lib/dpkg/status 2>/dev/null + )" +} + +# @since 2.12 +_comp_xfunc_dpkg_compgen_held_packages() +{ + _comp_compgen_split -- "$( + dpkg --get-selections ${cur:+"$cur}"} | + _comp_awk '{for(i=2;i<=NF;i++){ if($i=="hold"){ print $1;break }}}' + )" } -_have grep-status && { - _comp_dpkg_purgeable_packages() - { - grep-status -P -e "^$1" -a -FStatus 'ok installed' -o -FStatus 'ok config-files' -n -s Package - } -} || { - _comp_dpkg_purgeable_packages() - { - command grep -A 1 "Package: $1" /var/lib/dpkg/status 2>/dev/null | - command grep -B 1 -Ee "ok installed|half-installed|unpacked| \ - half-configured|config-files" \ - -Ee "^Essential: yes" | - awk "/Package: $1/ { print \$2 }" 2>/dev/null - } +# @deprecated 2.12 use _comp_xfunc_dpkg_compgen_installed_packages instead +_comp_dpkg_installed_packages() +{ + local COMPREPLY=() cur="${1-}" + # shellcheck disable=SC2119 + _comp_xfunc_dpkg_compgen_installed_packages + printf "%s\n" "${COMPREPLY[@]}" +} +# @deprecated 2.12 use _comp_xfunc_dpkg_compgen_purgeable_packages instead +_comp_dpkg_purgeable_packages() +{ + local COMPREPLY=() cur="${1-}" + # shellcheck disable=SC2119 + _comp_xfunc_dpkg_compgen_purgeable_packages + printf "%s\n" "${COMPREPLY[@]}" } # Debian dpkg(1) completion # -_dpkg() +_comp_cmd_dpkg() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return local i=$cword @@ -48,79 +72,111 @@ _dpkg() done fi + local noargopts='!(-*|*[ciAIfexXbsplWSrVLPD]*)' + # shellcheck disable=SC2254 case $prev in --install | --unpack | --record-avail | --contents | --info | --fsys-tarfile | \ - --field | --control | --extract | --vextract | --raw-extract | -!(-*)[ciAIfexX]) - _filedir '?(u|d)deb' + --field | --control | --extract | --vextract | --raw-extract | -${noargopts}[ciAIfexX]) + _comp_compgen_filedir '?(u|d)deb' return ;; - --build | -!(-*)b) - _filedir -d + --build | --admindir | --instdir | --root | -${noargopts}b) + _comp_compgen_filedir -d return ;; - --status | --print-avail | --list | -!(-*)[spl]) - COMPREPLY=($(_xfunc apt-cache _apt_cache_packages)) + --status | --print-avail | --list | -${noargopts}[spl]) + _comp_compgen -x apt-cache packages return ;; - --show | -!(-*)W) + --show | -${noargopts}W) if [[ $1 == *dpkg-query ]]; then - COMPREPLY=($(_xfunc apt-cache _apt_cache_packages)) + _comp_compgen -x apt-cache packages else - _filedir '?(u|d)deb' + _comp_compgen_filedir '?(u|d)deb' fi return ;; - --search | -!(-*)S) - _filedir + --search | -${noargopts}S) + _comp_compgen_filedir + return + ;; + --remove | --verify | -${noargopts}[rV]) + _comp_xfunc_dpkg_compgen_installed_packages return ;; - --remove | --verify | -!(-*)[rV]) - COMPREPLY=($(_comp_dpkg_installed_packages "$cur")) + --listfiles | --purge | -${noargopts}[LP]) + _comp_xfunc_dpkg_compgen_purgeable_packages return ;; - --listfiles | --purge | -!(-*)[LP]) - COMPREPLY=($(_comp_dpkg_purgeable_packages "$cur")) + --debug | -${noargopts}D) + _comp_compgen -- -W 'help' + return + ;; + --ignore-depends) + local packages + _comp_compgen -v packages -c "${cur##*,}" -x apt-cache packages + _comp_delimited , -W '"${packages[@]}"' + return + ;; + --log) + _comp_compgen_filedir log + return + ;; + --path-exclude | --path-include) + return + ;; + --status-logger) + _comp_compgen_commands + return + ;; + --verify-format) + _comp_compgen -- -W 'rpm' return ;; esac - $split && return + [[ $was_split ]] && return - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help + for i in ${!COMPREPLY[*]}; do + # remove ones ending with a dash (known parse issue, hard to fix) + [[ ${COMPREPLY[i]} != *- ]] || unset -v 'COMPREPLY[i]' + done [[ ${COMPREPLY-} == *= ]] && compopt -o nospace } && - complete -F _dpkg dpkg dpkg-deb dpkg-query + complete -F _comp_cmd_dpkg dpkg dpkg-deb dpkg-query -# Debian GNU dpkg-reconfigure(8) completion -# -_dpkg_reconfigure() +_comp_cmd_dpkg_reconfigure() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local opt + local noargopts='!(-*|*[fp]*)' + # shellcheck disable=SC2254 case $prev in - --frontend | -!(-*)f) - opt=($(printf '%s\n' /usr/share/perl5/Debconf/FrontEnd/*)) - opt=(${opt[@]##*/}) - opt=(${opt[@]%.pm}) - COMPREPLY=($(compgen -W '${opt[@]}' -- "$cur")) + --frontend | -${noargopts}f) + if _comp_expand_glob opt '/usr/share/perl5/Debconf/FrontEnd/*'; then + opt=("${opt[@]##*/}") + opt=("${opt[@]%.pm}") + _comp_compgen -- -W '"${opt[@]}"' + fi return ;; - --priority | -!(-*)p) - COMPREPLY=($(compgen -W 'low medium high critical' -- "$cur")) + --priority | -${noargopts}p) + _comp_compgen -- -W 'low medium high critical' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--frontend --priority --all --unseen-only - --help --showold --force --terse' -- "$cur")) + _comp_compgen -- -W '--frontend --priority --all --unseen-only --help + --showold --force --terse' else - COMPREPLY=($(_comp_dpkg_installed_packages "$cur")) + _comp_xfunc_dpkg_compgen_installed_packages fi } && - complete -F _dpkg_reconfigure -o default dpkg-reconfigure + complete -F _comp_cmd_dpkg_reconfigure -o default dpkg-reconfigure # ex: filetype=sh diff --git a/completions/dpkg-source b/completions/dpkg-source index 05fa3a1..c9131b2 100644 --- a/completions/dpkg-source +++ b/completions/dpkg-source @@ -1,9 +1,9 @@ # Debian dpkg-source completion -*- shell-script -*- -_dpkg_source() +_comp_cmd_dpkg_source() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local options word action packopts unpackopts fields @@ -29,13 +29,11 @@ _dpkg_source() unpack) case $prev in -x) - _filedir -d - _filedir 'dsc' + _comp_compgen_filedir 'dsc' ;; *) - COMPREPLY=($(compgen -W "$unpackopts" -- "$cur")) - _filedir -d - _filedir + _comp_compgen -- -W "$unpackopts" + _comp_compgen -a filedir ;; esac return @@ -43,7 +41,7 @@ _dpkg_source() pack) case $prev in -b) - _filedir -d + _comp_compgen_filedir -d ;; -c | -l | -T | -i | -I) # -c: get controlfile @@ -52,12 +50,11 @@ _dpkg_source() # -i: <regexp> filter out files to ignore diffs of. # -I: filter out files when building tarballs. # return directory names and file names - _filedir -d - _filedir + _comp_compgen_filedir ;; -F) # -F: force change log format - COMPREPLY=($(command ls /usr/lib/dpkg/parsechangelog)) + _comp_compgen_split -- "$(command ls /usr/lib/dpkg/parsechangelog)" ;; -V) # -V: set a substitution variable @@ -72,27 +69,26 @@ _dpkg_source() # $cur contains a "=" COMPREPLY=() else - COMPREPLY=($(compgen -W "$fields" -- "$cur")) + _comp_compgen -- -W "$fields" fi ;; -U) # -U: remove a field # Suggest possible fieldnames - COMPREPLY=($(compgen -W "$fields" -- "$cur")) + _comp_compgen -- -W "$fields" ;; *) - COMPREPLY=($(compgen -W "$packopts $unpackopts" \ - -- "$cur")) + _comp_compgen -- -W '$packopts $unpackopts' ;; esac return ;; *) - COMPREPLY=($(compgen -W "$options" -- "$cur")) + _comp_compgen -- -W "$options" return ;; esac } && - complete -F _dpkg_source dpkg-source + complete -F _comp_cmd_dpkg_source dpkg-source # ex: filetype=sh diff --git a/completions/dselect b/completions/dselect index 4c18026..554ab21 100644 --- a/completions/dselect +++ b/completions/dselect @@ -1,29 +1,28 @@ # Debian Linux dselect(8) completion -*- shell-script -*- -_dselect() +_comp_cmd_dselect() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --admindir) - _filedir -d + _comp_compgen_filedir -d return ;; -D | -debug) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help else - COMPREPLY=($(compgen -W 'access update select install config remove - quit' -- "$cur")) + _comp_compgen -- -W 'access update select install config remove quit' fi } && - complete -F _dselect dselect + complete -F _comp_cmd_dselect dselect # ex: filetype=sh diff --git a/completions/dsniff b/completions/dsniff index 749c533..f09eac2 100644 --- a/completions/dsniff +++ b/completions/dsniff @@ -1,26 +1,27 @@ # dsniff completion -*- shell-script -*- -_dsniff() +_comp_cmd_dsniff() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -r | -w | -f | -p) - _filedir + _comp_compgen_filedir return ;; -i) - _available_interfaces -a + _comp_compgen_available_interfaces -a return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1") -r -w -p' -- "$cur")) + _comp_compgen_usage + _comp_compgen -a -- -W '-r -w -p' fi } && - complete -F _dsniff dsniff + complete -F _comp_cmd_dsniff dsniff # ex: filetype=sh diff --git a/completions/dumpdb b/completions/dumpdb index eb1927f..0390b4e 100644 --- a/completions/dumpdb +++ b/completions/dumpdb @@ -1,18 +1,17 @@ # mailman dumpdb completion -*- shell-script -*- -_dumpdb() +_comp_cmd_dumpdb() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--marshal --pickle --noprint --help' \ - -- "$cur")) + _comp_compgen -- -W '--marshal --pickle --noprint --help' else - _filedir + _comp_compgen_filedir fi } && - complete -F _dumpdb dumpdb + complete -F _comp_cmd_dumpdb dumpdb # ex: filetype=sh diff --git a/completions/dumpe2fs b/completions/dumpe2fs index 413a5bf..326564e 100644 --- a/completions/dumpe2fs +++ b/completions/dumpe2fs @@ -1,28 +1,27 @@ # dumpe2fs(8) completion -*- shell-script -*- -_dumpe2fs() +_comp_cmd_dumpe2fs() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*[oV]) return ;; -*i) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage return fi - cur=${cur:=/dev/} - _filedir + _comp_compgen -c "${cur:-/dev/}" filedir } && - complete -F _dumpe2fs dumpe2fs + complete -F _comp_cmd_dumpe2fs dumpe2fs # ex: filetype=sh diff --git a/completions/e2freefrag b/completions/e2freefrag index c89dc9c..7fa4841 100644 --- a/completions/e2freefrag +++ b/completions/e2freefrag @@ -1,9 +1,9 @@ # e2freefrag(8) completion -*- shell-script -*- -_e2freefrag() +_comp_cmd_e2freefrag() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -c | -h) @@ -12,13 +12,12 @@ _e2freefrag() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" -h)' -- "$cur")) + _comp_compgen_usage -- -h return fi - cur=${cur:=/dev/} - _filedir + _comp_compgen -c "${cur:-/dev/}" filedir } && - complete -F _e2freefrag e2freefrag + complete -F _comp_cmd_e2freefrag e2freefrag # ex: filetype=sh diff --git a/completions/e2label b/completions/e2label index ac8e4b5..456907c 100644 --- a/completions/e2label +++ b/completions/e2label @@ -1,15 +1,14 @@ # e2label(8) completion -*- shell-script -*- -_e2label() +_comp_cmd_e2label() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if ((cword == 1)); then - cur=${cur:=/dev/} - _filedir + _comp_compgen -c "${cur:-/dev/}" filedir fi } && - complete -F _e2label e2label + complete -F _comp_cmd_e2label e2label # ex: filetype=sh diff --git a/completions/ebtables b/completions/ebtables index de6bc54..24f3fe7 100644 --- a/completions/ebtables +++ b/completions/ebtables @@ -1,47 +1,49 @@ # bash completion for ebtables -*- shell-script -*- -_ebtables() +_comp_cmd_ebtables() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return - local table chain='s/^Bridge chain: \([^ ,]\{1,\}\).*$/\1/p' \ + local table="" chain='s/^Bridge chain: \([^ ,]\{1,\}\).*$/\1/p' \ targets='ACCEPT DROP CONTINUE RETURN' + local IFS=$' \t\n' # for ${table:+-t "$table"} [[ ${words[*]} =~ [[:space:]]-(t|-table=?)[[:space:]]*([^[:space:]]+) ]] && - table="-t ${BASH_REMATCH[2]}" + table=${BASH_REMATCH[2]} + local noargopts='!(-*|*[AIDPFXLZtj]*)' + # shellcheck disable=SC2254 case $prev in - -!(-*)[AIDPFXLZ]) - COMPREPLY=($(compgen -W '`"$1" $table -L 2>/dev/null | \ - command sed -ne "$chain"`' -- "$cur")) + -${noargopts}[AIDPFXLZ]) + _comp_compgen_split -- "$( + "$1" ${table:+-t "$table"} -L 2>/dev/null | + command sed -ne "$chain" + )" ;; - -!(-*)t) - COMPREPLY=($(compgen -W 'nat filter broute' -- "$cur")) + -${noargopts}t) + _comp_compgen -- -W 'nat filter broute' ;; - -!(-*)j) - if [[ $table == "-t filter" || -z $table ]]; then - COMPREPLY=($(compgen -W '$targets - $("$1" $table -L 2>/dev/null | \ - command sed -n -e "s/INPUT\|OUTPUT\|FORWARD//" \ - -e "$chain")' \ - -- "$cur")) - elif [[ $table == "-t nat" ]]; then - COMPREPLY=($(compgen -W '$targets - $("$1" $table -L 2>/dev/null | \ - command sed -n -e "s/OUTPUT|PREROUTING|POSTROUTING//" \ - -e "$chain")' \ - -- "$cur")) - elif [[ $table == "-t broute" ]]; then - COMPREPLY=($(compgen -W 'ACCEPT DROP - $("$1" $table -L 2>/dev/null | \ - command sed -n -e "s/BROUTING//" -e "$chain")' \ - -- "$cur")) + -${noargopts}j) + if [[ $table == "filter" || ! $table ]]; then + _comp_compgen -- -W '$targets' + _comp_compgen -a split -- "$("$1" ${table:+-t "$table"} -L \ + 2>/dev/null | command sed -n -e \ + "s/INPUT\|OUTPUT\|FORWARD//" -e "$chain")" + elif [[ $table == "nat" ]]; then + _comp_compgen -- -W '$targets' + _comp_compgen -a split -- "$("$1" -t "$table" -L 2>/dev/null | + command sed -n -e "s/OUTPUT|PREROUTING|POSTROUTING//" \ + -e "$chain")" + elif [[ $table == "broute" ]]; then + _comp_compgen -- -W 'ACCEPT DROP' + _comp_compgen -a split -- "$("$1" -t "$table" -L 2>/dev/null | + command sed -n -e "s/BROUTING//" -e "$chain")" fi ;; *) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--802_3-sap --802_3-type --among-dst + _comp_compgen -- -W '--802_3-sap --802_3-type --among-dst --among-dst-file --among-src --among-src-file --append --arp-gratuitous --arp-htype --arp-ip-dst --arp-ip-src --arp-mac-dst --arp-mac-src --arp-opcode --arp-ptype --arpreply-mac @@ -67,12 +69,12 @@ _ebtables() --stp-sender-prio --stp-type --table --to-destination --to-dst --to-source --to-src --ulog --ulog-cprange --ulog-nlgroup --ulog-prefix --ulog-qthreshold --version --vlan-encap --vlan-id - --vlan-prio --zero' -- "$cur")) + --vlan-prio --zero' fi ;; esac } && - complete -F _ebtables ebtables + complete -F _comp_cmd_ebtables ebtables # ex: filetype=sh diff --git a/completions/ecryptfs-migrate-home b/completions/ecryptfs-migrate-home index d2eeb38..7566d6b 100644 --- a/completions/ecryptfs-migrate-home +++ b/completions/ecryptfs-migrate-home @@ -1,22 +1,22 @@ # ecryptfs-migrate-home(8) completion -*- shell-script -*- -_ecryptfs_migrate_home() +_comp_cmd_ecryptfs_migrate_home() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --help) return ;; --user | -u) - COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen -- -u return ;; esac - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help } && - complete -F _ecryptfs_migrate_home ecryptfs-migrate-home + complete -F _comp_cmd_ecryptfs_migrate_home ecryptfs-migrate-home # ex: filetype=sh diff --git a/completions/eog b/completions/eog index 2330e1a..14c448d 100644 --- a/completions/eog +++ b/completions/eog @@ -1,9 +1,9 @@ # eog(1) completion -*- shell-script -*- -_eog() +_comp_cmd_eog() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -'?' | --help | --help-all | --help-gtk) @@ -11,16 +11,16 @@ _eog() ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" --help-all)' -- "$cur")) + _comp_compgen_help -- --help-all [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir '@(ani|?(w)bmp|gif|ico|j2[ck]|jp[cefgx2]|jpeg|jpg2|pcx|p[gp]m|pn[gm]|ras|svg?(z)|tga|tif?(f)|x[bp]m)' + _comp_compgen_filedir '@(ani|avif|?(w)bmp|gif|hei[cf]|ico|j2[ck]|jp[cefgx2]|jpeg|jpg2|jxl|pcx|p[bgp]m|pn[gm]|ras|svg?(z)|tga|tif?(f)|webp|x[bp]m)' } && - complete -F _eog eog + complete -F _comp_cmd_eog eog # ex: filetype=sh diff --git a/completions/ether-wake b/completions/ether-wake index d952673..d2c7f83 100644 --- a/completions/ether-wake +++ b/completions/ether-wake @@ -1,13 +1,13 @@ # ether-wake(8) completion -*- shell-script -*- -_ether_wake() +_comp_cmd_ether_wake() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return case $prev in -i) - _available_interfaces -a + _comp_compgen_available_interfaces -a return ;; -p) @@ -16,12 +16,13 @@ _ether_wake() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -u) -V' -- "$cur")) + _comp_compgen_help -- -u + _comp_compgen -a -- -W '-V' return fi - _mac_addresses + _comp_compgen_mac_addresses } && - complete -F _ether_wake ether-wake etherwake + complete -F _comp_cmd_ether_wake ether-wake etherwake # ex: filetype=sh diff --git a/completions/evince b/completions/evince index 1c97dd9..49b67ac 100644 --- a/completions/evince +++ b/completions/evince @@ -1,32 +1,34 @@ # evince(1) completion -*- shell-script -*- -_evince() +_comp_cmd_evince() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[pil]*)' + # shellcheck disable=SC2254 case $prev in --help* | --sm-client-id | --class | --name | --screen | --gdk-debug | \ --gdk-no-debug | --gtk-module | --gtk-debug | --gtk-no-debug | --page-label | \ - --page-index | --find | --display | -!(-*)[hpil]) + --page-index | --find | --display | -${noargopts}[hpil]) return ;; --sm-client-state-file) - _filedir + _comp_compgen_filedir return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" --help-all)' -- "$cur")) + _comp_compgen_help -- --help-all [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir '@(@(?(e)ps|?(E)PS|[pf]df|[PF]DF|dvi|DVI)?(.gz|.GZ|.bz2|.BZ2|.xz|.XZ)|cb[rz]|djv?(u)|gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx)' + _comp_compgen_filedir '@(@(?(e)ps|?(E)PS|[pf]df|[PF]DF|dvi|DVI)?(.gz|.GZ|.bz2|.BZ2|.xz|.XZ)|cb[7rtz]|djv?(u)|tif?(f)|?(o)xps)' } && - complete -F _evince evince + complete -F _comp_cmd_evince evince # ex: filetype=sh diff --git a/completions/export b/completions/export index 8d82361..0f692c9 100644 --- a/completions/export +++ b/completions/export @@ -1,11 +1,11 @@ # bash export completion -*- shell-script -*- -_export() +_comp_cmd_export() { - local cur prev words cword - _init_completion -n = || return + local cur prev words cword comp_args + _comp_initialize -n := -- "$@" || return - local i action=variable remove=false + local i action=variable remove="" for ((i = 1; i < cword; i++)); do case ${words[i]} in -p) @@ -15,7 +15,7 @@ _export() action=function ;;& -*n*) - remove=true + remove=set ;; -*) continue @@ -25,41 +25,40 @@ _export() done if [[ $cur == *=* ]]; then - local ocur=$cur oprev=$prev - prev=${cur%%=*} cur=${cur#*=} - _variables && return - cur=$ocur prev=$oprev + _comp_variable_assignments "$cur" && return fi case $cur in *=) - local pval=$(quote "$(eval printf %s \"\$\{${cur%=}-\}\")") + local pname=${cur%=} + local REPLY + _comp_quote "${!pname-}" + local pval=$REPLY # Complete previous value if it's not empty. if [[ $pval != \'\' ]]; then COMPREPLY=("$pval") else - cur=${cur#*=} - _filedir + _comp_compgen -c "${cur#*=}" filedir fi ;; *=*) - cur=${cur#*=} - _filedir + _comp_compgen -c "${cur#*=}" filedir ;; *) if [[ $cword -eq 1 && $cur == -* ]]; then - COMPREPLY=($(compgen -W '-p $(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage -c help -s "$1" + _comp_compgen -a -- -W '-p' return fi local suffix="" - if ! $remove; then + if [[ ! $remove && $action != function ]]; then suffix="=" compopt -o nospace fi - COMPREPLY=($(compgen -A $action -S "$suffix" -- "$cur")) + _comp_compgen -- -A $action -S "$suffix" ;; esac } && - complete -F _export export + complete -F _comp_cmd_export export # ex: filetype=sh diff --git a/completions/faillog b/completions/faillog index c8b81bd..5343613 100644 --- a/completions/faillog +++ b/completions/faillog @@ -1,27 +1,29 @@ # faillog(8) completion -*- shell-script -*- -_faillog() +_comp_cmd_faillog() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[lmtu]*)' + # shellcheck disable=SC2254 case $prev in - --help | --lock-time | --maximum | --time | -!(-*)[hlmt]) + --help | --lock-time | --maximum | --time | -${noargopts}[hlmt]) return ;; - --user | -!(-*)u) - COMPREPLY=($(compgen -u -- "$cur")) + --user | -${noargopts}u) + _comp_compgen -- -u return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _faillog faillog + complete -F _comp_cmd_faillog faillog # ex: filetype=sh diff --git a/completions/fbgs b/completions/fbgs index 1947b87..66bcbbb 100644 --- a/completions/fbgs +++ b/completions/fbgs @@ -1,30 +1,29 @@ # bash completion for fbgs(1) -*- shell-script -*- -_fbgs() +_comp_cmd_fbgs() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case "$prev" in -f | --font) - local IFS=$'\n' - COMPREPLY=($(compgen -W '$(fc-list 2>/dev/null)' -- "$cur")) + _comp_compgen_split -l -- "$(fc-list 2>/dev/null)" return ;; -m | --mode) - COMPREPLY=($(compgen -W '$(command sed \ - -n "/^mode/{s/^mode \{1,\}\"\([^\"]\{1,\}\)\"/\1/g;p}" \ - /etc/fb.modes 2>/dev/null)' -- "$cur")) + _comp_compgen_split -- "$(command sed \ + -n '/^mode/{s/^mode \{1,\}"\([^"]\{1,\}\)"/\1/g;p}' \ + /etc/fb.modes 2>/dev/null)" return ;; -d | --device) - COMPREPLY=($(compgen -f -d -- "${cur:-/dev/}")) + _comp_compgen -c "${cur:-/dev/}" -- -f -d return ;; -fp | --firstpage | -lp | --lastpage | -r | --resolution | -s | --scroll | -t | \ --timeout) # expect integer value - COMPREPLY+=($(compgen -W '{0..9}')) + _comp_compgen -aR -- -W '{0..9}' compopt -o nospace return ;; @@ -35,16 +34,16 @@ _fbgs() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--bell --help --password -fp --firstpage - -lp --lastpage --color -l -xl -xxl --resolution --autozoom + _comp_compgen -- -W '--bell --help --password -fp --firstpage -lp + --lastpage --color -l -xl -xxl --resolution --autozoom --{,no}autoup --{,no}autodown --{,no}fitwidth --{,no}verbose --{,no}random --vt --scroll --timeout --{,no}once --gamma --font - --device --mode' -- "$cur")) + --device --mode' [[ ${COMPREPLY-} ]] && return fi - _filedir '?(e)ps|pdf' + _comp_compgen_filedir '?(e)ps|pdf' } && - complete -F _fbgs fbgs + complete -F _comp_cmd_fbgs fbgs # ex: filetype=sh diff --git a/completions/fbi b/completions/fbi index 455887a..275395e 100644 --- a/completions/fbi +++ b/completions/fbi @@ -1,32 +1,31 @@ # bash completion for fbi(1) -*- shell-script -*- -_fbi() +_comp_cmd_fbi() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case "$prev" in -l | --list) - _filedir + _comp_compgen_filedir return ;; -r | --resolution) - COMPREPLY+=($(compgen -W '{1..5}')) + _comp_compgen -aR -- -W '{1..5}' return ;; -f | --font) - local IFS=$'\n' - COMPREPLY=($(compgen -W '$(fc-list 2>/dev/null)' -- "$cur")) + _comp_compgen_split -l -- "$(fc-list 2>/dev/null)" return ;; -m | --mode) - COMPREPLY=($(compgen -W '$(command sed \ - -n "/^mode/{s/^mode \{1,\}\"\([^\"]\{1,\}\)\"/\1/g;p}" \ - /etc/fb.modes 2>/dev/null)' -- "$cur")) + _comp_compgen_split -- "$(command sed \ + -n '/^mode/{s/^mode \{1,\}"\([^"]\{1,\}\)"/\1/g;p}' \ + /etc/fb.modes 2>/dev/null)" return ;; -d | --device) - COMPREPLY=($(compgen -f -d -- "${cur:-/dev/}")) + _comp_compgen -c "${cur:-/dev/}" -- -f -d return ;; --cachemem | --blend | -T | --vt | -s | --scroll | -t | --timeout | -g | --gamma) @@ -36,19 +35,18 @@ _fbi() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--help --version --store --list --text - --autozoom --{,no}autoup --{,no}autodown --{,no}fitwidth - --{,no}verbose --{,no}random --{,no}comments --{,no}edit - --{,no}backup --{,no}preserve --{,no}readahead --cachemem --blend - --vt --scroll --timeout --{,no}once --resolution --gamma --font - --device --mode' -- "$cur")) + _comp_compgen -- -W '--help --version --store --list --text --autozoom + --{,no}autoup --{,no}autodown --{,no}fitwidth --{,no}verbose + --{,no}random --{,no}comments --{,no}edit --{,no}backup + --{,no}preserve --{,no}readahead --cachemem --blend --vt --scroll + --timeout --{,no}once --resolution --gamma --font --device --mode' [[ ${COMPREPLY-} ]] && return fi # FIXME: It is hard to determine correct supported extensions. # fbi can handle any format that imagemagick can plus some others - _filedir 'bmp|gif|jp?(e)g|pcd|png|p[pgb]m|tif?(f)|webp|xpm|xwd|?(e)ps|pdf|dvi|txt|svg?(z)|cdr|[ot]tf' + _comp_compgen_filedir 'bmp|gif|jp?(e)g|pcd|png|p[pgb]m|tif?(f)|webp|xpm|xwd|?(e)ps|pdf|dvi|txt|svg?(z)|cdr|[ot]tf' } && - complete -F _fbi fbi + complete -F _comp_cmd_fbi fbi # ex: filetype=sh diff --git a/completions/feh b/completions/feh index f1d4b18..3762574 100644 --- a/completions/feh +++ b/completions/feh @@ -1,110 +1,108 @@ # bash completion for feh(1) -*- shell-script -*- -_feh() +_comp_cmd_feh() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[foO|KCjeM@TSRHWEyJabgLD~^]*)' + # shellcheck disable=SC2254 case "$prev" in --image-bg | -B) - COMPREPLY=($(compgen -W 'checks white black' -- "$cur")) + _comp_compgen -- -W 'checks white black' return ;; - --filelist | --output | --output-only | --start-at | -!(-*)[foO\|]) - _filedir + --filelist | --output | --output-only | --start-at | -${noargopts}[foO\|]) + _comp_compgen_filedir return ;; - --caption-path | --fontpath | --output-dir | -!(-*)[KCj]) - _filedir -d + --caption-path | --fontpath | --output-dir | -${noargopts}[KCj]) + _comp_compgen_filedir -d return ;; - --font | --menu-font | --title-font | -!(-*)[eM@]) + --font | --menu-font | --title-font | -${noargopts}[eM@]) # expect string like "dejavu.ttf/12" if [[ $cur == */* ]]; then # expect integer value - COMPREPLY=($(compgen -P "$cur" -W '{0..9}')) + _comp_compgen -R -- -P "$cur" -W '{0..9}' compopt -o nospace return fi local font_path # font_path="$(imlib2-config --prefix 2>/dev/null)/share/imlib2/data/fonts" - # COMPREPLY=( $(cd "$font_path" 2>/dev/null; compgen -f \ - # -X "!*.@([tT][tT][fF])" -S / -- "$cur") ) + # _comp_compgen -C "$font_path" -- -f -X "!*.@([tT][tT][fF])" -S / for ((i = ${#words[@]} - 1; i > 0; i--)); do if [[ ${words[i]} == -@(C|-fontpath) ]]; then font_path="${words[i + 1]}" - COMPREPLY+=($( - cd "$font_path" 2>/dev/null - compgen -f \ - -X "!*.@([tT][tT][fF])" -S / -- "$cur" - )) + _comp_compgen -aC "$font_path" -- \ + -f -X "!*.@([tT][tT][fF])" -S / fi done compopt -o nospace return ;; - --theme | -!(-*)T) + --theme | -${noargopts}T) local conf_path=~/.config/feh/themes local theme_name theme_opts [[ -r $conf_path ]] || return - while read theme_name theme_opts; do + while read -r theme_name theme_opts; do if [[ $theme_name == '#'* || $theme_name == "" ]]; then continue fi - COMPREPLY+=($(compgen -W "$theme_name" -- "$cur")) + _comp_compgen -a -- -W "$theme_name" done <"$conf_path" return ;; - --sort | -!(-*)S) - COMPREPLY=($(compgen -W 'name filename mtime width height - pixels size format' -- "$cur")) + --sort | -${noargopts}S) + _comp_compgen -- -W 'name filename mtime width height pixels size + format' return ;; --reload | --limit-height | --limit-width | --thumb-height | --thumb-width | \ - --thumb-redraw | --magick-timeout | -!(-*)[RHWEyJ]) + --thumb-redraw | --magick-timeout | -${noargopts}[RHWEyJ]) # expect integer value - COMPREPLY+=($(compgen -W '{0..9}')) + _comp_compgen -aR -- -W '{0..9}' compopt -o nospace return ;; --zoom) # expect integer value or "max", "fill" - COMPREPLY=($(compgen -W 'max fill' -- "$cur")) + _comp_compgen -- -W 'max fill' if [[ ! $cur || ! ${COMPREPLY-} ]]; then - COMPREPLY+=($(compgen -W '{0..9}')) + _comp_compgen -aR -- -W '{0..9}' compopt -o nospace fi return ;; - --alpha | -!(-*)a) - COMPREPLY=($(compgen -W '{0..255}' -- "$cur")) + --alpha | -${noargopts}a) + _comp_compgen -- -W '{0..255}' return ;; - --bg | -!(-*)b) - _filedir - COMPREPLY+=($(compgen -W 'trans' -- "$cur")) + --bg | -${noargopts}b) + _comp_compgen_filedir + _comp_compgen -a -- -W 'trans' return ;; - --geometry | --max-dimension | --min-dimension | -!(-*)g) + --geometry | --max-dimension | --min-dimension | -${noargopts}g) # expect string like 640x480 if [[ $cur && $cur != *x* ]]; then COMPREPLY=(x) fi - COMPREPLY+=($(compgen -W "{0..9}")) + _comp_compgen -aR -- -W "{0..9}" compopt -o nospace return ;; --customlist | --index-info | --info | --slideshow-delay | --thumb-title | \ - --title | -!(-*)[LD~^]) + --title | -${noargopts}[LD~^]) # argument required but no completions available return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then # Some versions of feh just output "See 'man feh'" for --help :( - COMPREPLY=($(compgen -W '$(_parse_help "$1" --help)' -- "$cur")) + _comp_compgen_help if [[ ${COMPREPLY-} ]]; then [[ $COMPREPLY == *= ]] && compopt -o nospace return @@ -113,8 +111,8 @@ _feh() # FIXME: It is hard to determine correct supported extensions. # feh can handle any format that imagemagick can plus some others - _filedir 'xpm|tif?(f)|png|p[npgba]m|iff|?(i)lbm|jp?(e)g|jfi?(f)|gif|bmp|arg?(b)|tga|xcf|ani|ico|?(e)ps|pdf|dvi|txt|svg?(z)|cdr|[ot]tf' + _comp_compgen_filedir 'xpm|tif?(f)|png|p[npgba]m|iff|?(i)lbm|jp?(e)g|jfi?(f)|gif|bmp|arg?(b)|tga|xcf|ani|ico|?(e)ps|pdf|dvi|txt|svg?(z)|cdr|[ot]tf|ff?(.gz|.bz2)|webp|y4m|hei[cf]?(s)|avif?(s)' } && - complete -F _feh feh + complete -F _comp_cmd_feh feh # ex: filetype=sh diff --git a/completions/file b/completions/file index 21fbd16..7b07d40 100644 --- a/completions/file +++ b/completions/file @@ -1,32 +1,34 @@ # file(1) completion -*- shell-script -*- -_file() +_comp_cmd_file() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[Fmfe]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | --separator | -!(-*)[vF]) + --help | --version | --separator | -${noargopts}[vF]) return ;; - --magic-file | --files-from | -!(-*)[mf]) - _filedir + --magic-file | --files-from | -${noargopts}[mf]) + _comp_compgen_filedir return ;; - --exclude | -!(-*)e) - COMPREPLY=($(compgen -W 'apptype ascii cdf compress elf encoding - soft tar text tokens troff' -- "$cur")) + --exclude | -${noargopts}e) + _comp_compgen -- -W 'apptype ascii cdf compress elf encoding soft + tar text tokens troff' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - _filedir + _comp_compgen_filedir } && - complete -F _file file + complete -F _comp_cmd_file file # ex: filetype=sh diff --git a/completions/file-roller b/completions/file-roller index 1d223fd..cd745ac 100644 --- a/completions/file-roller +++ b/completions/file-roller @@ -1,42 +1,44 @@ # file-roller(1) completion -*- shell-script -*- -_file_roller() +_comp_cmd_file_roller() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return - local exts='@(7z|ace|alz|ar|arj|[bglx]z|bz2|tb?(z)2|cab|cb[rz]|iso?(9660)|Z|t[abglx]z|cpio|deb|rar|?(g)tar|gem|lh[az]|lz[4h]|?(t)lrz|lzma|lzo|wim|swm|rpm|sit|zoo)' + local exts='@(7z?(.001)|ace|alz|ar|arj|[bglx]z|bz2|tb?(z)2|cab|cb[rz]|iso?(9660)|Z|t[abglx]z|cpio|deb|rar|?(g)tar|gem|lh[az]|lz[4h]|?(t)lrz|lzma|lzo|wim|swm|rpm|sit|zoo|?(t)zst)' + local noargopts='!(-*|*[ae]*)' + # shellcheck disable=SC2254 case $prev in - --help | --help-all | --help-gtk | --help-sm-client | -!(-*)'?') + --help | --help-all | --help-gtk | --help-sm-client | -${noargopts}'?') return ;; --sm-client-state-file) - _filedir + _comp_compgen_filedir return ;; - --add-to | -!(-*)a) - _filedir_xspec unzip - _filedir "$exts" + --add-to | -${noargopts}a) + _comp_compgen_filedir_xspec unzip + _comp_compgen -a filedir "$exts" return ;; - --extract-to | --default-dir | -!(-*)e) - _filedir -d + --extract-to | --default-dir | -${noargopts}e) + _comp_compgen_filedir -d return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" --help-all)' -- "$cur")) + _comp_compgen_help -- --help-all [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir_xspec unzip - _filedir "$exts" + _comp_compgen_filedir_xspec unzip + _comp_compgen -a filedir "$exts" } && - complete -F _file_roller file-roller + complete -F _comp_cmd_file_roller file-roller # ex: filetype=sh diff --git a/completions/filefrag b/completions/filefrag index d26e8c8..6de8a19 100644 --- a/completions/filefrag +++ b/completions/filefrag @@ -1,17 +1,17 @@ # filefrag(8) completion -*- shell-script -*- -_filefrag() +_comp_cmd_filefrag() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage return fi - _filedir + _comp_compgen_filedir } && - complete -F _filefrag filefrag + complete -F _comp_cmd_filefrag filefrag # ex: filetype=sh diff --git a/completions/filesnarf b/completions/filesnarf index f959d80..d4c1cb0 100644 --- a/completions/filesnarf +++ b/completions/filesnarf @@ -1,22 +1,22 @@ # filesnarf etc completion -*- shell-script -*- -_snarf() +_comp_cmd_snarf() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -i) - _available_interfaces -a + _comp_compgen_available_interfaces -a return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage fi } && - complete -F _snarf filesnarf mailsnarf msgsnarf + complete -F _comp_cmd_snarf filesnarf mailsnarf msgsnarf # ex: filetype=sh diff --git a/completions/find b/completions/find index 64121ed..92c7fa8 100644 --- a/completions/find +++ b/completions/find @@ -2,53 +2,53 @@ # This makes heavy use of ksh style extended globs and contains Linux specific # code for completing the parameter to the -fstype option. -_find() +_comp_cmd_find() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local i - for i in ${!words[*]}; do + for ((i = 1; i < cword; i++)); do if [[ ${words[i]} == -@(exec|ok)?(dir) ]]; then - _command_offset $((i + 1)) + _comp_command_offset $((i + 1)) return fi done case $prev in -maxdepth | -mindepth) - COMPREPLY=($(compgen -W '{0..9}' -- "$cur")) + _comp_compgen -- -W '{0..9}' return ;; -newer | -anewer | -cnewer | -fls | -fprint | -fprint0 | -fprintf | -name | -[il]name | \ -ilname | -wholename | -[il]wholename | -samefile) - _filedir + _comp_compgen_filedir return ;; -fstype) - _fstypes + _comp_compgen_fstypes [[ $OSTYPE == *bsd* ]] && - COMPREPLY+=($(compgen -W 'local rdonly' -- "$cur")) + _comp_compgen -a -- -W 'local rdonly' return ;; -gid) - _gids + _comp_compgen_gids return ;; -group) - COMPREPLY=($(compgen -g -- "$cur" 2>/dev/null)) + _comp_compgen -- -g return ;; -xtype | -type) - COMPREPLY=($(compgen -W 'b c d p f l s' -- "$cur")) + _comp_compgen -- -W 'b c d p f l s' return ;; -uid) - _uids + _comp_compgen_uids return ;; -user) - COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen -- -u return ;; -[acm]min | -[acm]time | -inum | -path | -ipath | -regex | -iregex | -links | -perm | \ @@ -57,35 +57,34 @@ _find() return ;; -regextype) - COMPREPLY=($(compgen -W 'emacs posix-awk posix-basic posix-egrep - posix-extended' -- "$cur")) + _comp_compgen -- -W 'emacs posix-awk posix-basic posix-egrep + posix-extended' return ;; esac - local i exprfound=false + local i exprfound="" # set exprfound to true if there is already an expression present for i in "${words[@]}"; do - [[ $i == [-\(\),\!]* ]] && exprfound=true && break + [[ $i == [-\(\),\!]* ]] && exprfound=set && break done # handle case where first parameter is not a dash option - if ! $exprfound && [[ $cur != [-\(\),\!]* ]]; then - _filedir -d + if [[ ! $exprfound && $cur != [-\(\),\!]* ]]; then + _comp_compgen_filedir -d return fi # complete using basic options - COMPREPLY=($(compgen -W '-daystart -depth -follow -help - -ignore_readdir_race -maxdepth -mindepth -mindepth -mount - -noignore_readdir_race -noleaf -regextype -version -warn -nowarn -xdev - -amin -anewer -atime -cmin -cnewer -ctime -empty -executable -false - -fstype -gid -group -ilname -iname -inum -ipath -iregex -iwholename - -links -lname -mmin -mtime -name -newer -nogroup -nouser -path -perm - -readable -regex -samefile -size -true -type -uid -used -user - -wholename -writable -xtype -context -delete -exec -execdir -fls - -fprint -fprint0 -fprintf -ls -ok -okdir -print -print0 -printf -prune - -quit' -- "$cur")) + _comp_compgen -- -W '-daystart -depth -follow -help -ignore_readdir_race + -maxdepth -mindepth -mindepth -mount -noignore_readdir_race -noleaf + -regextype -version -warn -nowarn -xdev -amin -anewer -atime -cmin + -cnewer -ctime -empty -executable -false -fstype -gid -group -ilname + -iname -inum -ipath -iregex -iwholename -links -lname -mmin -mtime + -name -newer -nogroup -nouser -path -perm -readable -regex -samefile + -size -true -type -uid -used -user -wholename -writable -xtype -context + -delete -exec -execdir -fls -fprint -fprint0 -fprintf -ls -ok -okdir + -print -print0 -printf -prune -quit' if ((${#COMPREPLY[@]} != 0)); then # this removes any options from the list of completions that have @@ -100,14 +99,14 @@ _find() for i in "${words[@]}"; do [[ $i && -v onlyonce["$i"] ]] || continue for j in "${!COMPREPLY[@]}"; do - [[ ${COMPREPLY[j]} == "$i" ]] && unset 'COMPREPLY[j]' + [[ ${COMPREPLY[j]} == "$i" ]] && unset -v 'COMPREPLY[j]' done done fi - _filedir + _comp_compgen -a filedir } && - complete -F _find find + complete -F _comp_cmd_find find # ex: filetype=sh diff --git a/completions/find_member b/completions/find_member index cf30c70..d2620e8 100644 --- a/completions/find_member +++ b/completions/find_member @@ -1,25 +1,27 @@ # mailman find_member completion -*- shell-script -*- -_find_member() +_comp_cmd_find_member() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -l | -x | --listname | --exclude) - _xfunc list_lists _mailman_lists + # Prefer `list_lists` in the same dir as command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_compgen -x list_lists mailman_lists return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--listname --exclude --owners --help' \ - -- "$cur")) + _comp_compgen -- -W '--listname --exclude --owners --help' fi } && - complete -F _find_member find_member + complete -F _comp_cmd_find_member find_member # ex: filetype=sh diff --git a/completions/fio b/completions/fio index f81a4da..7fbcdd4 100644 --- a/completions/fio +++ b/completions/fio @@ -1,90 +1,147 @@ # fio(1) completion -*- shell-script -*- -_fio() +_comp_cmd_fio__compgen_engines() { - local cur prev words cword split - _init_completion -s || return + _comp_compgen_split -l -- "$("$1" --enghelp 2>/dev/null | command sed -ne '/^[[:space:]]/p'))" +} +_comp_cmd_fio() +{ + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + + local REPLY case $prev in --help | --version) return ;; --debug) - local prefix= - [[ $cur == *,* ]] && prefix="${cur%,*}," - COMPREPLY=($(compgen -W "process file io mem blktrace verify - random parse diskutil job mutex profile time net rate compress - steadystate helperthread" -- "${cur##*,}")) - ((${#COMPREPLY[@]} == 1)) && COMPREPLY=(${COMPREPLY/#/$prefix}) + local opts=$("$1" --debug=help 2>/dev/null) + opts=${opts##*:} + _comp_delimited , -W "${opts//,/ }" return ;; --output-format) - COMPREPLY=($(compgen -W "terse json json+ normal" -- "$cur")) + _comp_compgen -- -W "terse json json+ normal" return ;; --terse-version) - COMPREPLY=($(compgen -W "2 3" -- "$cur")) + _comp_compgen -- -W "2 3 4 5" + return + ;; + --crctest) + _comp_compgen_split -- "$("$1" --crctest=nonexistent 2>/dev/null)" return ;; --cmdhelp) - # TODO more commands? - COMPREPLY=($(compgen -W "all" -- "$cur")) + _comp_compgen_split -- "$("$1" --cmdhelp=all 2>/dev/null | _comp_awk '{print $1}') all" return ;; --enghelp) - # TODO print ioengine help, or list available ioengines - # TODO engine,help arg + _comp_cmd_fio__compgen_engines "$1" return ;; --eta) - COMPREPLY=($(compgen -W "always never auto" -- "$cur")) + _comp_compgen -- -W "always never auto" return ;; --daemonize) - _filedir pid + _comp_compgen_filedir pid return ;; --client) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; --remote-config) - _filedir job + _comp_compgen_filedir '@(fio|job)' return ;; --idle-prof) - COMPREPLY=($(compgen -W "system percpu calibrate" -- "$cur")) + _comp_compgen -- -W "system percpu calibrate" return ;; --inflate-log) - _filedir log + _comp_compgen_filedir log return ;; --trigger-file) - _filedir + _comp_compgen_filedir return ;; --trigger | --trigger-remote) - compopt -o filenames - COMPREPLY=($(compgen -c -- "$cur")) + _comp_compgen_commands return ;; --aux-path) - _filedir -d + _comp_compgen_filedir -d return ;; + --ioengine) + _comp_cmd_fio__compgen_engines "$1" + return + ;; + --exec_postrun | --exec_prerun) + _comp_compgen_commands + return + ;; + --uid) + _comp_compgen_uids + return + ;; + --gid) + _comp_compgen_gids + return + ;; + --?*) + local -a cmdhelp + _comp_split -l cmdhelp "$("$1" --cmdhelp="${prev#--}" 2>/dev/null)" + case ${cmdhelp[*]-} in + *"showing closest match"*) + # ignore + ;; + *" type: boolean "* | *" type: empty or boolean "*) + _comp_compgen -- -W '0 1' + return + ;; + *" valid values:"*) + # For example, for --kb_base=: + # valid values: 1024 [...] + # : 1000 [...] + local line="" in_values="" + REPLY=() + for line in "${cmdhelp[@]}"; do + if [[ $in_values ]]; then + if [[ $line =~ ^[[:space:]]*:[[:space:]]*([^[:space:]]+) ]]; then + REPLY+=("${BASH_REMATCH[1]}") + else + break + fi + elif [[ $line =~ ^[[:space:]]*valid\ values:[[:space:]]*([^[:space:]]+) ]]; then + in_values=set + REPLY+=("${BASH_REMATCH[1]}") + fi + done + _comp_compgen -- -W '"${REPLY[@]}"' + return + ;; + esac + # else fallthrough + ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help + _comp_compgen -a split -- "$("$1" --cmdhelp=all 2>/dev/null | + _comp_awk '{printf "--%s=\n", $1}')" [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir job + _comp_compgen_filedir '@(fio|job)' } && - complete -F _fio fio + complete -F _comp_cmd_fio fio # ex: filetype=sh diff --git a/completions/firefox b/completions/firefox index 4656f8d..e84d644 100644 --- a/completions/firefox +++ b/completions/firefox @@ -1,46 +1,53 @@ # firefox completion -*- shell-script -*- -_firefox() +_comp_cmd_firefox() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return [[ $cur == -MOZ_LOG*=* ]] && prev=${cur%%=*} cur=${cur#*=} case $prev in --help | --version | --display | --UILocale | -MOZ_LOG | --new-window | --new-tab | \ --private-window | --window-size | --search | --start-debugger-server | \ - --recording | --debugger-args | -[hvPa]) + --recording | --debugger-args | -[hva]) + return + ;; + -P) + _comp_compgen_split -- "$( + _comp_awk -F = '$1 == "Name" { print $2 }' \ + ~/.mozilla/firefox/profiles.ini 2>/dev/null + )" return ;; --profile | --screenshot) - _filedir -d + _comp_compgen_filedir -d return ;; -MOZ_LOG_FILE) - _filedir log + _comp_compgen_filedir log return ;; - --recording-file) - _filedir + --recording-output | --recording-file) + _comp_compgen_filedir return ;; --debugger | -d) - COMPREPLY=($(compgen -c -- "$cur")) + _comp_compgen_commands return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir "@(?([xs])htm?(l)|pdf|txt)" + _comp_compgen_filedir "@(?([xs])htm?(l)|pdf|txt|svg)" } && - complete -F _firefox firefox mozilla-firefox iceweasel + complete -F _comp_cmd_firefox firefox firefox-esr iceweasel mozilla-firefox # ex: filetype=sh diff --git a/completions/flake8 b/completions/flake8 index 045c409..6889e86 100644 --- a/completions/flake8 +++ b/completions/flake8 @@ -1,42 +1,46 @@ # flake8 completion -*- shell-script -*- -_flake8() +_comp_cmd_flake8() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[j]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | -!(-*)h) + --help | --version | -${noargopts}h) return ;; --format) - COMPREPLY=($(compgen -W 'default pylint' -- "$cur")) + _comp_compgen -- -W 'default pylint' return ;; - --jobs | -!(-*)j) - COMPREPLY=($(compgen -W "auto {1..$(_ncpus)}" -- "$cur")) + --jobs | -${noargopts}j) + local REPLY + _comp_get_ncpus + _comp_compgen -- -W "auto {1..$REPLY}" return ;; --output-file | --append-config | --config) - _filedir + _comp_compgen_filedir return ;; --include-in-doctest | --exclude-from-doctest) - _filedir py + _comp_compgen_filedir py return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir py + _comp_compgen_filedir py } && - complete -F _flake8 flake8 + complete -F _comp_cmd_flake8 flake8 # ex: filetype=sh diff --git a/completions/freebsd-update b/completions/freebsd-update index d5be861..8ccc949 100644 --- a/completions/freebsd-update +++ b/completions/freebsd-update @@ -2,18 +2,18 @@ [[ $OSTYPE == *freebsd* ]] || return 1 -_freebsd_update() +_comp_cmd_freebsd_update() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -b | -d) - _filedir -d + _comp_compgen_filedir -d return ;; -f) - _filedir + _comp_compgen_filedir return ;; -k | -r | -s | -t) @@ -21,9 +21,8 @@ _freebsd_update() ;; esac - COMPREPLY=($(compgen -W "fetch cron upgrade install rollback IDS" -- \ - $cur)) + _comp_compgen -- -W 'fetch cron upgrade install rollback IDS' } && - complete -F _freebsd_update freebsd-update + complete -F _comp_cmd_freebsd_update freebsd-update # ex: filetype=sh diff --git a/completions/freeciv b/completions/freeciv index 01af311..2dedf37 100644 --- a/completions/freeciv +++ b/completions/freeciv @@ -1,41 +1,41 @@ # freeciv client completions -*- shell-script -*- -_freeciv() +_comp_cmd_freeciv() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --help | --version | --name | --port | -[hvnp]) return ;; --file | --log | --music | --read | --Sound | --tiles | -[flmrSt]) - _filedir + _comp_compgen_filedir return ;; --Announce | -A) - COMPREPLY=($(compgen -W 'IPv4 IPv6 none' -- "$cur")) + _comp_compgen -- -W 'IPv4 IPv6 none' return ;; --debug | -d) - COMPREPLY=($(compgen -W '{0..3}' -- "$cur")) + _comp_compgen -- -W '{0..3}' return ;; --Meta | --server | -[Ms]) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; --Plugin | -P) - COMPREPLY=($(compgen -W 'none esd sdl' -- "$cur")) + _comp_compgen -- -W 'none esd sdl' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help fi } && - complete -F _freeciv freeciv{,-{gtk{2,3},sdl,xaw}} civclient + complete -F _comp_cmd_freeciv freeciv{,-{gtk{2,3},sdl,xaw}} civclient # ex: filetype=sh diff --git a/completions/freeciv-server b/completions/freeciv-server index a34b5a2..fd91fa0 100644 --- a/completions/freeciv-server +++ b/completions/freeciv-server @@ -1,22 +1,22 @@ # freeciv-server completion -*- shell-script -*- -_civserver() +_comp_cmd_civserver() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -f | -g | -l | -r | --file | --log | --gamelog | --read) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help fi } && - complete -F _civserver civserver freeciv-server + complete -F _comp_cmd_civserver civserver freeciv-server # ex: filetype=sh diff --git a/completions/function b/completions/function index 6ae5271..218f0cf 100644 --- a/completions/function +++ b/completions/function @@ -1,37 +1,17 @@ # bash shell function completion -*- shell-script -*- -_function() +_comp_cmd_function() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - if [[ $1 == @(declare|typeset) ]]; then - if [[ $cur == [-+]* ]]; then - local opts - opts=($(_parse_usage "$1")) - # Most options also have a '+' form. We'll exclude the ones that don't with compgen. - opts+=(${opts[*]/-/+}) - COMPREPLY=($(compgen -W "${opts[*]}" -X '+[Ffgp]' -- "$cur")) - else - local i=1 - while [[ ${words[i]} == [-+]* ]]; do - if [[ ${words[i]} == -*[fF]* ]]; then - COMPREPLY=($(compgen -A function -- "$cur")) - return - fi - ((i++)) - done - if ((i > 1)); then - # There was at least one option and it was not one that limited operations to functions - COMPREPLY=($(compgen -A variable -- "$cur")) - fi - fi - elif ((cword == 1)); then - COMPREPLY=($(compgen -A function -- "$cur")) + if ((cword == 1)); then + _comp_compgen -- -A function else - COMPREPLY=("() $(type -- ${words[1]} | command sed -e 1,2d)") + local funcdef=$(type -- "${words[1]}" 2>/dev/null | command sed -e 1,2d) + COMPREPLY=("()${funcdef:+ $funcdef}") fi } && - complete -F _function function declare typeset + complete -F _comp_cmd_function function # ex: filetype=sh diff --git a/completions/fusermount b/completions/fusermount index 7e48922..4f85319 100644 --- a/completions/fusermount +++ b/completions/fusermount @@ -1,28 +1,27 @@ # fusermount completion -*- shell-script -*- -_fusermount() +_comp_cmd_fusermount() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*[hVo]) return ;; -*u) - COMPREPLY=($(compgen -W "$(awk \ - '{ if ($3 ~ /^fuse(\.|$)/) print $2 }' /etc/mtab \ - 2>/dev/null)" -- "$cur")) + _comp_compgen_split -- "$(_comp_awk \ + '{ if ($3 ~ /^fuse(\.|$)/) print $2 }' /etc/mtab 2>/dev/null)" return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + _comp_compgen_help -- -h else - _filedir -d + _comp_compgen_filedir -d fi } && - complete -F _fusermount fusermount + complete -F _comp_cmd_fusermount fusermount # ex: filetype=sh diff --git a/completions/gcc b/completions/gcc index fa95274..ed5bc9b 100644 --- a/completions/gcc +++ b/completions/gcc @@ -1,26 +1,26 @@ # gcc(1) completion -*- shell-script -*- -_gcc() +_comp_cmd_gcc() { - local cur prev prev2 words cword argument prefix prefix_length - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return # Test that GCC is recent enough and if not fallback to # parsing of --completion option. - if ! $1 --completion=" " 2>/dev/null; then + if ! "$1" --completion=" " 2>/dev/null; then if [[ $cur == -* ]]; then - local cc=$($1 -print-prog-name=cc1 2>/dev/null) + local cc=$("$1" -print-prog-name=cc1 2>/dev/null) [[ $cc ]] || return - COMPREPLY=($(compgen -W "$($cc --help 2>/dev/null | tr '\t' ' ' | - command sed -e '/^ *-/!d' -e 's/ *-\([^][ <>]*\).*/-\1/')" \ - -- "$cur")) + _comp_compgen_split -- "$("$cc" --help 2>/dev/null | tr '\t' ' ' | + command sed -e '/^ *-/!d' -e 's/ *-\([^][ <>]*\).*/-\1/')" [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - _filedir + _comp_compgen_filedir fi return fi + local prev2 argument="" prefix prefix_length # extract also for situations like: -fsanitize=add if ((cword > 2)); then prev2="${COMP_WORDS[cword - 2]}" @@ -44,32 +44,34 @@ _gcc() prefix="$prev " fi - if [[ ! -v argument ]]; then - _filedir + if [[ ! $argument ]]; then + _comp_compgen_filedir else # In situation like '-fsanitize=add' $cur is equal to last token. # Thus we need to strip the beginning of suggested option. prefix_length=$((${#prefix} + 1)) - local flags=$($1 --completion="$argument" | cut -c $prefix_length-) + local flags=$("$1" --completion="$argument" | cut -c $prefix_length-) [[ ${flags} == "=*" ]] && compopt -o nospace 2>/dev/null - COMPREPLY=($(compgen -W "$flags" -- "")) + _comp_compgen -R -- -W "$flags" fi } && - complete -F _gcc gcc{,-5,-6,-7,-8} g++{,-5,-6,-7,-8} g77 g95 \ + complete -F _comp_cmd_gcc gcc{,-5,-6,-7,-8} g++{,-5,-6,-7,-8} g77 g95 \ gccgo{,-5,-6,-7,-8} gcj gfortran{,-5,-6,-7,-8} gpc && + _comp_cmd_gcc__setup_cmd() { - cc --version 2>/dev/null | command grep -q GCC || - [[ $(_realcommand cc) == *gcc* ]] && - complete -F _gcc cc || complete -F _minimal cc - c++ --version 2>/dev/null | command grep -q GCC || - [[ $(_realcommand c++) == *g++* ]] && - complete -F _gcc c++ || complete -F _minimal c++ - f77 --version 2>/dev/null | command grep -q GCC || - [[ $(_realcommand f77) == *gfortran* ]] && - complete -F _gcc f77 || complete -F _minimal f77 - f95 --version 2>/dev/null | command grep -q GCC || - [[ $(_realcommand f95) == *gfortran* ]] && - complete -F _gcc f95 || complete -F _minimal f95 - } + local REPLY + _comp_realcommand "$1" + if [[ $REPLY == *$2* ]] || + "$1" --version 2>/dev/null | command grep -q GCC; then + complete -F _comp_cmd_gcc "$1" + else + complete -F _comp_complete_minimal "$1" + fi + } && + _comp_cmd_gcc__setup_cmd cc gcc && + _comp_cmd_gcc__setup_cmd c++ g++ && + _comp_cmd_gcc__setup_cmd f77 gfortran && + _comp_cmd_gcc__setup_cmd f95 gfortran && + unset -f _comp_cmd_gcc__setup_cmd # ex: filetype=sh diff --git a/completions/gcl b/completions/gcl index 73a18b2..7b98767 100644 --- a/completions/gcl +++ b/completions/gcl @@ -2,20 +2,20 @@ # bash programmable completion for various Common Lisp implementations by # Nikodemus Siivola <nikodemus@random-state.net> -_gcl() +_comp_cmd_gcl() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return # completing an option (may or may not be separated by a space) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-eval -load -f -batch -dir -libdir -compile - -o-file -c-file -h-file -data-file -system-p' -- "$cur")) + _comp_compgen -- -W '-eval -load -f -batch -dir -libdir -compile + -o-file -c-file -h-file -data-file -system-p' else - _filedir + _comp_compgen_filedir fi } && - complete -F _gcl -o default gcl + complete -F _comp_cmd_gcl -o default gcl # ex: filetype=sh diff --git a/completions/gdb b/completions/gdb index f78f8a5..e6a124f 100644 --- a/completions/gdb +++ b/completions/gdb @@ -1,47 +1,46 @@ # bash completion for gdb -*- shell-script -*- -_gdb() +_comp_cmd_gdb() { - local cur prev words cword i - _init_completion || return + local cur prev words cword comp_args i + _comp_initialize -- "$@" || return # gdb [options] --args executable-file [inferior-arguments ...] for ((i = 1; i < cword; i++)); do if [[ ${words[i]} == --args ]]; then - _command_offset $((i + 1)) + _comp_command_offset $((i + 1)) return $? fi done # gdb [options] [executable-file [core-file or process-id]] if ((cword == 1)); then - local IFS compopt -o filenames - if [[ $cur == */* ]]; then + if _comp_looks_like_path "$cur"; then # compgen -c works as expected if $cur contains any slashes. - IFS=$'\n' - COMPREPLY=($(PATH="$PATH:." compgen -d -c -- "$cur")) + local PATH="$PATH:." + _comp_compgen_commands else # otherwise compgen -c contains Bash's built-in commands, # functions and aliases. Thus we need to retrieve the program # names manually. - IFS=":" - local path_array=($( - command sed -e 's/:\{2,\}/:/g' -e 's/^://' -e 's/:$//' <<<"$PATH" - )) - IFS=$'\n' - COMPREPLY=($(compgen -d -W '$(find "${path_array[@]}" . \ - -mindepth 1 -maxdepth 1 -not -type d -executable \ - -printf "%f\\n" 2>/dev/null)' -- "$cur")) + local path_array + _comp_compgen -Rv path_array split -F : -X '' -S /. -- "$PATH" + _comp_compgen_split -o plusdirs -- "$( + # Note: ${v+"$@"} does not work with empty IFS in bash < 4.4 + IFS=$' \t\n' + find ${path_array[@]+"${path_array[@]}"} . -name . -o \ + -type d -prune -o -perm -u+x -print 2>/dev/null | + command sed 's|^.*/||' | sort -u + )" fi elif ((cword == 2)); then - COMPREPLY=($(compgen -W "$(command ps axo comm,pid | - awk '{if ($1 ~ /^'"${prev##*/}"'/) print $2}')" -- "$cur")) + _comp_compgen_split -- "$(command ps axo comm,pid | + _comp_awk '{if ($1 ~ /^'"${prev##*/}"'/) print $2}')" compopt -o filenames - COMPREPLY+=($(compgen -f -X '!?(*/)core?(.?*)' -o plusdirs \ - -- "$cur")) + _comp_compgen -a -- -f -X '!?(*/)core?(.?*)' -o plusdirs fi } && - complete -F _gdb gdb + complete -F _comp_cmd_gdb gdb # ex: filetype=sh diff --git a/completions/genaliases b/completions/genaliases index 5953b9e..0fec30d 100644 --- a/completions/genaliases +++ b/completions/genaliases @@ -1,15 +1,15 @@ # mailman genaliases completion -*- shell-script -*- -_genaliases() +_comp_cmd_genaliases() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--quiet --help' -- "$cur")) + _comp_compgen -- -W '--quiet --help' fi } && - complete -F _genaliases genaliases + complete -F _comp_cmd_genaliases genaliases # ex: filetype=sh diff --git a/completions/gendiff b/completions/gendiff index d37793f..9fea862 100644 --- a/completions/gendiff +++ b/completions/gendiff @@ -1,12 +1,12 @@ # gendiff(1) completion -*- shell-script -*- -_gendiff() +_comp_cmd_gendiff() { - local cur prev words cword - _init_completion -o '@(diff|patch)' || return + local cur prev words cword comp_args + _comp_initialize -o '@(diff|patch)' -- "$@" || return - ((cword == 1)) && _filedir -d + ((cword == 1)) && _comp_compgen_filedir -d } && - complete -F _gendiff gendiff + complete -F _comp_cmd_gendiff gendiff # ex: filetype=sh diff --git a/completions/genisoimage b/completions/genisoimage index dfa39c0..d54fdf6 100644 --- a/completions/genisoimage +++ b/completions/genisoimage @@ -1,38 +1,38 @@ # bash completion for mkisofs/genisoimage -*- shell-script -*- -_mkisofs() +_comp_cmd_mkisofs() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -o | -abstract | -biblio | -check-session | -copyright | -log-file | \ -root-info | -prep-boot | -*-list) - _filedir + _comp_compgen_filedir return ;; -*-charset) - COMPREPLY=($(compgen -W '$(mkisofs -input-charset \ - help 2>&1 | tail -n +3)' -- "$cur")) + _comp_compgen_split -- "$(mkisofs -input-charset help 2>&1 | + tail -n +3)" return ;; -uid) - _uids + _comp_compgen_uids return ;; -gid) - _gids + _comp_compgen_gids return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help else - _filedir + _comp_compgen_filedir fi } && - complete -F _mkisofs mkisofs genisoimage + complete -F _comp_cmd_mkisofs mkisofs genisoimage # ex: filetype=sh diff --git a/completions/geoiplookup b/completions/geoiplookup index c60be89..504c22a 100644 --- a/completions/geoiplookup +++ b/completions/geoiplookup @@ -1,33 +1,33 @@ # geoiplookup(1) completion -*- shell-script -*- -_geoiplookup() +_comp_cmd_geoiplookup() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -h | -'?' | -v) return ;; -d) - _filedir -d + _comp_compgen_filedir -d return ;; -f) - _filedir dat + _comp_compgen_filedir dat return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" -h)' -- "$cur")) + _comp_compgen_usage -- -h return fi local ipvx [[ $1 == *6 ]] && ipvx=-6 || ipvx=-4 - _known_hosts_real $ipvx -- "$cur" + _comp_compgen_known_hosts $ipvx -- "$cur" } && - complete -F _geoiplookup geoiplookup geoiplookup6 + complete -F _comp_cmd_geoiplookup geoiplookup geoiplookup6 # ex: filetype=sh diff --git a/completions/getconf b/completions/getconf index de1ad2d..230b0f4 100644 --- a/completions/getconf +++ b/completions/getconf @@ -1,32 +1,33 @@ # getconf(1) completion -*- shell-script -*- -_getconf() +_comp_cmd_getconf() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -a) - _filedir + _comp_compgen_filedir return ;; -v) - COMPREPLY=($(compgen -W \ - '$("$1" -a 2>/dev/null | awk "{ print \$1 }")' -- \ - "${cur:-POSIX_V}")) + _comp_compgen -c "${cur:-POSIX_V}" split -- "$( + "$1" -a 2>/dev/null | _comp_awk '{ print $1 }' + )" return ;; esac if [[ $prev == PATH_MAX ]]; then # TODO more path vars, better handling - _filedir + _comp_compgen_filedir elif [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-a -v' -- "$cur")) + _comp_compgen -- -W '-a -v' else - COMPREPLY=($(compgen -W \ - '$("$1" -a 2>/dev/null | awk "{ print \$1 }")' -- "$cur")) + _comp_compgen_split -- "$( + "$1" -a 2>/dev/null | _comp_awk '{ print $1 }' + )" fi } && - complete -F _getconf getconf + complete -F _comp_cmd_getconf getconf # ex: filetype=sh diff --git a/completions/getent b/completions/getent index 4c54a24..4310434 100644 --- a/completions/getent +++ b/completions/getent @@ -1,17 +1,19 @@ # bash completion for getent -*- shell-script -*- -_getent() +_comp_cmd_getent() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return - local i db + local noargopts='!(-*|*[s]*)' + local i db="" has_db="" for ((i = 1; i < cword; i++)); do + # shellcheck disable=SC2254 case ${words[i]} in - --version | --usage | --help | -!(-*)[V?]) + --version | --usage | --help | -${noargopts}[V?]) return ;; - --service | -!(-*)s) + --service | -${noargopts}s) ((i++)) ;; -*) ;; @@ -19,35 +21,35 @@ _getent() *) # First non-option value is the db db=${words[i]} + has_db=set break ;; esac done - case ${db-} in + case $db in passwd) - COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen -- -u return ;; group) - COMPREPLY=($(compgen -g -- "$cur")) + _comp_compgen -- -g return ;; services) - COMPREPLY=($(compgen -s -- "$cur")) + _comp_compgen -- -s return ;; hosts) - COMPREPLY=($(compgen -A hostname -- "$cur")) + _comp_compgen -- -A hostname return ;; protocols | networks | ahosts | ahostsv4 | ahostsv6 | rpc) - COMPREPLY=($(compgen -W "$($1 $db | - awk '{ print $1 }')" -- "$cur")) + _comp_compgen_split -- "$("$1" "$db" | _comp_awk '{ print $1 }')" return ;; aliases | shadow | gshadow) - COMPREPLY=($(compgen -W "$($1 $db | cut -d: -f1)" -- "$cur")) + _comp_compgen_split -- "$("$1" "$db" | cut -d: -f1)" return ;; ethers | netgroup) @@ -55,23 +57,24 @@ _getent() ;; esac + # shellcheck disable=SC2254 case $prev in - -s | --service) + -${noargopts}s | --service) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace - elif [[ ! -v db ]]; then - COMPREPLY=($(compgen -W 'passwd group hosts services protocols - networks ahosts ahostsv4 ahostsv6 aliases ethers netgroup rpc - shadow gshadow' -- "$cur")) + elif [[ ! $has_db ]]; then + _comp_compgen -- -W 'passwd group hosts services protocols networks + ahosts ahostsv4 ahostsv6 aliases ethers netgroup rpc shadow + gshadow' fi } && - complete -F _getent getent + complete -F _comp_cmd_getent getent # ex: filetype=sh diff --git a/completions/gkrellm b/completions/gkrellm index c38c5ae..81781fb 100644 --- a/completions/gkrellm +++ b/completions/gkrellm @@ -1,25 +1,25 @@ # gkrellm(1) completion -*- shell-script -*- -_gkrellm() +_comp_cmd_gkrellm() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -t | --theme) - _filedir -d + _comp_compgen_filedir -d return ;; -p | --plugin) - _filedir so + _comp_compgen_filedir so return ;; -s | --server) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -l | --logfile) - _filedir + _comp_compgen_filedir return ;; -g | --geometry | -c | --config | -P | --port | -d | --debug-level) @@ -32,8 +32,8 @@ _gkrellm() ;; esac - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help } && - complete -F _gkrellm gkrellm gkrellm2 + complete -F _comp_cmd_gkrellm gkrellm gkrellm2 # ex: filetype=sh diff --git a/completions/gm b/completions/gm index b86c9cc..7dbaceb 100644 --- a/completions/gm +++ b/completions/gm @@ -1,21 +1,21 @@ # bash completion for gm(1) -*- shell-script -*- -_gm_commands() +_comp_cmd_gm__commands() { - COMPREPLY+=($(compgen -W '$("$1" help | - awk "/^ +[^ ]+ +- / { print \$1 }")' -- "$cur")) + _comp_compgen -a split -- "$("$1" help | + _comp_awk '/^ +[^ ]+ +- / { print $1 }')" } -_gm() +_comp_cmd_gm() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if ((cword == 1)); then - _gm_commands "$1" + _comp_cmd_gm__commands "$1" return elif [[ $cword -eq 2 && ${words[1]} == time ]]; then - _gm_commands "$1" + _comp_cmd_gm__commands "$1" return fi @@ -24,7 +24,7 @@ _gm() case $gmcmd in help) - [[ $prev == help ]] && _gm_commands "$1" + [[ $prev == help ]] && _comp_cmd_gm__commands "$1" return ;; version) @@ -32,9 +32,9 @@ _gm() ;; esac - # TODO... defer some commnds to the imagemagick "gm"less completions etc? + # TODO... defer some commands to the imagemagick "gm"less completions etc? compopt -o default } && - complete -F _gm gm + complete -F _comp_cmd_gm gm # ex: filetype=sh diff --git a/completions/gnatmake b/completions/gnatmake index 5f4b963..bbeccef 100644 --- a/completions/gnatmake +++ b/completions/gnatmake @@ -1,26 +1,26 @@ # Gnatmake completion -*- shell-script -*- # by Ralf_Schroth@t-online.de (Ralf Schroth) -_gnatmake() +_comp_cmd_gnatmake() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then # relevant (and less relevant ;-) )options completion - COMPREPLY=($(compgen -W '-a -c -f -i -j -k -m -M -n -o -q -s -v -z - -aL -A -aO -aI -I -I- -L -nostdinc -nostdlib -cargs -bargs -largs + _comp_compgen -- -W '-a -c -f -i -j -k -m -M -n -o -q -s -v -z -aL -A + -aO -aI -I -I- -L -nostdinc -nostdlib -cargs -bargs -largs -fstack-check -fno-inline -g -O1 -O0 -O2 -O3 -gnata -gnatA -gnatb -gnatc -gnatd -gnatD -gnate -gnatE -gnatf -gnatF -gnatg -gnatG -gnath -gnati -gnatk -gnatl -gnatL -gnatm -gnatn -gnato -gnatO -gnatp -gnatP -gnatq -gnatR -gnats -gnatt -gnatT -gnatu -gnatU -gnatv -gnatws -gnatwe -gnatwl -gnatwu -gnatW -gnatx -gnatX -gnaty - -gnatz -gnatZ -gnat83' -- "$cur")) + -gnatz -gnatZ -gnat83' else # source file completion - _filedir '@(adb|ads)' + _comp_compgen_filedir '@(adb|ads)' fi } && - complete -F _gnatmake gnatmake + complete -F _comp_cmd_gnatmake gnatmake # ex: filetype=sh diff --git a/completions/gnokii b/completions/gnokii index 039141a..21fb13c 100644 --- a/completions/gnokii +++ b/completions/gnokii @@ -1,19 +1,19 @@ # gnokii(1) completion -*- shell-script -*- -_gnokii_memory_type() +_comp_cmd_gnokii__memory_type() { # TODO: reduce the number of choices - COMPREPLY=($(compgen -W "IN OU SM ME MT" -- "$cur")) + _comp_compgen -- -W "IN OU SM ME MT" } -_gnokii() +_comp_cmd_gnokii() { - local cur prev words cword pprev tprev fprev - _init_completion || return + local cur prev words cword comp_args pprev tprev fprev + _comp_initialize -- "$@" || return case $prev in --config) - _filedir + _comp_compgen_filedir return ;; --phone) @@ -24,15 +24,13 @@ _gnokii() [[ -f $config_file ]] && break done [[ ! -f $config_file ]] && return - COMPREPLY=($(compgen -W \ - "$(command sed -n 's/^\[phone_\(.*\)\]/\1/p' $config_file)" \ - -- "$cur")) + _comp_compgen_split -- "$(command sed -n \ + 's/^\[phone_\(.*\)\]/\1/p' "$config_file")" return ;; --help) - COMPREPLY=($(compgen -W 'all monitor sms mms phonebook calendar - todo dial profile settings wap logo ringtone security file - other' -- "$cur")) + _comp_compgen -- -W 'all monitor sms mms phonebook calendar todo + dial profile settings wap logo ringtone security file other' return ;; --version | --shell | ping) @@ -41,15 +39,14 @@ _gnokii() # MONITOR --monitor) - COMPREPLY=($(compgen -W 'delay once' -- "$cur")) + _comp_compgen -- -W 'delay once' return ;; --getdisplaystatus | --displayoutput) return ;; --netmonitor) - COMPREPLY=($(compgen -W 'reset off field devel next nr' \ - -- "$cur")) + _comp_compgen -- -W 'reset off field devel next nr' return ;; @@ -59,13 +56,13 @@ _gnokii() return ;; --savesms) - COMPREPLY=($(compgen -W '--sender --smsc --smscno --folder - --location --sent --read --deliver --datetime' -- "$cur")) + _comp_compgen -- -W '--sender --smsc --smscno --folder --location + --sent --read --deliver --datetime' return ;; --memory-type | --memory | --getsms | --deletesms | --getmms | --deletemms | \ --getphonebook | --deletephonebook) - _gnokii_memory_type + _comp_cmd_gnokii__memory_type return ;; --getsmsc | --getcalendarnote | --deletecalendarnote | --gettodo | \ @@ -82,12 +79,12 @@ _gnokii() return ;; --writephonebook) - COMPREPLY=($(compgen -W '--overwrite --find-free --memory-type - --location --vcard --ldif' -- "$cur")) + _comp_compgen -- -W '--overwrite --find-free --memory-type + --location --vcard --ldif' return ;; --writecalendarnote | --writetodo) - _filedir vcf + _comp_compgen_filedir vcf return ;; @@ -97,7 +94,7 @@ _gnokii() return ;; --divert) - COMPREPLY=($(compgen -W '--op' -- "$cur")) + _comp_compgen -- -W '--op' return ;; @@ -112,7 +109,7 @@ _gnokii() # SETTINGS --reset) - COMPREPLY=($(compgen -W 'soft hard' -- "$cur")) + _comp_compgen -- -W 'soft hard' return ;; --setdatetime | --setalarm) @@ -131,12 +128,11 @@ _gnokii() # LOGOS --sendlogo) - COMPREPLY=($(compgen -W 'caller op picture' -- "$cur")) + _comp_compgen -- -W 'caller op picture' return ;; --setlogo | --getlogo) - COMPREPLY=($(compgen -W 'op startup caller dealer text' \ - -- "$cur")) + _comp_compgen -- -W 'op startup caller dealer text' return ;; --viewlogo) @@ -145,7 +141,7 @@ _gnokii() ;; --entersecuritycode) - COMPREPLY=($(compgen -W 'PIN PIN2 PUK PUK2 SEC' -- "$cur")) + _comp_compgen -- -W 'PIN PIN2 PUK PUK2 SEC' return ;; @@ -157,7 +153,7 @@ _gnokii() pprev=${words[cword - 2]} case $pprev in --setspeeddial) - _gnokii_memory_type + _comp_cmd_gnokii__memory_type return ;; --getsms | --deletesms | --getmms | --deletemms | --getphonebook | \ @@ -166,16 +162,15 @@ _gnokii() return ;; --gettodo | --getcalendarnote) - COMPREPLY=($(compgen -W '{1..9} end --vCal' -- "$cur")) + _comp_compgen -- -W '{1..9} end --vCal' return ;; --deletecalendarnote) - COMPREPLY=($(compgen -W '{1..9} end' -- "$cur")) + _comp_compgen -- -W '{1..9} end' return ;; --divert) - COMPREPLY=($(compgen -W 'register enable query disable - erasure' -- "$cur")) + _comp_compgen -- -W 'register enable query disable erasure' return ;; esac @@ -186,20 +181,20 @@ _gnokii() tprev=${words[cword - 3]} case $tprev in --deletesms | --deletemms) - COMPREPLY=($(compgen -W 'end' -- "$cur")) + _comp_compgen -- -W 'end' return ;; --getphonebook | --writetodo | --writecalendarnote) - COMPREPLY=($(compgen -W '{1..9} end' -- "$cur")) + _comp_compgen -- -W '{1..9} end' return ;; --gettodo | --getcalendarnote) [[ ${words[cword - 1]} == end ]] && - COMPREPLY=($(compgen -W '--vCal' -- "$cur")) + _comp_compgen -- -W '--vCal' return ;; --divert) - COMPREPLY=($(compgen -W '--type' -- "$cur")) + _comp_compgen -- -W '--type' return ;; esac @@ -210,28 +205,32 @@ _gnokii() fprev=${words[cword - 4]} case $fprev in --getphonebook) - COMPREPLY=($(compgen -W '--raw --vcard --ldif' -- "$cur")) + _comp_compgen -- -W '--raw --vcard --ldif' return ;; --divert) - COMPREPLY=($(compgen -W 'all busy noans outofreach notavail' \ - -- "$cur")) + _comp_compgen -- -W 'all busy noans outofreach notavail' return ;; esac fi - # safer to use LANG=C - local all_cmd="$(LANG=C _parse_help $1 "--help all")" - # these 2 below are allowed in combination with others - local main_cmd=$(command grep -v -- '--config\|--phone' <<<"$all_cmd") + local all_cmd + _comp_compgen -Rv all_cmd help -- --help all + # these 2 below are allowed in combination with others + local main_cmd + _comp_split -l main_cmd "$(printf '%s\n' "${all_cmd[@]}" | + command sed -e '/--config/d;/--phone/d;s/[][\(){}|^$*+?.]/\\&/g')" # don't provide main command completions if one is # already on the command line - [[ $COMP_LINE =~ $(tr ' ' '\b|' <<<$main_cmd) ]] && return + local IFS='|' + local regex_main_cmd="(${main_cmd[*]})($|[^_[:alnum:]])" + IFS=$' \t\n' + [[ $COMP_LINE =~ $regex_main_cmd ]] && return - COMPREPLY=($(compgen -W "$all_cmd" -- "$cur")) + _comp_compgen -- -W '"${all_cmd[@]}"' } && - complete -F _gnokii gnokii + complete -F _comp_cmd_gnokii gnokii # ex: filetype=sh diff --git a/completions/gnome-mplayer b/completions/gnome-mplayer index 32d93fc..86686fc 100644 --- a/completions/gnome-mplayer +++ b/completions/gnome-mplayer @@ -1,38 +1,38 @@ # gnome-mplayer(1) completion -*- shell-script -*- -_gnome_mplayer() +_comp_cmd_gnome_mplayer() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -'?' | --help | --help-all | --help-gtk) return ;; --showcontrols | --showsubtitles | --autostart) - COMPREPLY=($(compgen -w '0 1' -- "$cur")) + _comp_compgen -- -W '0 1' return ;; --subtitle) - _filedir '@(srt|sub|txt|utf|rar|mpsub|smi|js|ssa|ass)' + _comp_compgen_filedir '@(srt|sub|txt|utf|rar|mpsub|smi|js|ssa|ass)' return ;; --tvdriver) - COMPREPLY=($(compgen -W 'v4l v4l2' -- "$cur")) + _comp_compgen -- -W 'v4l v4l2' return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" --help-all)' -- "$cur")) + _comp_compgen_help -- --help-all [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir + _comp_compgen_filedir } && - complete -F _gnome_mplayer gnome-mplayer + complete -F _comp_cmd_gnome_mplayer gnome-mplayer # ex: filetype=sh diff --git a/completions/gnome-screenshot b/completions/gnome-screenshot index b3594d2..a884fa4 100644 --- a/completions/gnome-screenshot +++ b/completions/gnome-screenshot @@ -1,31 +1,33 @@ # gnome-screenshot(1) completion -*- shell-script -*- -_gnome_screenshot() +_comp_cmd_gnome_screenshot() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[def]*)' + # shellcheck disable=SC2254 case $prev in - --help | --help-* | --version | --delay | --display | -!(-*)[hd]) + --help | --help-* | --version | --delay | --display | -${noargopts}[hd]) return ;; - --border-effect | -!(-*)e) - COMPREPLY=($(compgen -W 'shadow border vintage none' -- "$cur")) + --border-effect | -${noargopts}e) + _comp_compgen -- -W 'shadow border vintage none' return ;; - --file | -!(-*)f) - _filedir '@(jp?(e)|pn)g' + --file | -${noargopts}f) + _comp_compgen_filedir '@(jp?(e)|pn)g' return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _gnome_screenshot gnome-screenshot + complete -F _comp_cmd_gnome_screenshot gnome-screenshot # ex: filetype=sh diff --git a/completions/gpasswd b/completions/gpasswd index f1f2200..db33c29 100644 --- a/completions/gpasswd +++ b/completions/gpasswd @@ -1,25 +1,27 @@ # gpasswd(1) completion -*- shell-script -*- -_gpasswd() +_comp_cmd_gpasswd() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[adAM]*)' + # shellcheck disable=SC2254 case $prev in - --add | --delete | --administrators | --members | -!(-*)[adAM]) - COMPREPLY=($(compgen -u -- "$cur")) + --add | --delete | --administrators | --members | -${noargopts}[adAM]) + _comp_compgen -- -u return ;; esac if [[ $cur == -* ]]; then # TODO: only -A and -M can be combined - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - COMPREPLY=($(compgen -g -- "$cur")) + _comp_compgen -- -g } && - complete -F _gpasswd gpasswd + complete -F _comp_cmd_gpasswd gpasswd # ex: filetype=sh diff --git a/completions/gpg b/completions/gpg index f0ca884..ca0d8e0 100644 --- a/completions/gpg +++ b/completions/gpg @@ -1,38 +1,53 @@ # bash completion for gpg -*- shell-script -*- -_gpg() +_comp_cmd_gpg() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[skKr]*)' + # shellcheck disable=SC2254 case $prev in - --sign | --clearsign | --decrypt-files | --load-extension | -!(-*)s) - _filedir + --sign | --clear-sign | --clearsign | --decrypt-files | \ + --load-extension | -${noargopts}s) + _comp_compgen_filedir return ;; - --export | --sign-key | --lsign-key | --nrsign-key | --nrlsign-key | --edit-key) + --list-keys | --list-public-keys | --locate-keys | \ + --locate-external-keys | --fingerprint | --delete-keys | \ + --delete-secret-and-public-keys | --export | --refresh-keys | \ + --search-keys | --edit-key | --sign-key | --lsign-key | \ + --nrsign-key | --nrlsign-key | --try-secret-key | -${noargopts}k) # return list of public keys - COMPREPLY=($(compgen -W "$($1 --list-keys 2>/dev/null | command sed -ne \ - 's@^pub.*/\([^ ]*\).*$@\1@p' -ne \ - 's@^.*\(<\([^>]*\)>\).*$@\2@p')" -- "$cur")) + _comp_compgen_split -- "$("$1" --list-keys 2>/dev/null | + command sed -ne \ + 's@^pub.*/\([^ ]*\).*$@\1@p' -ne \ + 's@^.*\(<\([^>]*\)>\).*$@\2@p')" return ;; - --recipient | -!(-*)r) - COMPREPLY=($(compgen -W "$($1 --list-keys 2>/dev/null | command sed -ne \ - 's@^.*<\([^>]*\)>.*$@\1@p')" -- "$cur")) + --list-secret-keys | --delete-secret-keys | --export-secret-keys | \ + --export-secret-subkeys | -${noargopts}K) + # return list of secret keys + _comp_compgen_split -- "$("$1" --list-secret-keys 2>/dev/null | + command sed -ne 's@^.*<\([^>]*\)>.*$@\1@p')" + return + ;; + --recipient | -${noargopts}r) + _comp_compgen_split -- "$("$1" --list-keys 2>/dev/null | + command sed -ne 's@^.*<\([^>]*\)>.*$@\1@p')" if [[ -e ~/.gnupg/gpg.conf ]]; then - COMPREPLY+=($(compgen -W "$(command sed -ne \ + _comp_compgen -a split -- "$(command sed -ne \ 's@^[ \t]*group[ \t][ \t]*\([^=]*\).*$@\1@p' \ - ~/.gnupg/gpg.conf)" -- "$cur")) + ~/.gnupg/gpg.conf)" fi return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$($1 --dump-options)' -- "$cur")) + _comp_compgen_split -- "$("$1" --dump-options)" fi } && - complete -F _gpg -o default gpg + complete -F _comp_cmd_gpg -o default gpg # ex: filetype=sh diff --git a/completions/gpg2 b/completions/gpg2 index cfa4023..fc54ff9 100644 --- a/completions/gpg2 +++ b/completions/gpg2 @@ -1,42 +1,47 @@ # gpg2(1) completion -*- shell-script -*- -_gpg2() +_comp_cmd_gpg2() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[sr]*)' + # shellcheck disable=SC2254 case $prev in --homedir) - _filedir -d + _comp_compgen_filedir -d return ;; - --sign | --clearsign | --options | --decrypt | -!(-*)s) - _filedir + --sign | --clearsign | --options | --decrypt | -${noargopts}s) + _comp_compgen_filedir return ;; - --export | --sign-key | --lsign-key | --nrsign-key | --nrlsign-key | --edit-key) + --export | --sign-key | --lsign-key | --nrsign-key | --nrlsign-key | \ + --edit-key | --delete-keys | --delete-secret-and-public-keys | \ + --locate-keys | --refresh-keys) # return list of public keys - COMPREPLY=($(compgen -W "$($1 --list-keys 2>/dev/null | command sed -ne \ - 's@^pub.*/\([^ ]*\).*$@\1@p' -ne \ - 's@^.*\(<\([^>]*\)>\).*$@\2@p')" -- "$cur")) + _comp_compgen_split -- "$("$1" --list-keys 2>/dev/null | + command sed -ne \ + 's@^pub.*/\([^ ]*\).*$@\1@p' -ne \ + 's@^.*\(<\([^>]*\)>\).*$@\2@p')" return ;; - --recipient | -!(-*)r) - COMPREPLY=($(compgen -W "$($1 --list-keys 2>/dev/null | - command sed -ne 's@^.*<\([^>]*\)>.*$@\1@p')" -- "$cur")) + --recipient | -${noargopts}r) + _comp_compgen_split -- "$("$1" --list-keys 2>/dev/null | + command sed -ne 's@^.*<\([^>]*\)>.*$@\1@p')" if [[ -e ~/.gnupg/gpg.conf ]]; then - COMPREPLY+=($(compgen -W "$(command sed -ne \ + _comp_compgen -a split -- "$(command sed -ne \ 's@^[ \t]*group[ \t][ \t]*\([^=]*\).*$@\1@p' \ - ~/.gnupg/gpg.conf)" -- "$cur")) + ~/.gnupg/gpg.conf)" fi return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$($1 --dump-options)' -- "$cur")) + _comp_compgen_split -- "$("$1" --dump-options)" fi } && - complete -F _gpg2 -o default gpg2 + complete -F _comp_cmd_gpg2 -o default gpg2 # ex: filetype=sh diff --git a/completions/gpgv b/completions/gpgv index 29315c9..7609a33 100644 --- a/completions/gpgv +++ b/completions/gpgv @@ -1,29 +1,30 @@ # gpgv(1) completion -*- shell-script -*- -_gpgv() +_comp_cmd_gpgv() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --help | --version | --weak-digest | --*-fd | -!(-*)[?h]*) return ;; --keyring) - _filedir "@(gpg|kbx)" + _comp_compgen_filedir "@(gpg|kbx)" return ;; --homedir) - _filedir -d + _comp_compgen_filedir -d return ;; esac - local args - _count_args "" "--@(weak-digest|*-fd|keyring|homedir)" + local REPLY + _comp_count_args -a "--@(weak-digest|*-fd|keyring|homedir)" + local args=$REPLY if [[ $cur == -* && $args -eq 1 ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi @@ -31,16 +32,16 @@ _gpgv() if [[ ${COMP_LINE,,} == *.@(asc|sig|sign)\ * ]]; then # Detached signature, only complete one arbitrary file arg and - if ((args == 2)); then - COMPREPLY=($(compgen -W '-' -- "$cur")) - _filedir + _comp_compgen -- -W '-' + _comp_compgen -a filedir fi else - _filedir gpg + _comp_compgen_filedir gpg fi else - _filedir "@(asc|gpg|sig|sign)" + _comp_compgen_filedir "@(asc|gpg|sig|sign)" fi } && - complete -F _gpgv gpgv gpgv2 + complete -F _comp_cmd_gpgv gpgv gpgv2 # ex: filetype=sh diff --git a/completions/gphoto2 b/completions/gphoto2 index cbf84c0..454ef61 100644 --- a/completions/gphoto2 +++ b/completions/gphoto2 @@ -1,55 +1,52 @@ # bash completion for gphoto2(1) -*- shell-script -*- -_gphoto2() +_comp_cmd_gphoto2() { - 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 case $prev in --debug-logfile) - _filedir + _comp_compgen_filedir return ;; --hook-script) - _filedir + _comp_compgen_filedir return ;; --filename) - _filedir + _comp_compgen_filedir return ;; -u | --upload-file) - _filedir + _comp_compgen_filedir return ;; --port) - COMPREPLY=($(compgen -W "$($1 --list-ports 2>/dev/null | - awk 'NR>3 { print $1 }')" -- "$cur")) - __ltrim_colon_completions "$cur" + _comp_compgen_split -- "$("$1" --list-ports 2>/dev/null | + _comp_awk 'NR>3 { print $1 }')" + _comp_ltrim_colon_completions "$cur" return ;; --camera) - local IFS=$'\n' - COMPREPLY=($(compgen -W "$($1 --list-cameras 2>/dev/null | - awk -F'"' 'NR>2 { print $2 }')" -- "$cur")) + _comp_compgen_split -l -- "$("$1" --list-cameras 2>/dev/null | + _comp_awk -F '"' 'NR>2 { print $2 }')" return ;; --get-config | --set-config | --set-config-index | --set-config-value) - COMPREPLY=($(compgen -W "$( - $1 --list-config 2>/dev/null - )" -- "$cur")) + _comp_compgen_split -- "$("$1" --list-config 2>/dev/null)" return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _gphoto2 gphoto2 + complete -F _comp_cmd_gphoto2 gphoto2 # ex: filetype=sh diff --git a/completions/gprof b/completions/gprof index 5a4ab2d..cb18633 100644 --- a/completions/gprof +++ b/completions/gprof @@ -1,56 +1,54 @@ # gprof(1) completion -*- shell-script -*- -_gprof() +_comp_cmd_gprof() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $cur in -A* | -C* | -J* | -p* | -P* | -q* | -Q* | -n* | -N* | -d*) return ;; -S*) - cur=${cur:2} - _filedir - COMPREPLY=("${COMPREPLY[@]/#/-S}") + _comp_compgen -c "${cur:2}" filedir + ((${#COMPREPLY[@]})) && COMPREPLY=("${COMPREPLY[@]/#/-S}") return ;; -O*) - cur=${cur:2} - COMPREPLY=($(compgen -P -O -W 'auto bsd 4.4bsd magic prof' \ - -- "$cur")) + _comp_compgen -c "${cur:2}" -- -P -O -W 'auto bsd 4.4bsd magic + prof' return ;; esac case $prev in -I | --directory-path) - _filedir -d + _comp_compgen_filedir -d return ;; -R | --file-ordering | --external-symbol-table) - _filedir + _comp_compgen_filedir return ;; -w | --width | -k | -m | --min-count | -h | --help | -e | -E | -f | -F) return ;; --file-format) - COMPREPLY=($(compgen -W 'auto bsd 4.4bsd magic prof' -- "$cur")) + _comp_compgen -- -W 'auto bsd 4.4bsd magic prof' return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir + _comp_compgen_filedir } && - complete -F _gprof gprof + complete -F _comp_cmd_gprof gprof # ex: filetype=sh diff --git a/completions/groupadd b/completions/groupadd index 5f67f29..fe4e600 100644 --- a/completions/groupadd +++ b/completions/groupadd @@ -1,26 +1,28 @@ # groupadd(8) completion -*- shell-script -*- -_groupadd() +_comp_cmd_groupadd() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return # TODO: if -o/--non-unique is given, could complete on existing gids # with -g/--gid + local noargopts='!(-*|*[gKp]*)' + # shellcheck disable=SC2254 case $prev in - --gid | --key | --password | -!(-*)[gKp]) + --gid | --key | --password | -${noargopts}[gKp]) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _groupadd groupadd + complete -F _comp_cmd_groupadd groupadd # ex: filetype=sh diff --git a/completions/groupdel b/completions/groupdel index 4d8ca7f..ab9fb29 100644 --- a/completions/groupdel +++ b/completions/groupdel @@ -1,27 +1,27 @@ # groupdel(8) completion -*- shell-script -*- -_groupdel() +_comp_cmd_groupdel() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -h | --help) return ;; -R | --root) - _filedir -d + _comp_compgen_filedir -d return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - COMPREPLY=($(compgen -g -- "$cur")) + _comp_compgen -- -g } && - complete -F _groupdel groupdel + complete -F _comp_cmd_groupdel groupdel # ex: filetype=sh diff --git a/completions/groupmems b/completions/groupmems index 2e89a5a..c884be2 100644 --- a/completions/groupmems +++ b/completions/groupmems @@ -1,27 +1,27 @@ # groupmems(8) completion -*- shell-script -*- -_groupmems() +_comp_cmd_groupmems() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -a | --add | -d | --delete) - COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen -- -u return ;; -g | --group) - COMPREPLY=($(compgen -g -- "$cur")) + _comp_compgen -- -g return ;; -R | --root) - _filedir -d + _comp_compgen_filedir -d return ;; esac - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help } && - complete -F _groupmems groupmems + complete -F _comp_cmd_groupmems groupmems # ex: filetype=sh diff --git a/completions/groupmod b/completions/groupmod index 5516d31..3e8a352 100644 --- a/completions/groupmod +++ b/completions/groupmod @@ -1,29 +1,31 @@ # groupmod(8) completion -*- shell-script -*- -_groupmod() +_comp_cmd_groupmod() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return # TODO: if -o/--non-unique is given, could complete on existing gids # with -g/--gid + local noargopts='!(-*|*[gnp]*)' + # shellcheck disable=SC2254 case $prev in - --gid | --help | --new-name | --password | -!(-*)[ghnp]) + --gid | --help | --new-name | --password | -${noargopts}[ghnp]) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - COMPREPLY=($(compgen -g -- "$cur")) + _comp_compgen -- -g } && - complete -F _groupmod groupmod + complete -F _comp_cmd_groupmod groupmod # ex: filetype=sh diff --git a/completions/growisofs b/completions/growisofs index ee09fe6..1ea27c2 100644 --- a/completions/growisofs +++ b/completions/growisofs @@ -1,9 +1,9 @@ # growisofs(1) completion -*- shell-script -*- -_growisofs() +_comp_cmd_growisofs() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -version | -speed) @@ -11,14 +11,13 @@ _growisofs() ;; -Z | -M) compopt -o nospace - _dvd_devices + _comp_compgen_dvd_devices return ;; /?(r)dev/*) if [[ $cur == =* ]]; then # e.g. /dev/dvd=foo.iso, /dev/dvdrw=/dev/zero - cur="${cur#=}" - _filedir + _comp_compgen -c "${cur#=}" filedir return fi ;; @@ -26,14 +25,13 @@ _growisofs() if [[ $cur == -* ]]; then # TODO: mkisofs options - COMPREPLY=($(compgen -W '-dvd-compat -overburn -speed= -Z -M' \ - -- "$cur")) + _comp_compgen -- -W '-dvd-compat -overburn -speed= -Z -M' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir + _comp_compgen_filedir } && - complete -F _growisofs growisofs + complete -F _comp_cmd_growisofs growisofs # ex: filetype=sh diff --git a/completions/grpck b/completions/grpck index 0fadbed..e5ab485 100644 --- a/completions/grpck +++ b/completions/grpck @@ -1,25 +1,26 @@ # grpck(8) completion -*- shell-script -*- -_grpck() +_comp_cmd_grpck() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[R]*)' + # shellcheck disable=SC2254 case $prev in - --root | -!(-*)R) - _filedir + --root | -${noargopts}R) + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - local opts=$(_parse_help "$1") - COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage return fi - _filedir + _comp_compgen_filedir } && - complete -F _grpck grpck + complete -F _comp_cmd_grpck grpck # ex: filetype=sh diff --git a/completions/gssdp-discover b/completions/gssdp-discover index 8454f52..3125912 100644 --- a/completions/gssdp-discover +++ b/completions/gssdp-discover @@ -1,34 +1,32 @@ -# bash completion for gssdp-discover -*- shell-script -*- +# bash completion for gssdp-discover/device-sniffer -*- shell-script -*- -_gssdp_discover() +_comp_cmd_gssdp_discover() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in --help | --target | --timeout | --rescan-interval | -[htnr]) return ;; --interface | -i) - _available_interfaces -a + _comp_compgen_available_interfaces -a return ;; --message-type | -m) - local types=$($1 --help 2>&1 | + [[ $1 == *gssdp-discover ]] || return + local types=$("$1" --help 2>&1 | command sed -ne 's/^.*--message-type=.*(\([^)]*\))$/\1/p') - COMPREPLY=($( - IFS+=, - compgen -W "$types" -- "$cur" - )) + _comp_compgen -F $' \t\n,' -- -W "$types" return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _gssdp_discover gssdp-discover + complete -F _comp_cmd_gssdp_discover gssdp-discover gssdp-device-sniffer # ex: filetype=sh diff --git a/completions/gzip b/completions/gzip index 0144c3a..9a41eec 100644 --- a/completions/gzip +++ b/completions/gzip @@ -1,27 +1,33 @@ # bash completion for gzip -*- shell-script -*- -_gzip() +_comp_cmd_gzip() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[bSACIJp]*)' + # shellcheck disable=SC2254 case $prev in - --blocksize | --suffix | --help | --version | -!(-*)[bShV]) + --blocksize | --suffix | --help | --version | --alias | --comment | \ + --iterations | --maxsplits | -${noargopts}[bShVACIJ]) return ;; - --processes | -!(-*)p) - COMPREPLY=($(compgen -W "{1..$(_ncpus)}" -- "$cur")) + --processes | -${noargopts}p) + local REPLY + _comp_get_ncpus + _comp_compgen -- -W "{1..$REPLY}" return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1") {-1..-9}' -- "$cur")) + _comp_compgen_help + _comp_compgen -a -- -W '-{1..9}' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - local IFS=$'\n' xspec="*.@(gz|t[ag]z)" + local xspec="*.@(gz|t[ag]z)" [[ ${1##*/} == pigz ]] && xspec="*.@([gz]z|t[ag]z)" if [[ $prev == --* ]]; then @@ -32,12 +38,11 @@ _gzip() [[ $prev == -*f* ]] && xspec= fi - _tilde "$cur" || return + _comp_compgen_tilde && return compopt -o filenames - COMPREPLY=($(compgen -f -X "$xspec" -- "$cur") - $(compgen -d -- "$cur")) + _comp_compgen -- -f -X "$xspec" -o plusdirs } && - complete -F _gzip gzip pigz + complete -F _comp_cmd_gzip gzip pigz # ex: filetype=sh diff --git a/completions/hash b/completions/hash new file mode 100644 index 0000000..4ea517b --- /dev/null +++ b/completions/hash @@ -0,0 +1,26 @@ +# hash completion -*- shell-script -*- + +_comp_cmd_hash() +{ + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + + local noargopts='!(*[p]*)' + # shellcheck disable=SC2254 + case $prev in + -${noargopts}p) + _comp_compgen_filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + _comp_compgen_help -c help "$1" + return + fi + + _comp_compgen_commands +} && + complete -F _comp_cmd_hash hash + +# ex: filetype=sh diff --git a/completions/hcitool b/completions/hcitool index 58bf5a7..aacc108 100644 --- a/completions/hcitool +++ b/completions/hcitool @@ -1,178 +1,168 @@ # bash completion for bluez utils -*- shell-script -*- -_bluetooth_addresses() +_comp_cmd_hcitool__bluetooth_addresses() { - if [[ -n ${COMP_BLUETOOTH_SCAN:-} ]]; then - COMPREPLY+=($(compgen -W "$(hcitool scan | - awk '/^\t/{print $1}')" -- "$cur")) + if [[ ${COMP_BLUETOOTH_SCAN-} ]]; then + _comp_compgen -a split -- "$(hcitool scan | _comp_awk '/^\t/{print $1}')" fi } -_bluetooth_devices() +_comp_cmd_hcitool__bluetooth_devices() { - COMPREPLY+=($(compgen -W "$(hcitool dev | - awk '/^\t/{print $1}')" -- "$cur")) + _comp_compgen -a split -- "$(hcitool dev | _comp_awk '/^\t/{print $1}')" } -_bluetooth_services() +_comp_cmd_hcitool__bluetooth_services() { - COMPREPLY=($(compgen -W 'DID SP DUN LAN FAX OPUSH FTP HS HF HFAG SAP NAP - GN PANU HCRP HID CIP A2SRC A2SNK AVRCT AVRTG UDIUE UDITE SYNCML' \ - -- "$cur")) + _comp_compgen -- -W 'DID SP DUN LAN FAX OPUSH FTP HS HF HFAG SAP NAP + GN PANU HCRP HID CIP A2SRC A2SNK AVRCT AVRTG UDIUE UDITE SYNCML' } -_bluetooth_packet_types() +_comp_cmd_hcitool__bluetooth_packet_types() { - COMPREPLY=($(compgen -W 'DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3' \ - -- "$cur")) + _comp_compgen -- -W 'DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3' } -_hcitool() +_comp_cmd_hcitool() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -i) - _bluetooth_devices + _comp_cmd_hcitool__bluetooth_devices return ;; --role) - COMPREPLY=($(compgen -W 'm s' -- "$cur")) + _comp_compgen -- -W 'm s' return ;; --pkt-type) - _bluetooth_packet_types + _comp_cmd_hcitool__bluetooth_packet_types return ;; esac - $split && return + [[ $was_split ]] && return - local arg - _get_first_arg - if [[ -z $arg ]]; then - if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) - else - COMPREPLY=($(compgen -W 'dev inq scan name info spinq epinq cmd - con cc dc sr cpt rssi lq tpl afh lst auth enc key clkoff - clock' -- "$cur")) - fi - else - local args - case $arg in + local REPLY + if _comp_get_first_arg; then + case $REPLY in name | info | dc | rssi | lq | afh | auth | key | clkoff | lst) - _count_args - if ((args == 2)); then - _bluetooth_addresses + _comp_count_args + if ((REPLY == 2)); then + _comp_cmd_hcitool__bluetooth_addresses fi ;; cc) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--role --pkt-type' -- "$cur")) + _comp_compgen -- -W '--role --pkt-type' else - _count_args - if ((args == 2)); then - _bluetooth_addresses + _comp_count_args + if ((REPLY == 2)); then + _comp_cmd_hcitool__bluetooth_addresses fi fi ;; sr) - _count_args - if ((args == 2)); then - _bluetooth_addresses + _comp_count_args + if ((REPLY == 2)); then + _comp_cmd_hcitool__bluetooth_addresses else - COMPREPLY=($(compgen -W 'master slave' -- "$cur")) + _comp_compgen -- -W 'master slave' fi ;; cpt) - _count_args - if ((args == 2)); then - _bluetooth_addresses + _comp_count_args + if ((REPLY == 2)); then + _comp_cmd_hcitool__bluetooth_addresses else - _bluetooth_packet_types + _comp_cmd_hcitool__bluetooth_packet_types fi ;; tpl | enc | clock) - _count_args - if ((args == 2)); then - _bluetooth_addresses + _comp_count_args + if ((REPLY == 2)); then + _comp_cmd_hcitool__bluetooth_addresses else - COMPREPLY=($(compgen -W '0 1' -- "$cur")) + _comp_compgen -- -W '0 1' fi ;; esac + else + if [[ $cur == -* ]]; then + _comp_compgen_help + else + _comp_compgen -- -W 'dev inq scan name info spinq epinq cmd con cc + dc sr cpt rssi lq tpl afh lst auth enc key clkoff clock' + fi fi } && - complete -F _hcitool hcitool + complete -F _comp_cmd_hcitool hcitool -_sdptool() +_comp_cmd_sdptool() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in --bdaddr) - _bluetooth_addresses + _comp_cmd_hcitool__bluetooth_addresses return ;; esac - $split && return + [[ $was_split ]] && return - local arg - _get_first_arg - if [[ -z $arg ]]; then - if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) - else - COMPREPLY=($(compgen -W 'search browse records add del get - setattr setseq' -- "$cur")) - fi - else - case $arg in + local REPLY + if _comp_get_first_arg; then + case $REPLY in search) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--bdaddr --tree --raw --xml' \ - -- "$cur")) + _comp_compgen -- -W '--bdaddr --tree --raw --xml' else - _bluetooth_services + _comp_cmd_hcitool__bluetooth_services fi ;; browse | records) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--tree --raw --xml' -- "$cur")) + _comp_compgen -- -W '--tree --raw --xml' else - _bluetooth_addresses + _comp_cmd_hcitool__bluetooth_addresses fi ;; add) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--handle --channel' -- "$cur")) + _comp_compgen -- -W '--handle --channel' else - _bluetooth_services + _comp_cmd_hcitool__bluetooth_services fi ;; get) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--bdaddr --tree --raw --xml' \ - -- "$cur")) + _comp_compgen -- -W '--bdaddr --tree --raw --xml' fi ;; esac + else + if [[ $cur == -* ]]; then + _comp_compgen_help + else + _comp_compgen -- -W 'search browse records add del get setattr + setseq' + fi fi } && - complete -F _sdptool sdptool + complete -F _comp_cmd_sdptool sdptool -_l2ping() +_comp_cmd_l2ping() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -i) - _bluetooth_devices + _comp_cmd_hcitool__bluetooth_devices return ;; -s | -c | -t | -d) @@ -181,200 +171,193 @@ _l2ping() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage else - _bluetooth_addresses + _comp_cmd_hcitool__bluetooth_addresses fi } && - complete -F _l2ping l2ping + complete -F _comp_cmd_l2ping l2ping -_rfcomm() +_comp_cmd_rfcomm() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -f | --config) - _filedir + _comp_compgen_filedir return ;; -i) - _bluetooth_devices - _bluetooth_addresses + _comp_cmd_hcitool__bluetooth_devices + _comp_cmd_hcitool__bluetooth_addresses return ;; esac - local arg - _get_first_arg - if [[ -z $arg ]]; then - if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) - else - COMPREPLY=($(compgen -W 'show connect listen watch bind - release' -- "$cur")) - fi - else - local args - _count_args + local REPLY + if _comp_get_first_arg; then + local arg=$REPLY + _comp_count_args + local args=$REPLY if ((args == 2)); then - _bluetooth_devices + _comp_cmd_hcitool__bluetooth_devices else case $arg in connect | bind) if ((args == 3)); then - _bluetooth_addresses + _comp_cmd_hcitool__bluetooth_addresses fi ;; esac fi + else + if [[ $cur == -* ]]; then + _comp_compgen_help + else + _comp_compgen -- -W 'show connect listen watch bind release' + fi fi } && - complete -F _rfcomm rfcomm + complete -F _comp_cmd_rfcomm rfcomm -_ciptool() +_comp_cmd_ciptool() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -i) - _bluetooth_devices - _bluetooth_addresses + _comp_cmd_hcitool__bluetooth_devices + _comp_cmd_hcitool__bluetooth_addresses return ;; esac - local arg - _get_first_arg - if [[ -z $arg ]]; then - if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) - else - COMPREPLY=($(compgen -W 'show search connect release loopback' \ - -- "$cur")) - fi - else - local args - case $arg in + local REPLY + if _comp_get_first_arg; then + case $REPLY in connect | release | loopback) - _count_args - if ((args == 2)); then - _bluetooth_addresses + local REPLY + _comp_count_args + if ((REPLY == 2)); then + _comp_cmd_hcitool__bluetooth_addresses fi ;; esac + else + if [[ $cur == -* ]]; then + _comp_compgen_help + else + _comp_compgen -- -W 'show search connect release loopback' + fi fi } && - complete -F _ciptool ciptool + complete -F _comp_cmd_ciptool ciptool -_dfutool() +_comp_cmd_dfutool() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -d | --device) - _bluetooth_devices + _comp_cmd_hcitool__bluetooth_devices return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help else - local args - _count_args - case $args in + local REPLY + _comp_count_args + case $REPLY in 1) - COMPREPLY=($(compgen -W 'verify modify upgrade archive' \ - -- "$cur")) + _comp_compgen -- -W 'verify modify upgrade archive' ;; 2) - _filedir + _comp_compgen_filedir ;; esac fi } && - complete -F _dfutool dfutool + complete -F _comp_cmd_dfutool dfutool -_hciconfig() +_comp_cmd_hciconfig() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - local arg - _get_first_arg - if [[ -z $arg ]]; then - if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--help --all' -- "$cur")) - else - COMPREPLY=($(compgen -W 'up down reset rstat auth noauth encrypt - noencrypt secmgr nosecmgr piscan noscan iscan pscan ptype name - class voice iac inqmode inqdata inqtype inqparams pageparms - pageto afhmode aclmtu scomtu putkey delkey commands features - version revision lm' -- "$cur")) - fi - else - local args - case $arg in + local REPLY + if _comp_get_first_arg; then + case $REPLY in putkey | delkey) - _count_args - if ((args == 2)); then - _bluetooth_addresses + _comp_count_args + if ((REPLY == 2)); then + _comp_cmd_hcitool__bluetooth_addresses fi ;; lm) - _count_args - if ((args == 2)); then - COMPREPLY=($(compgen -W 'MASTER SLAVE NONE ACCEPT' \ - -- "$cur")) + _comp_count_args + if ((REPLY == 2)); then + _comp_compgen -- -W 'MASTER SLAVE NONE ACCEPT' fi ;; ptype) - _count_args - if ((args == 2)); then - _bluetooth_packet_types + _comp_count_args + if ((REPLY == 2)); then + _comp_cmd_hcitool__bluetooth_packet_types fi ;; esac + else + if [[ $cur == -* ]]; then + _comp_compgen -- -W '--help --all' + else + _comp_compgen -- -W 'up down reset rstat auth noauth encrypt + noencrypt secmgr nosecmgr piscan noscan iscan pscan ptype name + class voice iac inqmode inqdata inqtype inqparams pageparms + pageto afhmode aclmtu scomtu putkey delkey commands features + version revision lm' + fi fi } && - complete -F _hciconfig hciconfig + complete -F _comp_cmd_hciconfig hciconfig -_hciattach() +_comp_cmd_hciattach() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-n -p -t -b -s -l' -- "$cur")) + _comp_compgen -- -W '-n -p -t -b -s -l' else - local args - _count_args - case $args in + local REPLY + _comp_count_args + case $REPLY in 1) - COMPREPLY=($(printf '%s\n' /dev/tty*)) - COMPREPLY=($(compgen -W '${COMPREPLY[@]} - ${COMPREPLY[@]#/dev/}' -- "$cur")) + _comp_expand_glob COMPREPLY '/dev/tty*' && + _comp_compgen -- -W '"${COMPREPLY[@]}" + "${COMPREPLY[@]#/dev/}"' ;; 2) - COMPREPLY=($(compgen -W 'any ericsson digi xircom csr bboxes - swave bcsp 0x0105 0x080a 0x0160 0x0002' -- "$cur")) + _comp_compgen -- -W 'any ericsson digi xircom csr bboxes swave + bcsp 0x0105 0x080a 0x0160 0x0002' ;; 3) - COMPREPLY=($(compgen -W '9600 19200 38400 57600 115200 230400 - 460800 921600' -- "$cur")) + _comp_compgen -- -W '9600 19200 38400 57600 115200 230400 + 460800 921600' ;; 4) - COMPREPLY=($(compgen -W 'flow noflow' -- "$cur")) + _comp_compgen -- -W 'flow noflow' ;; 5) - _bluetooth_addresses + _comp_cmd_hcitool__bluetooth_addresses ;; esac fi } && - complete -F _hciattach hciattach + complete -F _comp_cmd_hciattach hciattach # ex: filetype=sh diff --git a/completions/hddtemp b/completions/hddtemp index 7b95f0e..7dbdec3 100644 --- a/completions/hddtemp +++ b/completions/hddtemp @@ -1,38 +1,40 @@ # hddtemp(8) completion -*- shell-script -*- -_hddtemp() +_comp_cmd_hddtemp() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[flupsS]*)' + # shellcheck disable=SC2254 case $prev in - --file | -!(-*)f) - _filedir db + --file | -${noargopts}f) + _comp_compgen_filedir db return ;; - --listen | -!(-*)l) - _ip_addresses + --listen | -${noargopts}l) + _comp_compgen_ip_addresses return ;; - --unit | -!(-*)u) - COMPREPLY=($(compgen -W 'C F' -- "$cur")) + --unit | -${noargopts}u) + _comp_compgen -- -W 'C F' return ;; - --port | --separator | --syslog | --version | --help | -!(-*)[psSvh?]) + --port | --separator | --syslog | --version | --help | -${noargopts}[psSvh?]) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1") --help' -- "$cur")) + _comp_compgen_help + _comp_compgen -a -- -W '--help' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - cur=${cur:=/dev/} - _filedir + _comp_compgen -c "${cur:-/dev/}" filedir fi } && - complete -F _hddtemp hddtemp + complete -F _comp_cmd_hddtemp hddtemp # ex: filetype=sh diff --git a/completions/help b/completions/help new file mode 100644 index 0000000..679ea9f --- /dev/null +++ b/completions/help @@ -0,0 +1,16 @@ +# bash completion for help -*- shell-script -*- + +_comp_cmd_help() +{ + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + + if [[ $cur == -* ]]; then + _comp_compgen_usage -c help -s "$1" + return + fi + + _comp_compgen -- -A helptopic + ((${#COMPREPLY[*]} != 1)) || printf -v "COMPREPLY[0]" %q "$COMPREPLY" +} && + complete -F _comp_cmd_help help diff --git a/completions/hid2hci b/completions/hid2hci index f33a495..161f560 100644 --- a/completions/hid2hci +++ b/completions/hid2hci @@ -1,15 +1,14 @@ # hid2hci completion -*- shell-script -*- -_hid2hci() +_comp_cmd_hid2hci() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--help --quiet -0 --tohci -1 --tohid' \ - -- "$cur")) + _comp_compgen -- -W '--help --quiet -0 --tohci -1 --tohid' fi } && - complete -F _hid2hci hid2hci + complete -F _comp_cmd_hid2hci hid2hci # ex: filetype=sh diff --git a/completions/hostname b/completions/hostname index ce1b32e..12b96dc 100644 --- a/completions/hostname +++ b/completions/hostname @@ -1,23 +1,25 @@ # hostname(1) completion -*- shell-script -*- -_hostname() +_comp_cmd_hostname() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[F]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | -!(-*)[hV]) + --help | --version | -${noargopts}[hV]) return ;; - --file | -!(-*)F) - _filedir + --file | -${noargopts}F) + _comp_compgen_filedir return ;; esac [[ $cur == -* ]] && - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage } && - complete -F _hostname hostname + complete -F _comp_cmd_hostname hostname # ex: filetype=sh diff --git a/completions/hping2 b/completions/hping2 index 666838b..66139a9 100644 --- a/completions/hping2 +++ b/completions/hping2 @@ -1,35 +1,38 @@ # bash completion for hping2 -*- shell-script -*- -_hping2() +_comp_cmd_hping2() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[IaoE]*)' + # shellcheck disable=SC2254 case $prev in - --interface | -!(-*)I) - _available_interfaces + --interface | -${noargopts}I) + _comp_compgen_available_interfaces return ;; - --spoof | -!(-*)a) - _known_hosts_real -- "$cur" + --spoof | -${noargopts}a) + _comp_compgen_known_hosts -- "$cur" return ;; - --tos | -!(-*)o) - COMPREPLY=($(compgen -W '02 04 08 10')) + --tos | -${noargopts}o) + # TODO: parse choices from `--tos help`? + _comp_compgen -- -W '02 04 08 10' return ;; - --file | -!(-*)E) - _filedir + --file | -${noargopts}E) + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help else - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" fi } && - complete -F _hping2 hping hping2 hping3 + complete -F _comp_cmd_hping2 hping hping2 hping3 # ex: filetype=sh diff --git a/completions/htop b/completions/htop index b4916d5..6a0f797 100644 --- a/completions/htop +++ b/completions/htop @@ -1,33 +1,35 @@ # htop(1) completion -*- shell-script -*- -_htop() +_comp_cmd_htop() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[sud]*)' + # shellcheck disable=SC2254 case "$prev" in - --sort-key | -!(-*)s) - COMPREPLY=($(compgen -W '$("$1" -s help)' -- "$cur")) + --sort-key | -${noargopts}s) + _comp_compgen_split -- "$("$1" -s help)" return ;; - --user | -!(-*)u) - COMPREPLY=($(compgen -u -- "$cur")) + --user | -${noargopts}u) + _comp_compgen -- -u return ;; - --delay | -!(-*)d) + --delay | -${noargopts}d) # argument required but no completions available return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" --help)' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi } && - complete -F _htop htop + complete -F _comp_cmd_htop htop # ex: filetype=sh diff --git a/completions/htpasswd b/completions/htpasswd index 527684b..dafd1d9 100644 --- a/completions/htpasswd +++ b/completions/htpasswd @@ -1,9 +1,9 @@ # htpasswd(1) completion -*- shell-script -*- -_htpasswd() +_comp_cmd_htpasswd() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local i o=0 # $o is index of first non-option argument for ((i = 1; i <= cword; i++)); do @@ -19,18 +19,17 @@ _htpasswd() if ((o == 0 || o == cword)); then if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi # Password file (first non-option argument) - _filedir + _comp_compgen_filedir elif ((o == cword - 1)); then # Username (second non-option argument) - COMPREPLY=($(compgen -W \ - '$(cut -d: -f1 "${words[o]}" 2>/dev/null)' -- "$cur")) + _comp_compgen_split -- "$(cut -d: -f1 "${words[o]}" 2>/dev/null)" fi } && - complete -F _htpasswd htpasswd + complete -F _comp_cmd_htpasswd htpasswd # ex: filetype=sh diff --git a/completions/hunspell b/completions/hunspell index 92b4fe8..28cb7df 100644 --- a/completions/hunspell +++ b/completions/hunspell @@ -1,43 +1,40 @@ # hunspell(1) completion -*- shell-script -*- -_hunspell() +_comp_cmd_hunspell() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --help | --version | -vv | -[hPv]) return ;; -d) - local IFS=$' \t\n' reset=$(shopt -p nullglob) - shopt -s nullglob - local -a dicts=(/usr/share/hunspell/*.dic - /usr/local/share/hunspell/*.dic) - dicts=("${dicts[@]##*/}") - dicts=("${dicts[@]%.dic}") - $reset - IFS=$'\n' - COMPREPLY=($(compgen -W '${dicts[@]}' -- "$cur")) + local -a dicts + if _comp_expand_glob dicts '/usr/share/hunspell/*.dic /usr/local/share/hunspell/*.dic'; then + dicts=("${dicts[@]##*/}") + dicts=("${dicts[@]%.dic}") + _comp_compgen -- -W '"${dicts[@]}"' + fi return ;; -i) - _xfunc iconv _iconv_charsets + _comp_compgen -x iconv charsets return ;; -p) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - _filedir + _comp_compgen_filedir } && - complete -F _hunspell hunspell + complete -F _comp_cmd_hunspell hunspell # ex: filetype=sh diff --git a/completions/iconv b/completions/iconv index 81ae01b..bbcbbdd 100644 --- a/completions/iconv +++ b/completions/iconv @@ -1,38 +1,52 @@ # iconv(1) completion -*- shell-script -*- +# @since 2.12 +_comp_xfunc_iconv_compgen_charsets() +{ + _comp_cmd_iconv__compgen_charsets iconv +} + +# @deprecated 2.12 use `_comp_xfunc_iconv_compgen_charsets` instead _iconv_charsets() { - COMPREPLY+=($(compgen -X ... -W '$(${1:-iconv} -l | \ - command sed -e "s@/*\$@@" -e "s/[,()]//g")' -- "$cur")) + _comp_compgen -ai iconv charsets "${1:-iconv}" +} + +_comp_cmd_iconv__compgen_charsets() +{ + _comp_compgen_split -X ... -- "$("$1" -l | + command sed -e 's@/*$@@' -e 's/[,()]//g')" } -_iconv() +_comp_cmd_iconv() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[fto]*)' + # shellcheck disable=SC2254 case $prev in --help | --usage | --version | --unicode-subst | --byte-subst | \ - --widechar-subst | -!(-*)[?V]) + --widechar-subst | -${noargopts}[?V]) return ;; - --from-code | --to-code | -!(-*)[ft]) - _iconv_charsets $1 + --from-code | --to-code | -${noargopts}[ft]) + _comp_cmd_iconv__compgen_charsets "$1" return ;; - --output | -!(-*)o) - _filedir + --output | -${noargopts}o) + _comp_compgen_filedir return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _iconv -o default iconv + complete -F _comp_cmd_iconv -o default iconv # ex: filetype=sh diff --git a/completions/id b/completions/id index a07e51d..e91ad61 100644 --- a/completions/id +++ b/completions/id @@ -1,18 +1,17 @@ # id(1) completion -*- shell-script -*- -_id() +_comp_cmd_id() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - local opts=$(_parse_help "$1") - [[ $opts ]] || opts="-G -g -u" # POSIX fallback - COMPREPLY=($(compgen -W "$opts" -- "$cur")) + _comp_compgen_help || + _comp_compgen -- -W '-G -g -u' # POSIX fallback else - COMPREPLY=($(compgen -u "$cur")) + _comp_compgen -- -u fi } && - complete -F _id id + complete -F _comp_cmd_id id # ex: filetype=sh diff --git a/completions/idn b/completions/idn index 8023f8f..1a61479 100644 --- a/completions/idn +++ b/completions/idn @@ -1,26 +1,28 @@ # idn(1) completion -*- shell-script -*- -_idn() +_comp_cmd_idn() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[p]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | -!(-*)[hV]) + --help | --version | -${noargopts}[hV]) return ;; - --profile | -!(-*)p) - COMPREPLY=($(compgen -W 'Nameprep iSCSI Nodeprep Resourceprep - trace SASLprep' -- "$cur")) + --profile | -${noargopts}p) + _comp_compgen -- -W 'Nameprep iSCSI Nodeprep Resourceprep trace + SASLprep' return ;; esac - if ! $split && [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + if [[ ! $was_split && $cur == -* ]]; then + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _idn idn + complete -F _comp_cmd_idn idn # ex: filetype=sh diff --git a/completions/ifstat b/completions/ifstat index 629786e..0f05199 100644 --- a/completions/ifstat +++ b/completions/ifstat @@ -1,43 +1,45 @@ # bash completion for ifstat(1) -*- shell-script -*- -_ifstat() +_comp_cmd_ifstat() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[idstx]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | --scan | --interval | -!(-*)[hvV]) + --help | --version | --scan | --interval | -${noargopts}[hvV]) return ;; - -!(-*)i) + -${noargopts}i) # TODO comma separated - _available_interfaces -a + _comp_compgen_available_interfaces -a return ;; - -!(-*)d) + -${noargopts}d) # iproute2: no completion (scan delay) # traditional: parse driver if ! { "$1" --help 2>&1 || : } | command grep -q -- '-d.*--scan'; then - COMPREPLY=($(compgen -W '$("$1" -v | command \ - sed -e "s/[,.]//g" -ne "s/^.*drivers://p")' -- "$cur")) + _comp_compgen_split -- "$("$1" -v | command sed -e 's/[,.]//g' \ + -ne 's/^.*drivers://p')" fi return ;; - --noupdate | -!(-*)s) + --noupdate | -${noargopts}s) # iproute2: pass through (skip history update) # traditional: hostnames (snmp) if ! { "$1" --help 2>&1 || : } | command grep -q -- '-s.*--noupdate'; then - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return fi ;; - -!(-*)t) + -${noargopts}t) # iproute2: no completion (interval) # traditional: pass through (add timestamp) ! { @@ -45,24 +47,22 @@ _ifstat() } | command grep -q -- '-t.*--interval' || return ;; - --extended | -!(-*)x) + --extended | -${noargopts}x) # iproute2: parse xstat types - COMPREPLY=($(compgen -W '$("$1" -x nonexistent-xstat 2>&1 | - awk "found { print \$1 } /supported xstats:/ { found=1 }")' \ - -- "$cur")) + _comp_compgen_split -- "$("$1" -x nonexistent-xstat 2>&1 | + _comp_awk 'found { print $1 } /supported xstats:/ { found=1 }')" return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - local opts=$(_parse_help "$1") - COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi } && - complete -F _ifstat ifstat + complete -F _comp_cmd_ifstat ifstat # ex: filetype=sh diff --git a/completions/iftop b/completions/iftop index b73f4b6..d1635af 100644 --- a/completions/iftop +++ b/completions/iftop @@ -1,26 +1,26 @@ # iftop(8) completion -*- shell-script -*- -_iftop() +_comp_cmd_iftop() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -h | -f | -F | -m) return ;; -i) - _available_interfaces -a + _comp_compgen_available_interfaces -a return ;; -c) - _filedir + _comp_compgen_filedir return ;; esac - COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + _comp_compgen_help -- -h } && - complete -F _iftop iftop + complete -F _comp_cmd_iftop iftop # ex: filetype=sh diff --git a/completions/ifup b/completions/ifup index 5b35bfb..bfeee82 100644 --- a/completions/ifup +++ b/completions/ifup @@ -1,39 +1,40 @@ # Red Hat & Debian GNU/Linux if{up,down} completion -*- shell-script -*- -_userland GNU || return 1 +_comp_userland GNU || return 1 -_ifupdown() +_comp_cmd_ifupdown() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[Xoi]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | --allow | --exclude | --option | -!(-*)[hVXo]) + --help | --version | --allow | --exclude | --option | -${noargopts}[hVXo]) return ;; - --interfaces | -!(-*)i) - _filedir + --interfaces | -${noargopts}i) + _comp_compgen_filedir return ;; --state-dir) - _filedir -d + _comp_compgen_filedir -d return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - local args - _count_args "" "@(--allow|-i|--interfaces|--state-dir|-X|--exclude|-o)" + local REPLY + _comp_count_args -a "@(--allow|-i|--interfaces|--state-dir|-X|--exclude|-o)" - if ((args == 1)); then - _configured_interfaces - COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur")) + if ((REPLY == 1)); then + _comp_compgen_configured_interfaces fi } && - complete -F _ifupdown ifup ifdown ifquery ifstatus + complete -F _comp_cmd_ifupdown ifup ifdown ifquery ifstatus # ex: filetype=sh diff --git a/completions/influx b/completions/influx index e9362e7..89b90e7 100644 --- a/completions/influx +++ b/completions/influx @@ -1,35 +1,32 @@ # bash completion for influx(8) -*- shell-script -*- -_influx() +_comp_cmd_influx() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -version | -port | -database | -password | -username | -execute | -pps) return ;; -host) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -format | -precision | -consistency) - local args=$($1 --help 2>&1 | awk "\$1 == \"$prev\" { print \$2 }") - COMPREPLY=($( - IFS+="\"'|" - compgen -W "$args" -- "$cur" - )) + local args=$("$1" --help 2>&1 | _comp_awk "\$1 == \"$prev\" { print \$2 }") + _comp_compgen -F $' \t\n'"\"'|" -- -W "$args" return ;; -import | -path) - _filedir + _comp_compgen_filedir return ;; esac [[ $cur == -* ]] && - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help } && - complete -F _influx influx + complete -F _comp_cmd_influx influx # ex: filetype=sh diff --git a/completions/info b/completions/info index f50f842..3a13565 100644 --- a/completions/info +++ b/completions/info @@ -1,40 +1,42 @@ # bash completion for info -*- shell-script -*- -_info() +_comp_cmd_info() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return # default completion if parameter looks like a path if [[ $cur == @(*/|[.~])* ]]; then - _filedir + _comp_compgen_filedir return fi + local noargopts='!(-*|*[kndfor]*)' + # shellcheck disable=SC2254 case $prev in - --apropos | --index-search | --node | --help | --version | -!(-*)[knhv]) + --apropos | --index-search | --node | --help | --version | -${noargopts}[knhv]) return ;; - -!(-*)d) + -${noargopts}d) if [[ ${1##*/} == info ]]; then - _filedir -d + _comp_compgen_filedir -d return fi ;; --directory) - _filedir -d + _comp_compgen_filedir -d return ;; - --dribble | --file | --output | --restore | --raw-filename | --rcfile | -!(-*)[for]) - _filedir + --dribble | --file | --output | --restore | --raw-filename | --rcfile | -${noargopts}[for]) + _comp_compgen_filedir return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi @@ -47,28 +49,22 @@ _info() infopath=$INFOPATH fi - _expand || return - - infopath=$infopath: - if [[ -n $cur ]]; then - infopath="${infopath//://$cur* }" - else - infopath="${infopath//:// }" + _comp_split -F : infopath "$infopath" + if ((${#infopath[@]})); then + _comp_compgen -Rv infopath -- -S "/$cur*" -W '"${infopath[@]}"' + local IFS= + if _comp_expand_glob COMPREPLY '${infopath[@]}'; then + # weed out directory path names and paths to info pages (empty + # elements will be removed by the later `compgen -X ''`) + COMPREPLY=("${COMPREPLY[@]##*/?(:)}") + # strip suffix from info pages + COMPREPLY=("${COMPREPLY[@]%.@(gz|bz2|xz|lzma)}") + # weed out info dir file with -X 'dir' + _comp_compgen -c "${cur//\\\\/}" -- -W '"${COMPREPLY[@]%.*}"' -X '@(|dir)' + fi + _comp_unlocal IFS fi - - # redirect stderr for when path doesn't exist - COMPREPLY=($(eval command ls "$infopath" 2>/dev/null)) - # weed out directory path names and paths to info pages - COMPREPLY=(${COMPREPLY[@]##*/?(:)}) - # weed out info dir file - for i in ${!COMPREPLY[*]}; do - [[ ${COMPREPLY[i]} == dir ]] && unset "COMPREPLY[i]" - done - # strip suffix from info pages - COMPREPLY=(${COMPREPLY[@]%.@(gz|bz2|xz|lzma)}) - COMPREPLY=($(compgen -W '${COMPREPLY[@]%.*}' -- "${cur//\\\\/}")) - } && - complete -F _info info pinfo + complete -F _comp_cmd_info info pinfo # ex: filetype=sh diff --git a/completions/inject b/completions/inject index fad73a1..4b46921 100644 --- a/completions/inject +++ b/completions/inject @@ -1,26 +1,29 @@ # mailman inject completion -*- shell-script -*- -_inject() +_comp_cmd_inject() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -l | --listname) - _xfunc list_lists _mailman_lists + # Prefer `list_lists` in the same dir as command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_compgen -x list_lists mailman_lists return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--listname --queue --help' -- "$cur")) + _comp_compgen -- -W '--listname --queue --help' else - _filedir + _comp_compgen_filedir fi } && - complete -F _inject inject + complete -F _comp_cmd_inject inject # ex: filetype=sh diff --git a/completions/inotifywait b/completions/inotifywait index e5608fc..a069295 100644 --- a/completions/inotifywait +++ b/completions/inotifywait @@ -1,47 +1,48 @@ # bash completion for inotifywait(1) and inotifywatch(1) -*- shell-script -*- -_inotifywait_events() +_comp_cmd_inotifywait__events() { # Expecting line with "Events:", followed by ones starting with one # tab. Word following the tab is event name, others are line # wrapped explanations. - COMPREPLY+=($(compgen -W "$($1 --help 2>/dev/null | + _comp_compgen -a split -- "$("$1" --help 2>/dev/null | command sed -e '/^Events:/,/^[^'$'\t'']/!d' \ - -ne 's/^'$'\t''\([^ '$'\t'']\{1,\}\)[ '$'\t''].*/\1/p')" \ - -- "$cur")) + -ne 's/^'$'\t''\([^ '$'\t'']\{1,\}\)[ '$'\t''].*/\1/p')" } -_inotifywait() +_comp_cmd_inotifywait() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[oe]*)' + # shellcheck disable=SC2254 case $prev in - --help | --exclude | --excludei | --format | --timefmt | --timeout | -!(-*)[ht]) + --help | --exclude | --excludei | --include | --includei | --format | --timefmt | --timeout | -${noargopts}[ht]) return ;; - --fromfile | --outfile | -!(-*)o) - _filedir + --fromfile | --outfile | -${noargopts}o) + _comp_compgen_filedir return ;; - --event | -!(-*)e) - _inotifywait_events "$1" + --event | -${noargopts}e) + _comp_cmd_inotifywait__events "$1" return ;; --ascending | --descending) - COMPREPLY=($(compgen -W 'total' -- "$cur")) - _inotifywait_events "$1" + _comp_compgen -- -W 'total' + _comp_cmd_inotifywait__events "$1" return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - _filedir + _comp_compgen_filedir } && - complete -F _inotifywait inotifywait inotifywatch + complete -F _comp_cmd_inotifywait inotifywait inotifywatch # ex: filetype=sh diff --git a/completions/insmod b/completions/insmod index a59e753..2c02f3f 100644 --- a/completions/insmod +++ b/completions/insmod @@ -1,18 +1,18 @@ # Linux insmod(8) completion -*- shell-script -*- -_insmod() +_comp_cmd_insmod() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return # do filename completion for first argument if ((cword == 1)); then - _filedir '@(?(k)o?(.[gx]z))' + _comp_compgen_filedir '@(?(k)o?(.[gx]z|.zst))' else # do module parameter completion - COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" modinfo \ - -p ${words[1]} 2>/dev/null | cut -d: -f1)" -- "$cur")) + _comp_compgen_split -- "$(PATH="$PATH:/sbin" modinfo \ + -p "${words[1]}" 2>/dev/null | cut -d: -f1)" fi } && - complete -F _insmod insmod insmod.static + complete -F _comp_cmd_insmod insmod insmod.static # ex: filetype=sh diff --git a/completions/installpkg b/completions/installpkg index 7455eb1..71116b0 100644 --- a/completions/installpkg +++ b/completions/installpkg @@ -1,33 +1,33 @@ # Slackware Linux installpkg completion -*- shell-script -*- -_installpkg() +_comp_cmd_installpkg() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case "$prev" in --root) - _filedir -d + _comp_compgen_filedir -d return ;; --priority) - COMPREPLY=($(compgen -W 'ADD REC OPT SKP' -- "$cur")) + _comp_compgen -- -W 'ADD REC OPT SKP' return ;; --tagfile) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--warn --md5sum --root --infobox --terse - --menu --ask --priority --tagfile' -- "$cur")) + _comp_compgen -- -W '--warn --md5sum --root --infobox --terse --menu + --ask --priority --tagfile' return fi - _filedir 't[bglx]z' + _comp_compgen_filedir 't[bglx]z' } && - complete -F _installpkg installpkg + complete -F _comp_cmd_installpkg installpkg # ex: filetype=sh diff --git a/completions/interdiff b/completions/interdiff index 9933d15..6f56e33 100644 --- a/completions/interdiff +++ b/completions/interdiff @@ -1,20 +1,22 @@ # interdiff(1) completion -*- shell-script -*- -_interdiff() +_comp_cmd_interdiff() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[Upd]*)' + # shellcheck disable=SC2254 case $prev in - --unified | --strip-match | --drop-context | -!(-*)[Upd]) + --unified | --strip-match | --drop-context | -${noargopts}[Upd]) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi @@ -26,8 +28,8 @@ _interdiff() break fi done - _filedir "$exts" + _comp_compgen_filedir "$exts" } && - complete -F _interdiff interdiff + complete -F _comp_cmd_interdiff interdiff # ex: filetype=sh diff --git a/completions/invoke-rc.d b/completions/invoke-rc.d index 4a5045a..e5a66b6 100644 --- a/completions/invoke-rc.d +++ b/completions/invoke-rc.d @@ -2,37 +2,37 @@ # # Copyright (C) 2004 Servilio Afre Puentes <servilio@gmail.com> -_invoke_rc_d() +_comp_cmd_invoke_rc_d() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - local sysvdir services options valid_options + local sysvdir services options [[ -d /etc/rc.d/init.d ]] && sysvdir=/etc/rc.d/init.d || sysvdir=/etc/init.d - services=($(printf '%s ' $sysvdir/!(README*|*.sh|$_backup_glob))) - services=(${services[@]#$sysvdir/}) options=(--help --quiet --force --try-anyway --disclose-deny --query --no-fallback) if [[ $cword -eq 1 || $prev == --* ]]; then - valid_options=($( + # generate valid_options + _comp_compgen_split -- "$( tr " " "\n" <<<"${words[*]} ${options[*]}" | command sed -ne "/$(command sed 's/ /\\|/g' <<<"${options[*]}")/p" | sort | uniq -u - )) - COMPREPLY=($(compgen -W '${valid_options[@]} ${services[@]}' -- "$cur")) + )" + _comp_expand_glob services '"$sysvdir"/!(README*|*.sh|$_comp_backup_glob)' && + _comp_compgen -a -- -W '"${services[@]#"$sysvdir"/}"' elif [[ -x $sysvdir/$prev ]]; then - COMPREPLY=($(compgen -W '`command sed -e "y/|/ /" \ - -ne "s/^.*Usage:[ ]*[^ ]*[ ]*{*\([^}\"]*\).*$/\1/p" \ - $sysvdir/$prev`' -- "$cur")) + _comp_compgen_split -- "$(command sed -e 'y/|/ /' \ + -ne 's/^.*Usage:[ ]*[^ ]*[ ]*{*\([^}"]*\).*$/\1/p' \ + "$sysvdir/$prev")" else COMPREPLY=() fi } && - complete -F _invoke_rc_d invoke-rc.d + complete -F _comp_cmd_invoke_rc_d invoke-rc.d # ex: filetype=sh diff --git a/completions/ip b/completions/ip index 12ad9aa..511f206 100644 --- a/completions/ip +++ b/completions/ip @@ -1,58 +1,78 @@ # ip(8) completion -*- shell-script -*- -_iproute2_etc() +_comp_cmd_ip__iproute2_etc() { - COMPREPLY+=($(compgen -W \ - "$(awk '!/#/ { print $2 }' /etc/iproute2/$1 2>/dev/null)" \ - -- "$cur")) + _comp_compgen -a split -- "$(_comp_awk '!/#/ { print $2 }' "/etc/iproute2/$1" \ + 2>/dev/null)" } -_ip() +_comp_cmd_ip__netns() { - local cur prev words cword - _init_completion || return + _comp_compgen_split -- "$( + { + ${1-ip} -c=never netns list 2>/dev/null || ${1-ip} netns list + } | _comp_awk '{print $1}' + )" +} + +_comp_cmd_ip() +{ + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in - -V | -Version | -rc | -rcvbuf) + -V | -Version | -rc | -rcvbuf | -l | -loops) return ;; -f | -family) - COMPREPLY=($(compgen -W 'inet inet6 ipx dnet link' -- "$cur")) + _comp_compgen -- -W 'inet inet6 ipx dnet link' return ;; -b | -batch) - _filedir + _comp_compgen_filedir + return + ;; + -n | -netns) + _comp_cmd_ip__netns "$1" return ;; -force) - COMPREPLY=($(compgen -W '-batch' -- "$cur")) + _comp_compgen -- -W '-batch' return ;; esac - local subcword cmd subcmd="" - for ((subcword = 1; subcword < ${#words[@]} - 1; subcword++)); do + local subcword cmd="" has_cmd="" subcmd="" + for ((subcword = 1; subcword < cword; subcword++)); do [[ ${words[subcword]} == -b?(atch) ]] && return - [[ -v cmd ]] && subcmd=${words[subcword]} && break - [[ ${words[subcword]} != -* && \ - ${words[subcword - 1]} != -@(f?(amily)|rc?(vbuf)) ]] && - cmd=${words[subcword]} + [[ $has_cmd ]] && subcmd=${words[subcword]} && break + [[ ${words[subcword]} != -* && + ${words[subcword - 1]} != -@(f?(amily)|rc?(vbuf)) ]] && + cmd=${words[subcword]} has_cmd=set done - if [[ ! -v cmd ]]; then + if [[ ! $has_cmd ]]; then case $cur in -*) - local c="-Version -statistics -details -resolve -family - -oneline -timestamp -batch -rcvbuf" - ((cword == 1)) && c+=" -force" - COMPREPLY=($(compgen -W "$c" -- "$cur")) + _comp_compgen -a help - <<<"$( + ((cword == 1)) && printf '%s\n' -force + { + "$1" -c=never help || "$1" help + } 2>&1 | command sed -e \ + 's/[{|}=]/\n/g' -e \ + 's/\[\([^]]\{1,\}\)\]/\1/g' + )" ;; *) - COMPREPLY=($(compgen -W "help $($1 help 2>&1 | command sed -e \ - '/OBJECT := /,/}/!d' -e \ - 's/.*{//' -e \ - 's/}.*//' -e \ - 's/|//g')" -- "$cur")) + _comp_compgen_split -- "help $( + { + $1 -c=never help || $1 help + } 2>&1 | command sed -e \ + '/OBJECT := /,/}/!d' -e \ + 's/.*{//' -e \ + 's/}.*//' -e \ + 's/|//g' + )" ;; esac return @@ -69,26 +89,26 @@ _ip() delete) case $((cword - subcword)) in 1) - _available_interfaces + _comp_compgen_available_interfaces ;; 2) - COMPREPLY=($(compgen -W 'type' -- "$cur")) + _comp_compgen -- -W 'type' ;; 3) [[ $prev == type ]] && - COMPREPLY=($(compgen -W 'vlan veth vcan dummy - ifb macvlan can' -- "$cur")) + _comp_compgen -- -W 'vlan veth vcan dummy ifb + macvlan can' ;; esac ;; set) if ((cword - subcword == 1)); then - _available_interfaces + _comp_compgen_available_interfaces else case $prev in arp | dynamic | multicast | allmulticast | promisc | \ trailers) - COMPREPLY=($(compgen -W 'on off' -- "$cur")) + _comp_compgen -- -W 'on off' ;; txqueuelen | name | address | broadcast | mtu | netns | alias) ;; @@ -97,25 +117,24 @@ _ip() promisc trailers txqueuelen name address broadcast mtu netns alias" [[ $prev != @(up|down) ]] && c+=" up down" - COMPREPLY=($(compgen -W "$c" -- "$cur")) + _comp_compgen -- -W "$c" ;; esac fi ;; show) if ((cword == subcword + 1)); then - _available_interfaces - COMPREPLY+=($(compgen -W 'dev group up' -- "$cur")) + _comp_compgen_available_interfaces + _comp_compgen -a -- -W 'dev group up' elif [[ $prev == dev ]]; then - _available_interfaces + _comp_compgen_available_interfaces elif [[ $prev == group ]]; then - _iproute2_etc group + _comp_cmd_ip__iproute2_etc group fi ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help add delete set show' \ - -- "$cur")) + _comp_compgen -- -W 'help add delete set show' ;; esac ;; @@ -124,38 +143,38 @@ _ip() case $subcmd in add | change | replace) if [[ $prev == dev ]]; then - _available_interfaces + _comp_compgen_available_interfaces elif [[ $prev == scope ]]; then - _iproute2_etc rt_scopes + _comp_cmd_ip__iproute2_etc rt_scopes else : # TODO fi ;; del) if [[ $prev == dev ]]; then - _available_interfaces + _comp_compgen_available_interfaces elif [[ $prev == scope ]]; then - _iproute2_etc rt_scopes + _comp_cmd_ip__iproute2_etc rt_scopes else : # TODO fi ;; show | flush) if ((cword == subcword + 1)); then - _available_interfaces - COMPREPLY+=($(compgen -W 'dev scope to label dynamic + _comp_compgen_available_interfaces + _comp_compgen -a -- -W 'dev scope to label dynamic permanent tentative deprecated dadfailed temporary - primary secondary up' -- "$cur")) + primary secondary up' elif [[ $prev == dev ]]; then - _available_interfaces + _comp_compgen_available_interfaces elif [[ $prev == scope ]]; then - _iproute2_etc rt_scopes + _comp_cmd_ip__iproute2_etc rt_scopes fi ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help add change replace del - show flush' -- "$cur")) + _comp_compgen -- -W 'help add change replace del show + flush' ;; esac ;; @@ -164,15 +183,14 @@ _ip() case $subcmd in list | add | del | flush) if [[ $prev == dev ]]; then - _available_interfaces + _comp_compgen_available_interfaces else : # TODO fi ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help list add del flush' \ - -- "$cur")) + _comp_compgen -- -W 'help list add del flush' ;; esac ;; @@ -181,7 +199,7 @@ _ip() case $subcmd in list | flush) if [[ $prev == proto ]]; then - _iproute2_etc rt_protos + _comp_cmd_ip__iproute2_etc rt_protos else : # TODO fi @@ -189,25 +207,32 @@ _ip() get) # TODO ;; - a | add | d | del | change | append | r | replace | monitor) + a | add | d | del | change | append | r | replace) if [[ $prev == via ]]; then - COMPREPLY=($(compgen -W "$($1 r | command sed -ne \ - 's/.*via \([0-9.]*\).*/\1/p')" -- "$cur")) + _comp_compgen_split -- "$( + { + $1 -c=never r 2>/dev/null || $1 r + } | command sed -ne \ + 's/.*via \([0-9.]*\).*/\1/p' + )" elif [[ $prev == "$subcmd" ]]; then - COMPREPLY=($(compgen -W "table default \ - $($1 r | cut -d ' ' -f 1)" -- "$cur")) + _comp_compgen_split -- "table default $( + { + $1 -c=never r 2>/dev/null || $1 r + } | cut -d ' ' -f 1 + )" elif [[ $prev == dev ]]; then - _available_interfaces -a + _comp_compgen_available_interfaces -a elif [[ $prev == table ]]; then - COMPREPLY=($(compgen -W 'local main default' -- "$cur")) + _comp_compgen -- -W 'local main default' else - COMPREPLY=($(compgen -W 'via dev weight' -- "$cur")) + _comp_compgen -- -W 'via dev weight' fi ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help list flush get add del - change append replace monitor' -- "$cur")) + _comp_compgen -- -W 'help list flush get add del change + append replace' ;; esac ;; @@ -221,16 +246,16 @@ _ip() suppress_ifgroup | realms | nat | goto) ;; iif | oif) - _available_interfaces -a + _comp_compgen_available_interfaces -a ;; table | lookup) - COMPREPLY=($(compgen -W 'local main default' -- "$cur")) + _comp_compgen -- -W 'local main default' ;; *) - COMPREPLY=($(compgen -W 'from to tos dsfield fwmark - uidrange ipproto sport dport priority table lookup - protocol suppress_prefixlength suppress_ifgroup realms - nat goto iif oif not' -- "$cur")) + _comp_compgen -- -W 'from to tos dsfield fwmark + uidrange ipproto sport dport priority table + lookup protocol suppress_prefixlength + suppress_ifgroup realms nat goto iif oif not' ;; esac ;; @@ -238,14 +263,14 @@ _ip() if [[ $prev == protocol ]]; then : else - COMPREPLY=($(compgen -W 'protocol' -- "$cur")) + _comp_compgen -- -W 'protocol' fi ;; restore | show) ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help add del list flush save - restore show' -- "$cur")) + _comp_compgen -- -W 'help add del list flush save + restore show' ;; esac ;; @@ -260,8 +285,8 @@ _ip() ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help add del change replace - show flush' -- "$cur")) + _comp_compgen -- -W 'help add del change replace show + flush' ;; esac ;; @@ -276,8 +301,7 @@ _ip() ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help change show' \ - -- "$cur")) + _comp_compgen -- -W 'help change show' ;; esac ;; @@ -291,8 +315,7 @@ _ip() ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help add change del show prl - 6rd' -- "$cur")) + _comp_compgen -- -W 'help add change del show prl 6rd' ;; esac ;; @@ -304,16 +327,15 @@ _ip() ;; show) if [[ $cword -eq $subcword+1 || $prev == dev ]]; then - _available_interfaces - [[ $prev != dev ]] && - COMPREPLY=($(compgen -W '${COMPREPLY[@]} dev' \ - -- "$cur")) + _comp_compgen_available_interfaces + if [[ $prev != dev ]]; then + _comp_compgen -a -W dev + fi fi ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help add del show' \ - -- "$cur")) + _comp_compgen -- -W 'help add del show' ;; esac ;; @@ -325,7 +347,7 @@ _ip() ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help show' -- "$cur")) + _comp_compgen -- -W 'help show' ;; esac ;; @@ -335,7 +357,14 @@ _ip() all) ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help all' -- "$cur")) + _comp_compgen_split -- "help all $( + { + "$1" -c=never monitor help || "$1" monitor help + } 2>&1 | command sed -e \ + '/OBJECTS := /,/[^|]$/!d' -e \ + 's/OBJECTS := *//' -e \ + 's/|//g' + )" ;; esac ;; @@ -348,13 +377,12 @@ _ip() # TODO ;; delete | exec | pids | set) - [[ $prev == "$subcmd" ]] && - COMPREPLY=($(compgen -W "$($1 netns list)" -- "$cur")) + [[ $prev == "$subcmd" ]] && _comp_cmd_ip__netns "$1" ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'help add delete exec - identify list list-id monitor pids set' -- "$cur")) + _comp_compgen -- -W 'help add delete exec identify list + list-id monitor pids set' ;; esac ;; @@ -366,13 +394,12 @@ _ip() ;; *) ((cword == subcword)) && - COMPREPLY=($(compgen -W 'state policy monitor' \ - -- "$cur")) + _comp_compgen -- -W 'state policy monitor' ;; esac ;; esac } && - complete -F _ip ip + complete -F _comp_cmd_ip ip # ex: filetype=sh diff --git a/completions/ipcalc b/completions/ipcalc index 5603c26..979a8c2 100644 --- a/completions/ipcalc +++ b/completions/ipcalc @@ -1,9 +1,9 @@ # ipcalc(1) completion -*- shell-script -*- -_ipcalc() +_comp_cmd_ipcalc() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --help | --version | --split | -[hs]) @@ -18,8 +18,8 @@ _ipcalc() done [[ $cur != -* ]] || - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help } && - complete -F _ipcalc ipcalc + complete -F _comp_cmd_ipcalc ipcalc # ex: filetype=sh diff --git a/completions/iperf b/completions/iperf index 6347fe0..0168814 100644 --- a/completions/iperf +++ b/completions/iperf @@ -1,69 +1,90 @@ # iperf(1) completion -*- shell-script -*- -_iperf() +_comp_cmd_iperf() { - 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 noargopts='!(-*|*[ilpwMXbntLPTZCkOSAfIoFBcxy]*)' + # shellcheck disable=SC2254 case $prev in --help | --version | --interval | --len | --port | --window | --mss | --bandwidth | \ --num | --time | --listenport | --parallel | --ttl | --linux-congestion | --omit | \ --congestion | --bytes | --blockcount | --cport | --set-mss | --flowlabel | \ - --title | --tos | --affinity | -!(-*)[hvilpwMbntLPTZCkOSA]) + --title | --tos | --affinity | --rcv-timeout | --server-bitrate-limit | \ + --idle-timeout | --time-skew-threshold | --xbind | --nstreams | --connect-timeout | \ + --bitrate | --pacing-timer | --fq-rate | --length | --dscp | --extra-data | \ + --username | -${noargopts}[hvilpwMXbntLPTZCkOSA]) return ;; - --format | -!(-*)f) - COMPREPLY=($(compgen -W 'k m g K M G' -- "$cur")) + --format | -${noargopts}f) + local formats=$( + "$1" --help 2>&1 | + command sed -ne 's/^.*--format .*\[\([a-zA-Z]\{1,\}\)\].*/\1/p' | + command sed -e 's/./& /g' + ) + _comp_compgen -- -W '$formats' return ;; - --output | --fileinput | -!(-*)[oF]) - _filedir + --pidfile | -${noargopts}I) + _comp_compgen_filedir pid return ;; - --bind | -!(-*)B) - _available_interfaces -a - _ip_addresses -a - __ltrim_colon_completions "$cur" + --output | --fileinput | --authorized-users-path | -${noargopts}[oF]) + _comp_compgen_filedir return ;; - --client | -!(-*)c) - _known_hosts_real -- "$cur" + --bind | -${noargopts}B) + _comp_compgen_available_interfaces -a + _comp_compgen -a ip_addresses -a return ;; - --reportexclude | -!(-*)x) - COMPREPLY=($(compgen -W 'C D M S V' -- "$cur")) + --bind-dev) + _comp_compgen_available_interfaces -a return ;; - --reportstyle | -!(-*)y) - COMPREPLY=($(compgen -W 'C' -- "$cur")) + --client | -${noargopts}c) + _comp_compgen_known_hosts -- "$cur" + return + ;; + --reportexclude | -${noargopts}x) + _comp_compgen -- -W 'C D M S V' + return + ;; + --reportstyle | -${noargopts}y) + _comp_compgen -- -W 'C' return ;; --logfile) - _filedir log + _comp_compgen_filedir log + return + ;; + --rsa-private-key-path | --rsa-public-key-path) + _comp_compgen_filedir pem return ;; esac - $split && return + [[ $was_split ]] && return # Filter mode specific options - local i filter=cat + local -a filter=(cat) + local i for i in "${words[@]}"; do case $i in -s | --server) - filter='command sed -e /^Client.specific/,/^\(Server.specific.*\)\?$/d' + filter=(command sed -e '/^Client.specific/,/^\(Server.specific.*\)\{0,1\}$/d') ;; -c | --client) - filter='command sed -e /^Server.specific/,/^\(Client.specific.*\)\?$/d' + filter=(command sed -e '/^Server.specific/,/^\(Client.specific.*\)\{0,1\}$/d') ;; esac done - [[ $filter != cat ]] && filter+=' -e /--client/d -e /--server/d' + [[ $filter != cat ]] && filter+=(-e '/--client/d' -e '/--server/d') - COMPREPLY=($(compgen -W \ - '$("$1" --help 2>&1 | $filter | _parse_help -)' -- "$cur")) + _comp_compgen_help - <<<"$("$1" --help 2>&1 | "${filter[@]}")" [[ ${COMPREPLY-} == *= ]] && compopt -o nospace } && - complete -F _iperf iperf iperf3 + complete -F _comp_cmd_iperf iperf iperf3 # ex: filetype=sh diff --git a/completions/ipmitool b/completions/ipmitool index 920287d..5d6c212 100644 --- a/completions/ipmitool +++ b/completions/ipmitool @@ -1,65 +1,61 @@ # bash completion for ipmitool -*- shell-script -*- -_ipmitool_singleline_help() +_comp_cmd_ipmitool__singleline_help() { - COMPREPLY=($(compgen -W "$($1 $2 2>&1 | - command sed -ne 's/[,\r]//g' -e 's/^.*[Cc]ommands://p')" -- "$cur")) + _comp_compgen_split -- "$("$1" "$2" 2>&1 | + command sed -ne 's/[,\r]//g' -e 's/^.*[Cc]ommands://p')" } -_ipmitool() +_comp_cmd_ipmitool() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*[hVpUekyPmbtBTl]) return ;; -*d) - COMPREPLY=($(compgen -W "$( - command ls -d /dev/ipmi* /dev/ipmi/* /dev/ipmidev/* \ - 2>/dev/null | command sed -ne 's/^[^0-9]*\([0-9]\{1,\}\)/\1/p' - )" \ - -- "$cur")) + local -a files + _comp_expand_glob files '/dev/ipmi* /dev/ipmi/* /dev/ipmidev/*' && + _comp_compgen -- -W '"${files[@]##*([^0-9])}"' -X '![0-9]*' return ;; -*I) - COMPREPLY=($(compgen -W "$($1 -h 2>&1 | + _comp_compgen_split -- "$("$1" -h 2>&1 | command sed -e '/^Interfaces:/,/^[[:space:]]*$/!d' \ - -ne 's/^[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*/\1/p')" \ - -- "$cur")) + -ne 's/^[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*/\1/p')" return ;; -*H) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -*[fSO]) - _filedir + _comp_compgen_filedir return ;; -*C) - COMPREPLY=($(compgen -W '{0..14}' -- "$cur")) + _comp_compgen -- -W '{0..14}' return ;; -*L) - COMPREPLY=($(compgen -W 'CALLBACK USER OPERATOR ADMINISTRATOR' \ - -- "$cur")) + _comp_compgen -- -W 'CALLBACK USER OPERATOR ADMINISTRATOR' return ;; -*A) - COMPREPLY=($(compgen -W 'NONE PASSWORD MD2 MD5 OEM' -- "$cur")) + _comp_compgen -- -W 'NONE PASSWORD MD2 MD5 OEM' return ;; -*o) - COMPREPLY=($(compgen -W "$($1 -o list 2>&1 | - awk '/^[ \t]+/ { print $1 }') list" -- "$cur")) + _comp_compgen_split -- "$("$1" -o list 2>&1 | + _comp_awk '/^[ \t]+/ { print $1 }') list" return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + _comp_compgen_help -- -h return fi @@ -68,16 +64,16 @@ _ipmitool() local cmds=(raw i2c spd lan chassis power event mc sdr sensor fru gendev sel pef sol tsol isol user channel session sunoem kontronoem picmg fwum firewall shell exec set hpm ekanalyzer) - local i c cmd subcmd - for ((i = 1; i < ${#words[@]} - 1; i++)); do - [[ -v cmd ]] && subcmd=${words[i]} && break + local i c cmd="" has_cmd="" subcmd + for ((i = 1; i < cword; i++)); do + [[ $has_cmd ]] && subcmd=${words[i]} && break for c in "${cmds[@]}"; do - [[ ${words[i]} == "$c" ]] && cmd=$c && break + [[ ${words[i]} == "$c" ]] && cmd=$c has_cmd=set && break done done - if [[ ! -v cmd ]]; then - COMPREPLY=($(compgen -W '${cmds[@]}' -- "$cur")) + if [[ ! $has_cmd ]]; then + _comp_compgen -- -W '"${cmds[@]}"' return fi @@ -87,13 +83,12 @@ _ipmitool() shell) ;; - \ - exec) - _filedir + exec) + _comp_compgen_filedir ;; chassis | power | kontronoem | fwum) - _ipmitool_singleline_help $1 $cmd + _comp_cmd_ipmitool__singleline_help "$1" "$cmd" ;; lan) @@ -102,15 +97,14 @@ _ipmitool() alert) [[ $prev == alert ]] && - COMPREPLY=($(compgen -W 'print set' -- "$cur")) + _comp_compgen -- -W 'print set' ;; stats) [[ $prev == stats ]] && - COMPREPLY=($(compgen -W 'print set' -- "$cur")) + _comp_compgen -- -W 'print set' ;; *) - COMPREPLY=($(compgen -W 'print set alert stats' \ - -- "$cur")) + _comp_compgen -- -W 'print set alert stats' ;; esac ;; @@ -120,25 +114,25 @@ _ipmitool() get | info | type | list | entity) ;; elist) - COMPREPLY=($(compgen -W 'all full compact event mclog fru - generic' -- "$cur")) + _comp_compgen -- -W 'all full compact event mclog fru + generic' ;; dump) - _filedir + _comp_compgen_filedir ;; fill) case $prev in fill) - COMPREPLY=($(compgen -W 'sensors file' -- "$cur")) + _comp_compgen -- -W 'sensors file' ;; file) - _filedir + _comp_compgen_filedir ;; esac ;; *) - COMPREPLY=($(compgen -W 'get info type list elist entity - dump fill' -- "$cur")) + _comp_compgen -- -W 'get info type list elist entity dump + fill' ;; esac ;; @@ -148,7 +142,7 @@ _ipmitool() list | get | thresh) ;; *) - COMPREPLY=($(compgen -W 'list get thresh' -- "$cur")) + _comp_compgen -- -W 'list get thresh' ;; esac ;; @@ -158,15 +152,15 @@ _ipmitool() info | clear | list | elist | delete) ;; add | save | writeraw | readraw) - _filedir + _comp_compgen_filedir ;; time) [[ $prev == time ]] && - COMPREPLY=($(compgen -W 'get set' -- "$cur")) + _comp_compgen -- -W 'get set' ;; *) - COMPREPLY=($(compgen -W 'info clear list elist delete add - get save writeraw readraw time' -- "$cur")) + _comp_compgen -- -W 'info clear list elist delete add get + save writeraw readraw time' ;; esac ;; @@ -177,23 +171,23 @@ _ipmitool() set) [[ $prev == set ]] && - COMPREPLY=($(compgen -W 'name password' -- "$cur")) + _comp_compgen -- -W 'name password' ;; *) - COMPREPLY=($(compgen -W 'summary list set disable enable - priv test' -- "$cur")) + _comp_compgen -- -W 'summary list set disable enable priv + test' ;; esac ;; set) [[ $prev == set ]] && - COMPREPLY=($(compgen -W 'hostname username password privlvl - authtype localaddr targetaddr port csv verbose' -- "$cur")) + _comp_compgen -- -W 'hostname username password privlvl + authtype localaddr targetaddr port csv verbose' ;; esac } && - complete -F _ipmitool ipmitool + complete -F _comp_cmd_ipmitool ipmitool # ex: filetype=sh diff --git a/completions/ipsec b/completions/ipsec index 4bc8cdf..6bd4ebf 100644 --- a/completions/ipsec +++ b/completions/ipsec @@ -3,87 +3,86 @@ # Complete ipsec.conf conn entries. # # Reads a file from stdin in the ipsec.conf(5) format. -_ipsec_connections() +_comp_cmd_ipsec__connections() { local keyword name while read -r keyword name; do if [[ $keyword == [#]* ]]; then continue; fi [[ $keyword == conn && $name != '%default' ]] && COMPREPLY+=("$name") done - COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur")) + ((${#COMPREPLY[@]})) && + _comp_compgen -- -W '"${COMPREPLY[@]}"' } -_ipsec_freeswan() +_comp_cmd_ipsec__freeswan() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if ((cword == 1)); then - COMPREPLY=($(compgen -W 'auto barf eroute klipsdebug look manual - pluto ranbits rsasigkey setup showdefaults showhostkey spi spigrp - tncfg whack' -- "$cur")) + _comp_compgen -- -W 'auto barf eroute klipsdebug look manual pluto + ranbits rsasigkey setup showdefaults showhostkey spi spigrp tncfg + whack' return fi case ${words[1]} in auto) - COMPREPLY=($(compgen -W '--asynchronous --up --add --delete - --replace --down --route --unroute --ready --status - --rereadsecrets' -- "$cur")) + _comp_compgen -- -W '--asynchronous --up --add --delete --replace + --down --route --unroute --ready --status --rereadsecrets' ;; manual) - COMPREPLY=($(compgen -W '--up --down --route --unroute --union' \ - -- "$cur")) + _comp_compgen -- -W '--up --down --route --unroute --union' ;; ranbits) - COMPREPLY=($(compgen -W '--quick --continuous --bytes' -- "$cur")) + _comp_compgen -- -W '--quick --continuous --bytes' ;; setup) - COMPREPLY=($(compgen -W '--start --stop --restart' -- "$cur")) + _comp_compgen -- -W '--start --stop --restart' ;; *) ;; esac } -_ipsec_strongswan() +_comp_cmd_ipsec__strongswan() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if ((cword == 1)); then - COMPREPLY=($(compgen -W 'down irdumm leases listaacerts listacerts - listalgs listall listcacerts listcainfos listcards listcerts - listcrls listgroups listocsp listocspcerts listpubkeys openac pki - pluto pool purgecerts purgecrls purgeike purgeocsp ready reload - rereadaacerts rereadacerts rereadall rereadcacerts rereadcrls - rereadgroups rereadocspcerts rereadsecrets restart route scdecrypt - scencrypt scepclient secrets start starter status statusall stop - stroke unroute uci up update version whack --confdir --copyright - --directory --help --version --versioncode' -- "$cur")) + _comp_compgen -- -W 'down irdumm leases listaacerts listacerts listalgs + listall listcacerts listcainfos listcards listcerts listcrls + listgroups listocsp listocspcerts listpubkeys openac pki pluto pool + purgecerts purgecrls purgeike purgeocsp ready reload rereadaacerts + rereadacerts rereadall rereadcacerts rereadcrls rereadgroups + rereadocspcerts rereadsecrets restart route scdecrypt scencrypt + scepclient secrets start starter status statusall stop stroke + unroute uci up update version whack --confdir --copyright + --directory --help --version --versioncode' return fi case ${words[1]} in down | route | status | statusall | unroute | up) local confdir=$(ipsec --confdir) - _ipsec_connections <"$confdir/ipsec.conf" + _comp_cmd_ipsec__connections <"$confdir/ipsec.conf" ;; list*) - COMPREPLY=($(compgen -W '--utc' -- "$cur")) + _comp_compgen -- -W '--utc' ;; restart | start) - COMPREPLY=($(compgen -W '--attach-gdb --auto-update --debug - --debug-all --debug-more --nofork' -- "$cur")) + _comp_compgen -- -W '--attach-gdb --auto-update --debug --debug-all + --debug-more --nofork' ;; pki) - COMPREPLY=($(compgen -W '--gen --issue --keyid --print --pub - --req --self --signcrl --verify' -- "$cur")) + _comp_compgen -- -W '--gen --issue --keyid --print --pub --req + --self --signcrl --verify' ;; pool) ;; irdumm) - _filedir 'rb' + _comp_compgen_filedir 'rb' ;; *) ;; @@ -92,10 +91,10 @@ _ipsec_strongswan() case "$(ipsec --version 2>/dev/null)" in *strongSwan*) - complete -F _ipsec_strongswan ipsec + complete -F _comp_cmd_ipsec__strongswan ipsec ;; *) - complete -F _ipsec_freeswan ipsec + complete -F _comp_cmd_ipsec__freeswan ipsec ;; esac diff --git a/completions/iptables b/completions/iptables index ffb905b..d0c0ec1 100644 --- a/completions/iptables +++ b/completions/iptables @@ -1,51 +1,55 @@ # bash completion for iptables -*- shell-script -*- -_iptables() +_comp_cmd_iptables() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return - local table chain='s/^Chain \([^ ]\{1,\}\).*$/\1/p' + local table="" chain='s/^Chain \([^ ]\{1,\}\).*$/\1/p' + local targets='ACCEPT DROP LOG ULOG REJECT' + local IFS=$' \t\n' # for ${table:+-t "$table"} [[ ${words[*]} =~ [[:space:]]-(t|-table=?)[[:space:]]*([^[:space:]]+) ]] && - table="-t ${BASH_REMATCH[2]}" + table=${BASH_REMATCH[2]} case $prev in -*[AIDRPFXLZ]) - COMPREPLY=($(compgen -W '`"$1" $table -nL 2>/dev/null | \ - command sed -ne "s/^Chain \([^ ]\{1,\}\).*$/\1/p"`' -- "$cur")) + _comp_compgen_split -- "$( + "$1" ${table:+-t "$table"} -nL 2>/dev/null | + command sed -ne 's/^Chain \([^ ]\{1,\}\).*$/\1/p' + )" ;; -*t) - COMPREPLY=($(compgen -W 'nat filter mangle' -- "$cur")) + _comp_compgen -- -W 'nat filter mangle' ;; -j) - if [[ $table == "-t filter" || -z $table ]]; then - COMPREPLY=($(compgen -W 'ACCEPT DROP LOG ULOG REJECT - `"$1" $table -nL 2>/dev/null | command sed -ne "$chain" \ - -e "s/INPUT|OUTPUT|FORWARD|PREROUTING|POSTROUTING//"`' -- \ - "$cur")) - elif [[ $table == "-t nat" ]]; then - COMPREPLY=($(compgen -W 'ACCEPT DROP LOG ULOG REJECT MIRROR SNAT - DNAT MASQUERADE `"$1" $table -nL 2>/dev/null | \ - command sed -ne "$chain" -e "s/OUTPUT|PREROUTING|POSTROUTING//"`' \ - -- "$cur")) - elif [[ $table == "-t mangle" ]]; then - COMPREPLY=($(compgen -W 'ACCEPT DROP LOG ULOG REJECT MARK TOS - `"$1" $table -nL 2>/dev/null | command sed -ne "$chain" \ - -e "s/INPUT|OUTPUT|FORWARD|PREROUTING|POSTROUTING//"`' -- \ - "$cur")) + if [[ $table == "filter" || ! $table ]]; then + _comp_compgen -- -W '$targets' + _comp_compgen -a split -- "$("$1" ${table:+-t "$table"} -nL \ + 2>/dev/null | command sed -ne "$chain" \ + -e 's/INPUT|OUTPUT|FORWARD|PREROUTING|POSTROUTING//')" + elif [[ $table == "nat" ]]; then + _comp_compgen -- -W '$targets MIRROR SNAT DNAT MASQUERADE' + _comp_compgen -a split -- "$("$1" -t "$table" -nL 2>/dev/null | + command sed -ne "$chain" \ + -e 's/OUTPUT|PREROUTING|POSTROUTING//')" + elif [[ $table == "mangle" ]]; then + _comp_compgen -- -W '$targets MARK TOS' + _comp_compgen -a split -- "$("$1" -t "$table" -nL 2>/dev/null | + command sed -ne "$chain" \ + -e 's/INPUT|OUTPUT|FORWARD|PREROUTING|POSTROUTING//')" fi ;; *) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$("$1" --help 2>&1 | - command sed -e "s/^\[\!\]//" | _parse_help -)' -- "$cur")) + _comp_compgen_help - <<<"$("$1" --help 2>&1 | + command sed -e "s/^\[\!\]//")" [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi ;; esac } && - complete -F _iptables iptables + complete -F _comp_cmd_iptables iptables # ex: filetype=sh diff --git a/completions/ipv6calc b/completions/ipv6calc index c452c15..7cf7d82 100644 --- a/completions/ipv6calc +++ b/completions/ipv6calc @@ -1,23 +1,24 @@ # ipv6calc completion -*- shell-script -*- -_ipv6calc() +_comp_cmd_ipv6calc() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[dIOA]*)' + # shellcheck disable=SC2254 case "$prev" in - --debug | -!(-*)d) + --debug | -${noargopts}d) return ;; - --in | --out | --action | -!(-*)[IOA]) + --in | --out | --action | -${noargopts}[IOA]) # With ipv6calc < 0.73.0, -m does nothing here, so use sed instead. - COMPREPLY=($(compgen -W "$($1 "$prev" -h 2>&1 | - command sed -ne 's/^[[:space:]]\{1,\}\([^[:space:]:]\{1,\}\)[[:space:]]*:.*/\1/p')" \ - -- "$cur")) + _comp_compgen_split -- "$("$1" "$prev" -h 2>&1 | + command sed -ne 's/^[[:space:]]\{1,\}\([^[:space:]:]\{1,\}\)[[:space:]]*:.*/\1/p')" return ;; --db-geoip | --db-ip2location-ipv4 | --db-ip2location-ipv6) - _filedir + _comp_compgen_filedir return ;; --printstart | --printend) @@ -25,14 +26,14 @@ _ipv6calc() ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$("$1" -h 2>&1 | - command sed -e "s/[][]//g" | _parse_help -)' -- "$cur")) + _comp_compgen_help - <<<"$("$1" -h 2>&1 | + command sed -e "s/[][]//g")" fi } && - complete -F _ipv6calc ipv6calc + complete -F _comp_cmd_ipv6calc ipv6calc # ex: filetype=sh diff --git a/completions/iscsiadm b/completions/iscsiadm index 7786ddc..84cc817 100644 --- a/completions/iscsiadm +++ b/completions/iscsiadm @@ -1,31 +1,32 @@ # iscsiadm(1) completion -*- shell-script -*- -_iscsiadm() +_comp_cmd_iscsiadm() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[motLU]*)' + # shellcheck disable=SC2254 case $prev in - --mode | -!(-*)m) - COMPREPLY=($(compgen -W 'discovery node session iface fw host' \ - -- "$cur")) + --mode | -${noargopts}m) + _comp_compgen -- -W 'discovery node session iface fw host' return ;; - --op | -!(-*)o) - COMPREPLY=($(compgen -W 'new delete update show' -- "$cur")) + --op | -${noargopts}o) + _comp_compgen -- -W 'new delete update show' return ;; - --type | -!(-*)t) - COMPREPLY=($(compgen -W 'sendtargets st slp isns fw' -- "$cur")) + --type | -${noargopts}t) + _comp_compgen -- -W 'sendtargets st slp isns fw' return ;; - --loginall | --logoutall | -!(-*)[LU]) - COMPREPLY=($(compgen -W 'all manual automatic' -- "$cur")) + --loginall | --logoutall | -${noargopts}[LU]) + _comp_compgen -- -W 'all manual automatic' return ;; esac - $split && return + [[ $was_split ]] && return local options if ((cword > 1)); then @@ -59,8 +60,8 @@ _iscsiadm() options='--mode' fi - COMPREPLY=($(compgen -W "$options" -- "$cur")) + _comp_compgen -- -W "$options" } && - complete -F _iscsiadm iscsiadm + complete -F _comp_cmd_iscsiadm iscsiadm # ex: filetype=sh diff --git a/completions/isort b/completions/isort index 2a84e25..a5c6dff 100644 --- a/completions/isort +++ b/completions/isort @@ -1,9 +1,9 @@ # isort completion -*- shell-script -*- -_isort() +_comp_cmd_isort() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --help | --add-import | --builtin | --future | --from-first | -ff | \ @@ -15,27 +15,29 @@ _isort() return ;; --jobs | -j) - COMPREPLY=($(compgen -W "{1..$(_ncpus)}" -- "$cur")) + local REPLY + _comp_get_ncpus + _comp_compgen -- -W "{1..$REPLY}" return ;; --multi-line | -m) - COMPREPLY=($(compgen -W '{0..5}' -- "$cur")) + _comp_compgen -- -W '{0..5}' return ;; --section-default | -sd) - COMPREPLY=($(compgen -W 'FUTURE STDLIB THIRDPARTY FIRSTPARTY - LOCALFOLDER' -- "$cur")) + _comp_compgen -- -W 'FUTURE STDLIB THIRDPARTY FIRSTPARTY + LOCALFOLDER' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - _filedir '@(py|pyi)' + _comp_compgen_filedir '@(py|pyi)' } && - complete -F _isort isort + complete -F _comp_cmd_isort isort # ex: filetype=sh diff --git a/completions/isql b/completions/isql index 4258c51..11dd654 100644 --- a/completions/isql +++ b/completions/isql @@ -1,14 +1,16 @@ # isql completion -*- shell-script -*- # by Victor Bogado da Silva Lins <victor@bogado.net> -_isql() +_comp_cmd_isql() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - [[ -f $ODBCINI ]] && - COMPREPLY=($(command grep "\[$cur" "$ODBCINI" | tr -d \[\])) + [[ -f ${ODBCINI-} ]] && + _comp_compgen_split -l -- "$( + command sed -n 's/\]//g;s/^\[//gp' "$ODBCINI" + )" } && - complete -F _isql isql + complete -F _comp_cmd_isql isql # ex: filetype=sh diff --git a/completions/iwconfig b/completions/iwconfig index aa8fbf3..7fbc985 100644 --- a/completions/iwconfig +++ b/completions/iwconfig @@ -1,90 +1,90 @@ # iwconfig completion -*- shell-script -*- -_iwconfig() +_comp_deprecate_var 2.12 \ + COMP_IWLIST_SCAN BASH_COMPLETION_CMD_IWCONFIG_SCAN + +_comp_cmd_iwconfig() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in mode) - COMPREPLY=($(compgen -W 'managed ad-hoc master repeater secondary - monitor' -- "$cur")) + _comp_compgen -- -W 'managed ad-hoc master repeater secondary + monitor' return ;; essid) - COMPREPLY=($(compgen -W 'on off any' -- "$cur")) - if [[ -n ${COMP_IWLIST_SCAN:-} ]]; then - COMPREPLY+=($(compgen -W \ - "$(iwlist ${words[1]} scan | - awk -F'\"' '/ESSID/ {print $2}')" -- "$cur")) + _comp_compgen -- -W 'on off any' + if [[ ${BASH_COMPLETION_CMD_IWCONFIG_SCAN-} ]]; then + _comp_compgen -a split -- "$(iwlist "${words[1]}" scan | + _comp_awk -F '\"' '/ESSID/ {print $2}')" fi return ;; nwid) - COMPREPLY=($(compgen -W 'on off' -- "$cur")) + _comp_compgen -- -W 'on off' return ;; channel) - COMPREPLY=($(compgen -W "$(iwlist ${words[1]} channel | - awk '/^[ \t]*Channel/ {print $2}')" -- "$cur")) + _comp_compgen_split -- "$(iwlist "${words[1]}" channel | + _comp_awk '/^[ \t]*Channel/ {print $2}')" return ;; freq) - COMPREPLY=($(compgen -W "$(iwlist ${words[1]} channel | - awk '/^[ \t]*Channel/ {print $4"G"}')" -- "$cur")) + _comp_compgen_split -- "$(iwlist "${words[1]}" channel | + _comp_awk '/^[ \t]*Channel/ {print $4"G"}')" return ;; ap) - COMPREPLY=($(compgen -W 'on off any' -- "$cur")) - if [[ -n ${COMP_IWLIST_SCAN:-} ]]; then - COMPREPLY+=($(compgen -W \ - "$(iwlist ${words[1]} scan | - awk -F ': ' '/Address/ {print $2}')" -- "$cur")) + _comp_compgen -- -W 'on off any' + if [[ ${BASH_COMPLETION_CMD_IWCONFIG_SCAN-} ]]; then + _comp_compgen -a split -- "$(iwlist "${words[1]}" scan | + _comp_awk -F ': ' '/Address/ {print $2}')" fi return ;; rate) - COMPREPLY=($(compgen -W 'auto fixed' -- "$cur")) - COMPREPLY+=($(compgen -W \ - "$(iwlist ${words[1]} rate | - awk '/^[ \t]*[0-9]/ {print $1"M"}')" -- "$cur")) + _comp_compgen -- -W 'auto fixed' + _comp_compgen -a split -- "$(iwlist "${words[1]}" rate | + _comp_awk '/^[ \t]*[0-9]/ {print $1"M"}')" return ;; rts | frag) - COMPREPLY=($(compgen -W 'auto fixed off' -- "$cur")) + _comp_compgen -- -W 'auto fixed off' return ;; key | enc) - COMPREPLY=($(compgen -W 'off on open restricted' -- "$cur")) + _comp_compgen -- -W 'off on open restricted' return ;; power) - COMPREPLY=($(compgen -W 'period timeout off on' -- "$cur")) + _comp_compgen -- -W 'period timeout off on' return ;; txpower) - COMPREPLY=($(compgen -W 'off on auto' -- "$cur")) + _comp_compgen -- -W 'off on auto' return ;; retry) - COMPREPLY=($(compgen -W 'limit lifetime' -- "$cur")) + _comp_compgen -- -W 'limit lifetime' return ;; esac if ((cword == 1)); then if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--help --version' -- "$cur")) + _comp_compgen -- -W '--help --version' else - _available_interfaces -w + _comp_compgen_available_interfaces -w fi else - COMPREPLY=($(compgen -W 'essid nwid mode freq channel sens mode ap - nick rate rts frag enc key power txpower commit' -- "$cur")) + _comp_compgen -- -W 'essid nwid mode freq channel sens mode ap nick + rate rts frag enc key power txpower commit' fi } && - complete -F _iwconfig iwconfig + complete -F _comp_cmd_iwconfig iwconfig # ex: filetype=sh diff --git a/completions/iwlist b/completions/iwlist index 16aa39c..efac3e6 100644 --- a/completions/iwlist +++ b/completions/iwlist @@ -1,22 +1,22 @@ # iwlist completion -*- shell-script -*- -_iwlist() +_comp_cmd_iwlist() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if ((cword == 1)); then if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--help --version' -- "$cur")) + _comp_compgen -- -W '--help --version' else - _available_interfaces -w + _comp_compgen_available_interfaces -w fi else - COMPREPLY=($(compgen -W 'scan scanning freq frequency channel rate - bit bitrate key enc encryption power txpower retry ap accesspoint - peers event' -- "$cur")) + _comp_compgen -- -W 'scan scanning freq frequency channel rate bit + bitrate key enc encryption power txpower retry ap accesspoint peers + event' fi } && - complete -F _iwlist iwlist + complete -F _comp_cmd_iwlist iwlist # ex: filetype=sh diff --git a/completions/iwpriv b/completions/iwpriv index 4e38246..518a22a 100644 --- a/completions/iwpriv +++ b/completions/iwpriv @@ -1,31 +1,31 @@ # iwpriv completion -*- shell-script -*- -_iwpriv() +_comp_cmd_iwpriv() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in roam) - COMPREPLY=($(compgen -W 'on off' -- "$cur")) + _comp_compgen -- -W 'on off' return ;; port) - COMPREPLY=($(compgen -W 'ad-hoc managed' -- "$cur")) + _comp_compgen -- -W 'ad-hoc managed' return ;; esac if ((cword == 1)); then if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--help --version' -- "$cur")) + _comp_compgen -- -W '--help --version' else - _available_interfaces -w + _comp_compgen_available_interfaces -w fi else - COMPREPLY=($(compgen -W '--all roam port' -- "$cur")) + _comp_compgen -- -W '--all roam port' fi } && - complete -F _iwpriv iwpriv + complete -F _comp_cmd_iwpriv iwpriv # ex: filetype=sh diff --git a/completions/iwspy b/completions/iwspy index 38b7868..e097d95 100644 --- a/completions/iwspy +++ b/completions/iwspy @@ -1,20 +1,20 @@ # iwspy completion -*- shell-script -*- -_iwspy() +_comp_cmd_iwspy() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if ((cword == 1)); then if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--help --version' -- "$cur")) + _comp_compgen -- -W '--help --version' else - _available_interfaces -w + _comp_compgen_available_interfaces -w fi else - COMPREPLY=($(compgen -W 'setthr getthr off' -- "$cur")) + _comp_compgen -- -W 'setthr getthr off' fi } && - complete -F _iwspy iwspy + complete -F _comp_cmd_iwspy iwspy # ex: filetype=sh diff --git a/completions/jar b/completions/jar index 2289491..d01a8a4 100644 --- a/completions/jar +++ b/completions/jar @@ -1,27 +1,27 @@ # jar(1) completion -*- shell-script -*- -_jar() +_comp_cmd_jar() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if ((cword == 1)); then - COMPREPLY=($(compgen -W 'c t x u' -- "$cur")) + _comp_compgen -- -W 'c t x u' return fi case ${words[1]} in *c*f) - _filedir + _comp_compgen_filedir ;; *f) - _filedir_xspec unzip + _comp_compgen_filedir_xspec unzip ;; *) - _filedir + _comp_compgen_filedir ;; esac } && - complete -F _jar jar + complete -F _comp_cmd_jar jar # ex: filetype=sh diff --git a/completions/jarsigner b/completions/jarsigner index 1f26c9c..ebc6cf8 100644 --- a/completions/jarsigner +++ b/completions/jarsigner @@ -1,14 +1,14 @@ # jarsigner(1) completion -*- shell-script -*- -_jarsigner() +_comp_cmd_jarsigner() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -keystore) - COMPREPLY=($(compgen -W 'NONE' -- "$cur")) - _filedir '@(jks|ks|p12|pfx)' + _comp_compgen -- -W 'NONE' + _comp_compgen -a filedir '@(jks|ks|p12|pfx)' return ;; -storepass | -keypass | -sigfile | -digestalg | -sigalg | -tsacert | -tsapolicyid | \ @@ -17,41 +17,40 @@ _jarsigner() return ;; -certchain | -tsa) - _filedir + _comp_compgen_filedir return ;; -storetype) - COMPREPLY=($(compgen -W 'JKS PKCS11 PKCS12' -- "$cur")) + _comp_compgen -- -W 'JKS PKCS11 PKCS12' return ;; -signedjar) - _filedir '@(jar|apk)' + _comp_compgen_filedir '@(jar|apk)' return ;; esac # Check if a jar was already given. - local i jar=false - for ((i = 1; i < ${#words[@]} - 1; i++)); do - if [[ ${words[i]} == *.@(jar|apk) && \ + local i jar="" + for ((i = 1; i < cword; i++)); do + if [[ ${words[i]} == *.@(jar|apk) && ${words[i - 1]} != -signedjar ]]; then - jar=true + jar=set break fi done - if ! $jar; then + if [[ ! $jar ]]; then if [[ $cur == -* ]]; then # Documented as "should not be used": -internalsf, -sectionsonly - COMPREPLY=($(compgen -W '-keystore -storepass -storetype - -keypass -sigfile -signedjar -digestalg -sigalg -verify - -verbose -certs -tsa -tsacert -altsigner -altsignerpath - -protected -providerName -providerClass -providerArg' \ - -- "$cur")) + _comp_compgen -- -W '-keystore -storepass -storetype -keypass + -sigfile -signedjar -digestalg -sigalg -verify -verbose -certs + -tsa -tsacert -altsigner -altsignerpath -protected + -providerName -providerClass -providerArg' fi - _filedir '@(jar|apk)' + _comp_compgen -a filedir '@(jar|apk)' fi } && - complete -F _jarsigner jarsigner + complete -F _comp_cmd_jarsigner jarsigner # ex: filetype=sh diff --git a/completions/java b/completions/java index d0f70ae..8ddcfaf 100644 --- a/completions/java +++ b/completions/java @@ -1,86 +1,93 @@ # bash completion for java, javac and javadoc -*- shell-script -*- # available path elements completion -_java_path() +_comp_cmd_java__classpath() { - cur=${cur##*:} - _filedir '@(jar|zip)' + _comp_compgen -c "${cur##*:}" filedir '@(jar|zip)' } # exact classpath determination -_java_find_classpath() +# @var[out] REPLY Array to store classpaths +# @return 0 if at least one element is generated, or otherwise 1 +_comp_cmd_java__find_classpath() { local i + REPLY= + # search first in current options for ((i = 1; i < cword; i++)); do if [[ ${words[i]} == -@(cp|classpath) ]]; then - classpath=${words[i + 1]} + REPLY=${words[i + 1]} break fi done - # default to environment - [[ ! -v classpath ]] && classpath=${CLASSPATH-} - - # default to current directory - [[ -z $classpath ]] && classpath=. + # fall back to environment, followed by current directory + _comp_split -F : REPLY "${REPLY:-${CLASSPATH:-.}}" } # exact sourcepath determination -_java_find_sourcepath() +# @var[out] REPLY Array to store sourcepaths +# @return 0 if at least one element is generated, or otherwise 1 +_comp_cmd_java__find_sourcepath() { local i + REPLY= + # search first in current options for ((i = 1; i < cword; i++)); do if [[ ${words[i]} == -sourcepath ]]; then - sourcepath=${words[i + 1]} + REPLY=${words[i + 1]} break fi done - # default to classpath - if [[ ! -v sourcepath ]]; then - local classpath - _java_find_classpath - sourcepath=$classpath + # fall back to classpath + if [[ ! $REPLY ]]; then + _comp_cmd_java__find_classpath + return fi + + _comp_split -F : REPLY "$REPLY" } # available classes completion -_java_classes() +_comp_cmd_java__classes() { - local classpath i + local REPLY i # find which classpath to use - _java_find_classpath + _comp_cmd_java__find_classpath + local -a classpaths=("${REPLY[@]}") + local -a classes=() # convert package syntax to path syntax - cur=${cur//.//} + local cur=${cur//.//} # parse each classpath element for classes - for i in ${classpath//:/ }; do + for i in "${classpaths[@]}"; do if [[ $i == *.@(jar|zip) && -r $i ]]; then if type zipinfo &>/dev/null; then - COMPREPLY+=($(zipinfo -1 "$i" "$cur*" 2>/dev/null | - command grep '^[^$]*\.class$')) + _comp_split -a classes "$(zipinfo -1 "$i" "$cur*" 2>/dev/null | + command grep '^[^$]*\.class$')" elif type unzip &>/dev/null; then # Last column, between entries consisting entirely of dashes - COMPREPLY+=($(unzip -lq "$i" "$cur*" 2>/dev/null | - awk '$NF ~ /^-+$/ { flag=!flag; next }; - flag && $NF ~ /^[^$]*\.class/ { print $NF }')) + _comp_split -a classes "$(unzip -lq "$i" "$cur*" 2>/dev/null | + _comp_awk '$NF ~ /^-+$/ { flag=!flag; next }; + flag && $NF ~ /^[^$]*\.class/ { print $NF }')" elif type jar &>/dev/null; then - COMPREPLY+=($(jar tf "$i" "$cur" | - command grep '^[^$]*\.class$')) + _comp_split -a classes "$(jar tf "$i" "$cur" | + command grep '^[^$]*\.class$')" fi elif [[ -d $i ]]; then - COMPREPLY+=( - $(compgen -d -- "$i/$cur" | command sed -e "s|^$i/\(.*\)|\1.|") - $(compgen -f -X '!*.class' -- "$i/$cur" | - command sed -e '/\$/d' -e "s|^$i/||") - ) - [[ ${COMPREPLY-} == *.class ]] || compopt -o nospace + local tmp + _comp_compgen -v tmp -c "$i/$cur" -- -d -S . + _comp_compgen -av tmp -c "$i/$cur" -- -f -X '!*.class' + ((${#tmp[@]})) && + _comp_compgen -av classes -- -X '*\$*' -W '"${tmp[@]#$i/}"' + [[ ${classes-} == *.class ]] || compopt -o nospace # FIXME: if we have foo.class and foo/, the completion # returns "foo/"... how to give precedence to files @@ -88,47 +95,50 @@ _java_classes() fi done - if ((${#COMPREPLY[@]} != 0)); then + if ((${#classes[@]} != 0)); then # remove class extension - COMPREPLY=(${COMPREPLY[@]%.class}) + classes=("${classes[@]%.class}") # convert path syntax to package syntax - COMPREPLY=(${COMPREPLY[@]//\//.}) + classes=("${classes[@]//\//.}") + _comp_compgen -U classes -- -W '"${classes[@]}"' fi } # available packages completion -_java_packages() +_comp_cmd_java__packages() { - local sourcepath i + local REPLY i files # find which sourcepath to use - _java_find_sourcepath + _comp_cmd_java__find_sourcepath || return 0 + local -a sourcepaths=("${REPLY[@]}") # convert package syntax to path syntax - cur=${cur//.//} + local cur=${cur//.//} # parse each sourcepath element for packages - for i in ${sourcepath//:/ }; do + for i in "${sourcepaths[@]}"; do if [[ -d $i ]]; then - COMPREPLY+=($(command ls -F -d $i/$cur* 2>/dev/null | - command sed -e 's|^'$i'/||')) + _comp_expand_glob files '"$i/$cur"*' || continue + _comp_split -la COMPREPLY "$( + command ls -F -d "${files[@]}" 2>/dev/null | + command sed -e 's|^'"$i"'/||' + )" fi done if ((${#COMPREPLY[@]} != 0)); then - # keep only packages - COMPREPLY=($(tr " " "\n" <<<"${COMPREPLY[@]}" | command grep "/$")) - # remove packages extension - COMPREPLY=(${COMPREPLY[@]%/}) + # keep only packages with the package suffix `/` being removed + _comp_split -l COMPREPLY "$(printf '%s\n' "${COMPREPLY[@]}" | command sed -n 's,/$,,p')" # convert path syntax to package syntax - cur="${COMPREPLY[*]//\//.}" + ((${#COMPREPLY[@]})) && COMPREPLY=("${COMPREPLY[@]//\//.}") fi } # java completion # -_java() +_comp_cmd_java() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return local i @@ -142,7 +152,7 @@ _java() ;; *) # once we've seen a class, just do filename completion - _filedir + _comp_compgen_filedir return ;; esac @@ -151,59 +161,55 @@ _java() case $cur in # standard option completions -verbose:*) - COMPREPLY=($(compgen -W 'class gc jni' -- "${cur#*:}")) + _comp_compgen -c "${cur#*:}" -- -W 'class gc jni' return ;; -javaagent:*) - cur=${cur#*:} - _filedir '@(jar|zip)' + _comp_compgen -c "${cur#*:}" filedir '@(jar|zip)' return ;; -agentpath:*) - cur=${cur#*:} - _filedir so + _comp_compgen -c "${cur#*:}" filedir so return ;; # various non-standard option completions -splash:*) - cur=${cur#*:} - _filedir '@(gif|jp?(e)g|png)' + _comp_compgen -c "${cur#*:}" filedir '@(gif|jp?(e)g|png)' return ;; -Xbootclasspath*:*) - _java_path + _comp_cmd_java__classpath return ;; -Xcheck:*) - COMPREPLY=($(compgen -W 'jni' -- "${cur#*:}")) + _comp_compgen -c "${cur#*:}" -- -W 'jni' return ;; -Xgc:*) - COMPREPLY=($(compgen -W 'singlecon gencon singlepar genpar' \ - -- "${cur#*:}")) + _comp_compgen -c "${cur#*:}" -- -W 'singlecon gencon singlepar + genpar' return ;; -Xgcprio:*) - COMPREPLY=($(compgen -W 'throughput pausetime deterministic' \ - -- "${cur#*:}")) + _comp_compgen -c "${cur#*:}" -- -W 'throughput pausetime + deterministic' return ;; -Xloggc:* | -Xverboselog:*) - cur=${cur#*:} - _filedir + _comp_compgen -c "${cur#*:}" filedir return ;; -Xshare:*) - COMPREPLY=($(compgen -W 'auto off on' -- "${cur#*:}")) + _comp_compgen -c "${cur#*:}" -- -W 'auto off on' return ;; -Xverbose:*) - COMPREPLY=($(compgen -W 'memory load jni cpuinfo codegen opt - gcpause gcreport' -- "${cur#*:}")) + _comp_compgen -c "${cur#*:}" -- -W 'memory load jni cpuinfo codegen + opt gcpause gcreport' return ;; -Xverify:*) - COMPREPLY=($(compgen -W 'all none remote' -- "${cur#*:}")) + _comp_compgen -c "${cur#*:}" -- -W 'all none remote' return ;; # the rest that we have no completions for @@ -214,39 +220,39 @@ _java() case $prev in -cp | -classpath) - _java_path + _comp_cmd_java__classpath return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help [[ $cur == -X* ]] && - COMPREPLY+=($(compgen -W '$(_parse_help "$1" -X)' -- "$cur")) + _comp_compgen -a help -- -X else if [[ $prev == -jar ]]; then # jar file completion - _filedir '[jw]ar' + _comp_compgen_filedir '[jw]ar' else # classes completion - _java_classes + _comp_cmd_java__classes fi fi [[ ${COMPREPLY-} == -*[:=] ]] && compopt -o nospace - __ltrim_colon_completions "$cur" + _comp_ltrim_colon_completions "$cur" } && - complete -F _java java + complete -F _comp_cmd_java java -_javadoc() +_comp_cmd_javadoc() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -overview | -helpfile) - _filedir '?(x)htm?(l)' + _comp_compgen_filedir '?(x)htm?(l)' return ;; -doclet | -exclude | -subpackages | -source | -locale | -encoding | -windowtitle | \ @@ -255,49 +261,49 @@ _javadoc() return ;; -stylesheetfile) - _filedir css + _comp_compgen_filedir css return ;; -d | -link | -linkoffline) - _filedir -d + _comp_compgen_filedir -d return ;; -classpath | -cp | -bootclasspath | -docletpath | -sourcepath | -extdirs | \ -excludedocfilessubdir) - _java_path + _comp_cmd_java__classpath return ;; esac # -linkoffline takes two arguments if [[ $cword -gt 2 && ${words[cword - 2]} == -linkoffline ]]; then - _filedir -d + _comp_compgen_filedir -d return fi if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help else # source files completion - _filedir java + _comp_compgen_filedir java # packages completion - _java_packages + _comp_cmd_java__packages fi } && - complete -F _javadoc javadoc + complete -F _comp_cmd_javadoc javadoc -_javac() +_comp_cmd_javac() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return case $prev in -d) - _filedir -d + _comp_compgen_filedir -d return ;; -cp | -classpath | -bootclasspath | -sourcepath | -extdirs) - _java_path + _comp_cmd_java__classpath return ;; esac @@ -311,23 +317,23 @@ _javac() # the others. local opts=$("$1" $helpopt 2>&1 | command sed -e 's/-g:none/-g:{none}/' -ne \ "s/^[[:space:]]*${cur%%:*}:{\([^}]\{1,\}\)}.*/\1/p") - COMPREPLY=($(compgen -W "${opts//,/ }" -- "${cur#*:}")) + _comp_compgen -c "${cur#*:}" -- -W "${opts//,/ }" return fi if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help [[ $cur == -X* ]] && - COMPREPLY+=($(compgen -W '$(_parse_help "$1" -X)' -- "$cur")) + _comp_compgen -a help -- -X else # source files completion - _filedir java + _comp_compgen_filedir java fi [[ ${COMPREPLY-} == -*[:=] ]] && compopt -o nospace - __ltrim_colon_completions "$cur" + _comp_ltrim_colon_completions "$cur" } && - complete -F _javac javac + complete -F _comp_cmd_javac javac # ex: filetype=sh diff --git a/completions/javaws b/completions/javaws index f42a1e5..cd6c848 100644 --- a/completions/javaws +++ b/completions/javaws @@ -1,20 +1,20 @@ # javaws(1) completion -*- shell-script -*- -_javaws() +_comp_cmd_javaws() { - local cur prev words cword - _init_completion -n = || return + local cur prev words cword comp_args + _comp_initialize -n = -- "$@" || return case $prev in -help | -license | -about | -viewer | -arg | -param | -property | -update | -umask) return ;; -basedir | -codebase) - _filedir -d + _comp_compgen_filedir -d return ;; -uninstall | -import) - _filedir jnlp + _comp_compgen_filedir jnlp return ;; esac @@ -22,13 +22,13 @@ _javaws() if [[ $cur == *= ]]; then return elif [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W "$(_parse_help "$1" -help) " -- "$cur")) + _comp_compgen_help -- -help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir jnlp + _comp_compgen_filedir jnlp } && - complete -F _javaws javaws + complete -F _comp_cmd_javaws javaws # ex: filetype=sh diff --git a/completions/jpegoptim b/completions/jpegoptim index c366972..7409854 100644 --- a/completions/jpegoptim +++ b/completions/jpegoptim @@ -1,38 +1,40 @@ # jpegoptim(1) completion -*- shell-script -*- -_jpegoptim() +_comp_cmd_jpegoptim() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[dmTS]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | -!(-*)[hV]*) + --help | --version | -${noargopts}[hV]*) return ;; - --dest | -!(-*)d) - _filedir -d + --dest | -${noargopts}d) + _comp_compgen_filedir -d return ;; - --max | --threshold | -!(-*)[mT]) - COMPREPLY=($(compgen -W '{0..100}' -- "$cur")) + --max | --threshold | -${noargopts}[mT]) + _comp_compgen -- -W '{0..100}' return ;; - --size | -!(-*)S) - COMPREPLY=($(compgen -W '{1..99}%' -- "$cur")) + --size | -${noargopts}S) + _comp_compgen -- -W '{1..99}%' return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir 'jp?(e)g' + _comp_compgen_filedir 'jp?(e)g' } && - complete -F _jpegoptim jpegoptim + complete -F _comp_cmd_jpegoptim jpegoptim # ex: filetype=sh diff --git a/completions/jps b/completions/jps index a451eec..324ba0e 100644 --- a/completions/jps +++ b/completions/jps @@ -1,9 +1,9 @@ # jps(1) completion -*- shell-script -*- -_jps() +_comp_cmd_jps() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -J* | -help) @@ -12,14 +12,14 @@ _jps() esac if [[ $cur == -* ]]; then - # Not using _parse_usage because output has [-help] which does not - # mean -h, -e, -l, -p... - COMPREPLY=($(compgen -W "-q -m -l -v -V -J -help" -- "$cur")) + # Not using _comp_compgen_usage because output has [-help] which does + # not mean -h, -e, -l, -p... + _comp_compgen -- -W "-q -m -l -v -V -J -help" [[ ${COMPREPLY-} == -J* ]] && compopt -o nospace else - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" fi } && - complete -F _jps jps + complete -F _comp_cmd_jps jps # ex: filetype=sh diff --git a/completions/jq b/completions/jq index 2d99c39..7021d2a 100644 --- a/completions/jq +++ b/completions/jq @@ -1,24 +1,26 @@ # jq(1) completion -*- shell-script -*- -_jq() +_comp_cmd_jq() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[fL]*)' + # shellcheck disable=SC2254 case $prev in --help | --version | --arg | --argjson | --slurpfile | --argfile) return ;; --indent) - COMPREPLY=($(compgen -W '{1..8}' -- "$cur")) + _comp_compgen -- -W '{1..8}' return ;; - --from-file | --run-tests | -!(-*)f) - _filedir + --from-file | --run-tests | -${noargopts}f) + _comp_compgen_filedir return ;; - -!(-*)L) - _filedir -d + -${noargopts}L) + _comp_compgen_filedir -d return ;; esac @@ -29,26 +31,49 @@ _jq() return ;; --slurpfile | --argfile) - _filedir json + _comp_compgen_filedir 'json?(l)' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + # Get jq's --help output and see whether it mentions --help + # jq's --help only shows some of its command-line options; some are not + # even listed in the man page! + local help_output=$("$1" --help 2>/dev/null) + + if [[ $help_output == *--help* ]]; then + # If the output of --help seems complete, use it + _comp_compgen_help - <<<"$help_output" + else + # Otherwise, use a hard-coded list of known flags, some of which do + # not appear in the output of --help as of jq 1.6. + _comp_compgen -- -W '--version --seq --stream --slurp --raw-input + --null-input --compact-output --tab --indent --color-output + -monochrome-output --ascii-output --unbuffered --sort-keys + --raw-output --join-output --from-file --exit-status --arg + --argjson --slurpfile --rawfile --argfile --args --jsonargs + --run-tests --help' + fi return fi - local args + local word + for word in "${words[@]}"; do + [[ $word != --?(json)args ]] || return + done + + local REPLY # TODO: DTRT with args taking 2 options - _count_args "" "@(--arg|--arg?(json|file)|--?(slurp|from-)file|--indent|--run-tests|-!(-*)[fL])" + # -f|--from-file are not counted here because they supply the filter + _comp_count_args -a "@(--arg|--arg?(json|file)|--slurpfile|--indent|--run-tests|-${noargopts}L)" # 1st arg is filter - ((args == 1)) && return + ((REPLY == 1)) && return # 2... are input files - _filedir json + _comp_compgen_filedir 'json?(l)' } && - complete -F _jq jq + complete -F _comp_cmd_jq jq # ex: filetype=sh diff --git a/completions/jshint b/completions/jshint index 3622cec..27a529e 100644 --- a/completions/jshint +++ b/completions/jshint @@ -1,38 +1,38 @@ # bash completion for jshint -*- shell-script -*- -_jshint() +_comp_cmd_jshint() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -v | --version | -h | --help | --exclude | --filename | -e | --extra-ext) return ;; -c | --config) - _filedir + _comp_compgen_filedir return ;; --reporter) - COMPREPLY=($(compgen -W "jslint checkstyle unix" -- "$cur")) + _comp_compgen -- -W "jslint checkstyle unix" return ;; --extract) - COMPREPLY=($(compgen -W "auto always never" -- "$cur")) + _comp_compgen -- -W "auto always never" return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir js + _comp_compgen_filedir js } && - complete -F _jshint jshint + complete -F _comp_cmd_jshint jshint # ex: filetype=sh diff --git a/completions/json_xs b/completions/json_xs index c93ba86..d894526 100644 --- a/completions/json_xs +++ b/completions/json_xs @@ -1,21 +1,20 @@ # json_xs completion -*- shell-script -*- -_json_xs() +_comp_cmd_json_xs() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*f) - COMPREPLY=($(compgen -W 'json cbor storable storable-file bencode - clzf eval yaml string none' -- "$cur")) + _comp_compgen -- -W 'json cbor storable storable-file bencode clzf + eval yaml string none' return ;; -*t) - COMPREPLY=($(compgen -W 'json json-utf-8 json-pretty - json-utf-16le json-utf-16be json-utf-32le json-utf-32be - cbor storable storable-file bencode clzf yaml dump dumper - string none' -- "$cur")) + _comp_compgen -- -W 'json json-utf-8 json-pretty json-utf-16le + json-utf-16be json-utf-32le json-utf-32be cbor storable + storable-file bencode clzf yaml dump dumper string none' return ;; -*e) @@ -23,9 +22,11 @@ _json_xs() ;; esac - [[ $cur == -* ]] && - COMPREPLY=($(compgen -W '$(_parse_usage "$1") -f' -- "$cur")) + if [[ $cur == -* ]]; then + _comp_compgen_usage + _comp_compgen -a -- -W '-f' + fi } && - complete -F _json_xs json_xs + complete -F _comp_cmd_json_xs json_xs # ex: filetype=sh diff --git a/completions/jsonschema b/completions/jsonschema index 8a36ed3..19a4439 100644 --- a/completions/jsonschema +++ b/completions/jsonschema @@ -1,30 +1,30 @@ # bash completion for jsonschema -*- shell-script -*- -_jsonschema() +_comp_cmd_jsonschema() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --help | --error-format | --validator | -[hFV]) return ;; --instance | -i) - _filedir json + _comp_compgen_filedir json return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - local args - _count_args "" "-*" - ((args == 1)) || return - _filedir '@(json|schema)' + local REPLY + _comp_count_args -a "-*" + ((REPLY == 1)) || return + _comp_compgen_filedir '@(json|schema)' } && - complete -F _jsonschema jsonschema + complete -F _comp_cmd_jsonschema jsonschema # ex: filetype=sh diff --git a/completions/k3b b/completions/k3b index 87d26cd..960e046 100644 --- a/completions/k3b +++ b/completions/k3b @@ -1,48 +1,48 @@ # bash completion for k3b -*- shell-script -*- -_k3b() +_comp_cmd_k3b() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --help* | --author | -v | --version | --license | --lang) return ;; --datacd | --audiocd | --videocd | --mixedcd | --emovixcd | --videodvd) - _filedir + _comp_compgen_filedir return ;; --copydvd | --formatdvd | --videodvdrip) - _dvd_devices + _comp_compgen_dvd_devices return ;; --copycd | --erasecd | --cddarip | --videocdrip) - _cd_devices - _dvd_devices + _comp_compgen_cd_devices + _comp_compgen -a dvd_devices return ;; --cdimage | --image) - _filedir '@(cue|iso|toc)' + _comp_compgen_filedir '@(cue|iso|toc)' return ;; --dvdimage) - _filedir iso + _comp_compgen_filedir iso return ;; --ao) - COMPREPLY=($(compgen -W 'alsa arts' -- "$cur")) + _comp_compgen -- -W 'alsa arts' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W "$(_parse_help "$1")" -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - _filedir + _comp_compgen_filedir fi } && - complete -F _k3b k3b + complete -F _comp_cmd_k3b k3b # ex: filetype=sh diff --git a/completions/kcov b/completions/kcov index 672967a..20a62f2 100644 --- a/completions/kcov +++ b/completions/kcov @@ -1,30 +1,28 @@ # kcov(1) completion -*- shell-script -*- -_kcov() +_comp_cmd_kcov() { - 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 case "$prev" in --pid | -p) - _pids + _comp_compgen_pids return ;; --sort-type | -s) - COMPREPLY=($(compgen -W 'filename percent reverse lines - uncovered' -- "$cur")) + _comp_compgen -- -W 'filename percent reverse lines uncovered' return ;; --include-path | --exclude-path) - _filedir + _comp_compgen_filedir return ;; --replace-src-path) if [[ $cur == ?*:* ]]; then - cur="${cur##*:}" - _filedir + _comp_compgen -c "${cur##*:}" filedir else - _filedir + _comp_compgen_filedir compopt -o nospace fi return @@ -33,12 +31,12 @@ _kcov() if [[ $cur == ?*,* ]]; then prev="${cur%,*}" cur="${cur##*,}" - COMPREPLY=($(compgen -W "{0..100}" -- "$cur")) + _comp_compgen -- -W "{0..100}" ((${#COMPREPLY[@]} == 1)) && - COMPREPLY=(${COMPREPLY/#/$prev,}) + _comp_compgen -Rv COMPREPLY -- -P "$prev," -W '"$COMPREPLY"' else - COMPREPLY=($(compgen -W "{0..100}" -- "$cur")) - ((${#COMPREPLY[@]} == 1)) && COMPREPLY=(${COMPREPLY/%/,}) + _comp_compgen -- -W "{0..100}" + ((${#COMPREPLY[@]} == 1)) && COMPREPLY=("${COMPREPLY/%/,}") compopt -o nospace fi return @@ -49,16 +47,16 @@ _kcov() ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" --help)' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir + _comp_compgen_filedir } && - complete -F _kcov kcov + complete -F _comp_cmd_kcov kcov # ex: filetype=sh diff --git a/completions/kill b/completions/kill index 25cddba..266ea13 100644 --- a/completions/kill +++ b/completions/kill @@ -1,29 +1,30 @@ # kill(1) completion -*- shell-script -*- -_kill() +_comp_cmd_kill() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -s) - _signals + _comp_compgen_signals return ;; - -l) + -l | -n) return ;; esac if [[ $cword -eq 1 && $cur == -* ]]; then # return list of available signals - _signals - - COMPREPLY+=($(compgen -W "-s -l" -- "$cur")) + _comp_compgen_signals - + _comp_compgen -a help -c help "$1" else - # return list of available PIDs - _pids + # return list of available PIDs and jobs + _comp_compgen_pids + _comp_compgen -ac "${cur#%}" -- -j -P % fi } && - complete -F _kill kill + complete -F _comp_cmd_kill kill # ex: filetype=sh diff --git a/completions/killall b/completions/killall index c7c0b0f..76f8759 100644 --- a/completions/killall +++ b/completions/killall @@ -2,35 +2,37 @@ [[ $OSTYPE == *@(linux|freebsd|darwin)* ]] || return 1 -_killall() +_comp_cmd_killall() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[Zoysu]*)' + # shellcheck disable=SC2254 case $prev in - --context | --older-than | --younger-than | --version | -!(-*)@([Zoy]|V*)) + --context | --older-than | --younger-than | --version | -${noargopts}@([Zoy]|V*)) return ;; - --signal | -!(-*)s) - _signals + --signal | -${noargopts}s) + _comp_compgen_signals return ;; - --user | -!(-*)u) - _allowed_users + --user | -${noargopts}u) + _comp_compgen_allowed_users return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) - ((cword == 1)) && _signals - + _comp_compgen_help + ((cword == 1)) && _comp_compgen -a signals - return fi - _pnames + _comp_compgen_pnames } && - complete -F _killall killall + complete -F _comp_cmd_killall killall # ex: filetype=sh diff --git a/completions/kldload b/completions/kldload index f511158..3c2396d 100644 --- a/completions/kldload +++ b/completions/kldload @@ -2,20 +2,31 @@ [[ $OSTYPE == *freebsd* ]] || return 1 -_kldload() +_comp_cmd_kldload() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - local moddir=/modules/ - [[ -d $moddir ]] || moddir=/boot/kernel/ + if _comp_looks_like_path "$cur"; then + _comp_compgen_filedir ko + return + fi - compopt -o filenames - COMPREPLY=($(compgen -f "$moddir$cur")) - COMPREPLY=(${COMPREPLY[@]#$moddir}) - COMPREPLY=(${COMPREPLY[@]%.ko}) + local moddirs modules i + if _comp_split -F ";" moddirs "$(kldconfig -r 2>/dev/null)"; then + compopt -o filenames + for i in "${moddirs[@]}"; do + _comp_compgen -v modules -c "$i/$cur" -- -f && + COMPREPLY+=("${modules[@]#$i/}") + done + ((${#COMPREPLY[@]})) && + COMPREPLY=("${COMPREPLY[@]%.ko}") + fi + + # also add dirs in current dir + _comp_compgen -a filedir -d } && - complete -F _kldload kldload + complete -F _comp_cmd_kldload kldload # ex: filetype=sh diff --git a/completions/kldunload b/completions/kldunload index 2e12282..180af36 100644 --- a/completions/kldunload +++ b/completions/kldunload @@ -2,14 +2,14 @@ [[ $OSTYPE == *freebsd* ]] || return 1 -_kldunload() +_comp_cmd_kldunload() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - COMPREPLY=($(compgen -W '$(kldstat)' -X 'kernel' -X '!*.ko' -- "$cur")) - COMPREPLY=(${COMPREPLY[@]%.ko}) + _comp_compgen_split -X '!*.ko' -- "$(kldstat)" && + COMPREPLY=("${COMPREPLY[@]%.ko}") } && - complete -F _kldunload kldunload + complete -F _comp_cmd_kldunload kldunload # ex: filetype=sh diff --git a/completions/koji b/completions/koji index 8efef9a..8ee4390 100644 --- a/completions/koji +++ b/completions/koji @@ -1,74 +1,76 @@ # koji completion -*- shell-script -*- -_koji_search() +_comp_cmd_koji__search() { - COMPREPLY+=($(compgen -W \ - '$("$1" -q search $2 "$cur*" 2>/dev/null)' -- "$cur")) + _comp_compgen -a split -- "$("$1" -q search "$2" "$cur*" 2>/dev/null)" } -_koji_build() +_comp_cmd_koji__build() { - _koji_search "$1" build + _comp_cmd_koji__search "$1" build } -_koji_package() +_comp_cmd_koji__package() { - _koji_search "$1" package + _comp_cmd_koji__search "$1" package } -_koji_user() +_comp_cmd_koji__user() { - _koji_search "$1" user + _comp_cmd_koji__search "$1" user } -_koji_tag() +_comp_cmd_koji__tag() { - COMPREPLY+=($(compgen -W '$("$1" -q list-tags 2>/dev/null)' -- "$cur")) + _comp_compgen -a split -- "$("$1" -q list-tags 2>/dev/null)" } -_koji_target() +_comp_cmd_koji__target() { - COMPREPLY+=($(compgen -W '$("$1" -q list-targets 2>/dev/null | - awk "{ print \$1 }")' -- "$cur")) + _comp_compgen -a split -- "$("$1" -q list-targets 2>/dev/null | + _comp_awk '{ print $1 }')" } -_koji() +_comp_cmd_koji() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return - local commandix command + local commandix command="" has_command="" for ((commandix = 1; commandix < cword; commandix++)); do if [[ ${words[commandix]} != -* ]]; then command=${words[commandix]} + has_command=set break fi done + local noargopts='!(-*|*[co]*)' + # shellcheck disable=SC2254 case $prev in - --help | --help-commands | -!(-*)h*) + --help | --help-commands | -${noargopts}h*) return ;; - --config | --keytab | -!(-*)[co]) - _filedir + --config | --keytab | -${noargopts}[co]) + _comp_compgen_filedir return ;; --runas | --user | --editor | --by) - _koji_user "$1" + _comp_cmd_koji__user "$1" return ;; --authtype) - COMPREPLY=($(compgen -W 'noauth ssl password kerberos' -- "$cur")) + _comp_compgen -- -W 'noauth ssl password kerberos' return ;; --topdir) - _filedir -d + _comp_compgen_filedir -d return ;; --type) case ${command-} in latest-pkg | list-tagged) - COMPREPLY=($(compgen -W 'maven' -- "$cur")) + _comp_compgen -- -W 'maven' ;; esac return @@ -76,39 +78,38 @@ _koji() --name) case ${command-} in list-targets) - _koji_target "$1" + _comp_cmd_koji__target "$1" ;; esac return ;; --owner) - _koji_user "$1" + _comp_cmd_koji__user "$1" return ;; --tag | --latestfrom) - _koji_tag "$1" + _comp_cmd_koji__tag "$1" return ;; --package) - _koji_package "$1" + _comp_cmd_koji__package "$1" return ;; --build) - _koji_build "$1" + _comp_cmd_koji__build "$1" return ;; --build-target) - _koji_target "$1" + _comp_cmd_koji__target "$1" return ;; esac - $split && return + [[ $was_split ]] && return - if [[ -v command ]]; then + if [[ $has_command ]]; then if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W \ - '$(_parse_help "$1" "$command --help")' -- "$cur")) + _comp_compgen_help -- "$command" --help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi @@ -123,108 +124,108 @@ _koji() build | maven-build | win-build) case $nth in 1) - _koji_target "$1" + _comp_cmd_koji__target "$1" ;; 2) - _filedir src.rpm + _comp_compgen_filedir src.rpm ;; esac ;; cancel) - _koji_build "$1" + _comp_cmd_koji__build "$1" ;; chain-build) case $nth in 1) - _koji_target "$1" + _comp_cmd_koji__target "$1" ;; esac ;; download-build) case $nth in 1) - _koji_build "$1" + _comp_cmd_koji__build "$1" ;; esac ;; import-comps) case $nth in 1) - _filedir xml + _comp_compgen_filedir xml ;; 2) - _koji_tag "$1" + _comp_cmd_koji__tag "$1" ;; esac ;; latest-by-tag) - _koji_package "$1" + _comp_cmd_koji__package "$1" ;; latest-pkg | list-groups | list-tag-inheritance | show-groups) case $nth in 1) - _koji_tag "$1" + _comp_cmd_koji__tag "$1" ;; esac ;; list-tagged) case $nth in 1) - _koji_tag "$1" + _comp_cmd_koji__tag "$1" ;; 2) - _koji_package "$1" + _comp_cmd_koji__package "$1" ;; esac ;; list-untagged) case $nth in 1) - _koji_package "$1" + _comp_cmd_koji__package "$1" ;; esac ;; move-pkg) case $nth in 1 | 2) - _koji_tag "$1" + _comp_cmd_koji__tag "$1" ;; *) - _koji_package "$1" + _comp_cmd_koji__package "$1" ;; esac ;; search) case $nth in 1) - COMPREPLY=($(compgen -W 'package build tag target - user host rpm' -- "$cur")) + _comp_compgen -- -W 'package build tag target user host + rpm' ;; esac ;; tag-pkg | untag-pkg) case $nth in 1) - _koji_tag "$1" + _comp_cmd_koji__tag "$1" ;; *) - _koji_package "$1" + _comp_cmd_koji__package "$1" ;; esac ;; taginfo) - _koji_tag "$1" + _comp_cmd_koji__tag "$1" ;; wait-repo) case $nth in 1) for ((i = commandix + 1; i < cword; i++)); do if [[ ${words[i]} == --target ]]; then - _koji_target "$1" + _comp_cmd_koji__target "$1" return fi done - _koji_tag "$1" + _comp_cmd_koji__tag "$1" ;; esac ;; @@ -233,13 +234,13 @@ _koji() fi if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace - elif [[ ! -v command ]]; then - COMPREPLY=($(compgen -W '$("$1" --help-commands 2>/dev/null | \ - awk "/^( +|\t)/ { print \$1 }")' -- "$cur")) + elif [[ ! $has_command ]]; then + _comp_compgen_split -- "$("$1" --help-commands 2>/dev/null | + _comp_awk '/^( +|\t)/ { print $1 }')" fi } && - complete -F _koji koji arm-koji ppc-koji s390-koji sparc-koji + complete -F _comp_cmd_koji koji arm-koji ppc-koji s390-koji sparc-koji # ex: filetype=sh diff --git a/completions/ktutil b/completions/ktutil index 6030a47..d25dafc 100644 --- a/completions/ktutil +++ b/completions/ktutil @@ -1,55 +1,54 @@ # ktutil completion -*- shell-script -*- -_heimdal_principals() +_comp_cmd_ktutil__heimdal_principals() { - COMPREPLY=($(compgen -W "$(kadmin -l dump 2>/dev/null | - awk '{print $1}')" -- "$cur")) + _comp_compgen_split -- "$(kadmin -l dump 2>/dev/null | + _comp_awk '{print $1}')" } -_heimdal_realms() +_comp_cmd_ktutil__heimdal_realms() { - COMPREPLY=($(compgen -W "$(kadmin -l dump 2>/dev/null | - awk '{print $1}' | awk -F@ '{print $2}')" -- "$cur")) + _comp_compgen_split -- "$(kadmin -l dump 2>/dev/null | + _comp_awk '{print $1}' | _comp_awk -F @ '{print $2}')" } -_heimdal_encodings() +_comp_cmd_ktutil__heimdal_encodings() { - COMPREPLY=($(compgen -W 'des-cbc-mcrc des-cbc-md4 des-cbc-md5 - des3-cbc-sha1 arcfour-hmac-md5 aes128-cts-hmac-sha1-96 - aes256-cts-hmac-sha1-96' -- "$cur")) + _comp_compgen -- -W 'des-cbc-mcrc des-cbc-md4 des-cbc-md5 des3-cbc-sha1 + arcfour-hmac-md5 aes128-cts-hmac-sha1-96 aes256-cts-hmac-sha1-96' } -_ktutil() +_comp_cmd_ktutil() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return local command commands i options case $prev in -p | --principal) - _heimdal_principals + _comp_cmd_ktutil__heimdal_principals return ;; -e | --enctype) - _heimdal_encodings + _comp_cmd_ktutil__heimdal_encodings return ;; -a | --admin-server) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -r | --realm) - _heimdal_realms + _comp_cmd_ktutil__heimdal_realms return ;; -s | -k | --srvtab | --keytab) - _filedir + _comp_compgen_filedir return ;; esac - $split && return + [[ $was_split ]] && return commands='add change copy get list remove rename purge srvconvert srv2keytab srvcreate key2srvtab' @@ -97,24 +96,24 @@ _ktutil() options='-k --keytab -v --verbose --version -v --help' ;; esac - COMPREPLY=($(compgen -W "$options" -- "$cur")) + _comp_compgen -- -W "$options" else case ${command-} in copy) - _filedir + _comp_compgen_filedir ;; get) - _heimdal_principals + _comp_cmd_ktutil__heimdal_principals ;; rename) - _heimdal_principals + _comp_cmd_ktutil__heimdal_principals ;; *) - COMPREPLY=($(compgen -W "$commands" -- "$cur")) + _comp_compgen -- -W "$commands" ;; esac fi } && - complete -F _ktutil ktutil + complete -F _comp_cmd_ktutil ktutil # ex: filetype=sh diff --git a/completions/larch b/completions/larch index 7ed9ca2..0df7537 100644 --- a/completions/larch +++ b/completions/larch @@ -1,13 +1,13 @@ # larch(1) completion -*- shell-script -*- # by Alex Shinn <foof@synthcode.com> -_larch() +_comp_cmd_larch() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cword -eq 1 || $prev == -* ]]; then - COMPREPLY=($(compgen -W ' \ + _comp_compgen -- -W ' \ my-id my-default-archive register-archive whereis-archive archives \ init-tree tree-root tree-version set-tree-version inventory \ tagging-method tree-lint missing-tags add delete \ @@ -29,11 +29,10 @@ _larch() touched-files-prereqs patch-set-web update-distributions \ distribution-name notify my-notifier mail-new-categories \ mail-new-branches mail-new-versions mail-new-revisions \ - notify-library notify-browser push-new-revisions sendmail-mailx' \ - "$cur")) + notify-library notify-browser push-new-revisions sendmail-mailx' fi } && - complete -F _larch -o default larch + complete -F _comp_cmd_larch -o default larch # ex: filetype=sh diff --git a/completions/lastlog b/completions/lastlog index 214a174..8faf82b 100644 --- a/completions/lastlog +++ b/completions/lastlog @@ -1,25 +1,27 @@ # lastlog(8) completion -*- shell-script -*- -_lastlog() +_comp_cmd_lastlog() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[btu]*)' + # shellcheck disable=SC2254 case $prev in - --before | --help | --time | -!(-*)@([bt]|h*)) + --before | --help | --time | -${noargopts}@([bt]|h*)) return ;; - --user | -!(-*)u) - COMPREPLY=($(compgen -u -- "$cur")) + --user | -${noargopts}u) + _comp_compgen -- -u return ;; esac - $split && return + [[ $was_split ]] && return - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace } && - complete -F _lastlog lastlog + complete -F _comp_cmd_lastlog lastlog # ex: filetype=sh diff --git a/completions/ldapsearch b/completions/ldapsearch index 6dc415e..71c728e 100644 --- a/completions/ldapsearch +++ b/completions/ldapsearch @@ -1,231 +1,238 @@ # bash completion for openldap -*- shell-script -*- -_ldap_uris() +_comp_cmd_ldapsearch__ldap_uris() { - COMPREPLY=($(compgen -W 'ldap:// ldaps://' -- "$cur")) + _comp_compgen -- -W 'ldap:// ldaps://' } -_ldap_protocols() +_comp_cmd_ldapsearch__ldap_protocols() { - COMPREPLY=($(compgen -W '2 3' -- "$cur")) + _comp_compgen -- -W '2 3' } -_ldapsearch() +_comp_cmd_ldapsearch() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*h) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -*H) - _ldap_uris + _comp_cmd_ldapsearch__ldap_uris return ;; -*T) - _filedir -d + _comp_compgen_filedir -d return ;; -*[fy]) - _filedir + _comp_compgen_filedir return ;; -*s) - COMPREPLY=($(compgen -W 'base one sub children' -- "$cur")) + _comp_compgen -- -W 'base one sub children' return ;; -*a) - COMPREPLY=($(compgen -W 'never always search find' -- "$cur")) + _comp_compgen -- -W 'never always search find' return ;; -*P) - _ldap_protocols + _comp_cmd_ldapsearch__ldap_protocols return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1") -MM -ZZ' -- "$cur")) + _comp_compgen_help + _comp_compgen -a -- -W '-MM -ZZ' fi } && - complete -F _ldapsearch ldapsearch + complete -F _comp_cmd_ldapsearch ldapsearch -_ldapaddmodify() +_comp_cmd_ldapadd() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*h) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -*H) - _ldap_uris + _comp_cmd_ldapsearch__ldap_uris return ;; -*[Sfy]) - _filedir + _comp_compgen_filedir return ;; -*P) - _ldap_protocols + _comp_cmd_ldapsearch__ldap_protocols return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1") -MM -ZZ' -- "$cur")) + _comp_compgen_help + _comp_compgen -a -- -W '-MM -ZZ' fi } && - complete -F _ldapaddmodify ldapadd ldapmodify + complete -F _comp_cmd_ldapadd ldapadd ldapmodify -_ldapdelete() +_comp_cmd_ldapdelete() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*h) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -*H) - _ldap_uris + _comp_cmd_ldapsearch__ldap_uris return ;; -*[fy]) - _filedir + _comp_compgen_filedir return ;; -*P) - _ldap_protocols + _comp_cmd_ldapsearch__ldap_protocols return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1") -MM -ZZ' -- "$cur")) + _comp_compgen_help + _comp_compgen -a -- -W '-MM -ZZ' fi } && - complete -F _ldapdelete ldapdelete + complete -F _comp_cmd_ldapdelete ldapdelete -_ldapcompare() +_comp_cmd_ldapcompare() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*h) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -*H) - _ldap_uris + _comp_cmd_ldapsearch__ldap_uris return ;; -*y) - _filedir + _comp_compgen_filedir return ;; -*P) - _ldap_protocols + _comp_cmd_ldapsearch__ldap_protocols return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1") -MM -ZZ' -- "$cur")) + _comp_compgen_help + _comp_compgen -a -- -W '-MM -ZZ' fi } && - complete -F _ldapcompare ldapcompare + complete -F _comp_cmd_ldapcompare ldapcompare -_ldapmodrdn() +_comp_cmd_ldapmodrdn() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*h) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -*H) - _ldap_uris + _comp_cmd_ldapsearch__ldap_uris return ;; -*[fy]) - _filedir + _comp_compgen_filedir return ;; -*P) - _ldap_protocols + _comp_cmd_ldapsearch__ldap_protocols return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1") -ZZ -MM' -- "$cur")) + _comp_compgen_help + _comp_compgen -a -- -W '-ZZ -MM' fi } && - complete -F _ldapmodrdn ldapmodrdn + complete -F _comp_cmd_ldapmodrdn ldapmodrdn -_ldapwhoami() +_comp_cmd_ldapwhoami() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*h) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -*H) - _ldap_uris + _comp_cmd_ldapsearch__ldap_uris return ;; -*[fy]) - _filedir + _comp_compgen_filedir return ;; -*P) - _ldap_protocols + _comp_cmd_ldapsearch__ldap_protocols return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1") -MM -ZZ' -- "$cur")) + _comp_compgen_help + _comp_compgen -a -- -W '-MM -ZZ' fi } && - complete -F _ldapwhoami ldapwhoami + complete -F _comp_cmd_ldapwhoami ldapwhoami -_ldappasswd() +_comp_cmd_ldappasswd() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*h) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -*H) - _ldap_uris + _comp_cmd_ldapsearch__ldap_uris return ;; -*[tTy]) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1") -MM -ZZ' -- "$cur")) + _comp_compgen_help + _comp_compgen -a -- -W '-MM -ZZ' fi } && - complete -F _ldappasswd ldappasswd + complete -F _comp_cmd_ldappasswd ldappasswd # ex: filetype=sh diff --git a/completions/ldapvi b/completions/ldapvi index cb01ac8..d86cf55 100644 --- a/completions/ldapvi +++ b/completions/ldapvi @@ -1,51 +1,52 @@ # bash completion for ldapvi -*- shell-script -*- -_ldapvi() +_comp_cmd_ldapvi() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[Y]*)' + # shellcheck disable=SC2254 case $prev in - --host | -!(-*)h) - _known_hosts_real -- "$cur" + --host | -${noargopts}h) + _comp_compgen_known_hosts -- "$cur" return ;; - --sasl-mech | -!(-*)Y) - COMPREPLY=($(compgen -W 'EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 - PLAIN ANONYMOUS' -- "$cur")) + --sasl-mech | -${noargopts}Y) + _comp_compgen -- -W 'EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 PLAIN + ANONYMOUS' return ;; --bind) - COMPREPLY=($(compgen -W 'simple sasl' -- "$cur")) + _comp_compgen -- -W 'simple sasl' return ;; --bind-dialog) - COMPREPLY=($(compgen -W 'never auto always' -- "$cur")) + _comp_compgen -- -W 'never auto always' return ;; --scope) - COMPREPLY=($(compgen -W 'base one sub' -- "$cur")) + _comp_compgen -- -W 'base one sub' return ;; --deref) - COMPREPLY=($(compgen -W 'never searching finding always' \ - -- "$cur")) + _comp_compgen -- -W 'never searching finding always' return ;; --encoding) - COMPREPLY=($(compgen -W 'ASCII UTF-8 binary' -- "$cur")) + _comp_compgen -- -W 'ASCII UTF-8 binary' return ;; --tls) - COMPREPLY=($(compgen -W 'never allow try strict' -- "$cur")) + _comp_compgen -- -W 'never allow try strict' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help fi } && - complete -F _ldapvi ldapvi + complete -F _comp_cmd_ldapvi ldapvi # ex: filetype=sh diff --git a/completions/lftp b/completions/lftp index 72dedb4..16264cf 100644 --- a/completions/lftp +++ b/completions/lftp @@ -1,28 +1,30 @@ # lftp(1) completion -*- shell-script -*- -_lftp() +_comp_cmd_lftp() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[fceups]*)' + # shellcheck disable=SC2254 case $prev in - -!(-*)f) - _filedir + -${noargopts}f) + _comp_compgen_filedir return ;; - --help | --version | -!(-*)[chveups]) + --help | --version | -${noargopts}[chveups]) return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - COMPREPLY=($(compgen -W '$("$1" -c "bookmark list" 2>/dev/null)' -- "$cur")) - _known_hosts_real -- "$cur" + _comp_compgen_split -- "$("$1" -c "bookmark list" 2>/dev/null)" + _comp_compgen -a known_hosts -- "$cur" } && - complete -F _lftp lftp + complete -F _comp_cmd_lftp lftp # ex: filetype=sh diff --git a/completions/lftpget b/completions/lftpget index d21622e..a41ad0c 100644 --- a/completions/lftpget +++ b/completions/lftpget @@ -1,14 +1,14 @@ # lftpget(1) completion -*- shell-script -*- -_lftpget() +_comp_cmd_lftpget() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-c -d -v' -- "$cur")) + _comp_compgen -- -W '-c -d -v' fi } && - complete -F _lftpget lftpget + complete -F _comp_cmd_lftpget lftpget # ex: filetype=sh diff --git a/completions/lilo b/completions/lilo index af8539a..6df8566 100644 --- a/completions/lilo +++ b/completions/lilo @@ -1,66 +1,63 @@ # bash completion for lilo(8) -*- shell-script -*- -_lilo_labels() +_comp_cmd_lilo__labels() { - COMPREPLY=($(compgen -W "$(awk -F= '$1 ~ /^[ \t]*label$/ {print $2}' \ - ${1:-/etc/lilo.conf} 2>/dev/null | command sed -e 's/\"//g')" \ - -- "$cur")) + _comp_compgen_split -- "$(_comp_awk -F = '$1 ~ /^[ \t]*label$/ {print $2}' \ + "${1:-/etc/lilo.conf}" 2>/dev/null | command sed -e 's/\"//g')" } -_lilo() +_comp_cmd_lilo() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -C | -i | -m | -s | -S) - _filedir + _comp_compgen_filedir return ;; -r) - _filedir -d + _comp_compgen_filedir -d return ;; -I | -D | -R) # label completion - local i conf + local i conf="" for i in "${!words[@]}"; do if [[ ${words[i]} == -C ]]; then - conf=${words[i + 1]} + conf=${words[i + 1]-} break fi done - _lilo_labels $conf + _comp_cmd_lilo__labels "$conf" return ;; -A | -b | -M | -u | -U) # device completion - cur=${cur:=/dev/} - _filedir + _comp_compgen -c "${cur:-/dev/}" filedir return ;; -T) # topic completion - COMPREPLY=($(compgen -W 'help ChRul EBDA geom geom= table= - video' -- "$cur")) + _comp_compgen -- -W 'help ChRul EBDA geom geom= table= video' return ;; -B) - _filedir bmp + _comp_compgen_filedir bmp return ;; -E) - _filedir '@(bmp|dat)' + _comp_compgen_filedir '@(bmp|dat)' return ;; esac if [[ $cur == -* ]]; then # relevant options completion - COMPREPLY=($(compgen -W '-A -B -b -c -C -d -E -f -g -i -I -l -L -m -M - -p -P -q -r -R -s -S -t -T -u -U -v -V -w -x -z' -- "$cur")) + _comp_compgen -- -W '-A -B -b -c -C -d -E -f -g -i -I -l -L -m -M -p -P + -q -r -R -s -S -t -T -u -U -v -V -w -x -z' fi } && - complete -F _lilo lilo + complete -F _comp_cmd_lilo lilo # ex: filetype=sh diff --git a/completions/links b/completions/links index e0c28e2..989e9e0 100644 --- a/completions/links +++ b/completions/links @@ -1,17 +1,17 @@ # bash completion for links -*- shell-script -*- -_links() +_comp_cmd_links() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return case $prev in -html-t-text-color | -html-t-link-color) - COMPREPLY=($(compgen -W '{0..15}' -- "$cur")) + _comp_compgen -- -W '{0..15}' return ;; -http.fake-firefox | -html-[gt]-ignore-document-color) - COMPREPLY=($(compgen -W '0 1' -- "$cur")) + _comp_compgen -- -W '0 1' return ;; --help | -help | -mode | -display | -source | -dump | -width | -max-connections | \ @@ -23,78 +23,78 @@ _links() return ;; -lookup) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -driver) local drivers=$("$1" -driver foo 2>&1 | command sed -ne '$!d' -e '/^[a-z0-9, ]\{1,\}$/s/,/ /gp') [[ $drivers ]] || drivers='x svgalib fb directfb pmshell atheos' - COMPREPLY=($(compgen -W "$drivers" -- "$cur")) + _comp_compgen -- -W "$drivers" return ;; -codepage | -bookmarks-codepage | -http-assume-codepage) - _xfunc iconv _iconv_charsets + _comp_compgen -x iconv charsets return ;; -download-dir) - _filedir -d + _comp_compgen_filedir -d return ;; -bind-address) - _ip_addresses + _comp_compgen_ip_addresses return ;; -bind-address-ipv6) - _ip_addresses -6 - __ltrim_colon_completions "$cur" + _comp_compgen_ip_addresses -6 return ;; -async-dns | -download-utime | -aggressive-cache | -only-proxies | \ -http-bugs.* | -http.do-not-track | -ftp.use-* | -ftp.fast | -ftp.set-iptos | \ -smb.allow-hyperlinks-to-smb | -save-url-history | -dither-letters | \ -dither-images | -overwrite-instead-of-scroll | -html-*) - COMPREPLY=($(compgen -W '0 1' -- "$cur")) + _comp_compgen -- -W '0 1' return ;; -address-preference | -http.referer) - COMPREPLY=($(compgen -W '{0..4}' -- "$cur")) + _comp_compgen -- -W '{0..4}' return ;; -ssl-certificates | -display-optimize | -gamma-correction) - COMPREPLY=($(compgen -W '{0..2}' -- "$cur")) + _comp_compgen -- -W '{0..2}' return ;; -ssl.client-cert-key) - _filedir '@(key|pem)' + _comp_compgen_filedir '@(key|pem)' return ;; -ssl.client-cert-crt) - _filedir '@(c?(e)rt|cer|pem|der)' + _comp_compgen_filedir '@(c?(e)rt|cer|pem|der)' return ;; -bookmarks-file) - _filedir html + _comp_compgen_filedir html return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" | - command grep -vF -- "->")' -- "$cur")) + _comp_compgen -R help + ((${#COMPREPLY[@]})) && + _comp_compgen -- -W '"${COMPREPLY[@]}"' -X "->" return fi local dir for dir in .links .links2; do if [[ -r ~/$dir/links.his ]]; then - COMPREPLY+=($(compgen -W '$(cat ~/$dir/links.his)' -- "$cur")) - __ltrim_colon_completions "$cur" + _comp_compgen -a split -- "$(cat ~/$dir/links.his)" + _comp_ltrim_colon_completions "$cur" fi done - _filedir '@(htm|html)' + _comp_compgen -a filedir '@(htm|html)' } && - complete -F _links links links2 + complete -F _comp_cmd_links links links2 # ex: filetype=sh diff --git a/completions/lintian b/completions/lintian index 9343832..51402b2 100644 --- a/completions/lintian +++ b/completions/lintian @@ -1,74 +1,73 @@ # bash completion for lintian(1) and lintian-info(1) -*- shell-script -*- -_lintian_tags() +_comp_cmd_lintian__tags() { - local match search tags + local search tags check_files + _comp_expand_glob check_files '/usr/share/lintian/checks/*.desc' || return 0 - tags=$(awk '/^Tag/ { print $2 }' /usr/share/lintian/checks/*.desc) + tags=$(_comp_awk '/^Tag/ { print $2 }' "${check_files[@]}") if [[ $cur == *, ]]; then search=${cur//,/ } for item in $search; do - match=$(command grep -nE "^Tag: $item$" \ - /usr/share/lintian/checks/*.desc | cut -d: -f1) - tags=$(command sed -e "s/\<$item\>//g" <<<$tags) + tags=$(command sed -e "s/\<$item\>//g" <<<"$tags") done - COMPREPLY+=($(compgen -W "$tags")) + _comp_compgen -aR -- -W "$tags" elif [[ $cur == *,* ]]; then - COMPREPLY+=($(compgen -P "${cur%,*}," -W "$tags" -- "${cur##*,}")) + _comp_compgen -ac "${cur##*,}" -- -P "${cur%,*}," -W "$tags" else - COMPREPLY+=($(compgen -W "$tags" -- "$cur")) + _comp_compgen -a -- -W "$tags" fi } -_lintian_checks() +_comp_cmd_lintian__checks() { - local match search todisable checks + local match search todisable checks check_files + _comp_expand_glob check_files '/usr/share/lintian/checks/*.desc' || return 0 - checks=$(awk '/^(Check-Script|Abbrev)/ { print $2 }' \ - /usr/share/lintian/checks/*.desc) + checks=$(_comp_awk '/^(Check-Script|Abbrev)/ { print $2 }' \ + "${check_files[@]}") if [[ $cur == *, ]]; then search=${cur//,/ } for item in $search; do match=$(command grep -nE "^(Check-Script|Abbrev): $item$" \ - /usr/share/lintian/checks/*.desc | cut -d: -f1) - todisable=$(awk '/^(Check-Script|Abbrev)/ { print $2 }' $match) + "${check_files[@]}" | cut -d: -f1) + todisable=$(_comp_awk '/^(Check-Script|Abbrev)/ { print $2 }' "$match") for name in $todisable; do - checks=$(command sed -e "s/\<$name\>//g" <<<$checks) + checks=$(command sed -e "s/\<$name\>//g" <<<"$checks") done done - COMPREPLY+=($(compgen -W "$checks")) + _comp_compgen -aR -- -W "$checks" elif [[ $cur == *,* ]]; then - COMPREPLY+=($(compgen -P "${cur%,*}," -W "$checks" -- "${cur##*,}")) + _comp_compgen -ac "${cur##*,}" -- -P "${cur%,*}," -W "$checks" else - COMPREPLY+=($(compgen -W "$checks" -- "$cur")) + _comp_compgen -a -- -W "$checks" fi } -_lintian_infos() +_comp_cmd_lintian__infos() { - local match search infos + local search infos collection_files + _comp_expand_glob collection_files '/usr/share/lintian/collection/*.desc' || return 0 - infos=$(awk '/^Collector/ { print $2 }' \ - /usr/share/lintian/collection/*.desc) + infos=$(_comp_awk '/^Collector/ { print $2 }' \ + "${collection_files[@]}") if [[ $cur == *, ]]; then search=${cur//,/ } for item in $search; do - match=$(command grep -nE "^Collector: $item$" \ - /usr/share/lintian/collection/*.desc | cut -d: -f1) - infos=$(command sed -e "s/\<$item\>//g" <<<$infos) + infos=$(command sed -e "s/\<$item\>//g" <<<"$infos") done - COMPREPLY+=($(compgen -W "$infos")) + _comp_compgen -aR -- -W "$infos" elif [[ $cur == *,* ]]; then - COMPREPLY+=($(compgen -P "${cur%,*}," -W "$infos" -- "${cur##*,}")) + _comp_compgen -ac "${cur##*,}" -- -P "${cur%,*}," -W "$infos" else - COMPREPLY+=($(compgen -W "$infos" -- "$cur")) + _comp_compgen -a -- -W "$infos" fi } -_lintian() +_comp_cmd_lintian() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local lint_actions general_opts behaviour_opts configuration_opts @@ -86,36 +85,44 @@ _lintian() if [[ $prev == -* ]]; then case $prev in -C | --check-part | -X | --dont-check-part) - _lintian_checks + _comp_cmd_lintian__checks + return ;; -T | --tags | --suppress-tags) - _lintian_tags + _comp_cmd_lintian__tags + return ;; --tags-from-file | --suppress-tags-from-file | --cfg | -p | \ --packages-file) - _filedir + _comp_compgen_filedir + return ;; --lab | --archivedir | --dist | --root) - _filedir -d + _comp_compgen_filedir -d + return ;; --color) - COMPREPLY=($(compgen -W "never always auto html" -- "$cur")) + _comp_compgen -- -W "never always auto html" + return ;; -U | --unpack-info) - _lintian_infos + _comp_cmd_lintian__infos + return ;; --area | --section) - COMPREPLY=($(compgen -W "main contrib non-free" -- "$cur")) + _comp_compgen -- -W "main contrib non-free" + return + ;; + --arch) + return ;; - --arch) ;; - esac fi case "$cur" in --*) - COMPREPLY=($(compgen -W "$lint_actions $general_opts - $behaviour_opts $configuration_opts" -- "$cur")) + _comp_compgen -- -W "$lint_actions $general_opts $behaviour_opts + $configuration_opts" ;; *,) # If we're here, the user is trying to complete on @@ -123,54 +130,54 @@ _lintian() # Only few actions permit that, re-complete them now. case "$prev" in -C | --check-part | -X | --dont-check-part) - _lintian_checks + _comp_cmd_lintian__checks ;; -T | --tags | --suppress-tags) - _lintian_tags + _comp_cmd_lintian__tags ;; -U | --unpack-info) - _lintian_infos + _comp_cmd_lintian__infos ;; esac ;; *) # in Ubuntu, dbgsym packages end in .ddeb, lintian >= 2.57.0 groks - _filedir '@(?(u|d)deb|changes|dsc|buildinfo)' + _comp_compgen_filedir '@(?(u|d)deb|changes|dsc|buildinfo)' ;; esac return 0 } && - complete -F _lintian lintian + complete -F _comp_cmd_lintian lintian -_lintian_info() +_comp_cmd_lintian_info() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case "$prev" in --help | --profile) return ;; -t | --tags) - _lintian_tags + _comp_cmd_lintian__tags return ;; --include-dir) - _filedir -d + _comp_compgen_filedir -d return ;; esac case "$cur" in --*) - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help ;; *) - _filedir + _comp_compgen_filedir ;; esac return 0 } && - complete -F _lintian_info lintian-info + complete -F _comp_cmd_lintian_info lintian-info # ex: filetype=sh diff --git a/completions/lisp b/completions/lisp index 098567b..c236092 100644 --- a/completions/lisp +++ b/completions/lisp @@ -2,21 +2,20 @@ # bash programmable completion for various Common Lisp implementations by # Nikodemus Siivola <nikodemus@random-state.net> -_lisp() +_comp_cmd_lisp() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return # completing an option (may or may not be separated by a space) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-core -lib -batch -quit -edit -eval -init - -dynamic-space-size -hinit -noinit -nositeinit -load -slave' \ - -- "$cur")) + _comp_compgen -- -W '-core -lib -batch -quit -edit -eval -init + -dynamic-space-size -hinit -noinit -nositeinit -load -slave' else - _filedir + _comp_compgen_filedir fi } && - complete -F _lisp -o default lisp + complete -F _comp_cmd_lisp -o default lisp # ex: filetype=sh diff --git a/completions/list_admins b/completions/list_admins index 5708179..98452eb 100644 --- a/completions/list_admins +++ b/completions/list_admins @@ -1,17 +1,20 @@ # mailman list_admins completion -*- shell-script -*- -_list_admins() +_comp_cmd_list_admins() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--all-vhost --all --help' -- "$cur")) + _comp_compgen -- -W '--all-vhost --all --help' else - _xfunc list_lists _mailman_lists + # Prefer `list_lists` in the same dir as command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_compgen -x list_lists mailman_lists fi } && - complete -F _list_admins list_admins + complete -F _comp_cmd_list_admins list_admins # ex: filetype=sh diff --git a/completions/list_lists b/completions/list_lists index c5b9ba7..0ae00af 100644 --- a/completions/list_lists +++ b/completions/list_lists @@ -1,21 +1,25 @@ # mailman list_lists completion -*- shell-script -*- -_mailman_lists() +# @since 2.12 +_comp_xfunc_list_lists_compgen_mailman_lists() { - COMPREPLY=($(compgen -W '$(list_lists -b 2>/dev/null)' -- "$cur")) + _comp_compgen_split -- "$(list_lists -b 2>/dev/null)" } -_list_lists() +_comp_deprecate_func 2.12 _mailman_lists \ + _comp_xfunc_list_lists_compgen_mailman_lists + +_comp_cmd_list_lists() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--advertised --virtual-host-overview --bare - --help' -- "$cur")) + _comp_compgen -- -W '--advertised --virtual-host-overview --bare + --help' fi } && - complete -F _list_lists list_lists + complete -F _comp_cmd_list_lists list_lists # ex: filetype=sh diff --git a/completions/list_members b/completions/list_members index 639344c..a15a2cc 100644 --- a/completions/list_members +++ b/completions/list_members @@ -1,36 +1,38 @@ # mailman list_members completion -*- shell-script -*- -_list_members() +_comp_cmd_list_members() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -o | --output) - _filedir + _comp_compgen_filedir return ;; -d | --digest) - COMPREPLY=($(compgen -W 'mime plain' -- "$cur")) + _comp_compgen -- -W 'mime plain' return ;; -n | --nomail) - COMPREPLY=($(compgen -W 'byadmin byuser bybounce unknown' \ - -- "$cur")) + _comp_compgen -- -W 'byadmin byuser bybounce unknown' return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--output --regular --digest --nomail - --fullnames --preserve --help' -- "$cur")) + _comp_compgen -- -W '--output --regular --digest --nomail --fullnames + --preserve --help' else - _xfunc list_lists _mailman_lists + # Prefer `list_lists` in the same dir as command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_compgen -x list_lists mailman_lists fi } && - complete -F _list_members list_members + complete -F _comp_cmd_list_members list_members # ex: filetype=sh diff --git a/completions/list_owners b/completions/list_owners index 445be0b..6179176 100644 --- a/completions/list_owners +++ b/completions/list_owners @@ -1,18 +1,20 @@ # mailman list_owners completion -*- shell-script -*- -_list_owners() +_comp_cmd_list_owners() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--with-listnames --moderators --help' \ - -- "$cur")) + _comp_compgen -- -W '--with-listnames --moderators --help' else - _xfunc list_lists _mailman_lists + # Prefer `list_lists` in the same dir as command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_compgen -x list_lists mailman_lists fi } && - complete -F _list_owners list_owners + complete -F _comp_cmd_list_owners list_owners # ex: filetype=sh diff --git a/completions/locale-gen b/completions/locale-gen index 4068201..0ac8598 100644 --- a/completions/locale-gen +++ b/completions/locale-gen @@ -1,32 +1,32 @@ # locale-gen(8) completion -*- shell-script -*- -_locale_gen() +_comp_cmd_locale_gen() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in --help | -h) return ;; --aliases) - _filedir alias + _comp_compgen_filedir alias return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - COMPREPLY=($(compgen -W \ - '$(awk "{ print \$1 }" /usr/share/i18n/SUPPORTED 2>/dev/null)' \ - -- "$cur")) + _comp_compgen_split -- "$( + _comp_awk '{ print $1 }' /usr/share/i18n/SUPPORTED 2>/dev/null + )" } && - complete -F _locale_gen locale-gen + complete -F _comp_cmd_locale_gen locale-gen # ex: filetype=sh diff --git a/completions/lpq b/completions/lpq index 36729d2..d9c29bb 100644 --- a/completions/lpq +++ b/completions/lpq @@ -1,28 +1,28 @@ # lpq(1) completion -*- shell-script -*- -_lpq() +_comp_cmd_lpq() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -P) - COMPREPLY=($(compgen -W "$(lpstat -a 2>/dev/null | cut -d' ' -f1)" -- "$cur")) + _comp_compgen_split -- "$(lpstat -a 2>/dev/null | cut -d' ' -f1)" return ;; -U) - COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen -- -u return ;; esac if [[ $cur == - ]]; then - COMPREPLY=($(compgen -W '-E -P -U -a -h -l' -- "$cur")) + _comp_compgen -- -W '-E -P -U -a -h -l' return fi - _filedir + _comp_compgen_filedir } && - complete -F _lpq lpq + complete -F _comp_cmd_lpq lpq # ex: filetype=sh diff --git a/completions/lpr b/completions/lpr index 554f053..746df28 100644 --- a/completions/lpr +++ b/completions/lpr @@ -1,33 +1,33 @@ # lpr(1) completion -*- shell-script -*- -_lpr() +_comp_cmd_lpr() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -P) - COMPREPLY=($(compgen -W "$(lpstat -a 2>/dev/null | cut -d' ' -f1)" -- "$cur")) + _comp_compgen_split -- "$(lpstat -a 2>/dev/null | cut -d' ' -f1)" return ;; -U) - COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen -- -u return ;; -o) - COMPREPLY=($(compgen -W "media= landscape orientation-requested= sides= fitplot number-up= scaling= cpi= lpi= page-bottom= page-top= page-left= page-right=" -- "$cur")) + _comp_compgen -- -W "media= landscape orientation-requested= sides= fitplot number-up= scaling= cpi= lpi= page-bottom= page-top= page-left= page-right=" [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return ;; esac if [[ $cur == - ]]; then - COMPREPLY=($(compgen -W '-E -H -C -J -T -P -U -h -l -m -o -p -q -r' -- "$cur")) + _comp_compgen -- -W '-E -H -C -J -T -P -U -h -l -m -o -p -q -r' return fi - _filedir + _comp_compgen_filedir } && - complete -F _lpr lpr + complete -F _comp_cmd_lpr lpr # ex: filetype=sh diff --git a/completions/lrzip b/completions/lrzip index eb2904c..6f40be7 100644 --- a/completions/lrzip +++ b/completions/lrzip @@ -1,52 +1,56 @@ # lrzip(1) completion -*- shell-script -*- -_lrzip() +_comp_cmd_lrzip() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local xspec="*.lrz" + local noargopts='!(-*|*[SmwdoOLNp]*)' + # shellcheck disable=SC2254 case $prev in - -*@([wSm]|[Vh?]*)) + --help | --version | --suffix | --maxram | --window | \ + -${noargopts}@([Smw]|[h?V]*)) return ;; - -*d) + --decompress | -${noargopts}d) xspec="!"$xspec ;; - -*o) - _filedir + --outfile | -${noargopts}o) + _comp_compgen_filedir return ;; - -*O) - _filedir -d + --outdir | -${noargopts}O) + _comp_compgen_filedir -d return ;; - -*L) - COMPREPLY=($(compgen -W '{1..9}' -- "$cur")) + --level | -${noargopts}L) + _comp_compgen -- -W '{1..9}' return ;; - -*N) - COMPREPLY=($(compgen -W '{-20..19}' -- "$cur")) + --nice-level | -${noargopts}N) + _comp_compgen -- -W '{-20..19}' return ;; - -*p) - COMPREPLY=($(compgen -W "{1..$(_ncpus)}" -- "$cur")) + --threads | -${noargopts}p) + local REPLY + _comp_get_ncpus + _comp_compgen -- -W "{1..$REPLY}" return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - _tilde "$cur" || return + _comp_compgen_tilde && return - local IFS=$'\n' compopt -o filenames - COMPREPLY=($(compgen -f -X "$xspec" -- "$cur") $(compgen -d -- "$cur")) + _comp_compgen -- -f -X "$xspec" -o plusdirs } && - complete -F _lrzip lrzip + complete -F _comp_cmd_lrzip lrzip # ex: filetype=sh diff --git a/completions/lsof b/completions/lsof index eb1e967..07559b3 100644 --- a/completions/lsof +++ b/completions/lsof @@ -1,56 +1,56 @@ # lsof(8) completion -*- shell-script -*- -_lsof() +_comp_cmd_lsof() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -'?' | -h | +c | -c | -d | -F | -i | +r | -r | -s | -S | -T) return ;; -A | -k | -m | +m | -o) - _filedir + _comp_compgen_filedir return ;; +d | +D) - _filedir -d + _comp_compgen_filedir -d return ;; -D) - COMPREPLY=($(compgen -W '? b i r u' -- "$cur")) + _comp_compgen -- -W '? b i r u' return ;; -f) - COMPREPLY=($(compgen -W 'c f g G n' -- "$cur")) + _comp_compgen -- -W 'c f g G n' return ;; -g) # TODO: handle ^foo exclusions, comma separated lists - _pgids + _comp_compgen_pgids return ;; -p) # TODO: handle ^foo exclusions, comma separated lists - _pids + _comp_compgen_pids return ;; -u) # TODO: handle ^foo exclusions, comma separated lists - COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen -- -u return ;; esac if [[ $cur == [-+]* ]]; then - COMPREPLY=($(compgen -W '-h -a -A -b -c +c -C +d -d +D -D +f -f -F -g - -i -k -l +L -L +m -m +M -M -n -N -o -O -p -P +r -r -R -s -S -T -t - -u -U -v -V +w -w -x -X -z -Z' -- "$cur")) + _comp_compgen -- -W '-h -a -A -b -c +c -C +d -d +D -D +f -f -F -g -i -k + -l +L -L +m -m +M -M -n -N -o -O -p -P +r -r -R -s -S -T -t -u -U + -v -V +w -w -x -X -z -Z' return fi - _filedir + _comp_compgen_filedir } && - complete -F _lsof lsof + complete -F _comp_cmd_lsof lsof # ex: filetype=sh diff --git a/completions/lspci b/completions/lspci index d50783c..16d6195 100644 --- a/completions/lspci +++ b/completions/lspci @@ -1,41 +1,40 @@ # lspci(8) completion -*- shell-script -*- -_lspci() +_comp_cmd_lspci() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*[sDO]) return ;; -*i) - _filedir ids + _comp_compgen_filedir ids return ;; -*p) - _filedir pcimap + _comp_compgen_filedir pcimap return ;; -*A) - COMPREPLY+=($(compgen -W '$($1 -A help | command grep -vF :)' \ - -- "$cur")) + _comp_compgen_split -- "$("$1" -A help | command grep -vF :)" return ;; -*H) - COMPREPLY+=($(compgen -W "1 2" -- "$cur")) + _comp_compgen -- -W "1 2" return ;; -*F) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help fi } && - complete -F _lspci lspci + complete -F _comp_cmd_lspci lspci # ex: filetype=sh diff --git a/completions/lsscsi b/completions/lsscsi index bcbc430..6f417f5 100644 --- a/completions/lsscsi +++ b/completions/lsscsi @@ -1,27 +1,29 @@ # lsscsi(8) completion -*- shell-script -*- -_lsscsi() +_comp_cmd_lsscsi() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[y]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | -!(-*)[hV]*) + --help | --version | -${noargopts}[hV]*) return ;; - --sysfsroot | -!(-*)y) - _filedir -d + --sysfsroot | -${noargopts}y) + _comp_compgen_filedir -d return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _lsscsi lsscsi + complete -F _comp_cmd_lsscsi lsscsi # ex: filetype=sh diff --git a/completions/lsusb b/completions/lsusb index 63cff54..44c2625 100644 --- a/completions/lsusb +++ b/completions/lsusb @@ -1,20 +1,22 @@ # lsusb(8) completion -*- shell-script -*- -_lsusb() +_comp_cmd_lsusb() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[sD]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | -!(-*)@([sD]|[hV]*)) + --help | --version | -${noargopts}@([sD]|[hV]*)) return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help fi } && - complete -F _lsusb lsusb + complete -F _comp_cmd_lsusb lsusb # ex: filetype=sh diff --git a/completions/lua b/completions/lua index 3c4df90..a8904e0 100644 --- a/completions/lua +++ b/completions/lua @@ -1,9 +1,9 @@ # lua(1) completion -*- shell-script -*- -_lua() +_comp_cmd_lua() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -e | -l | -v | -) @@ -12,12 +12,12 @@ _lua() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W "$(_parse_help "$1")" -- "$cur")) + _comp_compgen_help return fi - _filedir 'l@(ua|?(ua)c)' + _comp_compgen_filedir 'l@(ua|?(ua)c)' } && - complete -F _lua lua + complete -F _comp_cmd_lua lua{,5{,.}{0..4}} # ex: filetype=sh diff --git a/completions/luac b/completions/luac index c763deb..3fef4be 100644 --- a/completions/luac +++ b/completions/luac @@ -1,27 +1,27 @@ # luac(1) completion -*- shell-script -*- -_luac() +_comp_cmd_luac() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -v | -) return ;; -o) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W "$(_parse_help "$1")" -- "$cur")) + _comp_compgen_help return fi - _filedir lua + _comp_compgen_filedir lua } && - complete -F _luac luac + complete -F _comp_cmd_luac luac{,5{,.}{0..4}} # ex: filetype=sh diff --git a/completions/luseradd b/completions/luseradd index 4d66385..255bc91 100644 --- a/completions/luseradd +++ b/completions/luseradd @@ -1,40 +1,42 @@ # luseradd(1) and lusermod(1) completion -*- shell-script -*- -_luseradd() +_comp_cmd_luseradd() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[culPpdksg]*)' + # shellcheck disable=SC2254 case $prev in --help | --usage | --gecos | --uid | --login | --plainpassword | --password | \ --commonname | --givenname | --surname | --roomnumber | --telephonenumber | \ - --homephone | -!(-*)@([culPp]|[?]*)) + --homephone | -${noargopts}@([culPp]|[?]*)) return ;; - --directory | --skeleton | -!(-*)[dk]) - _filedir -d + --directory | --skeleton | -${noargopts}[dk]) + _comp_compgen_filedir -d return ;; - --shell | -!(-*)s) - _shells + --shell | -${noargopts}s) + _comp_compgen_shells return ;; - --gid | -!(-*)g) - _gids + --gid | -${noargopts}g) + _comp_compgen_gids return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - [[ ${1##*/} == luseradd ]] || COMPREPLY=($(compgen -u -- "$cur")) + [[ ${1##*/} == luseradd ]] || _comp_compgen -- -u } && - complete -F _luseradd luseradd lusermod + complete -F _comp_cmd_luseradd luseradd lusermod # ex: filetype=sh diff --git a/completions/luserdel b/completions/luserdel index e36bda9..d36b256 100644 --- a/completions/luserdel +++ b/completions/luserdel @@ -1,9 +1,9 @@ # luserdel(1) completion -*- shell-script -*- -_luserdel() +_comp_cmd_luserdel() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --help | --usage | -!(-*)[?]*) @@ -12,12 +12,12 @@ _luserdel() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen -- -u } && - complete -F _luserdel luserdel + complete -F _comp_cmd_luserdel luserdel # ex: filetype=sh diff --git a/completions/lvm b/completions/lvm index e70ecc3..70581a7 100644 --- a/completions/lvm +++ b/completions/lvm @@ -1,56 +1,55 @@ # bash completion for lvm -*- shell-script -*- -_lvm_filedir() +_comp_cmd_lvm__filedir() { - cur=${cur:-/dev/} - _filedir + _comp_compgen -c "${cur:-/dev/}" filedir } -_lvm_volumegroups() +_comp_cmd_lvm__volumegroups() { - COMPREPLY=($(compgen -W "$(vgscan 2>/dev/null | - command sed -n -e 's|.*Found.*"\(.*\)".*$|\1|p')" -- "$cur")) + _comp_compgen_split -- "$(vgscan 2>/dev/null | + command sed -n -e 's|.*Found.*"\(.*\)".*$|\1|p')" } -_lvm_physicalvolumes_all() +_comp_cmd_lvm__physicalvolumes_all() { - COMPREPLY=($(compgen -W "$(pvscan 2>/dev/null | - command sed -n -e 's|^.*PV \([^ ]*\) .*|\1|p')" -- "$cur")) + _comp_compgen_split -- "$(pvscan 2>/dev/null | + command sed -n -e 's|^.*PV \([^ ]*\) .*|\1|p')" } -_lvm_physicalvolumes() +_comp_cmd_lvm__physicalvolumes() { - COMPREPLY=($(compgen -W "$(pvscan 2>/dev/null | - command sed -n -e 's|^.*PV \(.*\) VG.*$|\1|p')" -- "$cur")) + _comp_compgen_split -- "$(pvscan 2>/dev/null | + command sed -n -e 's|^.*PV \(.*\) VG.*$|\1|p')" } -_lvm_logicalvolumes() +_comp_cmd_lvm__logicalvolumes() { - COMPREPLY=($(compgen -W "$(lvscan 2>/dev/null | - command sed -n -e "s|^.*'\(.*\)'.*$|\1|p")" -- "$cur")) + _comp_compgen_split -- "$(lvscan 2>/dev/null | + command sed -n -e "s|^.*'\(.*\)'.*$|\1|p")" if [[ $cur == /dev/mapper/* ]]; then - _filedir + _comp_compgen -a filedir local i for i in "${!COMPREPLY[@]}"; do - [[ ${COMPREPLY[i]} == */control ]] && unset 'COMPREPLY[i]' + [[ ${COMPREPLY[i]} == */control ]] && unset -v 'COMPREPLY[i]' done fi } -_lvm_units() +_comp_cmd_lvm__units() { - COMPREPLY=($(compgen -W 'h s b k m g t H K M G T' -- "$cur")) + _comp_compgen -- -W 'h s b k m g t H K M G T' } -_lvm_sizes() +_comp_cmd_lvm__sizes() { - COMPREPLY=($(compgen -W 'k K m M g G t T' -- "$cur")) + _comp_compgen -- -W 'k K m M g G t T' } # @param $1 glob matching args known to take an argument -_lvm_count_args() +_comp_cmd_lvm__count_args() { - args=0 + REPLY=0 local offset=1 if [[ ${words[0]} == lvm ]]; then offset=2 @@ -59,791 +58,836 @@ _lvm_count_args() for ((i = offset; i < cword; i++)); do # shellcheck disable=SC2053 if [[ ${words[i]} != -* && $prev != $1 ]]; then - ((args++)) + ((REPLY++)) fi prev=${words[i]} done } -_lvmdiskscan() +_comp_cmd_lvmdiskscan() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help fi } && - complete -F _lvmdiskscan lvmdiskscan + complete -F _comp_cmd_lvmdiskscan lvmdiskscan -_pvscan() +_comp_cmd_pvscan() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help fi } && - complete -F _pvscan pvscan + complete -F _comp_cmd_pvscan pvscan -_pvs() +_comp_cmd_pvs() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[oO]*)' + # shellcheck disable=SC2254 case $prev in - --options | --sort | -!(-*)[oO]) - COMPREPLY=($(compgen -W 'pv_fmt pv_uuid pv_size pv_free pv_used - pv_name pv_attr pv_pe_count pv_pe_alloc_count' -- "$cur")) + --options | --sort | -${noargopts}[oO]) + _comp_compgen -- -W 'pv_fmt pv_uuid pv_size pv_free pv_used pv_name + pv_attr pv_pe_count pv_pe_alloc_count' return ;; --units) - _lvm_units + _comp_cmd_lvm__units return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_physicalvolumes_all + _comp_cmd_lvm__physicalvolumes_all fi } && - complete -F _pvs pvs + complete -F _comp_cmd_pvs pvs -_pvdisplay() +_comp_cmd_pvdisplay() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --units) - _lvm_units + _comp_cmd_lvm__units return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_physicalvolumes_all + _comp_cmd_lvm__physicalvolumes_all fi } && - complete -F _pvdisplay pvdisplay + complete -F _comp_cmd_pvdisplay pvdisplay -_pvchange() +_comp_cmd_pvchange() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[Ax]*)' + # shellcheck disable=SC2254 case $prev in - --autobackup | --allocatable | -!(-*)[Ax]) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + --autobackup | --allocatable | -${noargopts}[Ax]) + _comp_compgen -- -W 'y n' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_physicalvolumes_all + _comp_cmd_lvm__physicalvolumes_all fi } && - complete -F _pvchange pvchange + complete -F _comp_cmd_pvchange pvchange -_pvcreate() +_comp_cmd_pvcreate() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[M]*)' + # shellcheck disable=SC2254 case $prev in --restorefile) - _filedir + _comp_compgen_filedir return ;; - --metadatatype | -!(-*)M) - COMPREPLY=($(compgen -W '1 2' -- "$cur")) + --metadatatype | -${noargopts}M) + _comp_compgen -- -W '1 2' return ;; --metadatacopies) - COMPREPLY=($(compgen -W '0 1 2' -- "$cur")) + _comp_compgen -- -W '0 1 2' return ;; --metadatasize | --setphysicalvolumesize) - _lvm_sizes + _comp_cmd_lvm__sizes return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_filedir + _comp_cmd_lvm__filedir fi } && - complete -F _pvcreate pvcreate + complete -F _comp_cmd_pvcreate pvcreate -_pvmove() +_comp_cmd_pvmove() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[An]*)' + # shellcheck disable=SC2254 case $prev in - --autobackup | -!(-*)A) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + --autobackup | -${noargopts}A) + _comp_compgen -- -W 'y n' return ;; - --name | -!(-*)n) - _lvm_logicalvolumes + --name | -${noargopts}n) + _comp_cmd_lvm__logicalvolumes return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_physicalvolumes + _comp_cmd_lvm__physicalvolumes fi } && - complete -F _pvmove pvmove + complete -F _comp_cmd_pvmove pvmove -_pvremove() +_comp_cmd_pvremove() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_physicalvolumes_all + _comp_cmd_lvm__physicalvolumes_all fi } && - complete -F _pvremove pvremove + complete -F _comp_cmd_pvremove pvremove -_vgscan() +_comp_cmd_vgscan() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help fi } && - complete -F _vgscan vgscan + complete -F _comp_cmd_vgscan vgscan -_vgs() +_comp_cmd_vgs() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[oO]*)' + # shellcheck disable=SC2254 case $prev in - --options | --sort | -!(-*)[oO]) - COMPREPLY=($(compgen -W 'vg_fmt vg_uuid vg_name vg_attr vg_size - vg_free vg_sysid vg_extent_size vg_extent_count vg_free_count - max_lv max_pv pv_count lv_count snap_count vg_seqno' \ - -- "$cur")) + --options | --sort | -${noargopts}[oO]) + _comp_compgen -- -W 'vg_fmt vg_uuid vg_name vg_attr vg_size vg_free + vg_sysid vg_extent_size vg_extent_count vg_free_count max_lv + max_pv pv_count lv_count snap_count vg_seqno' return ;; --units) - _lvm_units + _comp_cmd_lvm__units return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_volumegroups + _comp_cmd_lvm__volumegroups fi } && - complete -F _vgs vgs + complete -F _comp_cmd_vgs vgs -_vgdisplay() +_comp_cmd_vgdisplay() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --units) - _lvm_units + _comp_cmd_lvm__units return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_volumegroups + _comp_cmd_lvm__volumegroups fi } && - complete -F _vgdisplay vgdisplay + complete -F _comp_cmd_vgdisplay vgdisplay -_vgchange() +_comp_cmd_vgchange() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[aAx]*)' + # shellcheck disable=SC2254 case $prev in - --available | --autobackup | --resizeable | -!(-*)[aAx]) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + --available | --autobackup | --resizeable | -${noargopts}[aAx]) + _comp_compgen -- -W 'y n' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_volumegroups + _comp_cmd_lvm__volumegroups fi } && - complete -F _vgchange vgchange + complete -F _comp_cmd_vgchange vgchange -_vgcreate() +_comp_cmd_vgcreate() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[AMs]*)' + # shellcheck disable=SC2254 case $prev in - --autobackup | -!(-*)A) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + --autobackup | -${noargopts}A) + _comp_compgen -- -W 'y n' return ;; - --metadatatype | -!(-*)M) - COMPREPLY=($(compgen -W '1 2' -- "$cur")) + --metadatatype | -${noargopts}M) + _comp_compgen -- -W '1 2' return ;; - --physicalextentsize | -!(-*)s) - _lvm_sizes + --physicalextentsize | -${noargopts}s) + _comp_cmd_lvm__sizes return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - local args - _lvm_count_args '@(-A|--autobackup|-M|--metadatatype|-s|--physicalextentsize)' - if ((args == 0)); then - _lvm_volumegroups + local REPLY + _comp_cmd_lvm__count_args '@(-A|--autobackup|-M|--metadatatype|-s|--physicalextentsize)' + if ((REPLY == 0)); then + _comp_cmd_lvm__volumegroups else - _lvm_physicalvolumes_all + _comp_cmd_lvm__physicalvolumes_all fi fi } && - complete -F _vgcreate vgcreate + complete -F _comp_cmd_vgcreate vgcreate -_vgremove() +_comp_cmd_vgremove() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_volumegroups + _comp_cmd_lvm__volumegroups fi } && - complete -F _vgremove vgremove + complete -F _comp_cmd_vgremove vgremove -_vgrename() +_comp_cmd_vgrename() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[A]*)' + # shellcheck disable=SC2254 case $prev in - --autobackup | -!(-*)A) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + --autobackup | -${noargopts}A) + _comp_compgen -- -W 'y n' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_volumegroups + _comp_cmd_lvm__volumegroups fi } && - complete -F _vgrename vgrename + complete -F _comp_cmd_vgrename vgrename -_vgreduce() +_comp_cmd_vgreduce() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[A]*)' + # shellcheck disable=SC2254 case $prev in - --autobackup | -!(-*)A) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + --autobackup | -${noargopts}A) + _comp_compgen -- -W 'y n' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - local args - _lvm_count_args '@(-A|--autobackup)' - if ((args == 0)); then - _lvm_volumegroups + local REPLY + _comp_cmd_lvm__count_args '@(-A|--autobackup)' + if ((REPLY == 0)); then + _comp_cmd_lvm__volumegroups else - _lvm_physicalvolumes + _comp_cmd_lvm__physicalvolumes fi fi } && - complete -F _vgreduce vgreduce + complete -F _comp_cmd_vgreduce vgreduce -_vgextend() +_comp_cmd_vgextend() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[AL]*)' + # shellcheck disable=SC2254 case $prev in - --autobackup | -!(-*)A) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + --autobackup | -${noargopts}A) + _comp_compgen -- -W 'y n' return ;; - --size | -!(-*)L) - _lvm_sizes + --size | -${noargopts}L) + _comp_cmd_lvm__sizes return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - local args - _lvm_count_args '@(-A|--autobackup|-L|--size)' - if ((args == 0)); then - _lvm_volumegroups + local REPLY + _comp_cmd_lvm__count_args '@(-A|--autobackup|-L|--size)' + if ((REPLY == 0)); then + _comp_cmd_lvm__volumegroups else - _lvm_physicalvolumes_all + _comp_cmd_lvm__physicalvolumes_all fi fi } && - complete -F _vgextend vgextend + complete -F _comp_cmd_vgextend vgextend -_vgport() +_comp_cmd_vgport() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_volumegroups + _comp_cmd_lvm__volumegroups fi } && - complete -F _vgport vgimport vgexport + complete -F _comp_cmd_vgport vgimport vgexport -_vgck() +_comp_cmd_vgck() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_volumegroups + _comp_cmd_lvm__volumegroups fi } && - complete -F _vgck vgck + complete -F _comp_cmd_vgck vgck -_vgconvert() +_comp_cmd_vgconvert() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[M]*)' + # shellcheck disable=SC2254 case $prev in - --metadatatype | -!(-*)M) - COMPREPLY=($(compgen -W '1 2' -- "$cur")) + --metadatatype | -${noargopts}M) + _comp_compgen -- -W '1 2' return ;; --metadatacopies) - COMPREPLY=($(compgen -W '0 1 2' -- "$cur")) + _comp_compgen -- -W '0 1 2' return ;; --metadatasize) - _lvm_sizes + _comp_cmd_lvm__sizes return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_volumegroups + _comp_cmd_lvm__volumegroups fi } && - complete -F _vgconvert vgconvert + complete -F _comp_cmd_vgconvert vgconvert -_vgcfgbackup() +_comp_cmd_vgcfgbackup() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[f]*)' + # shellcheck disable=SC2254 case $prev in - --file | -!(-*)f) - _filedir + --file | -${noargopts}f) + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_volumegroups + _comp_cmd_lvm__volumegroups fi } && - complete -F _vgcfgbackup vgcfgbackup + complete -F _comp_cmd_vgcfgbackup vgcfgbackup -_vgcfgrestore() +_comp_cmd_vgcfgrestore() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[fMn]*)' + # shellcheck disable=SC2254 case $prev in - --file | -!(-*)f) - _filedir + --file | -${noargopts}f) + _comp_compgen_filedir return ;; - --metadatatype | -!(-*)M) - COMPREPLY=($(compgen -W '1 2' -- "$cur")) + --metadatatype | -${noargopts}M) + _comp_compgen -- -W '1 2' return ;; - --name | -!(-*)n) - _lvm_volumegroups + --name | -${noargopts}n) + _comp_cmd_lvm__volumegroups return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_volumegroups + _comp_cmd_lvm__volumegroups fi } && - complete -F _vgcfgrestore vgcfgrestore + complete -F _comp_cmd_vgcfgrestore vgcfgrestore -_vgmerge() +_comp_cmd_vgmerge() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[A]*)' + # shellcheck disable=SC2254 case $prev in - --autobackup | -!(-*)A) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + --autobackup | -${noargopts}A) + _comp_compgen -- -W 'y n' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_volumegroups + _comp_cmd_lvm__volumegroups fi } && - complete -F _vgmerge vgmerge + complete -F _comp_cmd_vgmerge vgmerge -_vgsplit() +_comp_cmd_vgsplit() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[AM]*)' + # shellcheck disable=SC2254 case $prev in - --autobackup | -!(-*)A) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + --autobackup | -${noargopts}A) + _comp_compgen -- -W 'y n' return ;; - --metadatatype | -!(-*)M) - COMPREPLY=($(compgen -W '1 2' -- "$cur")) + --metadatatype | -${noargopts}M) + _comp_compgen -- -W '1 2' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - local args - _lvm_count_args '@(-A|--autobackup|-M|--metadatatype)' - if ((args == 0 || args == 1)); then - _lvm_volumegroups + local REPLY + _comp_cmd_lvm__count_args '@(-A|--autobackup|-M|--metadatatype)' + if ((REPLY < 2)); then + _comp_cmd_lvm__volumegroups else - _lvm_physicalvolumes + _comp_cmd_lvm__physicalvolumes fi fi } && - complete -F _vgsplit vgsplit + complete -F _comp_cmd_vgsplit vgsplit -_vgmknodes() +_comp_cmd_vgmknodes() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_volumegroups + _comp_cmd_lvm__volumegroups fi } && - complete -F _vgmknodes vgmknodes + complete -F _comp_cmd_vgmknodes vgmknodes -_lvscan() +_comp_cmd_lvscan() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help fi } && - complete -F _lvscan lvscan + complete -F _comp_cmd_lvscan lvscan -_lvs() +_comp_cmd_lvs() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[oO]*)' + # shellcheck disable=SC2254 case $prev in - --options | --sort | -!(-*)[oO]) - COMPREPLY=($(compgen -W 'lv_uuid lv_name lv_attr lv_minor lv_size + --options | --sort | -${noargopts}[oO]) + _comp_compgen -- -W 'lv_uuid lv_name lv_attr lv_minor lv_size seg_count origin snap_percent segtype stripes stripesize - chunksize seg_start seg_size' -- "$cur")) + chunksize seg_start seg_size' return ;; --units) - _lvm_units + _comp_cmd_lvm__units return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_logicalvolumes + _comp_cmd_lvm__logicalvolumes fi } && - complete -F _lvs lvs + complete -F _comp_cmd_lvs lvs -_lvdisplay() +_comp_cmd_lvdisplay() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --units) - _lvm_units + _comp_cmd_lvm__units return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_logicalvolumes + _comp_cmd_lvm__logicalvolumes fi } && - complete -F _lvdisplay lvdisplay + complete -F _comp_cmd_lvdisplay lvdisplay -_lvchange() +_comp_cmd_lvchange() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[aACMp]*)' + # shellcheck disable=SC2254 case $prev in - --available | --autobackup | --contiguous | --persistent | -!(-*)[aACM]) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + --available | --autobackup | --contiguous | --persistent | -${noargopts}[aACM]) + _comp_compgen -- -W 'y n' return ;; - --permission | -!(-*)p) - COMPREPLY=($(compgen -W 'r rw' -- "$cur")) + --permission | -${noargopts}p) + _comp_compgen -- -W 'r rw' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_logicalvolumes + _comp_cmd_lvm__logicalvolumes fi } && - complete -F _lvchange lvchange + complete -F _comp_cmd_lvchange lvchange -_lvcreate() +_comp_cmd_lvcreate() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[ACMZLpn]*)' + # shellcheck disable=SC2254 case $prev in - --autobackup | --contiguous | --persistent | --zero | -!(-*)[ACMZ]) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + --autobackup | --contiguous | --persistent | --zero | -${noargopts}[ACMZ]) + _comp_compgen -- -W 'y n' return ;; - --size | -!(-*)L) - _lvm_sizes + --size | -${noargopts}L) + _comp_cmd_lvm__sizes return ;; - --permission | -!(-*)p) - COMPREPLY=($(compgen -W 'r rw' -- "$cur")) + --permission | -${noargopts}p) + _comp_compgen -- -W 'r rw' return ;; - --name | -!(-*)n) - _lvm_logicalvolumes + --name | -${noargopts}n) + _comp_cmd_lvm__logicalvolumes return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - local args - _lvm_count_args '@(-A|-C|-M|-Z|--autobackup|--contiguous|--persistent|--zero|-L|--size|-p|--permission|-n|--name)' - if ((args == 0)); then - _lvm_volumegroups + local REPLY + _comp_cmd_lvm__count_args '@(-A|-C|-M|-Z|--autobackup|--contiguous|--persistent|--zero|-L|--size|-p|--permission|-n|--name)' + if ((REPLY == 0)); then + _comp_cmd_lvm__volumegroups else - _lvm_physicalvolumes + _comp_cmd_lvm__physicalvolumes fi fi } && - complete -F _lvcreate lvcreate + complete -F _comp_cmd_lvcreate lvcreate -_lvremove() +_comp_cmd_lvremove() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[A]*)' + # shellcheck disable=SC2254 case $prev in - --autobackup | -!(-*)A) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + --autobackup | -${noargopts}A) + _comp_compgen -- -W 'y n' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_logicalvolumes + _comp_cmd_lvm__logicalvolumes fi } && - complete -F _lvremove lvremove + complete -F _comp_cmd_lvremove lvremove -_lvrename() +_comp_cmd_lvrename() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[A]*)' + # shellcheck disable=SC2254 case $prev in - --autobackup | -!(-*)A) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + --autobackup | -${noargopts}A) + _comp_compgen -- -W 'y n' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_logicalvolumes + _comp_cmd_lvm__logicalvolumes fi } && - complete -F _lvrename lvrename + complete -F _comp_cmd_lvrename lvrename -_lvreduce() +_comp_cmd_lvreduce() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[AL]*)' + # shellcheck disable=SC2254 case $prev in - --autobackup | -!(-*)A) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + --autobackup | -${noargopts}A) + _comp_compgen -- -W 'y n' return ;; - --size | -!(-*)L) - _lvm_sizes + --size | -${noargopts}L) + _comp_cmd_lvm__sizes return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _lvm_logicalvolumes + _comp_cmd_lvm__logicalvolumes fi } && - complete -F _lvreduce lvreduce + complete -F _comp_cmd_lvreduce lvreduce -_lvresize() +_comp_cmd_lvresize() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[AL]*)' + # shellcheck disable=SC2254 case $prev in - --autobackup | -!(-*)A) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + --autobackup | -${noargopts}A) + _comp_compgen -- -W 'y n' return ;; - --size | -!(-*)L) - _lvm_sizes + --size | -${noargopts}L) + _comp_cmd_lvm__sizes return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - local args - _lvm_count_args '@(-A|--autobackup|-L|--size)' - if ((args == 0)); then - _lvm_logicalvolumes + local REPLY + _comp_cmd_lvm__count_args '@(-A|--autobackup|-L|--size)' + if ((REPLY == 0)); then + _comp_cmd_lvm__logicalvolumes else - _lvm_physicalvolumes + _comp_cmd_lvm__physicalvolumes fi fi } && - complete -F _lvresize lvresize + complete -F _comp_cmd_lvresize lvresize -_lvextend() +_comp_cmd_lvextend() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[AL]*)' + # shellcheck disable=SC2254 case $prev in - --autobackup | -!(-*)A) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + --autobackup | -${noargopts}A) + _comp_compgen -- -W 'y n' return ;; - --size | -!(-*)L) - _lvm_sizes + --size | -${noargopts}L) + _comp_cmd_lvm__sizes return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - local args - _lvm_count_args '@(-A|--autobackup|-L|--size)' - if ((args == 0)); then - _lvm_logicalvolumes + local REPLY + _comp_cmd_lvm__count_args '@(-A|--autobackup|-L|--size)' + if ((REPLY == 0)); then + _comp_cmd_lvm__logicalvolumes else - _lvm_physicalvolumes + _comp_cmd_lvm__physicalvolumes fi fi } && - complete -F _lvextend lvextend + complete -F _comp_cmd_lvextend lvextend -_lvm() +_comp_cmd_lvm() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if ((cword == 1)); then - COMPREPLY=($(compgen -W 'dumpconfig help lvchange lvcreate lvdisplay + _comp_compgen -- -W 'dumpconfig help lvchange lvcreate lvdisplay lvextend lvmchange lvmdiskscan lvmsadc lvmsar lvreduce lvremove lvrename lvresize lvs lvscan pvchange pvcreate pvdata pvdisplay pvmove pvremove pvresize pvs pvscan vgcfgbackup vgcfgrestore vgchange vgck vgconvert vgcreate vgdisplay vgexport vgextend vgimport vgmerge vgmknodes vgreduce vgremove vgrename vgs vgscan - vgsplit version' -- "$cur")) + vgsplit version' else case "${words[1]}" in pvchange | pvcreate | pvdisplay | pvmove | pvremove | pvresize | pvs | pvscan | \ @@ -851,11 +895,11 @@ _lvm() vgdisplay | vgexport | vgextend | vgimport | vgmerge | vgmknodes | vgreduce | \ vgremove | vgrename | vgs | vgscan | vgsplit | lvchange | lvcreate | lvdisplay | \ lvextend | lvreduce | lvremove | lvrename | lvresize | lvscan) - _${words[1]} + _comp_command_offset 1 ;; esac fi } && - complete -F _lvm lvm + complete -F _comp_cmd_lvm lvm # ex: filetype=sh diff --git a/completions/lz4 b/completions/lz4 index f297b5d..8e2a777 100644 --- a/completions/lz4 +++ b/completions/lz4 @@ -1,25 +1,27 @@ # lz4 completion -*- shell-script -*- -_lz4() +_comp_cmd_lz4() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -b) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -X '-*#*' -W \ - '$(_parse_help "$1" -h) -B{4..7} -i{1..9}' -- "$cur")) + _comp_compgen -R help -- -h + _comp_compgen -- -X '-*#*' -W \ + '${COMPREPLY+"${COMPREPLY[@]}"} -B{4..7} -i{1..9}' return fi - local args word xspec="*.?(t)lz4" - _count_args + local REPLY word xspec="*.?(t)lz4" + _comp_count_args + local args=$REPLY ((args > 2)) && return for word in "${words[@]}"; do @@ -41,12 +43,11 @@ _lz4() esac done - _tilde "$cur" || return + _comp_compgen_tilde && return - local IFS=$'\n' compopt -o filenames - COMPREPLY=($(compgen -f -X "$xspec" -- "$cur") $(compgen -d -- "$cur")) + _comp_compgen -- -f -X "$xspec" -o plusdirs } && - complete -F _lz4 lz4 lz4c + complete -F _comp_cmd_lz4 lz4 lz4c # ex: filetype=sh diff --git a/completions/lzip b/completions/lzip index 05f169c..cd33f60 100644 --- a/completions/lzip +++ b/completions/lzip @@ -1,47 +1,51 @@ # lzip(1) completion -*- shell-script -*- -_lzip() +_comp_cmd_lzip() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return - local decompress=false + local decompress="" + local noargopts='!(-*|*[bmsSBdno]*)' + # shellcheck disable=SC2254 case $prev in --help | --version | --member-size | --match-length | --dictionary-size | \ - --volume-size | --data-size | -!(-*)@([bmsSB]|[hV]*)) + --volume-size | --data-size | -${noargopts}@([bmsSB]|[hV]*)) return ;; - --decompress-!(-*)d) - decompress=true + --decompress | -${noargopts}d) + decompress=set ;; - --threads-!(-*)n) - COMPREPLY=($(compgen -W "{1..$(_ncpus)}" -- "$cur")) + --threads | -${noargopts}n) + local REPLY + _comp_get_ncpus + _comp_compgen -- -W "{1..$REPLY}" return ;; - --output-!(-*)o) - _filedir + --output | -${noargopts}o) + _comp_compgen_filedir return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1") {-1..-9}' -- "$cur")) + _comp_compgen_help + _comp_compgen -a -- -W '-{1..9}' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - if $decompress; then - _filedir lz + if [[ $decompress ]]; then + _comp_compgen_filedir lz return fi - local IFS=$'\n' compopt -o filenames - COMPREPLY=($(compgen -f -X "*.lz" -- "$cur") $(compgen -d -- "$cur")) + _comp_compgen -- -f -X "*.lz" -o plusdirs } && - complete -F _lzip clzip lzip pdlzip plzip + complete -F _comp_cmd_lzip clzip lzip pdlzip plzip # ex: filetype=sh diff --git a/completions/lzma b/completions/lzma index 34fba89..c1ae07d 100644 --- a/completions/lzma +++ b/completions/lzma @@ -1,20 +1,21 @@ # lzma(1) completion -*- shell-script -*- # by Per Øyvind Karlsen <peroyvind@mandriva.org> -_lzma() +_comp_cmd_lzma() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1") -{1..9}' -- "$cur")) + _comp_compgen_help + _comp_compgen -a -- -W '-{1..9}' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - local IFS=$'\n' xspec="*.@(lzma|tlz)" + local xspec="*.@(lzma|tlz)" if [[ $prev == --* ]]; then [[ $prev == --@(decompress|list|test) ]] && xspec="!"$xspec @@ -24,11 +25,11 @@ _lzma() [[ $prev == -*z* ]] && xspec= fi - _tilde "$cur" || return + _comp_compgen_tilde && return compopt -o filenames - COMPREPLY=($(compgen -f -X "$xspec" -- "$cur") $(compgen -d -- "$cur")) + _comp_compgen -- -f -X "$xspec" -o plusdirs } && - complete -F _lzma lzma + complete -F _comp_cmd_lzma lzma # ex: filetype=sh diff --git a/completions/lzop b/completions/lzop index 2642742..5cbd51f 100644 --- a/completions/lzop +++ b/completions/lzop @@ -1,32 +1,33 @@ # lzop(1) completion -*- shell-script -*- -_lzop() +_comp_cmd_lzop() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[oS]*)' + # shellcheck disable=SC2254 case $prev in - --output | -!(-*)o) - _filedir + --output | -${noargopts}o) + _comp_compgen_filedir return ;; --path) - _filedir -d + _comp_compgen_filedir -d return ;; - --suffix | -!(-*)S) + --suffix | -${noargopts}S) return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-1 -2 -3 -4 -5 -6 -7 -8 -9 -P + _comp_compgen -- -W '-{1..9} -P --fast --best --decompress --extract --test --list --ls --info --sysinfo --license --help --version --stdout --output --path --force --no-checksum --no-name --name --no-mode --no-time --suffix --keep --delete --crc32 --no-warn --ignore-warn --quiet --verbose - --no-stdin --filter --checksum --no-color --mono --color' \ - -- "$cur")) + --no-stdin --filter --checksum --no-color --mono --color' return fi @@ -48,12 +49,11 @@ _lzop() ;; esac - _tilde "$cur" || return + _comp_compgen_tilde && return - local IFS=$'\n' compopt -o filenames - COMPREPLY=($(compgen -f -X "$xspec" -- "$cur") $(compgen -d -- "$cur")) + _comp_compgen -- -f -X "$xspec" -o plusdirs } && - complete -F _lzop lzop + complete -F _comp_cmd_lzop lzop # ex: filetype=sh diff --git a/completions/macof b/completions/macof index ad29f58..408e446 100644 --- a/completions/macof +++ b/completions/macof @@ -1,22 +1,22 @@ # macof completion -*- shell-script -*- -_macof() +_comp_cmd_macof() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -i) - _available_interfaces -a + _comp_compgen_available_interfaces -a return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage fi } && - complete -F _macof macof + complete -F _comp_cmd_macof macof # ex: filetype=sh diff --git a/completions/mailmanctl b/completions/mailmanctl index 3bbc2f2..b29487a 100644 --- a/completions/mailmanctl +++ b/completions/mailmanctl @@ -1,18 +1,18 @@ # mailmanctl completion -*- shell-script -*- -_mailmanctl() +_comp_cmd_mailmanctl() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--no-restart --run-as-user - --stale-lock-cleanup --quiet --help' -- "$cur")) + _comp_compgen -- -W '--no-restart --run-as-user --stale-lock-cleanup + --quiet --help' else - COMPREPLY=($(compgen -W 'start stop restart reopen' -- "$cur")) + _comp_compgen -- -W 'start stop restart reopen' fi } && - complete -F _mailmanctl mailmanctl + complete -F _comp_cmd_mailmanctl mailmanctl # ex: filetype=sh diff --git a/completions/make b/completions/make index 96517c2..94e2b73 100644 --- a/completions/make +++ b/completions/make @@ -1,135 +1,128 @@ # bash completion for GNU make -*- shell-script -*- -_make_target_extract_script() +# Extract the valid target names starting with PREFIX from the output of +# `make -npq' +# @param mode If this is `-d', the directory names already specified in +# PREFIX are omitted in the output +# @param prefix Prefix of the target names +_comp_cmd_make__extract_targets() { - local mode="$1" - shift + local mode=$1 + local -x prefix=$2 - local prefix="$1" - local prefix_pat=$(command sed 's/[][\,.*^$(){}?+|/]/\\&/g' <<<"$prefix") - local basename=${prefix##*/} - local dirname_len=$((${#prefix} - ${#basename})) + # display mode, only output current path component to the next slash + local -x prefix_replace=$prefix + [[ $mode == -d && $prefix == */* ]] && + prefix_replace=${prefix##*/} - if [[ $mode == -d ]]; then - # display mode, only output current path component to the next slash - local output="\2" - else - # completion mode, output full path to the next slash - local output="\1\2" - fi - - cat <<EOF - 1,/^# * Make data base/ d; # skip any makefile output - /^# * Finished Make data base/,/^# * Make data base/{ - d; # skip any makefile output - } - /^# * Variables/,/^# * Files/ d; # skip until files section - /^# * Not a target/,/^$/ d; # skip not target blocks - /^${prefix_pat}/,/^$/! d; # skip anything user dont want - - # The stuff above here describes lines that are not - # explicit targets or not targets other than special ones - # The stuff below here decides whether an explicit target - # should be output. - - /^# * File is an intermediate prerequisite/ { - s/^.*$//;x; # unhold target - d; # delete line - } - - /^$/ { # end of target block - x; # unhold target - /^$/d; # dont print blanks - s|^\(.\{${dirname_len}\}\)\(.\{${#basename}\}[^:/]*/\{0,1\}\)[^:]*:.*$|${output}|p; - d; # hide any bugs - } - - # This pattern includes a literal tab character as \t is not a portable - # representation and fails with BSD sed - /^[^# :%]\{1,\}:/ { # found target block - /^\.PHONY:/ d; # special target - /^\.SUFFIXES:/ d; # special target - /^\.DEFAULT:/ d; # special target - /^\.PRECIOUS:/ d; # special target - /^\.INTERMEDIATE:/ d; # special target - /^\.SECONDARY:/ d; # special target - /^\.SECONDEXPANSION:/ d; # special target - /^\.DELETE_ON_ERROR:/ d; # special target - /^\.IGNORE:/ d; # special target - /^\.LOW_RESOLUTION_TIME:/ d; # special target - /^\.SILENT:/ d; # special target - /^\.EXPORT_ALL_VARIABLES:/ d; # special target - /^\.NOTPARALLEL:/ d; # special target - /^\.ONESHELL:/ d; # special target - /^\.POSIX:/ d; # special target - /^\.NOEXPORT:/ d; # special target - /^\.MAKE:/ d; # special target -EOF - - # don't complete with hidden targets unless we are doing a partial completion - if [[ -z ${prefix_pat} || ${prefix_pat} == */ ]]; then - cat <<EOF - /^${prefix_pat}[^a-zA-Z0-9]/d; # convention for hidden tgt -EOF - fi + _comp_awk -f "${BASH_SOURCE[0]%/*}/../helpers/make-extract-targets.awk" +} - cat <<EOF - h; # hold target - d; # delete line - } +# Truncate the non-unique filepaths in COMPREPLY to only generate unique +# directories or files. This function discards the files under subdirectories +# unless the path is unique under each subdirectory and instead generate the +# subdirectory path. For example, when there are two candidates, "abc/def" and +# "abc/xyz", we generate "abc/" instead of generating both candidates directly. +# When there is only one candidate "abc/def", we generate the full path +# "abc/def". +# +# @var[in] cur +# @var[in] mode +# @var[in,out] COMPREPLY +_comp_cmd_make__truncate_non_unique_paths() +{ + local prefix=$cur + [[ $mode == -d ]] && prefix= + if ((${#COMPREPLY[@]} > 0)); then + # collect the possible completions including the directory names in + # `paths' and count the number of children of each subdirectory in + # `nchild'. + local -A paths nchild + local target + for target in "${COMPREPLY[@]}"; do + local path=${target%/} + while [[ ! ${paths[$path]+set} ]] && + paths[$path]=set && + [[ $path == "$prefix"*/* ]]; do + path=${path%/*} + nchild[$path]=$((${nchild[$path]-0} + 1)) + done + done -EOF + COMPREPLY=() + local nreply=0 + for target in "${!paths[@]}"; do + # generate only the paths that do not have a unique child and whose + # all parent and ancestor directories have a unique child. + ((${nchild[$target]-0} == 1)) && continue + local path=$target + while [[ $path == "$prefix"*/* ]]; do + path=${path%/*} + ((${nchild[$path]-0} == 1)) || continue 2 + done + + # suffix `/' when the target path is a subdiretory, which has + # at least one child. + COMPREPLY[nreply++]=$target${nchild[$target]+/} + done + fi } -_make() +_comp_cmd_make() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return local makef makef_dir=("-C" ".") i + local noargopts='!(-*|*[foWICmEDVxj]*)' + # shellcheck disable=SC2254 case $prev in --file | --makefile | --old-file | --assume-old | --what-if | --new-file | \ - --assume-new | -!(-*)[foW]) - _filedir + --assume-new | -${noargopts}[foW]) + _comp_compgen_filedir return ;; - --include-dir | --directory | -!(-*)[ICm]) - _filedir -d + --include-dir | --directory | -${noargopts}[ICm]) + _comp_compgen_filedir -d return ;; - -!(-*)E) - COMPREPLY=($(compgen -v -- "$cur")) + -${noargopts}E) + _comp_compgen -- -v return ;; - --eval | -!(-*)[DVx]) + --eval | -${noargopts}[DVx]) return ;; - --jobs | -!(-*)j) - COMPREPLY=($(compgen -W "{1..$(($(_ncpus) * 2))}" -- "$cur")) + --jobs | -${noargopts}j) + local REPLY + _comp_get_ncpus + _comp_compgen -- -W "{1..$((REPLY * 2))}" return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - local opts="$(_parse_help "$1")" - COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage [[ ${COMPREPLY-} == *= ]] && compopt -o nospace elif [[ $cur == *=* ]]; then prev=${cur%%=*} cur=${cur#*=} local diropt [[ ${prev,,} == *dir?(ectory) ]] && diropt=-d - _filedir $diropt + _comp_compgen_filedir $diropt else # before we check for makefiles, see if a path was specified # with -C/--directory for ((i = 1; i < ${#words[@]}; i++)); do - if [[ ${words[i]} == -@(C|-directory) ]]; then - # eval for tilde expansion - eval "makef_dir=( -C \"${words[i + 1]}\" )" + if [[ ${words[i]} == @(-${noargopts}C|--directory) ]]; then + # Expand tilde expansion + local REPLY + _comp_dequote "${words[i + 1]-}" && + [[ -d ${REPLY-} ]] && + makef_dir=(-C "$REPLY") break fi done @@ -137,25 +130,36 @@ _make() # before we scan for targets, see if a Makefile name was # specified with -f/--file/--makefile for ((i = 1; i < ${#words[@]}; i++)); do - if [[ ${words[i]} == -@(f|-?(make)file) ]]; then - # eval for tilde expansion - eval "makef=( -f \"${words[i + 1]}\" )" + if [[ ${words[i]} == @(-${noargopts}f|--?(make)file) ]]; then + # Expand tilde expansion + local REPLY + _comp_dequote "${words[i + 1]-}" && + [[ -f ${REPLY-} ]] && + makef=(-f "$REPLY") break fi done - # recognise that possible completions are only going to be displayed - # so only the base name is shown + # recognise that possible completions are only going to be displayed so + # only the base name is shown. + # + # Note: This is currently turned off because the test suite of + # bash-completion conflicts with it; it uses "set show-all-if-ambiguous + # on" (causing COMP_TYPE == 37) to retrieve the action completion + # results, and also the compact form with only the basenames is not + # essentially needed. To re-enable it, please uncomment the following + # if-statement. local mode=-- - if ((COMP_TYPE != 9)); then - mode=-d # display-only mode - fi + # if ((COMP_TYPE != 9 && COMP_TYPE != 37 && COMP_TYPE != 42)); then + # mode=-d # display-only mode + # fi - local IFS=$' \t\n' script=$(_make_target_extract_script $mode "$cur") - COMPREPLY=($(LC_ALL=C \ + _comp_split COMPREPLY "$(LC_ALL=C \ $1 -npq __BASH_MAKE_COMPLETION__=1 \ ${makef+"${makef[@]}"} "${makef_dir[@]}" .DEFAULT 2>/dev/null | - command sed -ne "$script")) + _comp_cmd_make__extract_targets "$mode" "$cur")" + + _comp_cmd_make__truncate_non_unique_paths if [[ $mode != -d ]]; then # Completion will occur if there is only one suggestion @@ -165,6 +169,6 @@ _make() fi } && - complete -F _make make gmake gnumake pmake colormake bmake + complete -F _comp_cmd_make make gmake gnumake pmake colormake bmake # ex: filetype=sh diff --git a/completions/makepkg b/completions/makepkg index 23ac784..f6bdc65 100644 --- a/completions/makepkg +++ b/completions/makepkg @@ -1,29 +1,27 @@ # makepkg completion -*- shell-script -*- # Slackware Linux variant -_makepkg_slackware() +_comp_cmd_makepkg__slackware() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case "$prev" in -l | --linkadd | -c | --chown) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + _comp_compgen -- -W 'y n' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W \ - '$($1 | command sed -e "s/^options://" | _parse_help -)' \ - -- "$cur")) + _comp_compgen_help - <<<"$("$1" | command sed -e "s/^options://")" return fi - _filedir + _comp_compgen_filedir } -_makepkg_bootstrap() +_comp_cmd_makepkg__bootstrap() { local fname help @@ -32,17 +30,17 @@ _makepkg_bootstrap() help=$("$1" --help 2>&1) case ${help,,} in *slackware*) - fname=_makepkg_slackware + fname=_comp_cmd_makepkg__slackware ;; *) - fname=_minimal + fname=_comp_complete_minimal ;; esac - unset -f _makepkg_bootstrap + unset -f "$FUNCNAME" complete -F $fname makepkg - $fname + $fname "$@" } && - complete -F _makepkg_bootstrap makepkg + complete -F _comp_cmd_makepkg__bootstrap makepkg # ex: filetype=sh 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 diff --git a/completions/mc b/completions/mc index cf38821..5ea2423 100644 --- a/completions/mc +++ b/completions/mc @@ -1,29 +1,31 @@ # bash completion for mc -*- shell-script -*- -_mc() +_comp_cmd_mc() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[evlPCD]*)' + # shellcheck disable=SC2254 case $prev in - --edit | --view | --ftplog | --printwd | -!(-*)[evlP]) - _filedir + --edit | --view | --ftplog | --printwd | -${noargopts}[evlP]) + _comp_compgen_filedir return ;; - --help | --help-* | --version | --colors | --debuglevel | -!(-*)[hVCD]) + --help | --help-* | --version | --colors | --debuglevel | -${noargopts}[hVCD]) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" --help-all)' -- "$cur")) + _comp_compgen_help -- --help-all [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - _filedir -d + _comp_compgen_filedir -d fi } && - complete -F _mc mc + complete -F _comp_cmd_mc mc # ex: filetype=sh diff --git a/completions/mcrypt b/completions/mcrypt index 0c3ab5e..3135244 100644 --- a/completions/mcrypt +++ b/completions/mcrypt @@ -1,67 +1,65 @@ # mcrypt(1) completion -*- shell-script -*- # by Ariel Fermani <the_end@bbs.frc.utn.edu.ar> -_mcrypt() +_comp_cmd_mcrypt() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -g | --openpgp-z) - COMPREPLY=($(compgen -W '{0..9}' -- "$cur")) + _comp_compgen -- -W '{0..9}' return ;; -o | --keymode) - COMPREPLY=($(compgen -W '$($1 --list-keymodes 2>/dev/null )' \ - -- "$cur")) + _comp_compgen_split -- "$("$1" --list-keymodes 2>/dev/null)" return ;; -m | --mode) - COMPREPLY=($(compgen -W "$($1 --list 2>/dev/null | cut -d: -f2-)" \ - -- "$cur")) + _comp_compgen_split -- "$("$1" --list 2>/dev/null | cut -d: -f2-)" return ;; -a | --algorithm) - COMPREPLY=($(compgen -W "$($1 --list 2>/dev/null | - awk '{print $1}')" -- "$cur")) + _comp_compgen_split -- "$("$1" --list 2>/dev/null | + _comp_awk '{print $1}')" return ;; -h | --hash) - COMPREPLY=($(compgen -W '$($1 --list-hash 2>/dev/null | \ - command sed -e 1d)' -- "$cur")) + _comp_compgen_split -- "$("$1" --list-hash 2>/dev/null | + command sed -e 1d)" return ;; -k | -s | --key | --keysize) return ;; -f | -c | --keyfile | --config) - _filedir + _comp_compgen_filedir return ;; --algorithms-directory | --modes-directory) - _filedir -d + _comp_compgen_filedir -d return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help elif [[ ${words[0]} == mdecrypt ]]; then - _filedir nc + _comp_compgen_filedir nc else - local i decrypt=0 - for ((i = 1; i < ${#words[@]} - 1; i++)); do + local i decrypt="" + for ((i = 1; i < cword; i++)); do if [[ ${words[i]} == -@(d|-decrypt) ]]; then - _filedir nc - decrypt=1 + _comp_compgen_filedir nc + decrypt=set break fi done - if ((decrypt == 0)); then - _filedir + if [[ ! $decrypt ]]; then + _comp_compgen_filedir fi fi } && - complete -F _mcrypt mcrypt mdecrypt + complete -F _comp_cmd_mcrypt mcrypt mdecrypt # ex: filetype=sh diff --git a/completions/mdadm b/completions/mdadm index 37effd9..e67558d 100644 --- a/completions/mdadm +++ b/completions/mdadm @@ -1,16 +1,18 @@ # bash completion for mdadm -*- shell-script -*- -_mdadm_raid_level() +_comp_cmd_mdadm__raid_level() { - local mode + local mode="" + local i noargopts='!(-*|*[CB]*)' for ((i = 1; i < cword; i++)); do + # shellcheck disable=SC2254 case ${words[i]} in - -!(-*)C* | --create) + -${noargopts}C* | --create) mode=create break ;; - -!(-*)B* | --build) + -${noargopts}B* | --build) mode=build break ;; @@ -19,20 +21,19 @@ _mdadm_raid_level() case $mode in create) - COMPREPLY=($(compgen -W 'linear raid0 0 stripe raid1 1 mirror - raid4 4 raid5 5 raid6 6 raid10 10 multipath mp faulty' \ - -- "$cur")) + _comp_compgen -- -W 'linear raid0 0 stripe raid1 1 mirror raid4 4 + raid5 5 raid6 6 raid10 10 multipath mp faulty' ;; build) - COMPREPLY=($(compgen -W 'linear stripe raid0 0 raid1 multipath mp - faulty' -- "$cur")) + _comp_compgen -- -W 'linear stripe raid0 0 raid1 multipath mp + faulty' ;; esac } -_mdadm_raid_layout() +_comp_cmd_mdadm__raid_layout() { - local level + local i level="" for ((i = 1; i < cword; i++)); do if [[ ${words[i]} == -@(l|-level) ]]; then level=${words[i + 1]} @@ -42,108 +43,107 @@ _mdadm_raid_layout() case $level in raid5) - COMPREPLY=($(compgen -W 'left-asymmetric left-symmetric - right-asymmetric right-symmetric la ra ls rs' -- "$cur")) + _comp_compgen -- -W 'left-asymmetric left-symmetric + right-asymmetric right-symmetric la ra ls rs' ;; raid10) - COMPREPLY=($(compgen -W 'n o p' -- "$cur")) + _comp_compgen -- -W 'n o p' ;; faulty) - COMPREPLY=($(compgen -W 'write-transient wt read-transient rt + _comp_compgen -- -W 'write-transient wt read-transient rt write-persistent wp read-persistent rp write-all read-fixable - rf clear flush none' -- "$cur")) + rf clear flush none' ;; esac } -_mdadm_auto_flag() +_comp_cmd_mdadm__auto_flag() { - COMPREPLY=($(compgen -W 'no yes md mdp part p' -- "$cur")) + _comp_compgen -- -W 'no yes md mdp part p' } -_mdadm_update_flag() +_comp_cmd_mdadm__update_flag() { - COMPREPLY=($(compgen -W 'sparc2.2 summaries uuid name homehost resync - byteorder super-minor' -- "$cur")) + _comp_compgen -- -W 'sparc2.2 summaries uuid name homehost resync byteorder + super-minor' } -_mdadm() +_comp_cmd_mdadm() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[cblpaU]*)' + # shellcheck disable=SC2254 case $prev in - --config | --bitmap | --backup-file | -!(-*)[cb]) - _filedir + --config | --bitmap | --backup-file | -${noargopts}[cb]) + _comp_compgen_filedir return ;; - --level | -!(-*)l) - _mdadm_raid_level + --level | -${noargopts}l) + _comp_cmd_mdadm__raid_level return ;; - --layout | --parity | -!(-*)p) - _mdadm_raid_layout + --layout | --parity | -${noargopts}p) + _comp_cmd_mdadm__raid_layout return ;; - --auto | -!(-*)a) - _mdadm_auto_flag + --auto | -${noargopts}a) + _comp_cmd_mdadm__auto_flag return ;; - --update | -!(-*)U) - _mdadm_update_flag + --update | -${noargopts}U) + _comp_cmd_mdadm__update_flag return ;; esac - $split && return + [[ $was_split ]] && return local options='--help --help-options --version --verbose --quiet --brief --force --config= --scan --metadata= --homehost=' if [[ $cur == -* ]]; then if ((cword == 1)); then - COMPREPLY=($(compgen -W "$options --assemble --build --create - --monitor --grow" -- "$cur")) + _comp_compgen -- -W "$options --assemble --build --create --monitor + --grow" else + # shellcheck disable=SC2254 case ${words[cword - 1]} in - --assemble | -!(-*)A*) - COMPREPLY=($(compgen -W "$options --uuid= --super-minor= + --assemble | -${noargopts}A*) + _comp_compgen -- -W "$options --uuid= --super-minor= --name= --force --run --no-degraded --auto= --bitmap= - --backup-file= --update= --auto-update-homehost" \ - -- "$cur")) + --backup-file= --update= --auto-update-homehost" ;; - --build | --create | --grow | -!(-*)[BCG]*) - COMPREPLY=($(compgen -W "$options --raid-devices= + --build | --create | --grow | -${noargopts}[BCG]*) + _comp_compgen -- -W "$options --raid-devices= --spare-devices= --size= --chunk= --rounding= --level= --layout= --parity= --bitmap= --bitmap-chunk= --write-mostly --write-behind= --assume-clean - --backup-file= --name= --run --force --auto=" \ - -- "$cur")) + --backup-file= --name= --run --force --auto=" ;; - --follow | --monitor | -!(-*)F) - COMPREPLY=($(compgen -W "$options --mail --program - --alert --syslog --delay --daemonise --pid-file - --oneshot --test" -- "$cur")) + --follow | --monitor | -${noargopts}F) + _comp_compgen -- -W "$options --mail --program --alert + --syslog --delay --daemonise --pid-file --oneshot + --test" ;; /dev/* | --add | --fail | --remove) - COMPREPLY=($(compgen -W "$options --add --re-add - --remove --fail --set-faulty" -- "$cur")) + _comp_compgen -- -W "$options --add --re-add --remove + --fail --set-faulty" ;; *) - COMPREPLY=($(compgen -W "$options --query --detail - --examine --sparc2.2 --examine-bitmap --run --stop - --readonly --readwrite --zero-superblock --test" \ - -- "$cur")) + _comp_compgen -- -W "$options --query --detail --examine + --sparc2.2 --examine-bitmap --run --stop --readonly + --readwrite --zero-superblock --test" ;; esac fi [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - cur=${cur:=/dev/} - _filedir + _comp_compgen -c "${cur:-/dev/}" filedir fi } && - complete -F _mdadm mdadm + complete -F _comp_cmd_mdadm mdadm # ex: filetype=sh diff --git a/completions/mdtool b/completions/mdtool index 428e33b..cd179e5 100644 --- a/completions/mdtool +++ b/completions/mdtool @@ -1,32 +1,30 @@ # mdtool completion -*- shell-script -*- -_mdtool() +_comp_cmd_mdtool() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - local command i - - for ((i = 1; i < ${#words[@]} - 1; i++)); do + local command="" i + for ((i = 1; i < cword; i++)); do if [[ ${words[i]} == @(build|generate-makefiles|setup) ]]; then command=${words[i]} break fi done - if [[ -v command ]]; then + if [[ $command ]]; then case $command in "build") - COMPREPLY=($(compgen -W '--f --buildfile --p --project' \ - -S":" -- "$cur")) + _comp_compgen -- -W '--f --buildfile --p --project' -S":" # TODO: This does not work :( #if [[ "$prev" == *: ]]; then # case $prev in # @(--p:|--project:)) - # COMPREPLY=( $(compgen -f -G "*.mdp" -- "$cur") ) + # _comp_compgen -- -f -G "*.mdp" # ;; # @(--f:|--buildfile:)) - # COMPREPLY=( $(compgen -f -G "*.mdp" -G "*.mds" -- "$cur") ) + # _comp_compgen -- -f -G "*.mdp" -G "*.mds" # ;; # esac #fi @@ -34,29 +32,27 @@ _mdtool() ;; "generate-makefiles") compopt -o filenames - COMPREPLY=($(compgen -o filenames -G"*.mds" -- "$cur")) + _comp_compgen -- -o filenames -G"*.mds" if [[ $prev == *mds ]]; then - COMPREPLY=($(compgen -W '--simple-makefiles --s --d:' \ - -- "$cur")) + _comp_compgen -- -W '--simple-makefiles --s --d:' fi return ;; "setup") # TODO: at least return filenames after these options. - COMPREPLY=($(compgen -W 'install i uninstall u check-install - ci update up list l list-av la list-update lu rep-add ra + _comp_compgen -- -W 'install i uninstall u check-install ci + update up list l list-av la list-update lu rep-add ra rep-remove rr rep-update ru rep-list rl reg-update - reg-build rgu info rep-build rb pack p help h dump-file' \ - -- "$cur")) + reg-build rgu info rep-build rb pack p help h dump-file' return ;; esac fi - COMPREPLY=($(compgen -W 'gsetup build dbgen project-export - generate-makefiles gettext-update setup -q' -- "$cur")) + _comp_compgen -- -W 'gsetup build dbgen project-export generate-makefiles + gettext-update setup -q' } && - complete -F _mdtool mdtool + complete -F _comp_cmd_mdtool mdtool # ex: filetype=sh diff --git a/completions/medusa b/completions/medusa index 4512987..347879a 100644 --- a/completions/medusa +++ b/completions/medusa @@ -1,30 +1,30 @@ # bash completion for medusa -*- shell-script -*- -_medusa() +_comp_cmd_medusa() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*h) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -*[HUPCO]) - _filedir + _comp_compgen_filedir return ;; -*M) - COMPREPLY=($(compgen -W "$($1 -d | awk '/^ +\+/ {print $2}' | - command sed -e 's/\.mod$//')")) + _comp_compgen_split -- "$("$1" -d | _comp_awk '/^ +\+/ {print $2}' | + command sed -e 's/\.mod$//')" return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help fi } && - complete -F _medusa medusa + complete -F _comp_cmd_medusa medusa # ex: filetype=sh diff --git a/completions/mii-diag b/completions/mii-diag index c433a7a..bf4938b 100644 --- a/completions/mii-diag +++ b/completions/mii-diag @@ -1,26 +1,26 @@ # mii-diag(8) completion -*- shell-script -*- -_mii_diag() +_comp_cmd_mii_diag() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -F | -A | --advertise | --fixed-speed) - COMPREPLY=($(compgen -W '100baseT4 100baseTx 100baseTx-FD - 100baseTx-HD 10baseT 10baseT-FD 10baseT-HD' -- "$cur")) + _comp_compgen -- -W '100baseT4 100baseTx 100baseTx-FD 100baseTx-HD + 10baseT 10baseT-FD 10baseT-HD' return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help else - _available_interfaces -a + _comp_compgen_available_interfaces -a fi } && - complete -F _mii_diag -o default mii-diag + complete -F _comp_cmd_mii_diag -o default mii-diag # ex: filetype=sh diff --git a/completions/mii-tool b/completions/mii-tool index 1b80202..b3e15ad 100644 --- a/completions/mii-tool +++ b/completions/mii-tool @@ -1,32 +1,34 @@ # mii-tool(8) completion -*- shell-script -*- -_mii_tool() +_comp_cmd_mii_tool() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[FA]*)' + # shellcheck disable=SC2254 case $prev in - --force | -!(-*)F) - COMPREPLY=($(compgen -W '100baseTx-FD 100baseTx-HD 10baseT-FD - 10baseT-HD' -- "$cur")) + --force | -${noargopts}F) + _comp_compgen -- -W '100baseTx-FD 100baseTx-HD 10baseT-FD + 10baseT-HD' return ;; - --advertise | -!(-*)A) - COMPREPLY=($(compgen -W '100baseT4 100baseTx-FD 100baseTx-HD - 10baseT-FD 10baseT-HD' -- "$cur")) + --advertise | -${noargopts}A) + _comp_compgen -- -W '100baseT4 100baseTx-FD 100baseTx-HD 10baseT-FD + 10baseT-HD' return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - _available_interfaces -a + _comp_compgen_available_interfaces -a fi } && - complete -F _mii_tool -o default mii-tool + complete -F _comp_cmd_mii_tool -o default mii-tool # ex: filetype=sh diff --git a/completions/minicom b/completions/minicom index 57510e9..752c22e 100644 --- a/completions/minicom +++ b/completions/minicom @@ -1,40 +1,40 @@ # bash completion for minicom -*- shell-script -*- -_minicom() +_comp_cmd_minicom() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[acSCp]*)' + # shellcheck disable=SC2254 case $prev in - --attrib | --color | -!(-*)[ac]) - COMPREPLY=($(compgen -W 'on off' -- "$cur")) + --attrib | --color | -${noargopts}[ac]) + _comp_compgen -- -W 'on off' return ;; - --script | --capturefile | -!(-*)[SC]) - _filedir + --script | --capturefile | -${noargopts}[SC]) + _comp_compgen_filedir return ;; - --ptty | -!(-*)p) - COMPREPLY=($(printf '%s\n' /dev/tty*)) - COMPREPLY=($(compgen -W '${COMPREPLY[@]} ${COMPREPLY[@]#/dev/}' \ - -- "$cur")) + --ptty | -${noargopts}p) + _comp_expand_glob COMPREPLY '/dev/tty*' && + _comp_compgen -- -W '"${COMPREPLY[@]}" "${COMPREPLY[@]#/dev/}"' return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - COMPREPLY=( - $(printf '%s\n' /etc/minirc.* /etc/minicom/minirc.* ~/.minirc.* | - command sed -e '/\*$/d' -e 's/^.*minirc\.//' | - command grep "^${cur}")) + local -a files + _comp_expand_glob files '{/etc/,/etc/minicom/,~/.}minirc.?*' && + _comp_compgen -- -W '"${files[@]##*minirc.}"' } && - complete -F _minicom -o default minicom + complete -F _comp_cmd_minicom -o default minicom # ex: filetype=sh diff --git a/completions/mkinitrd b/completions/mkinitrd index bcb7e07..4e11b0b 100644 --- a/completions/mkinitrd +++ b/completions/mkinitrd @@ -1,50 +1,49 @@ # bash completion for mkinitrd -*- shell-script -*- -_mkinitrd() +_comp_cmd_mkinitrd() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in --preload | --with | --builtin) - _modules + _comp_compgen_kernel_modules return ;; --fstab | --dsdt) - _filedir + _comp_compgen_filedir return ;; --net-dev) - _available_interfaces + _comp_compgen_available_interfaces return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--version --help -v -f --preload \ - --force-scsi-probe --omit-scsi-modules \ - --omit-ide-modules --image-version --force-raid-probe \ - --omit-raid-modules --with= --force-lvm-probe \ - --omit-lvm-modules --builtin --omit-dmraid --net-dev \ - --fstab --nocompress --dsdt --bootchart' -- "$cur")) + _comp_compgen -- -W '--version --help -v -f --preload + --force-scsi-probe --omit-scsi-modules --omit-ide-modules + --image-version --force-raid-probe --omit-raid-modules --with= + --force-lvm-probe --omit-lvm-modules --builtin --omit-dmraid + --net-dev --fstab --nocompress --dsdt --bootchart' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - local args - _count_args + local REPLY + _comp_count_args - case $args in + case $REPLY in 1) - _filedir + _comp_compgen_filedir ;; 2) - _kernel_versions + _comp_compgen_kernel_versions ;; esac fi } && - complete -F _mkinitrd mkinitrd + complete -F _comp_cmd_mkinitrd mkinitrd # ex: filetype=sh diff --git a/completions/mktemp b/completions/mktemp index e063810..a13542a 100644 --- a/completions/mktemp +++ b/completions/mktemp @@ -1,29 +1,30 @@ # mktemp(1) completion -*- shell-script -*- -_mktemp() +_comp_cmd_mktemp() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[p]*)' + # shellcheck disable=SC2254 case "$prev" in --help | --version | --suffix) return ;; - --tmpdir | -!(-*)p) - _filedir -d + --tmpdir | -${noargopts}p) + _comp_compgen_filedir -d return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - local opts=$(_parse_help "$1") - [[ $opts ]] || opts="-d -u -q -p -t" # non-GNU fallback - COMPREPLY=($(compgen -W "$opts" -- "$cur")) + _comp_compgen_help || + _comp_compgen -- -W '-d -u -q -p -t' # non-GNU fallback [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _mktemp mktemp + complete -F _comp_cmd_mktemp mktemp # ex: filetype=sh diff --git a/completions/mmsitepass b/completions/mmsitepass index 49daae6..dcf38c7 100644 --- a/completions/mmsitepass +++ b/completions/mmsitepass @@ -1,15 +1,15 @@ # mailman mmsitepass completion -*- shell-script -*- -_mmsitepass() +_comp_cmd_mmsitepass() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--listcreator --help' -- "$cur")) + _comp_compgen -- -W '--listcreator --help' fi } && - complete -F _mmsitepass mmsitepass + complete -F _comp_cmd_mmsitepass mmsitepass # ex: filetype=sh diff --git a/completions/modinfo b/completions/modinfo index 009bcf3..5c8d416 100644 --- a/completions/modinfo +++ b/completions/modinfo @@ -1,35 +1,41 @@ # Linux modinfo(8) completion -*- shell-script -*- -_modinfo() +_comp_cmd_modinfo() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[Fkb]*)' + # shellcheck disable=SC2254 case "$prev" in - --field | -!(-*)F) - COMPREPLY=($(compgen -W 'alias author depends description - filename firmware license parm srcversion staging vermagic - version' -- "${cur,,}")) + --field | -${noargopts}F) + _comp_compgen -c "${cur,,}" -- -W 'alias author depends description + filename firmware intree license name parm release_date + retpoline sig_hashalgo sig_key signat signer softdep srcversion + staging vermagic version' return ;; - --set-version | -!(-*)k) - _kernel_versions + --set-version | -${noargopts}k) + _comp_compgen_kernel_versions + return + ;; + --basedir | -${noargopts}b) + _comp_compgen_filedir -d return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - local opts=$(_parse_help "$1") - COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi local i version=$(uname -r) for ((i = ${#words[@]} - 1; i > 0; i--)); do - if [[ ${words[i]} == -@(!(-*)k*|-set-version) ]]; then + if [[ ${words[i]} == -@(${noargopts}k*|-set-version) ]]; then version=${words[i + 1]} break fi @@ -37,11 +43,11 @@ _modinfo() # do filename completion if we're giving a path to a module if [[ $cur == @(*/|[.~])* ]]; then - _filedir '@(?(k)o?(.[gx]z))' + _comp_compgen_filedir '@(?(k)o?(.[gx]z|.zst))' else - _modules $version + _comp_compgen_kernel_modules "$version" fi } && - complete -F _modinfo modinfo + complete -F _comp_cmd_modinfo modinfo # ex: filetype=sh diff --git a/completions/modprobe b/completions/modprobe index 36cb588..242a282 100644 --- a/completions/modprobe +++ b/completions/modprobe @@ -1,40 +1,42 @@ # Linux modprobe(8) completion -*- shell-script -*- -_modprobe() +_comp_cmd_modprobe() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[CdtS]*)' + # shellcheck disable=SC2254 case "$prev" in - --help | --version | -!(-*)[hV]) + --help | --version | -${noargopts}[hV]) return ;; - --config | -!(-*)C) - _filedir + --config | -${noargopts}C) + _comp_compgen_filedir return ;; - --dirname | --type | -!(-*)[dt]) - _filedir -d + --dirname | --type | -${noargopts}[dt]) + _comp_compgen_filedir -d return ;; - --set-version | -!(-*)S) - _kernel_versions + --set-version | -${noargopts}S) + _comp_compgen_kernel_versions return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help if [[ ! ${COMPREPLY-} ]]; then - COMPREPLY=($(compgen -W '-a --all -b --use-blacklist -C --config + _comp_compgen -- -W '-a --all -b --use-blacklist -C --config -c --showconfig --dump-modversions -d --dirname --first-time --force-vermagic --force-modversion -f --force -i --ignore-install --ignore-remove -l --list -n --dry-run -q --quiet -R --resolve-alias -r --remove -S --set-version --show-depends -s --syslog -t --type -V --version -v - --verbose' -- "$cur")) + --verbose' fi [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return @@ -42,46 +44,47 @@ _modprobe() local i mode=insert module="" version=$(uname -r) for ((i = 1; i < cword; i++)); do + # shellcheck disable=SC2254 case "${words[i]}" in - --remove | -!(-*)r*) + --remove | -${noargopts}r*) mode=remove ;; - --list | -!(-*)l*) + --list | -${noargopts}l*) mode=list ;; --dump-modversions) mode="file" ;; - --set-version | -!(-*)S) + --set-version | -${noargopts}S) version=${words[i + 1]} # -S is not $prev and not $cur ;; - --config | --dirname | --type | -!(-*)[Cdt]) + --config | --dirname | --type | -${noargopts}[Cdt]) ((i++)) # skip option and its argument ;; -*) # skip all other options ;; *) - [[ -z $module ]] && module=${words[i]} + [[ ! $module ]] && module=${words[i]} ;; esac done case $mode in remove) - _installed_modules "$cur" + _comp_compgen_inserted_kernel_modules ;; list) # no completion available ;; file) - _filedir + _comp_compgen_filedir ;; insert) # do filename completion if we're giving a path to a module if [[ $cur == @(*/|[.~])* ]]; then - _filedir '@(?(k)o?(.[gx]z))' - elif [[ -n $module ]]; then + _comp_compgen_filedir '@(?(k)o?(.[gx]z|.zst))' + elif [[ $module ]]; then # do module parameter completion if [[ $cur == *=* ]]; then prev=${cur%%=*} @@ -90,24 +93,24 @@ _modprobe() command grep -q "^$prev:.*(bool)"; then local choices="on off" [[ $cur ]] && choices="1 0 y Y n N on off" - COMPREPLY=($(compgen -W "$choices" -- "$cur")) + _comp_compgen -- -W "$choices" fi else - COMPREPLY=($(compgen -S = -W "$(PATH="$PATH:/sbin" \ + _comp_compgen_split -S = -- "$(PATH="$PATH:/sbin" \ modinfo -p "$module" 2>/dev/null | - awk -F: '!/^[ \t]/ { print $1 }')" -- "$cur")) + _comp_awk -F : '!/^[ \t]/ { print $1 }')" [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi else - _modules $version + _comp_compgen_kernel_modules "$version" if [[ ${COMPREPLY-} ]]; then # filter out already installed modules local -a mods=("${COMPREPLY[@]}") - _installed_modules "$cur" + _comp_compgen_inserted_kernel_modules for i in "${!mods[@]}"; do for module in "${COMPREPLY[@]}"; do if [[ ${mods[i]} == "$module" ]]; then - unset 'mods[i]' + unset -v 'mods[i]' break fi done @@ -118,6 +121,6 @@ _modprobe() ;; esac } && - complete -F _modprobe modprobe + complete -F _comp_cmd_modprobe modprobe # ex: filetype=sh diff --git a/completions/monodevelop b/completions/monodevelop index 1c5b5ba..6e60bfe 100644 --- a/completions/monodevelop +++ b/completions/monodevelop @@ -1,19 +1,19 @@ # monodevelop completion -*- shell-script -*- -_monodevelop() +_comp_cmd_monodevelop() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + _comp_compgen_help -- -h [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - _filedir + _comp_compgen_filedir fi } && - complete -F _monodevelop monodevelop + complete -F _comp_cmd_monodevelop monodevelop # ex: filetype=sh diff --git a/completions/mplayer b/completions/mplayer index d71ebb8..7ab096a 100644 --- a/completions/mplayer +++ b/completions/mplayer @@ -1,120 +1,120 @@ # mplayer(1) completion -*- shell-script -*- -_mplayer_options_list() +_comp_cmd_mplayer__options() { cur=${cur%\\} - COMPREPLY=($(compgen -W "$($1 -noconfig all $2 help 2>/dev/null | - command sed -e '/^Available/,/^$/!d' -e '/^Available/d' | awk '{print $1}' | - command sed -e 's/:$//' -e 's/^'${2#-}'$//' -e 's/<.*//')" -- "$cur")) + _comp_compgen_split -- "$("$1" -noconfig all "$2" help 2>/dev/null | + command sed -e '/^Available/,/^$/!d' -e '/^Available/d' | _comp_awk '{print $1}' | + command sed -e 's/:$//' -e 's/^'"${2#-}"'$//' -e 's/<.*//')" } -_mplayer() +_comp_cmd_mplayer() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return local cmd=${words[0]} i j k=0 case $prev in -[av][cfo] | -[av]fm | -vop | -fstype | -demuxer | -o[av]c | -of | -profile | \ -audio-demuxer | -sub-demuxer) - _mplayer_options_list $cmd $prev + _comp_cmd_mplayer__options "$cmd" "$prev" return ;; -show-profile) - _mplayer_options_list $cmd -profile + _comp_cmd_mplayer__options "$cmd" -profile return ;; -audiofile | -audio-file) - _filedir '@(mp3|mpg|og[ag]|w?(a)v|mid|flac|mka|ac3|ape)' + _comp_compgen_filedir '@(mp3|mpg|og[ag]|w?(a)v|mid|flac|mka|ac3|ape)' return ;; -font | -subfont) if [[ $prev == -font ]]; then - _filedir '@(desc|ttf)' + _comp_compgen_filedir '@(desc|ttf)' else - _filedir ttf + _comp_compgen_filedir ttf fi - local IFS=$'\n' - COMPREPLY+=($(compgen -W '$(fc-list 2>/dev/null)' -- "$cur")) + _comp_compgen -a split -l -- "$(fc-list 2>/dev/null)" return ;; -sub | -sub-file) - _filedir '@(srt|sub|txt|utf|rar|mpsub|smi|js|ssa|ass)' + _comp_compgen_filedir '@(srt|sub|txt|utf|rar|mpsub|smi|js|ssa|ass)' return ;; -vobsub) - _filedir '@(idx|ifo|sub)' - local IFS=$'\n' - COMPREPLY=($(for i in "${COMPREPLY[@]}"; do - if [[ -f $i && -r $i ]]; then - printf '%s\n' ${i%.*} - else - printf '%s\n' $i - fi - done)) + if _comp_compgen_filedir '@(idx|ifo|sub)'; then + for i in "${!COMPREPLY[@]}"; do + if [[ -f ${COMPREPLY[i]} && -r ${COMPREPLY[i]} ]]; then + COMPREPLY[i]=${COMPREPLY[i]%.*} + fi + done + fi return ;; -subcp | -msgcharset) local cp - cp=($(iconv --list 2>/dev/null | command sed -e "s@//@@;" 2>/dev/null)) - if [[ $cur == "${cur,,}" ]]; then - COMPREPLY=($(compgen -W '${cp[@],,}' -- "$cur")) - else - COMPREPLY=($(compgen -W '${cp[@]^^}' -- "$cur")) + if _comp_split cp "$(iconv --list 2>/dev/null | command sed -e "s@//@@;" 2>/dev/null)"; then + if [[ $cur == "${cur,,}" ]]; then + _comp_compgen -- -W '"${cp[@],,}"' + else + _comp_compgen -- -W '"${cp[@]^^}"' + fi fi return ;; -ifo) - _filedir ifo + _comp_compgen_filedir ifo return ;; -cuefile) - _filedir '@(bin|cue)' + _comp_compgen_filedir '@(bin|cue)' return ;; -skin) # if you don't have installed mplayer in /usr you # may want to set the MPLAYER_SKINS_DIR global variable local -a dirs - if [[ -n $MPLAYER_SKINS_DIR ]]; then - dirs=($MPLAYER_SKINS_DIR) + if [[ $MPLAYER_SKINS_DIR ]]; then + _comp_split dirs "$MPLAYER_SKINS_DIR" else dirs=(/usr/share/mplayer/skins /usr/local/share/mplayer/skins) fi - local IFS=$'\n' - for i in ~/.mplayer/skins "${dirs[@]}"; do - if [[ -d $i && -r $i ]]; then - for j in $(compgen -d -- $i/$cur); do - COMPREPLY[k++]=${j#$i/} - done - fi - done + if ((${#dirs[@]})); then + local -a subdirs + for i in ~/.mplayer/skins "${dirs[@]}"; do + if [[ -d $i && -r $i ]]; then + _comp_compgen -v subdirs -c "$i/$cur" -- -d + for j in "${subdirs[@]}"; do + COMPREPLY[k++]=${j#"$i/"} + done + fi + done + fi return ;; -cdrom-device) - _cd_devices - _dvd_devices + _comp_compgen_cd_devices + _comp_compgen -a dvd_devices return ;; -dvd-device) - _dvd_devices - _filedir iso + _comp_compgen_dvd_devices + _comp_compgen -a filedir iso return ;; -bluray-device) - _filedir -d + _comp_compgen_filedir -d return ;; -mixer | -dvdauth | -fb | -zrdev) - cur=${cur:=/dev/} - _filedir + _comp_compgen -c "${cur:-/dev/}" filedir return ;; -edl | -edlout | -lircconf | -menu-cfg | -playlist | -csslib | -dumpfile | \ -subfile | -aofile | -fbmodeconfig | -include | -o | -dvdkey | -passlogfile) - _filedir + _comp_compgen_filedir return ;; -autoq | -autosync | -loop | -menu-root | -speed | -sstep | -aid | -alang | \ @@ -136,124 +136,119 @@ _mplayer() return ;; -channels) - COMPREPLY=($(compgen -W '2 4 6 8' -- "$cur")) + _comp_compgen -- -W '2 4 6 8' return ;; -aspect | -monitoraspect) - COMPREPLY=($(compgen -W '1:1 3:2 4:3 5:4 14:9 14:10 16:9 16:10 - 2.35:1' -- "$cur")) - __ltrim_colon_completions "$cur" + _comp_compgen -- -W '1:1 3:2 4:3 5:4 14:9 14:10 16:9 16:10 2.35:1' + _comp_ltrim_colon_completions "$cur" return ;; -lavdopts) - COMPREPLY=($(compgen -W 'bitexact bug= debug= ec= er= fast gray - idct= lowres= sb= st= skiploopfilter= skipidct= skipframe= - threads= vismv= vstats' -- "$cur")) + _comp_compgen -- -W 'bitexact bug= debug= ec= er= fast gray idct= + lowres= sb= st= skiploopfilter= skipidct= skipframe= threads= + vismv= vstats' return ;; -lavcopts) - COMPREPLY=($(compgen -W 'vcodec= vqmin= vqscale= vqmax= mbqmin= - mbqmax= vqdiff= vmax_b_frames= vme= vhq v4mv keyint= - vb_strategy= vpass= aspect= vbitrate= vratetol= vrc_maxrate= - vrc_minrate= vrc_buf_size= vb_qfactor= vi_qfactor= vb_qoffset= - vi_qoffset= vqblur= vqcomp= vrc_eq= vrc_override= - vrc_init_cplx= vqsquish= vlelim= vcelim= vstrict= vdpart - vpsize= gray vfdct= idct= lumi_mask= dark_mask= tcplx_mask= - scplx_mask= naq ildct format= pred qpel precmp= cmp= subcmp= - predia= dia= trell last_pred= preme= subq= psnr mpeg_quant aic - umv' -- "$cur")) + _comp_compgen -- -W 'vcodec= vqmin= vqscale= vqmax= mbqmin= mbqmax= + vqdiff= vmax_b_frames= vme= vhq v4mv keyint= vb_strategy= + vpass= aspect= vbitrate= vratetol= vrc_maxrate= vrc_minrate= + vrc_buf_size= vb_qfactor= vi_qfactor= vb_qoffset= vi_qoffset= + vqblur= vqcomp= vrc_eq= vrc_override= vrc_init_cplx= vqsquish= + vlelim= vcelim= vstrict= vdpart vpsize= gray vfdct= idct= + lumi_mask= dark_mask= tcplx_mask= scplx_mask= naq ildct format= + pred qpel precmp= cmp= subcmp= predia= dia= trell last_pred= + preme= subq= psnr mpeg_quant aic umv' return ;; -ssf) - COMPREPLY=($(compgen -W 'lgb= cgb= ls= cs= chs= cvs=' -- "$cur")) + _comp_compgen -- -W 'lgb= cgb= ls= cs= chs= cvs=' return ;; -jpeg) - COMPREPLY=($(compgen -W 'noprogressive progressive nobaseline - baseline optimize= smooth= quality= outdir=' -- "$cur")) + _comp_compgen -- -W 'noprogressive progressive nobaseline baseline + optimize= smooth= quality= outdir=' return ;; -xvidopts) - COMPREPLY=($(compgen -W 'dr2 nodr2' -- "$cur")) + _comp_compgen -- -W 'dr2 nodr2' return ;; -xvidencopts) - COMPREPLY=($(compgen -W 'pass= bitrate= fixed_quant= me_quality= - 4mv rc_reaction_delay_factor= rc_averaging_period= rc_buffer= + _comp_compgen -- -W 'pass= bitrate= fixed_quant= me_quality= 4mv + rc_reaction_delay_factor= rc_averaging_period= rc_buffer= quant_range= min_key_interval= max_key_interval= mpeg_quant mod_quant lumi_mask hintedme hintfile debug keyframe_boost= - kfthreshold= kfreduction=' -- "$cur")) + kfthreshold= kfreduction=' return ;; -divx4opts) - COMPREPLY=($(compgen -W 'br= key= deinterlace q= min_quant= - max_quant= rc_period= rc_reaction_period= crispness= - rc_reaction_ratio= pass= vbrpass= help' -- "$cur")) + _comp_compgen -- -W 'br= key= deinterlace q= min_quant= max_quant= + rc_period= rc_reaction_period= crispness= rc_reaction_ratio= + pass= vbrpass= help' return ;; -info) - COMPREPLY=($(compgen -W 'name= artist= genre= subject= - copyright= srcform= comment= help' -- "$cur")) + _comp_compgen -- -W 'name= artist= genre= subject= copyright= + srcform= comment= help' return ;; -lameopts) - COMPREPLY=($(compgen -W 'vbr= abr cbr br= q= aq= ratio= vol= - mode= padding= fast preset= help' -- "$cur")) + _comp_compgen -- -W 'vbr= abr cbr br= q= aq= ratio= vol= mode= + padding= fast preset= help' return ;; -rawaudio) - COMPREPLY=($(compgen -W 'on channels= rate= samplesize= format=' \ - -- "$cur")) + _comp_compgen -- -W 'on channels= rate= samplesize= format=' return ;; -rawvideo) - COMPREPLY=($(compgen -W 'on fps= sqcif qcif cif 4cif pal ntsc w= - h= y420 yv12 yuy2 y8 format= size=' -- "$cur")) + _comp_compgen -- -W 'on fps= sqcif qcif cif 4cif pal ntsc w= h= + y420 yv12 yuy2 y8 format= size=' return ;; -aop) - COMPREPLY=($(compgen -W 'list= delay= format= fout= volume= mul= - softclip' -- "$cur")) + _comp_compgen -- -W 'list= delay= format= fout= volume= mul= + softclip' return ;; -dxr2) - COMPREPLY=($(compgen -W 'ar-mode= iec958-encoded iec958-decoded - mute ucode= 75ire bw color interlaced macrovision= norm= + _comp_compgen -- -W 'ar-mode= iec958-encoded iec958-decoded mute + ucode= 75ire bw color interlaced macrovision= norm= square-pixel ccir601-pixel cr-left= cr-right= cr-top= cr-bot= ck-rmin= ck-gmin= ck-bmin= ck-rmax= ck-gmax= ck-bmax= ck-r= ck-g= ck-b= ignore-cache= ol-osd= olh-cor= olw-cor= olx-cor= - oly-cor= overlay overlay-ratio= update-cache' -- "$cur")) + oly-cor= overlay overlay-ratio= update-cache' return ;; -tv) - COMPREPLY=($(compgen -W 'on noaudio driver= device= input= freq= + _comp_compgen -- -W 'on noaudio driver= device= input= freq= outfmt= width= height= buffersize= norm= channel= chanlist= audiorate= forceaudio alsa amode= forcechan= adevice= audioid= - volume= bass= treble= balance= fps= channels= immediatemode=' \ - -- "$cur")) + volume= bass= treble= balance= fps= channels= immediatemode=' return ;; -mf) - COMPREPLY=($(compgen -W 'on w= h= fps= type=' -- "$cur")) + _comp_compgen -- -W 'on w= h= fps= type=' return ;; -cdda) - COMPREPLY=($(compgen -W 'speed= paranoia= generic-dev= - sector-size= overlap= toc-bias toc-offset= skip noskip' \ - -- "$cur")) + _comp_compgen -- -W 'speed= paranoia= generic-dev= sector-size= + overlap= toc-bias toc-offset= skip noskip' return ;; -input) - COMPREPLY=($(compgen -W 'conf= ar-delay ar-rate keylist cmdlist - js-dev file' -- "$cur")) + _comp_compgen -- -W 'conf= ar-delay ar-rate keylist cmdlist js-dev + file' return ;; -af-adv) - COMPREPLY=($(compgen -W 'force= list=' -- "$cur")) + _comp_compgen -- -W 'force= list=' return ;; -noconfig) - COMPREPLY=($(compgen -W 'all gui system user' -- "$cur")) + _comp_compgen -- -W 'all gui system user' return ;; -*) @@ -271,17 +266,17 @@ _mplayer() case $cur in -*) - COMPREPLY=($(compgen -W '$($cmd -noconfig all -list-options 2>/dev/null | \ + _comp_compgen_split -- "$("$cmd" -noconfig all -list-options 2>/dev/null | command sed -ne "1,/^[[:space:]]*Name/d" \ -e "s/^[[:space:]]*/-/" -e "s/[[:space:]:].*//" \ - -e "/^-\(Total\|.*\*\)\{0,1\}$/!p")' -- "$cur")) + -e "/^-\(Total\|.*\*\)\{0,1\}$/!p")" ;; *) - _filedir '@(m?(j)p?(e)g|M?(J)P?(E)G|wm[av]|WM[AV]|avi|AVI|asf|ASF|vob|VOB|bin|BIN|dat|DAT|vcd|VCD|ps|PS|pes|PES|fl[iv]|FL[IV]|fxm|FXM|viv|VIV|rm?(j)|RM?(J)|ra?(m)|RA?(M)|yuv|YUV|mov|MOV|qt|QT|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|og[gmavx]|OG[GMAVX]|w?(a)v|W?(A)V|dump|DUMP|mk[av]|MK[AV]|aac|AAC|m2v|M2V|dv|DV|rmvb|RMVB|mid|MID|t[ps]|T[PS]|3g[p2]|3gpp?(2)|mpc|MPC|flac|FLAC|vro|VRO|divx|DIVX|aif?(f)|AIF?(F)|m2t?(s)|M2T?(S)|mts|MTS|vdr|VDR|xvid|XVID|ape|APE|gif|GIF|nut|NUT|bik|BIK|web[am]|WEB[AM]|amr|AMR|awb|AWB|iso|ISO|opus|OPUS|m[eo]d|M[EO]D|xm|XM|it|IT|s[t3]m|S[T3]M|mtm|MTM|w64|W64)?(.@(crdownload|part))' + _comp_compgen_filedir '@(m?(j)p?(e)g|M?(J)P?(E)G|wm[av]|WM[AV]|avi|AVI|asf|ASF|vob|VOB|bin|BIN|dat|DAT|vcd|VCD|ps|PS|pes|PES|fl[iv]|FL[IV]|fxm|FXM|viv|VIV|rm?(j)|RM?(J)|ra?(m)|RA?(M)|yuv|YUV|mov|MOV|qt|QT|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|og[gmavx]|OG[GMAVX]|w?(a)v|W?(A)V|dump|DUMP|mk[av]|MK[AV]|aac|AAC|m2v|M2V|dv|DV|rmvb|RMVB|mid|MID|t[ps]|T[PS]|3g[p2]|3gpp?(2)|mpc|MPC|flac|FLAC|vro|VRO|divx|DIVX|aif?(f)|AIF?(F)|m2t?(s)|M2T?(S)|mts|MTS|vdr|VDR|xvid|XVID|ape|APE|gif|GIF|nut|NUT|bik|BIK|web[am]|WEB[AM]|amr|AMR|awb|AWB|iso|ISO|opus|OPUS|m[eo]d|M[EO]D|xm|XM|it|IT|s[t3]m|S[T3]M|mtm|MTM|w64|W64)?(.@(crdownload|part))' ;; esac } && - complete -F _mplayer mplayer mplayer2 mencoder gmplayer kplayer + complete -F _comp_cmd_mplayer mplayer mplayer2 mencoder gmplayer kplayer # ex: filetype=sh diff --git a/completions/mr b/completions/mr index 930e3c9..660dfd8 100644 --- a/completions/mr +++ b/completions/mr @@ -1,59 +1,66 @@ # mr completion -*- shell-script -*- -_mr() +_comp_cmd_mr() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local help commands options help="$(PERLDOC_PAGER=cat PERLDOC=-otext "${1}" help 2>/dev/null)" commands="$( + # shellcheck disable=SC2030 printf %s "$help" | while read -r _ options cmd _; do [[ $options != "[options]" ]] || printf "%s\n" "$cmd" done )" # Split [online|offline] and remove `action` placeholder. - commands="${commands//@(action|[\[\|\]])/$'\n'}" + commands="${commands//@(action|[\[\|\]])/ }" # Add standard aliases. commands="${commands} ci co ls" + _comp_split commands "$commands" + local IFS='|' + local glob_commands="@(${commands[*]})" + _comp_unlocal IFS # Determine if user has entered an `mr` command. Used to block top-level # (option and command) completions. - local cmd i - for ((i = 1; i < ${#words[@]} - 1; i++)); do - if [[ $commands == *"${words[i]}"* ]]; then + local cmd has_cmd="" i + for ((i = 1; i < cword; i++)); do + # shellcheck disable=SC2053 + if [[ ${words[i]} == $glob_commands ]]; then cmd="${words[i]}" + has_cmd=set break fi done # Complete options for specific commands. - if [[ -v cmd ]]; then + if [[ $has_cmd ]]; then case $cmd in bootstrap) - _filedir + _comp_compgen_filedir # Also complete stdin (-) as a potential bootstrap source. - if [[ -z ${cur} || $cur == - ]] && [[ $prev != - ]]; then + if [[ ! ${cur} || $cur == - ]] && [[ $prev != - ]]; then COMPREPLY+=(-) fi return ;; clean) if [[ ${cur} == -* ]]; then - COMPREPLY=($(compgen -W '-f' -- "${cur}")) + _comp_compgen -- -W '-f' fi return ;; commit | ci | record) if [[ ${cur} == -* ]]; then - COMPREPLY=($(compgen -W '-m' -- "${cur}")) + _comp_compgen -- -W '-m' fi return ;; run) - COMPREPLY=($(compgen -c -- "${cur}")) + _comp_compgen_commands return ;; *) @@ -64,28 +71,28 @@ _mr() fi # Complete top-level options and commands. + local noargopts='!(-*|*[cd]*)' + # shellcheck disable=SC2254 case $prev in - --config | -!(-*)c) - _filedir + --config | -${noargopts}c) + _comp_compgen_filedir return ;; - --directory | -!(-*)d) - _filedir -d + --directory | -${noargopts}d) + _comp_compgen_filedir -d return ;; esac if [[ $cur == -* ]]; then - options="$(printf '%s\n' "$help" | _parse_help -)" - # Remove short options (all have compatible long options). - options="${options//-[a-z]$'\n'/}" - # Remove deprecated options. - options="${options//--path/}" - COMPREPLY=($(compgen -W "${options}" -- "${cur}")) + _comp_compgen -Rv options help - <<<"$help" + # -X '-[a-z]': Remove short options (all have compatible long options). + # -X '--path': Remove deprecated options. + _comp_compgen -- -W '"${options[@]}"' -X '@(-[a-z]|--path)' else - COMPREPLY=($(compgen -W "${commands}" -- "${cur}")) + _comp_compgen -- -W '"${commands[@]}"' fi } && - complete -F _mr mr + complete -F _comp_cmd_mr mr # ex: filetype=sh diff --git a/completions/msynctool b/completions/msynctool index 4de37f5..0348170 100644 --- a/completions/msynctool +++ b/completions/msynctool @@ -1,42 +1,38 @@ # bash completion for msynctool -*- shell-script -*- -_msynctool() +_comp_cmd_msynctool() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $words in --configure) - COMPREPLY=($(compgen -W "$($1 --showgroup \ - $prev | awk '/^Member/ {print $2}' | command sed \ - -e 's/:$//')" -- "$cur")) + _comp_compgen_split -- "$("$1" --showgroup "$prev" | + _comp_awk '/^Member/ {print $2}' | command sed -e 's/:$//')" return ;; --addmember) - COMPREPLY=($(compgen -W '$($1 --listplugins \ - | command sed -e 1d)' -- "$cur")) + _comp_compgen_split -- "$("$1" --listplugins | command sed -e 1d)" return ;; esac case $prev in --configure | --addgroup | --delgroup | --showgroup | --sync | --addmember) - COMPREPLY=($(compgen -W '$($1 --listgroups \ - | command sed -e 1d)' -- "$cur")) + _comp_compgen_split -- "$("$1" --listgroups | command sed -e 1d)" return ;; --showformats | --filter-objtype | --slow-sync) - COMPREPLY=($(compgen -W '$($1 --listobjects \ - | command sed -e 1d)' -- "$cur")) + _comp_compgen_split -- "$("$1" --listobjects | command sed -e 1d)" return ;; esac - COMPREPLY=($(compgen -W '--listgroups --listplugins --listobjects - --showformats --showgroup --sync --filter-objtype --slow-sync --wait - --multi --addgroup --delgroup --addmember --configure --manual - --configdir --conflict' -- "$cur")) + _comp_compgen -- -W '--listgroups --listplugins --listobjects --showformats + --showgroup --sync --filter-objtype --slow-sync --wait --multi + --addgroup --delgroup --addmember --configure --manual --configdir + --conflict' } && - complete -F _msynctool msynctool + complete -F _comp_cmd_msynctool msynctool # ex: filetype=sh diff --git a/completions/mtx b/completions/mtx index b5c270b..d04a0c1 100644 --- a/completions/mtx +++ b/completions/mtx @@ -1,10 +1,10 @@ # mtx completion -*- shell-script -*- # by Jon Middleton <jjm@ixtab.org.uk> -_mtx() +_comp_cmd_mtx() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local options tapes drives @@ -12,21 +12,21 @@ _mtx() inventory status load unload eepos first last next" tapes=$(mtx status 2>/dev/null | - awk '/Storage Element [0-9]+:Full/ { printf "%s ", $3 }') + _comp_awk '/Storage Element [0-9]+:Full/ { printf "%s ", $3 }') tapes=${tapes//:Full/} drives=$(mtx status 2>/dev/null | - awk '/Data Transfer Element [0-9]+:(Full|Empty)/ { printf "%s ", $4 }') + _comp_awk '/Data Transfer Element [0-9]+:(Full|Empty)/ { printf "%s ", $4 }') drives=${drives//:Full/} drives=${drives//:Empty/} if ((cword > 1)); then case $prev in load) - COMPREPLY=($(compgen -W "$tapes" -- "$cur")) + _comp_compgen -- -W "$tapes" ;; unload | first | last | next) - COMPREPLY=($(compgen -W "$drives" -- "$cur")) + _comp_compgen -- -W "$drives" ;; -f) true @@ -36,9 +36,9 @@ _mtx() ;; esac else - COMPREPLY=($(compgen -W "$options" -- "$cur")) + _comp_compgen -- -W "$options" fi } && - complete -F _mtx mtx + complete -F _comp_cmd_mtx mtx # ex: filetype=sh diff --git a/completions/munin-node-configure b/completions/munin-node-configure index 39d8d64..edfb4b9 100644 --- a/completions/munin-node-configure +++ b/completions/munin-node-configure @@ -1,33 +1,33 @@ # munin-node-configure completion -*- shell-script -*- -_munin_node_configure() +_comp_cmd_munin_node_configure() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --config) - _filedir + _comp_compgen_filedir return ;; --servicedir | --libdir) - _filedir -d + _comp_compgen_filedir -d return ;; --snmp) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; --snmpversion) - COMPREPLY=($(compgen -W '1 2c 3' -- "$cur")) + _comp_compgen -- -W '1 2c 3' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help fi } && - complete -F _munin_node_configure munin-node-configure + complete -F _comp_cmd_munin_node_configure munin-node-configure # ex: filetype=sh diff --git a/completions/munin-run b/completions/munin-run index 97e526a..c514a01 100644 --- a/completions/munin-run +++ b/completions/munin-run @@ -1,28 +1,27 @@ # munin-run completion -*- shell-script -*- -_munin_run() +_comp_cmd_munin_run() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --config | --sconffile) - _filedir + _comp_compgen_filedir return ;; --servicedir | --sconfdir) - _filedir -d + _comp_compgen_filedir -d return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help else - COMPREPLY=($(compgen -W \ - '$(command ls /etc/munin/plugins 2>/dev/null)' -- "$cur")) + _comp_compgen_split -- "$(command ls /etc/munin/plugins 2>/dev/null)" fi } && - complete -F _munin_run munin-run + complete -F _comp_cmd_munin_run munin-run # ex: filetype=sh diff --git a/completions/munin-update b/completions/munin-update index 8766eae..8ed8a1f 100644 --- a/completions/munin-update +++ b/completions/munin-update @@ -1,27 +1,27 @@ # munin-update completion -*- shell-script -*- -_munin_update() +_comp_cmd_munin_update() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --config) - _filedir + _comp_compgen_filedir return ;; --host) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--force-root --noforce-root --service --host + _comp_compgen -- -W '--force-root --noforce-root --service --host --config --help --debug --nodebug --fork --nofork --stdout - --nostdout --timeout' -- "$cur")) + --nostdout --timeout' fi } && - complete -F _munin_update munin-update + complete -F _comp_cmd_munin_update munin-update # ex: filetype=sh diff --git a/completions/munindoc b/completions/munindoc index 5c7644a..4a1b4c6 100644 --- a/completions/munindoc +++ b/completions/munindoc @@ -1,13 +1,12 @@ # munindoc completion -*- shell-script -*- -_munindoc() +_comp_cmd_munindoc() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - COMPREPLY=($(compgen -W \ - '$(command ls /usr/share/munin/plugins 2>/dev/null)' -- "$cur")) + _comp_compgen_split -- "$(command ls /usr/share/munin/plugins 2>/dev/null)" } && - complete -F _munindoc munindoc + complete -F _comp_cmd_munindoc munindoc # ex: filetype=sh diff --git a/completions/mussh b/completions/mussh index c2f7a52..e36affe 100644 --- a/completions/mussh +++ b/completions/mussh @@ -1,52 +1,52 @@ # mussh(1) completion -*- shell-script -*- -_mussh() +_comp_cmd_mussh() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --help | -V | -m | -t) return ;; -d) - COMPREPLY=($(compgen -W '{0..2}' -- "$cur")) + _comp_compgen -- -W '{0..2}' return ;; -v) - COMPREPLY=($(compgen -W '{0..3}' -- "$cur")) + _comp_compgen -- -W '{0..3}' return ;; -i | -H | -C) - _filedir + _comp_compgen_filedir return ;; -o | -po) - _xfunc ssh _ssh_options + _comp_compgen -x ssh options return ;; -l | -L) - COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen -- -u return ;; -s) - _shells + _comp_compgen_shells return ;; -p | -h) - [[ $cur == *@* ]] && _user_at_host || _known_hosts_real -a -- "$cur" + [[ $cur == *@* ]] && _comp_complete_user_at_host "$@" || _comp_compgen_known_hosts -a -- "$cur" return ;; -c) compopt -o filenames - COMPREPLY+=($(compgen -c -- "$cur")) + _comp_compgen_commands return ;; esac [[ $cur != -* ]] || - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help } && - complete -F _mussh mussh + complete -F _comp_cmd_mussh mussh # ex: filetype=sh diff --git a/completions/mutt b/completions/mutt index 1161487..5ebf65a 100644 --- a/completions/mutt +++ b/completions/mutt @@ -4,157 +4,174 @@ # a "query" function to retrieve addresses, so that's what we use here. # @param $1 (cur) Current word to complete -_muttaddr() +_comp_cmd_mutt__addresses() { - _muttaliases "$1" - _muttquery "$1" + _comp_cmd_mutt__aliases "$1" + _comp_cmd_mutt__query "$1" - COMPREPLY+=($(compgen -u -- "$1")) + _comp_compgen -ac "$1" -- -u } # Find muttrc to use -# @output muttrc filename -_muttrc() +# @var[out] REPLY muttrc filename +_comp_cmd_mutt__get_muttrc() { + REPLY= # Search COMP_WORDS for '-F muttrc' or '-Fmuttrc' argument set -- "${words[@]}" while (($# > 0)); do if [[ $1 == -F* ]]; then if ((${#1} > 2)); then - muttrc="$(dequote "${1:2}")" + _comp_dequote "${1:2}" else shift - [[ $1 ]] && muttrc="$(dequote "$1")" + [[ ${1-} ]] && _comp_dequote "$1" fi break fi shift done - if [[ ! -v muttrc ]]; then + if [[ ! $REPLY ]]; then if [[ -f ~/.${muttcmd}rc ]]; then - muttrc=\~/.${muttcmd}rc + REPLY=\~/.${muttcmd}rc elif [[ -f ~/.${muttcmd}/${muttcmd}rc ]]; then - muttrc=\~/.${muttcmd}/${muttcmd}rc + REPLY=\~/.${muttcmd}/${muttcmd}rc fi fi - printf "%s" "${muttrc-}" } # Recursively build list of sourced config files -# @param $1 List of config files found so far -# @param $2 Config file to process -# @output List of config files -_muttconffiles() +# @param $1... Config file to process +# @var[out] REPLY List of config files +# @return 0 if any conffiles are generated, 1 if none is generated. +_comp_cmd_mutt__get_conffiles() { - local file sofar + local -a conffiles=() + local -A visited=() + local file + for file; do + _comp_dequote "$file" + _comp_cmd_mutt__get_conffiles__visit "$REPLY" + done + ((${#conffiles[@]})) || return 1 + REPLY=("${conffiles[@]}") +} +# Recursion function for _comp_cmd_mutt__get_conffiles +# @var[ref] conffiles List of config files found so far +# @var[ref] visited Dictionary of config files already visited +_comp_cmd_mutt__get_conffiles__visit() +{ + [[ -f $1 && ${visited[$1]-} != set ]] || return 0 + visited[$1]=set + conffiles+=("$1") + local -a newconffiles + _comp_split newconffiles "$(command sed -n 's|^source[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' "$1")" || + return 0 - sofar=" $1 " - shift - while [[ ${1-} ]]; do - newconffiles=($(command sed -n 's|^source[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' "$(eval printf %s $1)")) - for file in ${newconffiles+"${newconffiles[@]}"}; do - __expand_tilde_by_ref file - [[ ! -f $file || $sofar == *\ $file\ * ]] && continue - sofar+=" $file" - sofar=" $(eval _muttconffiles \"$sofar\" $file) " - done - shift + local file REPLY + for file in "${newconffiles[@]}"; do + _comp_expand_tilde "$file" + _comp_cmd_mutt__get_conffiles__visit "$REPLY" done - printf '%s\n' $sofar } # @param $1 (cur) Current word to complete -_muttaliases() +_comp_cmd_mutt__aliases() { - local cur=$1 muttrc muttcmd=${words[0]} + local cur=$1 muttrc muttcmd=${words[0]} REPLY local -a conffiles aliases - muttrc=$(_muttrc) - [[ -z $muttrc ]] && return + _comp_cmd_mutt__get_muttrc + muttrc=$REPLY + [[ ! $muttrc ]] && return - conffiles=($(eval _muttconffiles $muttrc $muttrc)) - # shellcheck disable=SC2046 - aliases=("$(command sed -n 's|^alias[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' \ - $(eval echo "${conffiles[@]}"))") - COMPREPLY+=($(compgen -W "${aliases[*]}" -- "$cur")) + local REPLY + _comp_cmd_mutt__get_conffiles "$muttrc" || return 0 + conffiles=("${REPLY[@]}") + _comp_compgen -a split -- "$(command sed -n 's|^alias[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' \ + "${conffiles[@]}")" } # @param $1 (cur) Current word to complete -_muttquery() +_comp_cmd_mutt__query() { - local cur=$1 querycmd muttcmd=${words[0]} - local -a queryresults - - querycmd="$($muttcmd -Q query_command 2>/dev/null | command sed -e 's|^query_command=\"\(.*\)\"$|\1|' -e 's|%s|'$cur'|')" - if [[ -z $cur || -z $querycmd ]]; then - queryresults=() - else - __expand_tilde_by_ref querycmd - queryresults=($($querycmd | - command sed -n '2,$s|^\([^[:space:]]\{1,\}\).*|\1|p')) + local cur=$1 + [[ $cur ]] || return 0 + local muttcmd=${words[0]} + + local querycmd="$("$muttcmd" -Q query_command 2>/dev/null | command sed -e 's|^query_command=\"\(.*\)\"$|\1|' -e 's|%s|'"$cur"'|')" + if [[ $querycmd ]]; then + local REPLY + _comp_expand_tilde "$querycmd" + querycmd=$REPLY + # generate queryresults: + # $querycmd is expected to be a command with arguments + _comp_compgen -a split -- "$($querycmd | + command sed -n '2,$s|^\([^[:space:]]\{1,\}\).*|\1|p')" fi - - COMPREPLY+=($(compgen -W "${queryresults[*]}" -- "$cur")) } # @param $1 (cur) Current word to complete -_muttfiledir() +_comp_cmd_mutt__filedir() { - local cur=$1 folder muttrc spoolfile muttcmd=${words[0]} - - muttrc=$(_muttrc) + local cur=$1 folder muttrc spoolfile muttcmd=${words[0]} REPLY + _comp_cmd_mutt__get_muttrc + muttrc=$REPLY if [[ $cur == [=+]* ]]; then - folder="$($muttcmd -F "$muttrc" -Q folder 2>/dev/null | command sed -e 's|^folder=\"\(.*\)\"$|\1|')" - : folder:=~/Mail + folder="$("$muttcmd" -F "$muttrc" -Q folder 2>/dev/null | command sed -e 's|^folder=\"\(.*\)\"$|\1|')" + [[ $folder ]] || folder=~/Mail # Match any file in $folder beginning with $cur # (minus the leading '=' sign). compopt -o filenames - COMPREPLY=($(compgen -f -- "$folder/${cur:1}")) - COMPREPLY=(${COMPREPLY[@]#$folder/}) + _comp_compgen -c "$folder/${cur:1}" -- -f + COMPREPLY=("${COMPREPLY[@]#"$folder"/}") return elif [[ $cur == !* ]]; then - spoolfile="$($muttcmd -F "$muttrc" -Q spoolfile 2>/dev/null | + spoolfile="$("$muttcmd" -F "$muttrc" -Q spoolfile 2>/dev/null | command sed -e 's|^spoolfile=\"\(.*\)\"$|\1|')" - [[ -n $spoolfile ]] && eval cur="${cur/^!/$spoolfile}" + if [[ $spoolfile ]]; then + _comp_dequote "\"$spoolfile\"" && spoolfile=$REPLY + cur=$spoolfile${cur:1} + fi fi - _filedir + _comp_compgen -c "$cur" filedir } -_mutt() +_comp_cmd_mutt() { - local cur prev words cword - _init_completion -n =+! || return + local cur prev words cword comp_args + _comp_initialize -n =+! -- "$@" || return case $cur in -*) - COMPREPLY=($(compgen -W '-A -a -b -c -e -f -F -H -i -m -n -p -Q -R -s - -v -x -y -z -Z -h' -- "$cur")) + _comp_compgen -- -W '-A -a -b -c -e -f -F -H -i -m -n -p -Q -R -s + -v -x -y -z -Z -h' return ;; *) case $prev in -*[afFHi]) - _muttfiledir "$cur" + _comp_cmd_mutt__filedir "$cur" return ;; -*A) - _muttaliases "$cur" + _comp_cmd_mutt__aliases "$cur" return ;; -*[emQshpRvyzZ]) return ;; *) - _muttaddr "$cur" + _comp_cmd_mutt__addresses "$cur" return ;; esac ;; esac } && - complete -F _mutt -o default mutt muttng + complete -F _comp_cmd_mutt -o default mutt muttng neomutt # ex: filetype=sh diff --git a/completions/mypy b/completions/mypy index 534d575..1c01ad4 100644 --- a/completions/mypy +++ b/completions/mypy @@ -1,57 +1,60 @@ # mypy completion -*- shell-script -*- -_mypy() +_comp_cmd_mypy() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return [[ $cword -gt 2 && ${words[cword - 2]} == --shadow-file ]] && prev=--shadow-file # hack; takes two args + local noargopts='!(-*|*[pcm]*)' + # shellcheck disable=SC2254 case $prev in --help | --version | --python-version | --platform | --always-true | \ - --always-false | --find-occurrences | --package | --command | -!(-*)[hVpc]) + --always-false | --@(dis|en)able-error-code | --find-occurrences | \ + --exclude | --package | --command | -${noargopts}[hVpc]) return ;; --config-file) - _filedir + _comp_compgen_filedir return ;; --follow-imports) - COMPREPLY=($(compgen -W 'normal silent skip error' -- "$cur")) + _comp_compgen -- -W 'normal silent skip error' return ;; --python-executable) - COMPREPLY=($(compgen -c -- "${cur:-py}")) + _comp_compgen -c "${cur:-py}" commands return ;; --*-dir | --*-report) - _filedir -d + _comp_compgen_filedir -d return ;; - --custom-typing | --module | -!(-*)m) - _xfunc python _python_modules + --custom-typing-module | --module | -${noargopts}m) + _comp_compgen -x python modules return ;; --shadow-file) - _filedir '@(py|pyi)' + _comp_compgen_filedir '@(py|pyi)' return ;; --junit-xml) - _filedir xml + _comp_compgen_filedir xml return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - _filedir '@(py|pyi)' + _comp_compgen_filedir '@(py|pyi)' } && - complete -F _mypy mypy + complete -F _comp_cmd_mypy mypy # ex: filetype=sh diff --git a/completions/mysql b/completions/mysql index 9363133..4ba049f 100644 --- a/completions/mysql +++ b/completions/mysql @@ -1,83 +1,94 @@ # mysql(1) completion -*- shell-script -*- -_mysql_character_sets() +# @since 2.12 +_comp_xfunc_mysql_compgen_character_sets() { - local IFS=$' \t\n' reset=$(shopt -p failglob) - shopt -u failglob - local -a charsets=(/usr/share/m{ariadb,ysql}/charsets/*.xml) - $reset + local -a charsets + _comp_expand_glob charsets '/usr/share/m{ariadb,ysql}/charsets/!(Index).xml' + charsets+=(utf8) charsets=("${charsets[@]##*/}") - charsets=("${charsets[@]%%?(Index|\*).xml}" utf8) - COMPREPLY+=($(compgen -W '${charsets[@]}' -- "$cur")) + charsets=("${charsets[@]%.xml}") + _comp_compgen -U charsets -- -W '"${charsets[@]}"' -X '' } -_mysql() +# @deprecated 2.12 +_mysql_character_sets() { - local cur prev words cword split - _init_completion -s || return + _comp_compgen -ax mysql character_sets "$@" +} +_comp_cmd_mysql() +{ + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + + # Prefer `mysqlshow` in the same dir as the command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + + local noargopts='!(-*|*[uDhSPeI]*)' + # shellcheck disable=SC2254 case $prev in - --user | -!(-*)u) - COMPREPLY=($(compgen -u -- "$cur")) + --user | -${noargopts}u) + _comp_compgen -- -u return ;; - --database | -!(-*)D) - COMPREPLY=($(compgen -W "$(mysqlshow 2>/dev/null | command sed -ne '2d' -e 's/^|.\([^|]*\)|.*/\1/p')" -- "$cur")) + --database | -${noargopts}D) + _comp_compgen_split -- "$(mysqlshow 2>/dev/null | + command sed -ne '2d' -e 's/^|.\([^|]*\)|.*/\1/p')" return ;; - --host | -!(-*)h) - _known_hosts_real -- "$cur" + --host | -${noargopts}h) + _comp_compgen_known_hosts -- "$cur" return ;; --default-character-set) - _mysql_character_sets + _comp_xfunc_mysql_compgen_character_sets return ;; --character-sets-dir | --ssl-capath) - _filedir -d + _comp_compgen_filedir -d return ;; - --socket | -!(-*)S) - _filedir sock + --socket | -${noargopts}S) + _comp_compgen_filedir sock return ;; --protocol) - COMPREPLY=($(compgen -W 'tcp socket pipe memory' -- "$cur")) + _comp_compgen -- -W 'tcp socket pipe memory' return ;; --defaults-file | --defaults-extra-file | --tee) - _filedir + _comp_compgen_filedir return ;; --ssl-ca | --ssl-cert) - _filedir '@(pem|cer|c?(e)rt)' + _comp_compgen_filedir '@(pem|cer|c?(e)rt)' return ;; --ssl-key) - _filedir '@(pem|key)' + _comp_compgen_filedir '@(pem|key)' return ;; --port | --set-variable | --ssl-cipher | --connect_timeout | \ --max_allowed_packet | --prompt | --net_buffer_length | --select_limit | \ --max_join_size | --server-arg | --debug | --delimiter | --execute | --pager | \ - -!(-*)[Pe]) + -${noargopts}[Pe]) return ;; - --help | --version | -!(-*)[?IV]) + --help | --version | -${noargopts}[?IV]) return ;; esac - $split && return + [[ $was_split ]] && return case $cur in --*) - local help=$(_parse_help "$1") - help+=" --skip-comments --skip-ssl" - - COMPREPLY=($(compgen -W "$help" -- "$cur")) + _comp_compgen_help + _comp_compgen -a -- -W '--skip-comments --skip-ssl' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return ;; @@ -90,10 +101,9 @@ _mysql() ;; esac - COMPREPLY=($(compgen -W \ - "$(mysqlshow 2>/dev/null | command sed -ne '2d' -e 's/^|.\([^|]*\)|.*/\1/p')" \ - -- "$cur")) + _comp_compgen_split -- "$(mysqlshow 2>/dev/null | + command sed -ne '2d' -e 's/^|.\([^|]*\)|.*/\1/p')" } && - complete -F _mysql mysql + complete -F _comp_cmd_mysql mysql # ex: filetype=sh diff --git a/completions/mysqladmin b/completions/mysqladmin index 5329534..af7d50f 100644 --- a/completions/mysqladmin +++ b/completions/mysqladmin @@ -1,63 +1,65 @@ # bash completion for mysqladmin -*- shell-script -*- -_mysqladmin() +_comp_cmd_mysqladmin() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[uhScPOiw]*)' + # shellcheck disable=SC2254 case $prev in - --user | -!(-*)u) - COMPREPLY=($(compgen -u -- "$cur")) + --user | -${noargopts}u) + _comp_compgen -- -u return ;; - --host | -!(-*)h) - _known_hosts_real -- "$cur" + --host | -${noargopts}h) + _comp_compgen_known_hosts -- "$cur" return ;; --character-sets-dir | --ssl-capath) - _filedir -d + _comp_compgen_filedir -d return ;; --default-character-set) - _xfunc mysql _mysql_character_sets + _comp_compgen -x mysql character_sets return ;; - --socket | -!(-*)S) - _filedir sock + --socket | -${noargopts}S) + _comp_compgen_filedir sock return ;; --defaults-file | --defaults-extra-file) - _filedir + _comp_compgen_filedir return ;; --ssl-ca | --ssl-cert) - _filedir '@(pem|cer|c?(e)rt)' + _comp_compgen_filedir '@(pem|cer|c?(e)rt)' return ;; --ssl-key) - _filedir '@(pem|key)' + _comp_compgen_filedir '@(pem|key)' return ;; --count | --port | --set-variable | --sleep | --ssl-cipher | --wait | \ - --connect_timeout | --shutdown_timeout | -!(-*)[cPOiw]) + --connect_timeout | --shutdown_timeout | -${noargopts}[cPOiw]) return ;; - --help | --version | -!(-*)[?V]) + --help | --version | -${noargopts}[?V]) return ;; esac - $split && return + [[ $was_split ]] && return - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help - COMPREPLY+=($(compgen -W 'create debug drop extended-status flush-hosts + _comp_compgen -a -- -W 'create debug drop extended-status flush-hosts flush-logs flush-status flush-tables flush-threads flush-privileges kill password old-password ping processlist reload refresh shutdown - status start-slave stop-slave variables version' -- "$cur")) + status start-slave stop-slave variables version' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace } && - complete -F _mysqladmin mysqladmin + complete -F _comp_cmd_mysqladmin mysqladmin # ex: filetype=sh diff --git a/completions/nc b/completions/nc index 6fb0994..22e297c 100644 --- a/completions/nc +++ b/completions/nc @@ -1,9 +1,9 @@ # nc(1) completion -*- shell-script -*- -_nc() +_comp_cmd_nc() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return case $prev in -*[hIiMmOPpqVWw]) @@ -11,41 +11,39 @@ _nc() ;; -*s) if [[ ${words[*]} == *-6* ]]; then - _ip_addresses -6 - __ltrim_colon_completions "$cur" + _comp_compgen_ip_addresses -6 else - _ip_addresses + _comp_compgen_ip_addresses fi return ;; -*T) - COMPREPLY=($(compgen -W 'critical inetcontrol lowcost lowdelay - netcontrol throughput reliability ef af{11..43} cs{0..7}' \ - -- "$cur")) + _comp_compgen -- -W 'critical inetcontrol lowcost lowdelay + netcontrol throughput reliability ef af{11..43} cs{0..7}' return ;; -*X) - COMPREPLY=($(compgen -W '4 5 connect' -- "$cur")) + _comp_compgen -- -W '4 5 connect' return ;; -*x) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + _comp_compgen_help -- -h return fi # Complete 1st non-option arg only - local args - _count_args "" "-*[IiMmOPpqsTVWwXx]" - ((args == 1)) || return + local REPLY + _comp_count_args -n "" -a "-*[IiMmOPpqsTVWwXx]" + ((REPLY == 1)) || return - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" } && - complete -F _nc nc + complete -F _comp_cmd_nc nc # ex: filetype=sh diff --git a/completions/ncftp b/completions/ncftp index c3f2cf1..60218c1 100644 --- a/completions/ncftp +++ b/completions/ncftp @@ -1,9 +1,9 @@ # bash completion for ncftp -*- shell-script -*- -_ncftp() +_comp_cmd_ncftp() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -u | -p | -P | -j | -F) @@ -12,16 +12,16 @@ _ncftp() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + _comp_compgen_help -- -h return fi if [[ $cword -eq 1 && -f ~/.ncftp/bookmarks ]]; then - COMPREPLY=($(compgen -W '$(command sed -ne "s/^\([^,]\{1,\}\),.*$/\1/p" \ - ~/.ncftp/bookmarks)' -- "$cur")) + _comp_compgen_split -- "$(command sed -ne \ + 's/^\([^,]\{1,\}\),.*$/\1/p' ~/.ncftp/bookmarks)" fi } && - complete -F _ncftp -o default ncftp + complete -F _comp_cmd_ncftp -o default ncftp # ex: filetype=sh diff --git a/completions/nethogs b/completions/nethogs index 5cd3650..c39a707 100644 --- a/completions/nethogs +++ b/completions/nethogs @@ -1,26 +1,26 @@ # bash completion for nethogs(8) -*- shell-script -*- -_nethogs() +_comp_cmd_nethogs() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case "$prev" in -d) # expect integer value - COMPREPLY+=($(compgen -W '{0..9}')) + _comp_compgen -aR -- -W '{0..9}' compopt -o nospace return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" -h)' -- "$cur")) + _comp_compgen_usage -- -h return fi - _available_interfaces -a + _comp_compgen_available_interfaces -a } && - complete -F _nethogs nethogs + complete -F _comp_cmd_nethogs nethogs # ex: filetype=sh diff --git a/completions/newlist b/completions/newlist index f1f6cf8..b4e6060 100644 --- a/completions/newlist +++ b/completions/newlist @@ -1,9 +1,9 @@ # mailman newlist completion -*- shell-script -*- -_newlist() +_comp_cmd_newlist() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -l | --language | -u | --urlhost | -e | --emailhost | --help) @@ -11,15 +11,18 @@ _newlist() ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - _xfunc list_lists _mailman_lists + # Prefer `list_lists` in the same dir as command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_compgen -x list_lists mailman_lists fi } && - complete -F _newlist newlist + complete -F _comp_cmd_newlist newlist # ex: filetype=sh diff --git a/completions/newusers b/completions/newusers index 890a5fc..28282f6 100644 --- a/completions/newusers +++ b/completions/newusers @@ -1,13 +1,13 @@ # newusers(8) completion -*- shell-script -*- -_newusers() +_comp_cmd_newusers() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -c | --crypt) - COMPREPLY=($(compgen -W 'DES MD5 NONE SHA256 SHA512' -- "$cur")) + _comp_compgen -- -W 'DES MD5 NONE SHA256 SHA512' return ;; -s | --sha-rounds) @@ -15,16 +15,16 @@ _newusers() ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir + _comp_compgen_filedir } && - complete -F _newusers newusers + complete -F _comp_cmd_newusers newusers # ex: filetype=sh diff --git a/completions/ngrep b/completions/ngrep index 7d16c8d..14f39a9 100644 --- a/completions/ngrep +++ b/completions/ngrep @@ -1,38 +1,38 @@ # ngrep(8) completion -*- shell-script -*- -_ngrep() +_comp_cmd_ngrep() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -h | -V | -n | -A | -s | -S | -c | -P) return ;; -I | -O) - _filedir 'pcap?(ng)' + _comp_compgen_filedir 'pcap?(ng)' return ;; -d) - _available_interfaces -a - COMPREPLY+=($(compgen -W 'any' -- "$cur")) + _comp_compgen_available_interfaces -a + _comp_compgen -a -- -W 'any' return ;; -W) - COMPREPLY=($(compgen -W 'normal byline single none' -- "$cur")) + _comp_compgen -- -W 'normal byline single none' return ;; -F) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + _comp_compgen_help -- -h return fi } && - complete -F _ngrep ngrep + complete -F _comp_cmd_ngrep ngrep # ex: filetype=sh diff --git a/completions/nmap b/completions/nmap index 482148e..a3e691b 100644 --- a/completions/nmap +++ b/completions/nmap @@ -1,30 +1,30 @@ # bash completion for nmap -*- shell-script -*- -_nmap() +_comp_cmd_nmap() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -iL | -oN | -oX | -oS | -oG | ---excludefile | --resume | --stylesheet) - _filedir + _comp_compgen_filedir return ;; -oA | --datadir) - _filedir -d + _comp_compgen_filedir -d return ;; -e) - _available_interfaces -a + _comp_compgen_available_interfaces -a return ;; -b | --dns-servers) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then # strip everything following a :, inclusive @@ -35,7 +35,7 @@ _nmap() # expand --foo/bar to --foo --bar # strip everything following a non-option name or = char # TODO: should expand -T<0-5> to -T0 ... -T5 - COMPREPLY=($(compgen -W "$( + _comp_compgen_split -- "$( "$1" --help 2>&1 | command sed \ -e "s/:.*$//" \ -e "s/=.*$/=/" \ @@ -44,13 +44,12 @@ _nmap() -e "/^[[:space:]]*-[^-]/s/\/\([^-]\)/ -\1/g" \ -e "/^[[:space:]]*--/s/\/\([^-]\)/ --\1/g" \ -e "s/[^[:space:]a-zA-Z0-9=-].*$//" - )" \ - -- "$cur")) + )" [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" fi } && - complete -F _nmap nmap + complete -F _comp_cmd_nmap nmap # ex: filetype=sh diff --git a/completions/nproc b/completions/nproc index 50273f0..dc38944 100644 --- a/completions/nproc +++ b/completions/nproc @@ -1,9 +1,9 @@ # nproc(1) completion -*- shell-script -*- -_nproc() +_comp_cmd_nproc() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in --help | --version | --ignore) @@ -11,13 +11,13 @@ _nproc() ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _nproc nproc + complete -F _comp_cmd_nproc nproc # ex: filetype=sh diff --git a/completions/nslookup b/completions/nslookup index 3341b1f..b04b03a 100644 --- a/completions/nslookup +++ b/completions/nslookup @@ -1,32 +1,42 @@ # bash completion for nslookup -*- shell-script -*- -_bind_queryclass() +_comp_cmd_nslookup__queryclass() { - COMPREPLY+=($(compgen -W 'IN CH HS ANY' -- "$cur")) + _comp_compgen -a -- -W 'IN CH HS ANY' } -_bind_querytype() +_comp_cmd_nslookup__querytype() { # https://en.wikipedia.org/wiki/List_of_DNS_record_types - COMPREPLY+=($(compgen -W 'A AAAA AFSDB APL CERT CNAME DHCID DLV DNAME - DNSKEY DS HIP IPSECKEY KEY KX LOC MX NAPTR NS NSEC NSEC3 NSEC3PARAM PTR - RRSIG RP SIG SOA SPF SRV SSHFP TXT' -- "$cur")) + # Resource records + local -a types=( + A AAAA AFSDB APL CAA CDNSKEY CDS CERT CNAME CSYNC DHCID DLV DNAME + DNSKEY DS EUI48 EUI64 HINFO HIP IPSECKEY KEY KX LOC MX NAPTR NS NSEC + NSEC3 NSEC3PARAM OPENPGPKEY PTR RRSIG RP SIG SMIMEA SOA SRV SSHFP TA + TKEY TLSA TSIG TXT URI ZONEMD SVCB HTTPS + ) + # Other types/pseudo record types + types+=(AXFR IXFR OPT) + # Selected obsolete record types + types+=(SPF) + + _comp_compgen -a -- -W '"${types[@]}"' } -_nslookup() +_comp_cmd_nslookup() { - local cur prev words cword - _init_completion -n = || return + local cur prev words cword comp_args + _comp_initialize -n = -- "$@" || return case $cur in -class=* | -cl=*) cur=${cur#*=} - _bind_queryclass + _comp_cmd_nslookup__queryclass return ;; -querytype=* | -type=* | -q=* | -ty=*) cur=${cur#*=} - _bind_querytype + _comp_cmd_nslookup__querytype return ;; -?*=*) @@ -35,38 +45,38 @@ _nslookup() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-all -class= -debug -nodebug -d2 -nod2 - -domain= -search -nosearch -port= -querytype= -recurse -norecurse - -retry= -timeout= -vc -novc -fail -nofail' -- "$cur")) + _comp_compgen -- -W '-all -class= -debug -nodebug -d2 -nod2 -domain= + -search -nosearch -port= -querytype= -recurse -norecurse -retry= + -timeout= -vc -novc -fail -nofail' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - local args - _count_args = - if ((args <= 2)); then - _known_hosts_real -- "$cur" - [[ $args -eq 1 && $cur == @(|-) ]] && COMPREPLY+=(-) + local REPLY + _comp_count_args + if ((REPLY <= 2)); then + _comp_compgen_known_hosts -- "$cur" + [[ $REPLY -eq 1 && $cur == @(|-) ]] && COMPREPLY+=(-) fi } && - complete -F _nslookup nslookup + complete -F _comp_cmd_nslookup nslookup -_host() +_comp_cmd_host() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -c) - _bind_queryclass + _comp_cmd_nslookup__queryclass return ;; -t) - _bind_querytype + _comp_cmd_nslookup__querytype return ;; -m) - COMPREPLY=($(compgen -W 'trace record usage' -- "$cur")) + _comp_compgen -- -W 'trace record usage' return ;; -N | -R | -W) @@ -75,12 +85,21 @@ _host() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage return fi - _known_hosts_real -- "$cur" + local REPLY + _comp_count_args -a "-*[ctmNRW]" + if ((REPLY == 1)); then + _comp_compgen_known_hosts -- "$cur" + elif ((REPLY == 2)); then + local ipvx + [[ ${words[*]} =~ \ -[^\ ]*([46]) ]] && ipvx=-${BASH_REMATCH[1]} + # shellcheck disable=SC2086 + _comp_compgen_known_hosts ${ipvx-} -- "$cur" + fi } && - complete -F _host host + complete -F _comp_cmd_host host # ex: filetype=sh diff --git a/completions/nsupdate b/completions/nsupdate index 68df333..854e33c 100644 --- a/completions/nsupdate +++ b/completions/nsupdate @@ -1,27 +1,25 @@ # bash completion for nsupdate(1) -*- shell-script -*- -_nsupdate() +_comp_cmd_nsupdate() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*[VLprtu]) return ;; -*k) - _filedir key + _comp_compgen_filedir key return ;; -*R) - cur=${cur:=/dev/} - _filedir + _comp_compgen -c "${cur:-/dev/}" filedir return ;; -*y) if [[ $cur == h* ]]; then - COMPREPLY=($(compgen -W "hmac-{md5,sha{1,224,256,384,512}}" \ - -S : -- "$cur")) + _comp_comtpen -- -W "hmac-{md5,sha{1,224,256,384,512}}" -S : [[ ${COMPREPLY-} == *: ]] && compopt -o nospace fi return @@ -29,12 +27,12 @@ _nsupdate() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage return fi - _filedir + _comp_compgen_filedir } && - complete -F _nsupdate nsupdate + complete -F _comp_cmd_nsupdate nsupdate # ex: filetype=sh diff --git a/completions/ntpdate b/completions/ntpdate index f6ee8f5..5dab0a7 100644 --- a/completions/ntpdate +++ b/completions/ntpdate @@ -1,21 +1,21 @@ # bash completion for ntpdate -*- shell-script -*- -_ntpdate() +_comp_cmd_ntpdate() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*k) - _filedir + _comp_compgen_filedir return ;; -*U) - COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen -- -u return ;; -*p) - COMPREPLY=($(compgen -W '{1..8}' -- "$cur")) + _comp_compgen -- -W '{1..8}' return ;; @@ -25,11 +25,11 @@ _ntpdate() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_help -- -h || _comp_compgen_usage else - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" fi } && - complete -F _ntpdate ntpdate + complete -F _comp_cmd_ntpdate ntpdate # ex: filetype=sh diff --git a/completions/oggdec b/completions/oggdec index 97bde20..a76ba49 100644 --- a/completions/oggdec +++ b/completions/oggdec @@ -1,38 +1,40 @@ # bash completion for oggdec(1) -*- shell-script -*- -_oggdec() +_comp_cmd_oggdec() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[beso]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | -!(-*)[hV]*) + --help | --version | -${noargopts}[hV]*) return ;; - --bits | -!(-*)b) - COMPREPLY=($(compgen -W "8 16" -- "$cur")) + --bits | -${noargopts}b) + _comp_compgen -- -W "8 16" return ;; - --endianness | --sign | -!(-*)[es]) - COMPREPLY=($(compgen -W "0 1" -- "$cur")) + --endianness | --sign | -${noargopts}[es]) + _comp_compgen -- -W "0 1" return ;; - --output | -!(-*)o) - _filedir wav + --output | -${noargopts}o) + _comp_compgen_filedir wav return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir ogg + _comp_compgen_filedir ogg } && - complete -F _oggdec oggdec + complete -F _comp_cmd_oggdec oggdec # ex: filetype=sh diff --git a/completions/op b/completions/op deleted file mode 100644 index 31d6475..0000000 --- a/completions/op +++ /dev/null @@ -1,59 +0,0 @@ -# op (1Password CLI) completion -*- shell-script -*- - -_op_commands() -{ - "$@" --help 2>/dev/null | - awk '/^(Available |Sub)commands/{flag=1;next}/^ /&&flag{print $1}' -} - -_op_command_options() -{ - case $cur in - -*) - for i in "${!words[@]}"; do - [[ ${words[i]} == -* || $i -eq 0 ]] && unset "words[i]" - done - COMPREPLY=($(compgen -W \ - '$(_parse_usage "$1" "${words[*]} --help") --help' -- "$cur")) - [[ ${COMPREPLY-} == *= ]] && compopt -o nospace - return 0 - ;; - esac - return 1 -} - -_op() -{ - local cur prev words cword split - _init_completion -s || return - - local command i - for ((i = 1; i < cword; i++)); do - case ${words[i]} in - --help | --version) return ;; - -*) ;; - *) - command=${words[i]} - break - ;; - esac - done - - if [[ ! -v command && $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) - [[ ${COMPREPLY-} == *= ]] && compopt -o nospace - return - fi - - [[ -v command ]] && _op_command_options "$1" && return - - if [[ ! -v command || $command == "$prev" ]]; then - COMPREPLY=($(compgen -W '$(_op_commands "$1" ${command-})' -- "$cur")) - [[ ${COMPREPLY-} ]] && return - fi - - # TODO specific command and subcommand completions -} && - complete -F _op op - -# ex: filetype=sh diff --git a/completions/openssl b/completions/openssl index dd77092..9dad715 100644 --- a/completions/openssl +++ b/completions/openssl @@ -1,52 +1,54 @@ # bash completion for openssl -*- shell-script -*- -_openssl_sections() +_comp_cmd_openssl__compgen_sections() { - local config f + local config="" _i _file # check if a specific configuration file is used - for ((i = 2; i < cword; i++)); do - if [[ ${words[i]} == -config ]]; then - config=${words[i + 1]} + for ((_i = 2; _i < cword; _i++)); do + if [[ ${words[_i]} == -config ]]; then + config=${words[_i + 1]} break fi done # if no config given, check some usual default locations - if [[ -z $config ]]; then - for f in /etc/ssl/openssl.cnf /etc/pki/tls/openssl.cnf \ + if [[ ! $config ]]; then + for _file in /etc/ssl/openssl.cnf /etc/pki/tls/openssl.cnf \ /usr/share/ssl/openssl.cnf; do - [[ -f $f ]] && config=$f && break + [[ -f $_file ]] && config=$_file && break done fi [[ ! -f $config ]] && return - COMPREPLY=($(compgen -W "$(awk '/\[.*\]/ {print $2}' $config)" -- "$cur")) + _comp_compgen -U config split -- "$(_comp_awk '/\[.*\]/ {print $2}' "$config")" } -_openssl_digests() +_comp_cmd_openssl__compgen_digests() { - "$1" dgst -h 2>&1 | - awk '/^-.*[ \t]to use the .* message digest algorithm/ { print $1 }' - local -a digests=($("$1" help 2>&1 | + [[ $cur == -* ]] || return + _comp_compgen_split -- "$( + "$1" dgst -h 2>&1 | + _comp_awk '/^-.*[ \t]to use the .* message digest algorithm/ { print $1 }' + )" + _comp_compgen -ac "${cur#-}" split -P "-" -- "$("$1" help 2>&1 | command sed -ne '/^Message Digest commands/,/^[[:space:]]*$/p' | - command sed -e 1d)) - printf "%s\n" "${digests[@]/#/-}" + command sed -e 1d)" } -_openssl() +_comp_cmd_openssl() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - local commands command options formats + local commands command formats commands='asn1parse ca ciphers crl crl2pkcs7 dgst dh dhparam dsa dsaparam ec ecparam enc engine errstr gendh gendsa genrsa nseq ocsp passwd pkcs12 pkcs7 pkcs8 prime rand req rsa rsautl s_client s_server s_time - sess_id smime speed spkac verify version x509 md2 md4 md5 rmd160 sha - sha1 aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb aes-256-cbc + sess_id smime speed spkac storeutl verify version x509 md2 md4 md5 rmd160 + sha sha1 aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb aes-256-cbc aes-256-ecb base64 bf bf-cbc bf-cfb bf-ecb bf-ofb camellia-128-cbc camellia-128-ecb camellia-192-cbc camellia-192-ecb camellia-256-cbc camellia-256-ecb cast cast-cbc cast5-cbc cast5-cfb cast5-ecb cast5-ofb @@ -56,7 +58,7 @@ _openssl() sha224 sha256 sha384 sha512 genpkey pkey pkeyparam pkeyutl' if ((cword == 1)); then - COMPREPLY=($(compgen -W "$commands" -- "$cur")) + _comp_compgen -- -W "$commands" else command=${words[1]} case $prev in @@ -65,15 +67,15 @@ _openssl() -out | -oid | -paramfile | -peerkey | -prvrify | -rand | -recip | -revoke | \ -sess_in | -sess_out | -spkac | -sigfile | -sign | -signkey | -signer | \ -signature | -ss_cert | -untrusted | -verify | -writerand) - _filedir + _comp_compgen_filedir return ;; -outdir | -CApath) - _filedir -d + _comp_compgen_filedir -d return ;; -name | -crlexts | -extensions) - _openssl_sections + _comp_cmd_openssl__compgen_sections return ;; -inform | -outform | -keyform | -certform | -CAform | -CAkeyform | -dkeyform | \ @@ -90,49 +92,48 @@ _openssl() formats+=" ENGINE" ;; esac - COMPREPLY=($(compgen -W "$formats" -- "$cur")) + _comp_compgen -- -W "$formats" return ;; -connect) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -starttls) - COMPREPLY=($(compgen -W ' - smtp pop3 imap ftp xmpp xmpp-server telnet irc mysql - postgres lmtp nntp sieve ldap - ' -- "$cur")) + _comp_compgen -- -W ' smtp pop3 imap ftp xmpp xmpp-server + telnet irc mysql postgres lmtp nntp sieve ldap' return ;; -cipher) - COMPREPLY=($(IFS=: compgen -W "$($1 ciphers)" -- "$cur")) + _comp_compgen_split -F : -- "$("$1" ciphers)" return ;; -kdf) - COMPREPLY=($(compgen -W 'TLS1-PRF HKDF' -- "$cur")) + _comp_compgen -- -W 'TLS1-PRF HKDF' return ;; esac if [[ $cur == -* ]]; then # possible options for the command - options=$(_parse_help "$1" "$command -help" 2>/dev/null) + _comp_compgen_help -- "$command" -help case $command in - dgst | req | x509) options+=" $(_openssl_digests $1)" ;; + dgst | req | x509) + _comp_compgen -a -i openssl digests "$1" + ;; esac - COMPREPLY=($(compgen -W "$options" -- "$cur")) else if [[ $command == speed ]]; then - COMPREPLY=($(compgen -W 'md2 mdc2 md5 hmac sha1 rmd160 - idea-cbc rc2-cbc rc5-cbc bf-cbc des-cbc des-ede3 rc4 - rsa512 rsa1024 rsa2048 rsa4096 dsa512 dsa1024 dsa2048 idea - rc2 des rsa blowfish' -- "$cur")) + _comp_compgen -- -W 'md2 mdc2 md5 hmac sha1 rmd160 idea-cbc + rc2-cbc rc5-cbc bf-cbc des-cbc des-ede3 rc4 rsa512 rsa1024 + rsa2048 rsa4096 dsa512 dsa1024 dsa2048 idea rc2 des rsa + blowfish' else - _filedir + _comp_compgen_filedir fi fi fi } && - complete -F _openssl -o default openssl + complete -F _comp_cmd_openssl -o default openssl # ex: filetype=sh diff --git a/completions/opera b/completions/opera index f2bc8c3..c9245e4 100644 --- a/completions/opera +++ b/completions/opera @@ -1,29 +1,28 @@ # opera(1) completion -*- shell-script -*- -_opera() +_comp_cmd_opera() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case "$prev" in ?(-)-widget | ?(-)-urllist | ?(-)-uiparserlog | ?(-)-uiwidgetsparserlog | \ ?(-)-profilinglog) - _filedir + _comp_compgen_filedir return ;; ?(-)-[psb]d) - _filedir -d + _comp_compgen_filedir -d return ;; ?(-)-remote) - COMPREPLY=($(compgen -W 'openURL\\( openFile\\( openM2\\( - openComposer\\( addBookmark\\( raise\\(\\) lower\\(\\)' \ - -- "$cur")) + _comp_compgen -- -W 'openURL\\( openFile\\( openM2\\( + openComposer\\( addBookmark\\( raise\\(\\) lower\\(\\)' [[ ${COMPREPLY-} == *\( ]] && compopt -o nospace return ;; ?(-)-windowname) - COMPREPLY=($(compgen -W 'first last opera{1..9}' -- "$cur")) + _comp_compgen -- -W 'first last opera{1..9}' return ;; ?(-)-geometry | ?(-)-window | ?(-)-display | ?(-)-urllistloadtimeout | \ @@ -35,13 +34,13 @@ _opera() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir '@(?([xX]|[sS])[hH][tT][mM]?([lL]))' + _comp_compgen_filedir '@(?([xX]|[sS])[hH][tT][mM]?([lL]))' } && - complete -F _opera opera + complete -F _comp_cmd_opera opera # ex: filetype=sh diff --git a/completions/optipng b/completions/optipng index 0f6b40e..a81ffa2 100644 --- a/completions/optipng +++ b/completions/optipng @@ -1,52 +1,51 @@ # optipng(1) completion -*- shell-script -*- -_optipng() +_comp_cmd_optipng() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -'?' | -h | --help | -f) return ;; -o) - COMPREPLY=($(compgen -W '{0..7}' -- "$cur")) + _comp_compgen -- -W '{0..7}' return ;; -out | -log) - _filedir + _comp_compgen_filedir return ;; -dir) - _filedir -d + _comp_compgen_filedir -d return ;; -i) - COMPREPLY=($(compgen -W '0 1' -- "$cur")) + _comp_compgen -- -W '0 1' return ;; -zc | -zm) - COMPREPLY=($(compgen -W '{1..9}' -- "$cur")) + _comp_compgen -- -W '{1..9}' return ;; -zw) - COMPREPLY=($(compgen -W '256 512 1k 2k 4k 8k 16k 32k' \ - -- "$cur")) + _comp_compgen -- -W '256 512 1k 2k 4k 8k 16k 32k' return ;; -strip) - COMPREPLY=($(compgen -W 'all' -- "$cur")) + _comp_compgen -- -W 'all' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - _filedir '@(png|bmp|gif|pnm|tif?(f))' + _comp_compgen_filedir '@(png|bmp|gif|pnm|tif?(f))' } && - complete -F _optipng optipng + complete -F _comp_cmd_optipng optipng # ex: filetype=sh diff --git a/completions/p4 b/completions/p4 index ed5f20c..5bcadf6 100644 --- a/completions/p4 +++ b/completions/p4 @@ -1,30 +1,29 @@ # Perforce completion -*- shell-script -*- # by Frank Cusack <frank@google.com> -_p4() +_comp_cmd_p4() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local p4commands p4filetypes # rename isn't really a command - p4commands="$(p4 help commands 2>/dev/null | awk 'NF>3 {print $1}')" + p4commands="$(p4 help commands 2>/dev/null | _comp_awk 'NF>3 {print $1}')" p4filetypes="ctext cxtext ktext kxtext ltext tempobj ubinary \ uresource uxbinary xbinary xltext xtempobj xtext \ text binary resource" if ((cword == 1)); then - COMPREPLY=($(compgen -W "$p4commands" -- "$cur")) + _comp_compgen -- -W "$p4commands" elif ((cword == 2)); then case $prev in help) - COMPREPLY=($(compgen -W "simple commands environment - filetypes jobview revisions usage views $p4commands" \ - -- "$cur")) + _comp_compgen -- -W "simple commands environment filetypes + jobview revisions usage views $p4commands" ;; admin) - COMPREPLY=($(compgen -W "checkpoint stop" -- "$cur")) + _comp_compgen -- -W "checkpoint stop" ;; *) ;; @@ -34,7 +33,7 @@ _p4() -t) case ${words[cword - 2]} in add | edit | reopen) - COMPREPLY=($(compgen -W "$p4filetypes" -- "$cur")) + _comp_compgen -- -W "$p4filetypes" ;; *) ;; @@ -46,6 +45,6 @@ _p4() fi } && - complete -F _p4 -o default p4 g4 + complete -F _comp_cmd_p4 -o default p4 g4 # ex: filetype=sh diff --git a/completions/pack200 b/completions/pack200 index 1a6ded7..a4abe92 100644 --- a/completions/pack200 +++ b/completions/pack200 @@ -1,74 +1,74 @@ # pack200(1) completion -*- shell-script -*- -_pack200() +_comp_cmd_pack200() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -S | --segment-limit | -P | --pass-file | -C | --class-attribute | \ - -F | --field-attribute | -M | --method-attribute | -D | --code-attribute | \ - '-?' | -h | --help | -V | --version | -J) + -F | --field-attribute | -M | --method-attribute | -D | \ + --code-attribute | '-?' | -h | --help | -V | --version | -J) return ;; -E | --effort) - COMPREPLY=($(compgen -W '{0..9}' -- "$cur")) + _comp_compgen -- -W '{0..9}' return ;; -H | --deflate-hint) - COMPREPLY=($(compgen -W 'true false keep' -- "$cur")) + _comp_compgen -- -W 'true false keep' return ;; -m | --modification-time) - COMPREPLY=($(compgen -W 'latest keep' -- "$cur")) + _comp_compgen -- -W 'latest keep' return ;; -U | --unknown-attribute) - COMPREPLY=($(compgen -W 'error strip pass' -- "$cur")) + _comp_compgen -- -W 'error strip pass' return ;; -f | --config-file) - _filedir properties + _comp_compgen_filedir properties return ;; -l | --log-file) - COMPREPLY=($(compgen -W '-' -- "$cur")) - _filedir log + _comp_compgen -- -W '-' + _comp_compgen -a filedir log return ;; -r | --repack) - _filedir jar + _comp_compgen_filedir jar return ;; esac - $split && return + [[ $was_split ]] && return # Check if a pack or a jar was already given. - local i pack=false jar=false - for ((i = 1; i < ${#words[@]} - 1; i++)); do + local i pack="" jar="" + for ((i = 1; i < cword; i++)); do case ${words[i]} in - *.pack | *.pack.gz) pack=true ;; - *.jar) jar=true ;; + *.pack | *.pack.gz) pack=set ;; + *.jar) jar=set ;; esac done - if ! $pack; then + if [[ ! $pack ]]; then if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--no-gzip --gzip --strip-debug + _comp_compgen -- -W '--no-gzip --gzip --strip-debug --no-keep-file-order --segment-limit= --effort= --deflate-hint= --modification-time= --pass-file= --unknown-attribute= --class-attribute= --field-attribute= --method-attribute= --code-attribute= --config-file= --verbose --quiet --log-file= - --help --version -J --repack' -- "$cur")) + --help --version -J --repack' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - _filedir 'pack?(.gz)' + _comp_compgen_filedir 'pack?(.gz)' fi - elif ! $jar; then - _filedir jar + elif [[ ! $jar ]]; then + _comp_compgen_filedir jar fi } && - complete -F _pack200 pack200 + complete -F _comp_cmd_pack200 pack200 # ex: filetype=sh diff --git a/completions/passwd b/completions/passwd index 652a41e..b34a1e7 100644 --- a/completions/passwd +++ b/completions/passwd @@ -1,24 +1,26 @@ # passwd(1) completion -*- shell-script -*- -_passwd() +_comp_cmd_passwd() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[nxwi]*)' + # shellcheck disable=SC2254 case $prev in - --minimum | --maximum | --warning | --inactive | --help | --usage | -!(-*)[nxwi?]) + --minimum | --maximum | --warning | --inactive | --help | --usage | \ + -${noargopts}[nxwi?]) return ;; esac if [[ $cur == -* ]]; then - local opts=$(_parse_help "$1") - COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage return fi - _allowed_users + _comp_compgen_allowed_users } && - complete -F _passwd passwd + complete -F _comp_cmd_passwd passwd # ex: filetype=sh diff --git a/completions/patch b/completions/patch index e883d9c..bba184c 100644 --- a/completions/patch +++ b/completions/patch @@ -1,70 +1,71 @@ # patch(1) completion -*- shell-script -*- -_patch() +_comp_cmd_patch() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[pDBYzgFiorVd]*)' + # shellcheck disable=SC2254 case $prev in --strip | --ifdef | --prefix | --basename-prefix | --suffix | --get | \ - -!(-*)[pDBYzg]) + -${noargopts}[pDBYzg]) return ;; - --fuzz | -!(-*)F) - COMPREPLY=($(compgen -W '{0..3}' -- "$cur")) + --fuzz | -${noargopts}F) + _comp_compgen -- -W '{0..3}' return ;; - --input | -!(-*)i) - _filedir '@(?(d)patch|dif?(f))' + --input | -${noargopts}i) + _comp_compgen_filedir '@(?(d)patch|dif?(f))' return ;; - --output | --reject-file | -!(-*)[or]) + --output | --reject-file | -${noargopts}[or]) [[ ! $cur || $cur == - ]] && COMPREPLY=(-) - _filedir + _comp_compgen -a filedir return ;; --quoting-style) - COMPREPLY=($(compgen -W 'literal shell shell-always c escape' \ - -- "$cur")) + _comp_compgen -- -W 'literal shell shell-always c escape' return ;; - --version-control | -!(-*)V) - COMPREPLY=($(compgen -W 'simple numbered existing' -- "$cur")) + --version-control | -${noargopts}V) + _comp_compgen -- -W 'simple numbered existing' return ;; - --directory | -!(-*)d) - _filedir -d + --directory | -${noargopts}d) + _comp_compgen_filedir -d return ;; --reject-format) - COMPREPLY=($(compgen -W 'context unified' -- "$cur")) + _comp_compgen -- -W 'context unified' return ;; --read-only) - COMPREPLY=($(compgen -W 'ignore warn fail' -- "$cur")) + _comp_compgen -- -W 'ignore warn fail' return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - local args - _count_args - case $args in + local REPLY + _comp_count_args + case $REPLY in 1) - _filedir + _comp_compgen_filedir ;; 2) - _filedir '@(?(d)patch|dif?(f))' + _comp_compgen_filedir '@(?(d)patch|dif?(f))' ;; esac } && - complete -F _patch patch + complete -F _comp_cmd_patch patch # ex: filetype=sh diff --git a/completions/pdftoppm b/completions/pdftoppm new file mode 100644 index 0000000..ac97b41 --- /dev/null +++ b/completions/pdftoppm @@ -0,0 +1,35 @@ +# bash completion for pdftoppm(1) -*- shell-script -*- + +_comp_cmd_pdftoppm() +{ + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + + case $prev in + -[flrxyWH] | -r[xy] | -scale?(-to-[xy]) | -jpegopt | -[ou]pw) + return + ;; + -tiffcompression) + _comp_compgen -- -W 'none packbits jpeg lzw deflate' + return + ;; + -freetype | -aa | -aaVector) + _comp_compgen -- -W 'yes no' + return + ;; + -thinlinemode) + _comp_compgen -- -W 'none solid shape' + return + ;; + esac + + if [[ $cur == -* ]]; then + _comp_compgen_help + return + fi + + [[ $prev == *.pdf ]] || _comp_compgen_filedir pdf +} && + complete -F _comp_cmd_pdftoppm pdftoppm + +# ex: filetype=sh diff --git a/completions/pdftotext b/completions/pdftotext index a3501ba..a99fd40 100644 --- a/completions/pdftotext +++ b/completions/pdftotext @@ -1,39 +1,40 @@ # bash completion for pdftotext(1) -*- shell-script -*- -_pdftotext() +_comp_cmd_pdftotext() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in - -h | -help | --help | -'?' | -f | -l | -r | -x | -y | -W | -H | -fixed | -opw | -upw) + -h | -help | --help | -'?' | -f | -l | -r | -x | -y | -W | -H | \ + -fixed | -opw | -upw) return ;; -enc) - COMPREPLY=($(compgen -W '$("$1" -listenc 2>/dev/null | - command sed -e 1d)' -- "$cur")) + _comp_compgen_split -- "$("$1" -listenc 2>/dev/null | + command sed -e 1d)" return ;; -eol) - COMPREPLY=($(compgen -W "unix dos mac" -- "$cur")) + _comp_compgen -- -W "unix dos mac" return ;; esac if [[ $cur == -* && ${prev,,} != *.pdf ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi case ${prev,,} in - | *.txt) ;; *.pdf) - COMPREPLY=($(compgen -W '-' -- "$cur")) - _filedir txt + _comp_compgen -- -W '-' + _comp_compgen -a filedir txt ;; - *) _filedir pdf ;; + *) _comp_compgen_filedir pdf ;; esac } && - complete -F _pdftotext pdftotext + complete -F _comp_cmd_pdftotext pdftotext # ex: filetype=sh diff --git a/completions/perl b/completions/perl index 9823d73..9b82777 100644 --- a/completions/perl +++ b/completions/perl @@ -1,17 +1,16 @@ # bash completion for perl -*- shell-script -*- -_perl_helper() +_comp_cmd_perl__helper() { - COMPREPLY=($(compgen -P "$prefix" -W \ - "$(${2:-perl} ${BASH_SOURCE[0]%/*}/../helpers/perl $1 $cur)" \ - -- "$cur")) - [[ $1 == functions ]] || __ltrim_colon_completions "$prefix$cur" + _comp_compgen_split -P "$prefix" -- "$("${1:-perl}" \ + "${BASH_SOURCE[0]%/*}/../helpers/perl" "$2" "$cur")" + [[ $2 == functions ]] || _comp_ltrim_colon_completions "$prefix$cur" } -_perl() +_comp_cmd_perl() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return local prefix="" temp optPrefix optSuffix @@ -33,36 +32,35 @@ _perl() return ;; -*[Ix]) - local IFS=$'\n' compopt -o filenames - COMPREPLY=($(compgen -d $optPrefix $optSuffix -- "$cur")) + _comp_compgen -- -d "$optPrefix" $optSuffix return ;; -*[mM]) temp="${cur#-}" - prefix+="${cur%$temp}" + prefix+=${cur%"$temp"} cur="$temp" - _perl_helper modules $1 + _comp_cmd_perl__helper "$1" modules return ;; -*V) if [[ $cur == :* ]]; then temp="${cur##+(:)}" - prefix+="${cur%$temp}" - local IFS=$'\n' - COMPREPLY=($(compgen -P "$prefix" -W \ - '$($1 -MConfig -e "print join \"\\n\", - keys %Config::Config" 2>/dev/null)' -- "$temp")) - __ltrim_colon_completions "$prefix$temp" + prefix+=${cur%"$temp"} + _comp_compgen -c "$temp" split -lP "$prefix" -- "$( + "$1" -MConfig -e 'print join "\n", + keys %Config::Config' 2>/dev/null + )" + _comp_ltrim_colon_completions "$prefix$temp" fi return ;; -*d | -*dt) if [[ $cur == :* ]]; then temp="${cur#:}" - prefix="$prefix${cur%$temp}" + prefix=$prefix${cur%"$temp"} cur="Devel::$temp" - _perl_helper modules $1 + _comp_cmd_perl__helper "$1" modules fi ;; esac @@ -71,31 +69,31 @@ _perl() # `-E' options and their arguments, e.g. `perl -e "exit 2"', is # valid syntax. However, the argument is neither a filename nor a # directory, but one line of perl program, thus do not suggest - # _filedir completion. + # _comp_compgen_filedir completion. elif [[ $prev == -e ]] || [[ $prev == -E ]]; then return # Likewise, `-I' also accepts a space between option and argument # and it takes a directory as value. elif [[ $prev == -I ]]; then - local IFS=$'\n' compopt -o filenames - COMPREPLY=($(compgen -d ${optPrefix-} ${optSuffix-} -- "$cur")) + # shellcheck disable=SC2086 + _comp_compgen -- -d ${optPrefix-} ${optSuffix-} return elif [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-C -s -T -u -U -W -X -h -v -V -c -w -d -D -p - -n -a -F -l -0 -I -m -M -P -S -x -i -e' -- "$cur")) + _comp_compgen -- -W '-C -s -T -u -U -W -X -h -v -V -c -w -d -D -p -n -a + -F -l -0 -I -m -M -P -S -x -i -e' else - _filedir + _comp_compgen_filedir fi } && - complete -F _perl perl + complete -F _comp_cmd_perl perl -_perldoc() +_comp_cmd_perldoc() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return local prefix="" temp @@ -107,40 +105,39 @@ _perldoc() prefix=$prev fi - local perl="${1%doc}" - [[ $perl == "$1" ]] || ! type $perl &>/dev/null && perl= + # Prefer `perl` in the same dir in utility functions + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH case $prev in -*[hVnoMwL]) return ;; -*d) - _filedir + _comp_compgen_filedir return ;; -*f) - _perl_helper functions $perl + _comp_cmd_perl__helper "" functions return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + _comp_compgen_help -- -h else # return available modules (unless it is clearly a file) if [[ $cur != @(*/|[.~])* ]]; then - _perl_helper perldocs $perl + _comp_cmd_perl__helper "" perldocs if [[ $cur == p* ]]; then - COMPREPLY+=($(compgen -W \ - '$(PERLDOC_PAGER=cat "$1" -u perl | \ - command sed -ne "/perl.*Perl overview/,/perlwin32/p" | \ - awk "\$NF=2 && \$1 ~ /^perl/ { print \$1 }")' \ - -- "$cur")) + _comp_compgen -a split -- "$(PERLDOC_PAGER=cat "$1" -u perl | + command sed -ne '/perl.*Perl overview/,/perlwin32/p' | + _comp_awk 'NF >= 2 && $1 ~ /^perl/ { print $1 }')" fi fi - _filedir 'p@([lm]|od)' + _comp_compgen -a filedir 'p@([lm]|od)' fi } && - complete -F _perldoc -o bashdefault perldoc + complete -F _comp_cmd_perldoc -o bashdefault perldoc # ex: filetype=sh diff --git a/completions/perlcritic b/completions/perlcritic index 7843549..d368203 100644 --- a/completions/perlcritic +++ b/completions/perlcritic @@ -1,9 +1,9 @@ # perlcritic(1) completion -*- shell-script -*- -_perlcritic() +_comp_cmd_perlcritic() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --help | --version | --top | --include | --exclude | --single-policy | \ @@ -11,41 +11,38 @@ _perlcritic() return ;; --severity) - COMPREPLY=($(compgen -W "{1..5} brutal cruel harsh stern gentle" \ - -- "$cur")) + _comp_compgen -- -W '{1..5} brutal cruel harsh stern gentle' return ;; --profile | -p) - _filedir perlcriticrc + _comp_compgen_filedir perlcriticrc return ;; --theme) - COMPREPLY=($(compgen -W '$("$1" --list-themes 2>/dev/null)' \ - -- "$cur")) + _comp_compgen_split -- "$("$1" --list-themes 2>/dev/null)" return ;; --profile-strictness) - COMPREPLY=($(compgen -W 'warn fatal quiet' -- "$cur")) + _comp_compgen -- -W 'warn fatal quiet' return ;; --verbose) - COMPREPLY=($(compgen -W '{1..11}' -- "$cur")) + _comp_compgen -- -W '{1..11}' return ;; --pager) - compopt -o filenames - COMPREPLY=($(compgen -c -- "$cur")) + _comp_compgen_commands return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage return fi - _filedir 'p[lm]' + _comp_compgen_filedir 'p[lm]' } && - complete -F _perlcritic perlcritic + complete -F _comp_cmd_perlcritic perlcritic # ex: filetype=sh diff --git a/completions/perltidy b/completions/perltidy index 4404cf8..5be5281 100644 --- a/completions/perltidy +++ b/completions/perltidy @@ -1,41 +1,49 @@ # perltidy(1) completion -*- shell-script -*- -_perltidy() +_comp_cmd_perltidy() { - local cur prev words cword - _init_completion -n = || return + local cur prev words cword comp_args + _comp_initialize -n = -- "$@" || return case $prev in -h | --help) return ;; -o) - _filedir + _comp_compgen_filedir return ;; esac case $cur in - -pro=*) - cur="${cur#*=}" - _filedir + -pro=* | --profile=*) + _comp_compgen -c "${cur#*=}" filedir return ;; - -ole=*) - COMPREPLY=($(compgen -W 'dos win mac unix' -- "${cur#*=}")) + -ole=* | --output-line-ending=*) + _comp_compgen -c "${cur#*=}" -- -W 'dos win mac unix' return ;; - -bt=* | -pt=* | -sbt=* | -bvt=* | -pvt=* | -sbvt=* | -bvtc=* | -pvtc=* | -sbvtc=* | \ - -cti=* | -kbl=* | -vt=*) - COMPREPLY=($(compgen -W '0 1 2' -- "${cur#*=}")) + -bt=* | --brace-tightness=* | -pt=* | --paren-tightness=* | \ + -sbt=* | --square-bracket-tightness=* | \ + -bvt=* | --brace-vertical-tightness=* | \ + -pvt=* | --paren-vertical-tightness=* | \ + -sbvt=* | --square-bracket-vertical-tightness=* | \ + -bvtc=* | --brace-vertical-tightness-closing=* | \ + -pvtc=* | --paren-vertical-tightness-closing=* | \ + -sbvtc=* | --square-bracket-vertical-tightness-closing=* | \ + -cti=* | --closing-token-indentation=* | \ + -kbl=* | --keep-old-blank-lines=* | \ + -vt=* | --vertical-tightness=*) + _comp_compgen -c "${cur#*=}" -- -W '0 1 2' return ;; - -vtc=*) - COMPREPLY=($(compgen -W '0 1' -- "${cur#*=}")) + -vtc=* | --vertical-tightness-closing=*) + _comp_compgen -c "${cur#*=}" -- -W '0 1' return ;; - -cab=*) - COMPREPLY=($(compgen -W '0 1 2 3' -- "${cur#*=}")) + -cab=* | --comma-arrow-breakpoints=*) + _comp_compgen -c "${cur#*=}" -- -W '0 1 2 3' return ;; -*=) @@ -44,12 +52,12 @@ _perltidy() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - _filedir 'p[lm]|t' + _comp_compgen_filedir 'p[lm]|t' fi } && - complete -F _perltidy perltidy + complete -F _comp_cmd_perltidy perltidy # ex: filetype=sh diff --git a/completions/pgrep b/completions/pgrep index 62dbb65..d4402f5 100644 --- a/completions/pgrep +++ b/completions/pgrep @@ -1,62 +1,60 @@ # pgrep(1) and pkill(1) completion -*- shell-script -*- -_pgrep() +_comp_cmd_pgrep() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[cdgJMNstTzFGPuU]*)' + # shellcheck disable=SC2254 case $prev in - --delimiter | --pgroup | --session | --terminal | -!(-*)[cdgJMNstTz]) + --delimiter | --pgroup | --session | --terminal | -${noargopts}[cdgJMNstTz]) return ;; --signal) - _signals + _comp_compgen_signals return ;; - --pidfile | -!(-*)F) - _filedir + --pidfile | -${noargopts}F) + _comp_compgen_filedir return ;; - --group | -!(-*)G) - _gids + --group | -${noargopts}G) + _comp_compgen_gids return ;; -j) - COMPREPLY=($(compgen -W 'any none' -- "$cur")) + _comp_compgen -- -W 'any none' return ;; - --parent | --ns | -!(-*)P) - _pids + --parent | --ns | -${noargopts}P) + _comp_compgen_pids return ;; - --euid | --uid | -!(-*)[uU]) - _uids + --euid | --uid | -${noargopts}[uU]) + _comp_compgen_uids return ;; --nslist) - local prefix= - [[ $cur == *,* ]] && prefix="${cur%,*}," - COMPREPLY=( - $(IFS="$IFS," compgen -W '$($1 --help 2>&1 | - command sed -ne "s/^[[:space:]]*Available namespaces://p")' \ - -- "${cur##*,}")) - ((${#COMPREPLY[@]} == 1)) && COMPREPLY=(${COMPREPLY/#/$prefix}) + _comp_compgen -c "${cur##*,}" split -F $' \t\n,' -- "$( + "$1" --help 2>&1 | + command sed -ne 's/^[[:space:]]*Available namespaces://p' + )" && + _comp_delimited , -W '"${COMPREPLY[@]}"' return ;; esac if [[ $cur == -* ]]; then - local help=$(_parse_help "$1") - [[ $help ]] || help='$("$1" --usage 2>&1 | - command sed -e "s/\[-signal\]//" -e "s/\[-SIGNAL\]//" | - _parse_usage -)' - COMPREPLY=($(compgen -W "$help" -- "$cur")) - [[ $cword -eq 1 && $1 == *pkill ]] && _signals - + _comp_compgen_help || + _comp_compgen_usage - <<<"$("$1" --usage 2>&1 | + command sed -e "s/\[-signal\]//" -e "s/\[-SIGNAL\]//")" + [[ $cword -eq 1 && $1 == *pkill ]] && _comp_compgen -a signals - return fi - _pnames -s + _comp_compgen_pnames -s } && - complete -F _pgrep pgrep pkill + complete -F _comp_cmd_pgrep pgrep pkill # ex: filetype=sh diff --git a/completions/pidof b/completions/pidof index a11b432..d413d6f 100644 --- a/completions/pidof +++ b/completions/pidof @@ -1,27 +1,29 @@ # pidof(8) completion -*- shell-script -*- -_pidof() +_comp_cmd_pidof() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[o]*)' + # shellcheck disable=SC2254 case $prev in - --help | -V | --version | -!(-*)[hV]*) + --help | -V | --version | -${noargopts}[hV]*) return ;; - --omit-pid | -!(-*)o) - _pids + --omit-pid | -${noargopts}o) + _comp_compgen_pids return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - _pnames + _comp_compgen_pnames } && - complete -F _pidof pidof + complete -F _comp_cmd_pidof pidof # ex: filetype=sh diff --git a/completions/pine b/completions/pine index 319c8d5..6844db0 100644 --- a/completions/pine +++ b/completions/pine @@ -1,32 +1,32 @@ # pine/alpine completion -*- shell-script -*- -_pine() +_comp_cmd_pine() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -help | -d | -f | -c | -I | -n | -url | -copy_pinerc | -copy_abook) return ;; - -attach | -attachlist | -attach_and_delete | -p | -P | -pinerc | -passfile | -x) - _filedir + -attach | -attachlist | -attach_and_delete | -p | -P | -pinerc | \ + -passfile | -x) + _comp_compgen_filedir return ;; -sort) - COMPREPLY=($(compgen -W 'arrival subject threaded orderedsubject - date from size score to cc' -- "$cur")) + _comp_compgen -- -W 'arrival subject threaded orderedsubject date + from size score to cc' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + _comp_compgen_help -- -h else - COMPREPLY=($(compgen -W '$(awk "{print \$1}" ~/.addressbook \ - 2>/dev/null)' -- "$cur")) + _comp_compgen_split -- "$(_comp_awk '{print $1}' ~/.addressbook 2>/dev/null)" fi } && - complete -F _pine pine alpine + complete -F _comp_cmd_pine pine alpine # ex: filetype=sh diff --git a/completions/ping b/completions/ping index 446f026..44c0888 100644 --- a/completions/ping +++ b/completions/ping @@ -1,9 +1,9 @@ # ping(8) completion -*- shell-script -*- -_ping() +_comp_cmd_ping() { - local cur prev words cword - _init_completion -n = || return + local cur prev words cword comp_args + _comp_initialize -n = -- "$@" || return local ipvx @@ -12,21 +12,21 @@ _ping() return ;; -*I) - _available_interfaces -a + _comp_compgen_available_interfaces -a return ;; -*M) # Path MTU strategy in Linux, mask|time in FreeBSD local opts="do want dont" [[ $OSTYPE == *bsd* ]] && opts="mask time" - COMPREPLY=($(compgen -W '$opts' -- "$cur")) + _comp_compgen -- -W '$opts' return ;; -*N) if [[ $cur != *= ]]; then - COMPREPLY=($(compgen -W 'name ipv6 ipv6-global ipv6-sitelocal + _comp_compgen -- -W 'name ipv6 ipv6-global ipv6-sitelocal ipv6-linklocal ipv6-all ipv4 ipv4-all subject-ipv6= - subject-ipv4= subject-name= subject-fqdn=' -- "$cur")) + subject-ipv4= subject-name= subject-fqdn=' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi return @@ -34,19 +34,19 @@ _ping() -*Q) # TOS in Linux, "somewhat quiet" (no args) in FreeBSD if [[ $OSTYPE != *bsd* ]]; then - COMPREPLY=($(compgen -W '{0..7}' -- "$cur")) + _comp_compgen -- -W '{0..7}' return fi ;; -*S) # Socket sndbuf in Linux, source IP in FreeBSD - [[ $OSTYPE == *bsd* ]] && _ip_addresses + [[ $OSTYPE == *bsd* ]] && _comp_compgen_ip_addresses return ;; -*T) # Timestamp option in Linux, TTL in FreeBSD [[ $OSTYPE == *bsd* ]] || - COMPREPLY=($(compgen -W 'tsonly tsandaddr' -- "$cur")) + _comp_compgen -- -W 'tsonly tsandaddr' return ;; -*4*) @@ -58,14 +58,14 @@ _ping() esac if [[ $cur == -* ]]; then - local opts=$(_parse_help "$1") - COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage return fi [[ $1 == *6 ]] && ipvx=-6 - _known_hosts_real ${ipvx-} -- "$cur" + [[ $1 == *4 ]] && ipvx=-4 + _comp_compgen_known_hosts ${ipvx-} -- "$cur" } && - complete -F _ping ping ping6 + complete -F _comp_cmd_ping ping ping4 ping6 # ex: filetype=sh diff --git a/completions/pkg-config b/completions/pkg-config index b9db167..489f477 100644 --- a/completions/pkg-config +++ b/completions/pkg-config @@ -1,9 +1,9 @@ # bash completion for pkgconfig -*- shell-script -*- -_pkg_config() +_comp_cmd_pkg_config() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in --define-variable | --atleast-version | --atleast-pkgconfig-version | \ @@ -15,9 +15,9 @@ _pkg_config() local word for word in "${words[@]:1}"; do if [[ $word != -* ]]; then - COMPREPLY=($(compgen -W \ - '$("$1" $word --print-variables 2>/dev/null)' \ - -- "$cur")) + _comp_compgen_split -- "$( + "$1" "$word" --print-variables 2>/dev/null + )" break fi done @@ -29,17 +29,17 @@ _pkg_config() ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - COMPREPLY=($(compgen -W "$($1 --list-all \ - 2>/dev/null | awk '{print $1}')" -- "$cur")) - _filedir pc + _comp_compgen_split -- "$("$1" --list-all 2>/dev/null | + _comp_awk '{print $1}')" + _comp_compgen -a filedir pc fi } && - complete -F _pkg_config pkg-config + complete -F _comp_cmd_pkg_config pkg-config pkgconf # ex: filetype=sh diff --git a/completions/pkg-get b/completions/pkg-get index 72bd0a0..a8ec1a8 100644 --- a/completions/pkg-get +++ b/completions/pkg-get @@ -2,10 +2,10 @@ # # Copyright 2006 Yann Rouillard <yann@opencsw.org> -_pkg_get_get_catalog_file() +_comp_cmd_pkg_get__catalog_file() { local url="$1" - local catalog_file i conffile + local i conffile for file in /etc/opt/csw/pkg-get.conf /opt/csw/etc/pkg-get.conf /etc/pkg-get.conf; do if [[ -f $file ]]; then @@ -15,19 +15,17 @@ _pkg_get_get_catalog_file() done conffile="${conffile:-/opt/csw/etc/pkg-get.conf}" - if [[ -z $url ]]; then - url=$(awk -F= ' $1=="url" { print $2 }' $conffile) + if [[ ! $url ]]; then + url=$(_comp_awk -F = ' $1=="url" { print $2 }' "$conffile") fi - catalog_file="${url##*//}" - catalog_file="${catalog_file%%/*}" - catalog_file="/var/pkg-get/catalog-$catalog_file" - - echo "$catalog_file" + REPLY="${url##*//}" + REPLY="${REPLY%%/*}" + REPLY="/var/pkg-get/catalog-$REPLY" } && - _pkg_get() + _comp_cmd_pkg_get() { - local cur prev file catalog_file url command + local cur prev file url command="" COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD - 1]}" @@ -46,27 +44,29 @@ _pkg_get_get_catalog_file() fi done - if [[ -v command ]]; then + if [[ $command ]]; then if [[ $command == @(-[Ddi]|describe|download|install) ]]; then - catalog_file=$(_pkg_get_get_catalog_file "$url") - if [[ -f $catalog_file ]]; then - local packages_list=$(awk ' $0 ~ /BEGIN PGP SIGNATURE/ { exit } $1 ~ /^Hash:/ || $1 ~ /^ *(-|#|$)/ { next } { print $1 }' $catalog_file) - COMPREPLY=($(compgen -W "${packages_list}" -- ${cur})) + local REPLY + _comp_cmd_pkg_get__catalog_file "$url" + if [[ -f $REPLY ]]; then + local packages_list=$(_comp_awk '$0 ~ /BEGIN PGP SIGNATURE/ { exit } $1 ~ /^Hash:/ || $1 ~ /^ *(-|#|$)/ { next } { print $1 }' "$REPLY") + _comp_compgen -- -W "${packages_list}" fi fi return fi if [[ ${cur} == -* ]]; then - local opts="-c -d -D -f -i -l -s -S -u -U -v" - COMPREPLY=($(compgen -W "${opts}" -- ${cur})) + local -a opts=(-c -d -D -f -i -l -s -S -u -U -v) + _comp_compgen -- -W '"${opts[@]}"' return fi - local commands="available describe download install list \ - updatecatalog upgrade" - COMPREPLY=($(compgen -W "${commands}" -- ${cur})) + local -a commands=( + available describe download install list updatecatalog upgrade + ) + _comp_compgen -- -W '"${commands[@]}"' } && - complete -F _pkg_get pkg-get + complete -F _comp_cmd_pkg_get pkg-get # ex: filetype=sh diff --git a/completions/pkg_delete b/completions/pkg_delete index 2abb671..aecc8e8 100644 --- a/completions/pkg_delete +++ b/completions/pkg_delete @@ -1,18 +1,19 @@ # bash completion for *BSD package management tools -*- shell-script -*- -_pkg_delete() +_comp_cmd_pkg_delete() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local pkgdir=${PKG_DBDIR:-/var/db/pkg}/ [[ $prev == -o || $prev == -p || $prev == -W ]] && return - COMPREPLY=($(compgen -d -- "$pkgdir$cur")) - ((${#COMPREPLY[@]} == 0)) || COMPREPLY=(${COMPREPLY[@]#$pkgdir}) + _comp_compgen -c "$pkgdir$cur" -- -d + ((${#COMPREPLY[@]} == 0)) || COMPREPLY=("${COMPREPLY[@]#"$pkgdir"}") } && - complete -F _pkg_delete -o dirnames pkg_delete pkg_info pkg_deinstall + complete -F _comp_cmd_pkg_delete -o dirnames \ + pkg_delete pkg_info pkg_deinstall # ex: filetype=sh diff --git a/completions/pkgadd b/completions/pkgadd index 3f5b6a1..bdb9c42 100644 --- a/completions/pkgadd +++ b/completions/pkgadd @@ -2,10 +2,10 @@ # # Copyright 2006 Yann Rouillard <yann@opencsw.org> -_pkgadd() +_comp_cmd_pkgadd() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return # if a device directory was given # we must complete with the package @@ -23,40 +23,39 @@ _pkgadd() case $prev in -d) - _filedir pkg - _filedir -d + _comp_compgen_filedir pkg ;; -a | -r | -V) - _filedir + _comp_compgen_filedir ;; -k | -s | -R) - _filedir -d + _comp_compgen_filedir -d ;; -P | -x) ;; *) if [[ ${cur} == -* ]]; then - local opts="-a -A -d -k -n -M -P -r -R -s -v -V -x" - COMPREPLY=($(compgen -W "${opts}" -- ${cur})) + local -a opts=(-a -A -d -k -n -M -P -r -R -s -v -V -x) + _comp_compgen -- -W '"${opts[@]}"' else - local pkginst_list + local -a pkginst_list if [[ -d $device ]]; then - local -a tmplist - for filedir in $(/bin/ls -1 $device); do - if [[ -d "$device/$filedir" ]] && [[ -f "$device/$filedir/pkginfo" ]]; then - tmplist+=(${tmplist[@]:-} "$filedir") - fi - done - pkginst_list="${tmplist[*]}" + if _comp_expand_glob pkginst_list '"$device"/*/pkginfo'; then + pkginst_list=("${pkginst_list[@]#"$device/"}") + pkginst_list=("${pkginst_list[@]%/pkginfo}") + fi else - pkginst_list="$(strings "$(dequote $device)" | - command grep ^PKG= | sort -u | cut -d= -f2)" + local REPLY + _comp_dequote "$device" + _comp_split -l pkginst_list "$(strings "${REPLY-}" | + command sed -n 's/^PKG=//p' | sort -u)" fi - COMPREPLY=($(compgen -W "$pkginst_list" -- ${cur})) + ((${#pkginst_list[@]})) && + _comp_compgen -- -W '"${pkginst_list[@]}"' fi ;; esac } && - complete -F _pkgadd pkgadd + complete -F _comp_cmd_pkgadd pkgadd # ex: filetype=sh diff --git a/completions/pkgrm b/completions/pkgrm index 2449d34..bb5327e 100644 --- a/completions/pkgrm +++ b/completions/pkgrm @@ -1,11 +1,11 @@ -# pkgrm completion -*- shell-script -*- +# pkgrm completion -*- shell-script -*- # # Copyright 2006 Yann Rouillard <yann@opencsw.org> -_pkgrm() +_comp_cmd_pkgrm() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return # if a spool directory was given # we must complete with the package @@ -24,23 +24,23 @@ _pkgrm() case $prev in -a | -V) - _filedir + _comp_compgen_filedir ;; -s | -R) - _filedir -d + _comp_compgen_filedir -d ;; -Y) ;; *) if [[ ${cur} == -* ]]; then local opts="-a -A -n -M -R -s -v -V -Y" - COMPREPLY=($(compgen -W "${opts}" -- ${cur})) + _comp_compgen -- -W "${opts}" else - COMPREPLY=($(compgen -W "$(/bin/ls -1 $spool)" -- ${cur})) + _comp_compgen_split -- "$(/bin/ls -1 "$spool")" fi ;; esac } && - complete -F _pkgrm pkgrm + complete -F _comp_cmd_pkgrm pkgrm # ex: filetype=sh diff --git a/completions/pkgtool b/completions/pkgtool index 951bae4..faf0130 100644 --- a/completions/pkgtool +++ b/completions/pkgtool @@ -1,13 +1,13 @@ # Slackware Linux pkgtool completion -*- shell-script -*- -_pkgtool() +_comp_cmd_pkgtool() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case "$prev" in --source_dir | --target_dir) - _filedir -d + _comp_compgen_filedir -d return ;; --sets) @@ -15,21 +15,20 @@ _pkgtool() return ;; --source_device) - COMPREPLY=($(compgen -f -d -- "${cur:-/dev/}")) + _comp_compgen -c "${cur:-/dev/}" -- -f -d return ;; --tagfile) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--sets --ignore-tagfiles --tagfile - --source-mounted --source_dir --target_dir --source_device' \ - -- "$cur")) + _comp_compgen -- -W '--sets --ignore-tagfiles --tagfile + --source-mounted --source_dir --target_dir --source_device' fi } && - complete -F _pkgtool pkgtool + complete -F _comp_cmd_pkgtool pkgtool # ex: filetype=sh diff --git a/completions/pkgutil b/completions/pkgutil index 91d8748..63dc400 100644 --- a/completions/pkgutil +++ b/completions/pkgutil @@ -1,7 +1,7 @@ -# pkgutil completion -*- shell-script -*- +# pkgutil completion -*- shell-script -*- # Copyright 2006 Yann Rouillard <yann@opencsw.org> -_pkgutil_url2catalog() +_comp_cmd_pkgutil__url2catalog() { local filename="$1" @@ -9,44 +9,50 @@ _pkgutil_url2catalog() filename="${filename//\//_}" filename="/var/opt/csw/pkgutil/catalog.${filename}_$(uname -p)_$(uname -r)" - echo "$filename" + REPLY=$filename } -_pkgutil() +_comp_cmd_pkgutil() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return - local command catalog_files configuration_files - declare -a configuration_files=("/opt/csw/etc/pkgutil.conf" "/etc/opt/csw/pkgutil.conf") - declare -a catalog_files=() + local command="" catalog_files configuration_files + local -a configuration_files=( + "/opt/csw/etc/pkgutil.conf" "/etc/opt/csw/pkgutil.conf") + local -a catalog_files=() - local i=$cword + local i=$cword REPLY while ((i-- > 1)); do if [[ ${words[i]} == -@(t|-temp) ]]; then local url="${words[i + 1]}" - local catalog=$(_pkgutil_url2catalog "$url") - catalog_files=("$catalog") + _comp_cmd_pkgutil__url2catalog "$url" + catalog_files=("$REPLY") elif [[ ${words[i]} == --config ]]; then - configuration_files=("$(dequote ${words[i + 1]})") + local REPLY + _comp_dequote "${words[i + 1]}" + [[ ${REPLY-} ]] && configuration_files=("$REPLY") elif [[ ${words[i]} == -@([iurdacUS]|-install|-upgrade|-remove|-download|-available|-compare|-catalog|-stream) ]]; then command="${words[i]}" fi done if [[ $prev == -@([WPR]|-workdir|-pkgdir|-rootpath) ]]; then - _filedir -d + _comp_compgen_filedir -d return fi if [[ $prev == -@(o|-output|-config) ]]; then - _filedir + _comp_compgen_filedir return fi if [[ $prev == -@(p|-param) ]]; then compopt -o nospace - COMPREPLY=($(compgen -W "mirror: pkgaddopts: pkgrmopts: wgetopts: use_gpg: use_md5: pkgliststyle: maxpkglist: noncsw: stop_on_hook_soft_error: exclude_pattern: gpg_homedir: root_path: deptree_filter_common: show_current: catalog_not_cached: catalog_update:" -- $cur)) + _comp_compgen -- -W 'mirror: pkgaddopts: pkgrmopts: wgetopts: use_gpg: + use_md5: pkgliststyle: maxpkglist: noncsw: stop_on_hook_soft_error: + exclude_pattern: gpg_homedir: root_path: deptree_filter_common: + show_current: catalog_not_cached: catalog_update:' return fi @@ -55,7 +61,8 @@ _pkgutil() # as a separator, borrowed from maven completion code which borrowed # it from darcs completion code :) local colonprefixes=${cur%"${cur##*:}"} - COMPREPLY=($(compgen -W "sparc:5.9 sparc:5.10 sparc:5.11 i386:5.9 i386:5.10 i386:5.11" -- $cur)) + _comp_compgen -- -W 'sparc:5.9 sparc:5.10 sparc:5.11 i386:5.9 i386:5.10 + i386:5.11' local i=${#COMPREPLY[*]} while ((i-- > 0)); do COMPREPLY[i]=${COMPREPLY[i]#"$colonprefixes"} @@ -63,33 +70,42 @@ _pkgutil() return fi - if [[ -v command && $cur != -* ]]; then + if [[ $command && $cur != -* ]]; then local mirrors mirror_url - mirrors=$(awk -F= ' $1 ~ /^ *mirror *$/ { print $2 }' "${configuration_files[@]}") + mirrors=$(_comp_awk -F = ' $1 ~ /^ *mirror *$/ { print $2 }' "${configuration_files[@]}") mirrors=${mirrors:-http://mirror.opencsw.org/opencsw/testing} for mirror_url in $mirrors; do - local catalog=$(_pkgutil_url2catalog "$mirror_url") - catalog_files=("${catalog_files[@]}" "$catalog") + _comp_cmd_pkgutil__url2catalog "$mirror_url" + catalog_files+=("$REPLY") done if [[ $command == -@([dius]|-download|-install|-upgrade|-stream) ]]; then - local packages_list=$(awk ' $0 ~ /BEGIN PGP SIGNATURE/ { exit } $1 ~ /^Hash:/ || $1 ~ /^ *(-|#|$)/ { next } { print $1 }' "${catalog_files[@]}") - COMPREPLY=($(compgen -W "${packages_list}" -- $cur)) + local packages_list=$(_comp_awk ' $0 ~ /BEGIN PGP SIGNATURE/ { exit } $1 ~ /^Hash:/ || $1 ~ /^ *(-|#|$)/ { next } { print $1 }' "${catalog_files[@]}") + _comp_compgen -- -W "${packages_list}" elif [[ $command == @(-r|--remove) ]]; then - local packages_list=$(pkginfo | awk ' $2 ~ /^CSW/ { printf ("%s|",$2) }') + local packages_list=$( + pkginfo | _comp_awk ' $2 ~ /^CSW/ { printf ("%s|",$2) }' + ) packages_list=${packages_list%|} packages_list=$(nawk " \$3 ~ /^$packages_list\$/ { print \$1 }" "${catalog_files[@]}") - COMPREPLY=($(compgen -W "${packages_list}" -- $cur)) + _comp_compgen -- -W "${packages_list}" fi return fi - local commands="-i --install -u --upgrade -r --remove -d --download -U --catalog -a --available --describe -c --compare -C --compare-diff -A --compare-avail -e --email -t --temp -x --exclude -W --workdir -P --pkgdir -R --rootpath --config -y --yes -f --force -n --nomod -N --nodeps -D --debug --trace -h --help -v --version -V --syscheck -l --list -L --listfile -F --findfile --deptree --extract -s --stream -o --output -T --target --single -p --param --parse --cleanup --catinfo" - COMPREPLY=($(compgen -W "${commands}" -- $cur)) + local -a commands=( + --install --upgrade --remove --download --catalog --available + --describe --compare --compare-diff --compare-avail --email --temp + --exclude --workdir --pkgdir --rootpath --config --yes --force --nomod + --nodeps --debug --trace --help --version --syscheck --list --listfile + --findfile --deptree --extract --stream --output --target --single + --param --parse --cleanup --catinfo + ) + _comp_compgen -- -W '"${commands[@]}"' } && - complete -F _pkgutil pkgutil + complete -F _comp_cmd_pkgutil pkgutil # ex: filetype=sh diff --git a/completions/plague-client b/completions/plague-client index 4e98206..cec0b6c 100644 --- a/completions/plague-client +++ b/completions/plague-client @@ -1,14 +1,14 @@ # bash completion for plague-client -*- shell-script -*- -_plague_client() +_comp_cmd_plague_client() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return ((cword == 1)) && - COMPREPLY=($(compgen -W 'build detail finish help is_paused kill list - list_builders pause requeue unpause update_builders' -- "$cur")) + _comp_compgen -- -W 'build detail finish help is_paused kill list + list_builders pause requeue unpause update_builders' } && - complete -F _plague_client plague-client + complete -F _comp_cmd_plague_client plague-client # ex: filetype=sh diff --git a/completions/pm-hibernate b/completions/pm-hibernate index ea3b0aa..26c304b 100644 --- a/completions/pm-hibernate +++ b/completions/pm-hibernate @@ -1,12 +1,13 @@ # bash completion for pm-utils -*- shell-script -*- -_pm_action() +_comp_cmd_pm_hibernate() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - COMPREPLY=($(compgen -W "--help $(_parse_help "$1")" -- "$cur")) + _comp_compgen_help + _comp_compgen -a -- -W '--help' } && - complete -F _pm_action pm-hibernate pm-suspend pm-suspend-hybrid + complete -F _comp_cmd_pm_hibernate pm-hibernate pm-suspend pm-suspend-hybrid # ex: filetype=sh diff --git a/completions/pm-is-supported b/completions/pm-is-supported index adc7fde..f909fe4 100644 --- a/completions/pm-is-supported +++ b/completions/pm-is-supported @@ -1,13 +1,12 @@ # pm-is-supported(1) completion -*- shell-script -*- -_pm_is_supported() +_comp_cmd_pm_is_supported() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - COMPREPLY=($(compgen -W '--help --suspend --hibernate --suspend-hybrid' \ - -- "$cur")) + _comp_compgen -- -W '--help --suspend --hibernate --suspend-hybrid' } && - complete -F _pm_is_supported pm-is-supported + complete -F _comp_cmd_pm_is_supported pm-is-supported # ex: filetype=sh diff --git a/completions/pm-powersave b/completions/pm-powersave index affb195..0db0ddc 100644 --- a/completions/pm-powersave +++ b/completions/pm-powersave @@ -1,12 +1,12 @@ # pm-powersave(8) completion -*- shell-script -*- -_pm_powersave() +_comp_cmd_pm_powersave() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - COMPREPLY=($(compgen -W "true false" -- "$cur")) + _comp_compgen -- -W "true false" } && - complete -F _pm_powersave pm-powersave + complete -F _comp_cmd_pm_powersave pm-powersave # ex: filetype=sh diff --git a/completions/pngfix b/completions/pngfix index 64b5481..d77d80b 100644 --- a/completions/pngfix +++ b/completions/pngfix @@ -1,36 +1,35 @@ # pngfix completion -*- shell-script -*- -_pngfix() +_comp_cmd_pngfix() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in --suffix | --prefix) return ;; --output) - _filedir + _comp_compgen_filedir return ;; --strip) - COMPREPLY=($(IFS='|' compgen -W '$("$1" --help 2>&1 | - command sed -ne "s/.*--strip=\[\([^]]*\)\].*/\1/p")' \ - -- "$cur")) + _comp_compgen_split -F '|' -- "$("$1" --help 2>&1 | + command sed -ne 's/.*--strip=\[\([^]]*\)\].*/\1/p')" return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir png + _comp_compgen_filedir png } && - complete -F _pngfix pngfix + complete -F _comp_cmd_pngfix pngfix # ex: filetype=sh diff --git a/completions/portinstall b/completions/portinstall index 8033740..dc1a933 100644 --- a/completions/portinstall +++ b/completions/portinstall @@ -1,31 +1,28 @@ # bash completion for FreeBSD portinstall -*- shell-script -*- -_portinstall() +_comp_cmd_portinstall() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - local portsdir indexfile - local -a COMPREPLY2 + [[ $prev == -l || $prev == -L || $prev == -o ]] && return - portsdir=${PORTSDIR:-/usr/ports}/ + local -x portsdir=${PORTSDIR:-/usr/ports}/ # First try INDEX-5 - indexfile=$portsdir/INDEX-5 + local indexfile=$portsdir/INDEX-5 # Then INDEX if INDEX-5 does not exist or system is not FreeBSD 5.x [[ ${OSTYPE%.*} == freebsd5 && -f $indexfile ]] || indexfile=$portsdir/INDEX + [[ -f $indexfile && -r $indexfile ]] || return - [[ $prev == -l || $prev == -L || $prev == -o ]] && return - - COMPREPLY=($(command grep -E "^$cur" 2>/dev/null <$indexfile | - cut -d'|' -f1)) - COMPREPLY2=($(command grep -E "^[^\|]+\|$portsdir$cur" 2>/dev/null \ - <$indexfile | cut -d'|' -f2)) - COMPREPLY2=(${COMPREPLY2[@]#$portsdir}) - COMPREPLY+=("${COMPREPLY2[@]}") + _comp_compgen_split -l -- "$(_comp_awk -F '|' ' + BEGIN { portsdir = ENVIRON["portsdir"]; len = length(portsdir) } + { print $1 } + substr($2, 1, len) == portsdir { print substr($2, len + 1) } + ' "$indexfile")" } && - complete -F _portinstall -o dirnames portinstall + complete -F _comp_cmd_portinstall -o dirnames portinstall # ex: filetype=sh diff --git a/completions/portsnap b/completions/portsnap index a2f0a93..a5f880c 100644 --- a/completions/portsnap +++ b/completions/portsnap @@ -2,24 +2,24 @@ [[ $OSTYPE == *freebsd* ]] || return 1 -_portsnap() +_comp_cmd_portsnap() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -d | -p) - _filedir -d + _comp_compgen_filedir -d return ;; -l | -f) - _filedir + _comp_compgen_filedir return ;; esac - COMPREPLY=($(compgen -W "fetch cron extract update" -- $cur)) + _comp_compgen -- -W "fetch cron extract update" } && - complete -F _portsnap portsnap + complete -F _comp_cmd_portsnap portsnap # ex: filetype=sh diff --git a/completions/portupgrade b/completions/portupgrade index ffe6305..1dc93c2 100644 --- a/completions/portupgrade +++ b/completions/portupgrade @@ -1,19 +1,19 @@ # bash completion for FreeBSD portupgrade -*- shell-script -*- -_portupgrade() +_comp_cmd_portupgrade() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return [[ $prev == -l || $prev == -L || $prev == -o ]] && return local pkgdir=${PKG_DBDIR:-/var/db/pkg}/ - COMPREPLY=($(compgen -d -- "$pkgdir$cur")) - COMPREPLY=(${COMPREPLY[@]#$pkgdir}) - COMPREPLY=(${COMPREPLY[@]%-*}) + _comp_compgen -c "$pkgdir$cur" -- -d + COMPREPLY=("${COMPREPLY[@]#"$pkgdir"}") + COMPREPLY=("${COMPREPLY[@]%-*}") } && - complete -F _portupgrade -o dirnames portupgrade + complete -F _comp_cmd_portupgrade -o dirnames portupgrade # ex: filetype=sh diff --git a/completions/postcat b/completions/postcat index a58b0e5..ac74e80 100644 --- a/completions/postcat +++ b/completions/postcat @@ -1,39 +1,34 @@ # postcat(1) completion -*- shell-script -*- -_postcat() +_comp_cmd_postcat() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -c) - _filedir -d + _comp_compgen_filedir -d return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage return fi - local idx qfile=0 + local idx qfile="" for idx in "${words[@]}"; do - [[ $idx == -q ]] && qfile=1 && break + [[ $idx == -q ]] && qfile=set && break done - if ((qfile == 1)); then - local len=${#cur} pval - for pval in $(mailq 2>/dev/null | - command sed -e '1d; $d; /^[^0-9A-Z]/d; /^$/d; s/[* !].*$//'); do - if [[ $cur == "${pval:0:len}" ]]; then - COMPREPLY+=($pval) - fi - done + if [[ $qfile ]]; then + _comp_compgen_split -- "$(mailq 2>/dev/null | + command sed -e '1d; $d; /^[^0-9A-Z]/d; /^$/d; s/[* !].*$//')" return fi - _filedir + _comp_compgen_filedir } && - complete -F _postcat postcat + complete -F _comp_cmd_postcat postcat # ex: filetype=sh diff --git a/completions/postconf b/completions/postconf index 4cb324c..ac1b21b 100644 --- a/completions/postconf +++ b/completions/postconf @@ -1,19 +1,19 @@ # postconf(1) completion -*- shell-script -*- -_postconf() +_comp_cmd_postconf() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local eqext case $prev in -b | -t) - _filedir + _comp_compgen_filedir return ;; -c) - _filedir -d + _comp_compgen_filedir -d return ;; -e) @@ -23,7 +23,7 @@ _postconf() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage return fi @@ -34,6 +34,6 @@ _postconf() fi done } && - complete -F _postconf postconf + complete -F _comp_cmd_postconf postconf # ex: filetype=sh diff --git a/completions/postfix b/completions/postfix index f960550..a05f71f 100644 --- a/completions/postfix +++ b/completions/postfix @@ -1,33 +1,29 @@ # postfix(1) completion -*- shell-script -*- -_postfix() +_comp_cmd_postfix() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -c) - _filedir -d + _comp_compgen_filedir -d return ;; -D) - COMPREPLY=($(compgen -W 'start' -- "$cur")) + _comp_compgen -- -W 'start' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($( - compgen -W \ - '$(_bashcomp_try_faketty "$1" --help 2>&1 | _parse_usage -)' \ - -- "$cur" - )) + _comp_compgen_usage -c _comp_try_faketty "$1" --help return fi - COMPREPLY=($(compgen -W 'check start stop abort flush reload status - set-permissions upgrade-configuration' -- "$cur")) + _comp_compgen -- -W 'check start stop abort flush reload status + set-permissions upgrade-configuration' } && - complete -F _postfix postfix + complete -F _comp_cmd_postfix postfix # ex: filetype=sh diff --git a/completions/postmap b/completions/postmap index 35c4ada..48e5d9f 100644 --- a/completions/postmap +++ b/completions/postmap @@ -1,13 +1,13 @@ # postalias(1) and postmap(1) completion -*- shell-script -*- -_postmap() +_comp_cmd_postmap() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -c) - _filedir -d + _comp_compgen_filedir -d return ;; -[dq]) @@ -16,13 +16,13 @@ _postmap() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage return fi if [[ $cur == *:* ]]; then compopt -o filenames - COMPREPLY=($(compgen -f -- "${cur#*:}")) + _comp_compgen -c "${cur#*:}" -- -f else local len=${#cur} pval for pval in $(/usr/sbin/postconf -m 2>/dev/null); do @@ -32,10 +32,10 @@ _postmap() done if [[ ! ${COMPREPLY-} ]]; then compopt -o filenames - COMPREPLY=($(compgen -f -- "$cur")) + _comp_compgen -- -f fi fi } && - complete -F _postmap postmap postalias + complete -F _comp_cmd_postmap postmap postalias # ex: filetype=sh diff --git a/completions/postsuper b/completions/postsuper index 559449a..d195ac7 100644 --- a/completions/postsuper +++ b/completions/postsuper @@ -1,56 +1,40 @@ # postsuper(1) completion -*- shell-script -*- -_postsuper() +_comp_cmd_postsuper() { - local cur prev words cword - _init_completion || return - - local pval len + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -c) - _filedir -d + _comp_compgen_filedir -d return ;; -[dr]) - len=${#cur} - for pval in ALL $(mailq 2>/dev/null | - command sed -e '1d; $d; /^[^0-9A-Z]/d; /^$/d; s/[* !].*$//'); do - if [[ $cur == "${pval:0:len}" ]]; then - COMPREPLY+=($pval) - fi - done + _comp_compgen_split -- "ALL $(mailq 2>/dev/null | + command sed -e '1d; $d; /^[^0-9A-Z]/d; /^$/d; s/[* !].*$//')" return ;; -h) - len=${#cur} - for pval in ALL $(mailq 2>/dev/null | - command sed -e '1d; $d; /^[^0-9A-Z]/d; /^$/d; s/[* ].*$//; /!$/d'); do - if [[ $cur == "${pval:0:len}" ]]; then - COMPREPLY+=($pval) - fi - done + _comp_compgen_split -- "ALL $(mailq 2>/dev/null | + command sed \ + -e '1d; $d; /^[^0-9A-Z]/d; /^$/d; s/[* ].*$//; /!$/d')" return ;; -H) - len=${#cur} - for pval in ALL $(mailq 2>/dev/null | - command sed -e '1d; $d; /^[^0-9A-Z]/d; /^$/d; /^[0-9A-Z]*[* ]/d; s/!.*$//'); do - if [[ $cur == "${pval:0:len}" ]]; then - COMPREPLY+=($pval) - fi - done + _comp_compgen_split -- "ALL $(mailq 2>/dev/null | command sed \ + -e '1d; $d; /^[^0-9A-Z]/d; /^$/d; /^[0-9A-Z]*[* ]/d; s/!.*$//')" return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - COMPREPLY=($(compgen -W 'hold incoming active deferred' -- "$cur")) + _comp_compgen -- -W 'hold incoming active deferred' } && - complete -F _postsuper postsuper + complete -F _comp_cmd_postsuper postsuper # ex: filetype=sh diff --git a/completions/povray b/completions/povray index 56dfd94..868ff3e 100644 --- a/completions/povray +++ b/completions/povray @@ -1,22 +1,22 @@ # povray completion -*- shell-script -*- # by "David Necas (Yeti)" <yeti@physics.muni.cz> -_povray() +_comp_cmd_povray() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local povcur=$cur pfx oext defoext defoext=png # default output extension, if cannot be determined FIXME - _expand || return + _comp_expand || return case $povcur in [-+]I*) - cur="${povcur#[-+]I}" # to confuse _filedir + cur="${povcur#[-+]I}" # to confuse _comp_compgen_filedir pfx="${povcur%"$cur"}" - _filedir pov - COMPREPLY=(${COMPREPLY[@]/#/$pfx}) + _comp_compgen_filedir pov && + _comp_compgen -Rv COMPREPLY -- -P "$pfx" -W '"${COMPREPLY[@]}"' return ;; [-+]O*) @@ -31,34 +31,35 @@ _povray() *) oext=$defoext ;; esac # complete filename corresponding to previously specified +I - COMPREPLY=($( - IFS=$'\n' - command grep '^[-+]I' <<<"${words[*]}" - )) - COMPREPLY=(${COMPREPLY[@]#[-+]I}) - COMPREPLY=(${COMPREPLY[@]/%.pov/.$oext}) - cur="${povcur#[-+]O}" # to confuse _filedir + _comp_compgen -Rv COMPREPLY -- -X '![-+]I*' -W '"${words[@]}"' + _comp_compgen -Rv COMPREPLY -- -X '' -W '"${COMPREPLY[@]#[-+]I}"' + local i + for i in "${!COMPREPLY[@]}"; do + COMPREPLY[i]=${COMPREPLY[i]/%.pov/".$oext"} + done + cur="${povcur#[-+]O}" # to confuse _comp_compgen_filedir pfx="${povcur%"$cur"}" - _filedir $oext - COMPREPLY=(${COMPREPLY[@]/#/$pfx}) + _comp_compgen -a filedir "$oext" + ((${#COMPREPLY[@]})) && + _comp_compgen -Rv COMPREPLY -- -P "$pfx" -W '"${COMPREPLY[@]}"' return ;; *.ini\[ | *.ini\[*[^]]) # sections in .ini files cur="${povcur#*\[}" pfx="${povcur%\["$cur"}" # prefix == filename - [[ -r $pfx ]] || return - COMPREPLY=($(command sed -e 's/^[[:space:]]*\[\('"$cur"'[^]]*\]\).*$/\1/' \ - -e 't' -e 'd' -- "$pfx")) - # to prevent [bar] expand to nothing. can be done more easily? - COMPREPLY=("${COMPREPLY[@]/#/${pfx}[}") + [[ -f $pfx && -r $pfx ]] || return + _comp_compgen_split -l -- "$(command sed -ne \ + 's/^[[:space:]]*\[\([^]]*\]\).*$/\1/p' -- "$pfx")" && + # to prevent [bar] expand to nothing. can be done more easily? + _comp_compgen -Rv COMPREPLY -- -P "${pfx}[" -W '"${COMPREPLY[@]}"' return ;; *) - _filedir '@(ini|pov)' + _comp_compgen_filedir '@(ini|pov)' return ;; esac } && - complete -F _povray povray xpovray spovray + complete -F _comp_cmd_povray povray xpovray spovray # ex: filetype=sh diff --git a/completions/prelink b/completions/prelink index 1c39611..51b1cd9 100644 --- a/completions/prelink +++ b/completions/prelink @@ -1,42 +1,42 @@ # prelink(8) completion -*- shell-script -*- -_prelink() +_comp_cmd_prelink() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -'?' | --help | --usage | -V | --version | -r | --reloc-only) return ;; -b | --black-list | --dynamic-linker | --undo-output) - _filedir + _comp_compgen_filedir return ;; -c | --config-file) - _filedir conf + _comp_compgen_filedir conf return ;; -C | --cache) - _filedir cache + _comp_compgen_filedir cache return ;; --ld-library-path) - _filedir -d + _comp_compgen_filedir -d return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir + _comp_compgen_filedir } && - complete -F _prelink prelink + complete -F _comp_cmd_prelink prelink # ex: filetype=sh diff --git a/completions/printenv b/completions/printenv index 3553e83..5bd565f 100644 --- a/completions/printenv +++ b/completions/printenv @@ -1,9 +1,9 @@ # printenv(1) completion -*- shell-script -*- -_printenv() +_comp_cmd_printenv() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --help | --version) @@ -12,12 +12,12 @@ _printenv() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - COMPREPLY=($(compgen -v -- "$cur")) + _comp_compgen -- -v } && - complete -F _printenv printenv + complete -F _comp_cmd_printenv printenv # ex: filetype=sh diff --git a/completions/protoc b/completions/protoc index fdd77be..ac93e1c 100644 --- a/completions/protoc +++ b/completions/protoc @@ -1,63 +1,58 @@ # protoc completion -*- shell-script -*- -_protoc() +_comp_cmd_protoc() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in --version | -h | --help | --encode | --decode) return ;; --descriptor_set_out) - _filedir + _comp_compgen_filedir return ;; --error_format) - COMPREPLY=($(compgen -W 'gcc msvs' -- "$cur")) + _comp_compgen -- -W 'gcc msvs' return ;; --plugin) - if [[ $cur != *=* ]]; then - compopt -o filenames - COMPREPLY=($(compgen -c -- "$cur")) - fi + [[ $cur == *=* ]] || _comp_compgen_commands return ;; --proto_path | --*_out) - _filedir -d + _comp_compgen_filedir -d return ;; esac - $split && return + [[ $was_split ]] && return case $cur in -o*) - cur=${cur:2} - _filedir - COMPREPLY=("${COMPREPLY[@]/#/-o}") + _comp_compgen -c "${cur:2}" filedir + ((${#COMPREPLY[@]})) && COMPREPLY=("${COMPREPLY[@]/#/-o}") return ;; -I*) - cur=${cur:2} - _filedir -d - COMPREPLY=("${COMPREPLY[@]/#/-I}") + _comp_compgen -c "${cur:2}" filedir -d + ((${#COMPREPLY[@]})) && COMPREPLY=("${COMPREPLY[@]/#/-I}") return ;; -*) - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help local i for i in "${!COMPREPLY[@]}"; do - [[ ${COMPREPLY[i]} == -oFILE ]] && unset 'COMPREPLY[i]' + [[ ${COMPREPLY[i]} == -oFILE ]] && unset -v 'COMPREPLY[i]' done [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return ;; esac - _filedir proto + _comp_compgen_filedir proto } && - complete -F _protoc protoc + complete -F _comp_cmd_protoc protoc # ex: filetype=sh diff --git a/completions/ps b/completions/ps new file mode 100644 index 0000000..e816355 --- /dev/null +++ b/completions/ps @@ -0,0 +1,70 @@ +# bash completion for ps(1) -*- shell-script -*- + +_comp_cmd_ps() +{ + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + + case $prev in + --help) + _comp_compgen -- -W 'simple list output threads misc all' + return + ;; + --info | V | --version) + return + ;; + -C) + _comp_compgen_pnames + return + ;; + -[Gg] | --[Gg]roup) + _comp_compgen -- -g + return + ;; + ?(-)p | [^-]*p | --pid) + _comp_compgen_pids + return + ;; + --ppid) + _comp_compgen_pids # TODO: Only pids with children? + return + ;; + ?(-)q | [^-]*q | --quick-pid) + _comp_compgen_pids + return + ;; + -s | --sid) + # TODO + return + ;; + ?(-)t | [^-]*t | --tty) + _comp_expand_glob COMPREPLY '/dev/tty*' && + _comp_compgen -- -W '"${COMPREPLY[@]}" "${COMPREPLY[@]#/dev/}"' + return + ;; + ?(-)U | [^-]*U | -u | --[Uu]ser) + _comp_compgen -- -u + return + ;; + --format | ?(-)[Oo] | [^-]*[Oo]) + # TODO: This doesn't work well when there are multiple options for + # the non-first item (similarly to useradd --groups and others). + local labels=$("$1" L | _comp_awk '{ print $1 }') + _comp_delimited , -W '$labels' + return + ;; + esac + + if [[ $cur == -* ]]; then + # sed: strip single char dashless ", x," that trip _comp_compgen_help + _comp_compgen_help - <<<"$({ + "$1" --help + "$1" --help all + } 2>/dev/null | + command sed -e "s/, [A-Za-z],/,/")" || + _comp_compgen_usage + fi +} && + complete -F _comp_cmd_ps ps + +# ex: filetype=sh diff --git a/completions/psql b/completions/psql index 4bc6049..b05b3a4 100644 --- a/completions/psql +++ b/completions/psql @@ -1,97 +1,104 @@ # bash completion for Postgresql -*- shell-script -*- -_pg_databases() +_comp_cmd_psql__databases() { # -w was introduced in 8.4, https://launchpad.net/bugs/164772 # "Access privileges" in output may contain linefeeds, hence the NF > 1 - COMPREPLY=($(compgen -W "$(psql -XAtqwlF $'\t' 2>/dev/null | - awk 'NF > 1 { print $1 }')" -- "$cur")) + _comp_compgen_split -- "$(psql -XAtqwlF $'\t' 2>/dev/null | + _comp_awk 'NF > 1 { print $1 }')" } -_pg_users() +_comp_cmd_psql__users() { # -w was introduced in 8.4, https://launchpad.net/bugs/164772 - COMPREPLY=($(compgen -W "$(psql -XAtqwc 'select usename from pg_user' \ - template1 2>/dev/null)" -- "$cur")) - ((${#COMPREPLY[@]} == 0)) && COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen_split -- "$(psql -XAtqwc 'select usename from pg_user' \ + template1 2>/dev/null)" || + _comp_compgen -- -u } # createdb(1) completion # -_createdb() +_comp_cmd_createdb() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[hUOpDET]*)' + # shellcheck disable=SC2254 case $prev in - --host | -!(-*)h) - _known_hosts_real -- "$cur" + --host | -${noargopts}h) + _comp_compgen_known_hosts -- "$cur" return ;; - --username | --owner | -!(-*)[UO]) - _pg_users + --username | --owner | -${noargopts}[UO]) + _comp_cmd_psql__users return ;; - --help | --version | --port | --tablespace | --encoding | --template | -!(-*)[pDET]) + --help | --version | --port | --tablespace | --encoding | --template | \ + -${noargopts}[pDET]) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - _pg_databases + _comp_cmd_psql__databases fi } && - complete -F _createdb createdb + complete -F _comp_cmd_createdb createdb # createuser(1) completion # -_createuser() +_comp_cmd_createuser() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[pchU]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | --port | --connection-limit | -!(-*)[pc]) + --help | --version | --port | --connection-limit | -${noargopts}[pc]) return ;; - --host | -!(-*)h) - _known_hosts_real -- "$cur" + --host | -${noargopts}h) + _comp_compgen_known_hosts -- "$cur" return ;; - --username | -!(-*)U) - _pg_users + --username | -${noargopts}U) + _comp_cmd_psql__users return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _createuser createuser + complete -F _comp_cmd_createuser createuser # dropdb(1) completion # -_dropdb() +_comp_cmd_dropdb() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[hU]*)' + # shellcheck disable=SC2254 case $prev in - --host | -!(-*)h) - _known_hosts_real -- "$cur" + --host | -${noargopts}h) + _comp_compgen_known_hosts -- "$cur" return ;; - --username | -!(-*)U) - _pg_users + --username | -${noargopts}U) + _comp_cmd_psql__users return ;; --help | --version) @@ -99,90 +106,95 @@ _dropdb() ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - _pg_databases + _comp_cmd_psql__databases fi } && - complete -F _dropdb dropdb + complete -F _comp_cmd_dropdb dropdb # dropuser(1) completion # -_dropuser() +_comp_cmd_dropuser() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[phU]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | --port | -!(-*)p) + --help | --version | --port | -${noargopts}p) return ;; - --host | -!(-*)h) - _known_hosts_real -- "$cur" + --host | -${noargopts}h) + _comp_compgen_known_hosts -- "$cur" return ;; - --username | -!(-*)U) - _pg_users + --username | -${noargopts}U) + _comp_cmd_psql__users return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - _pg_users + _comp_cmd_psql__users fi } && - complete -F _dropuser dropuser + complete -F _comp_cmd_dropuser dropuser # psql(1) completion # -_psql() +_comp_cmd_psql() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[hUdofLcFpPRTv]*)' + # shellcheck disable=SC2254 case $prev in - --host | -!(-*)h) - _known_hosts_real -- "$cur" + --host | -${noargopts}h) + _comp_compgen_known_hosts -- "$cur" return ;; - --username | -!(-*)U) - _pg_users + --username | -${noargopts}U) + _comp_cmd_psql__users return ;; - --dbname | -!(-*)d) - _pg_databases + --dbname | -${noargopts}d) + _comp_cmd_psql__databases return ;; - --output | --file | --log-file | -!(-*)[ofL]) - _filedir + --output | --file | --log-file | -${noargopts}[ofL]) + _comp_compgen_filedir return ;; --help | --version | --command | --field-separator | --port | --pset | \ - --record-separator | --table-attr | --set | --variable | -!(-*)[?VcFpPRTv]) + --record-separator | --table-attr | --set | --variable | \ + -${noargopts}[?VcFpPRTv]) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then # return list of available options - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else # return list of available databases - _pg_databases + _comp_cmd_psql__databases fi } && - complete -F _psql psql + complete -F _comp_cmd_psql psql # ex: filetype=sh diff --git a/completions/puppet b/completions/puppet index e8767de..3a8f585 100644 --- a/completions/puppet +++ b/completions/puppet @@ -1,64 +1,70 @@ # bash completion for puppet -*- shell-script -*- -_puppet_logdest() +_comp_cmd_puppet__logdest() { - if [[ -z $cur ]]; then - COMPREPLY=($(compgen -W 'syslog console /' -- "$cur")) + if [[ ! $cur ]]; then + _comp_compgen -- -W 'syslog console /' else - COMPREPLY=($(compgen -W 'syslog console' -- "$cur")) - _filedir + _comp_compgen -- -W 'syslog console' + _comp_compgen -a filedir fi } -_puppet_digest() +_comp_cmd_puppet__digest() { - COMPREPLY=($(compgen -W 'MD5 MD2 SHA1 SHA256' -- "$cur")) + _comp_compgen -- -W 'MD5 MD2 SHA1 SHA256' } -_puppet_certs() +_comp_cmd_puppet__certs() { local puppetca="puppet cert" PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin type puppetca &>/dev/null && puppetca=puppetca if [[ $1 == --all ]]; then - cert_list=$($puppetca --list --all | command sed -e 's/^[+-]\{0,1\}\s*\(\S\+\)\s\+.*$/\1/') + cert_list=$( + $puppetca --list --all | + command sed -e 's/^[+-]\{0,1\}[[:space:]]*\([^[:space:]]\{1,\}\)[[:space:]]\{1,\}.*$/\1/' + ) else - cert_list=$($puppetca --list) + cert_list=$("$puppetca" --list) fi - COMPREPLY+=($(compgen -W "$cert_list" -- "$cur")) + _comp_compgen -a -- -W "$cert_list" } -_puppet_types() +_comp_cmd_puppet__types() { - puppet_types=$(puppet describe --list | command sed -e 's/^\(\S\{1,\}\).*$/\1/') - COMPREPLY+=($(compgen -W "$puppet_types" -- "$cur")) + puppet_types=$( + puppet describe --list | command sed -e 's/^\([^[:space:]]\{1,\}\).*$/\1/' + ) + _comp_compgen -a -- -W "$puppet_types" } -_puppet_references() +_comp_cmd_puppet__references() { local puppetdoc="puppet doc" PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin type puppetdoc &>/dev/null && puppetdoc=puppetdoc - puppet_doc_list=$($puppetdoc --list | command sed -e 's/^\(\S\{1,\}\).*$/\1/') - COMPREPLY+=($(compgen -W "$puppet_doc_list" -- "$cur")) + puppet_doc_list=$( + $puppetdoc --list | command sed -e 's/^\([^[:space:]]\{1,\}\).*$/\1/' + ) + _comp_compgen -a -- -W "$puppet_doc_list" } -_puppet_subcmd_opts() +_comp_cmd_puppet__subcmd_opts() { # puppet cmd help is somewhat slow, avoid if possible - [[ -z $cur || $cur == -* ]] && - COMPREPLY+=($(compgen -W \ - '$(_parse_usage "$1" "help $2")' -- "$cur")) + [[ ! $cur || $cur == -* ]] && + _comp_compgen -a usage -- help ${2:+"$2"} } -_puppet() +_comp_cmd_puppet() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - local subcommand action + local subcommand="" action case $prev in -h | --help | -V | --version) @@ -96,16 +102,16 @@ _puppet() ;; puppet) case ${words[1]} in - agent | apply | cert | describe | doc | filebucket | kick | master | parser | queue | resource) + agent | apply | cert | describe | doc | filebucket | kick | \ + master | parser | queue | resource) subcommand=${words[1]} ;; *.pp | *.rb) subcommand=apply ;; *) - COMPREPLY=($(compgen -W 'agent apply cert describe doc - filebucket kick master parser queue resource' \ - -- "$cur")) + _comp_compgen -- -W 'agent apply cert describe doc + filebucket kick master parser queue resource' return ;; esac @@ -116,33 +122,34 @@ _puppet() agent) case $prev in --certname) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; --digest) - _puppet_digest + _comp_cmd_puppet__digest return ;; --fqdn) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -l | --logdest) - _puppet_logdest + _comp_cmd_puppet__logdest return ;; --masterport) - COMPREPLY=($(compgen -W '8140' -- "$cur")) + _comp_compgen -- -W '8140' return ;; -w | --waitforcert) - COMPREPLY=($(compgen -W '0 15 30 60 120' -- "$cur")) + _comp_compgen -- -W '0 15 30 60 120' return ;; *) - _puppet_subcmd_opts "$1" $subcommand - # _parse_usage doesn't grok [-D|--daemonize|--no-daemonize] - COMPREPLY+=($(compgen -W '--no-daemonize' -- "$cur")) + _comp_cmd_puppet__subcmd_opts "$1" "$subcommand" + # _comp_compgen_usage doesn't grok + # [-D|--daemonize|--no-daemonize] + _comp_compgen -a -- -W '--no-daemonize' return ;; esac @@ -150,22 +157,22 @@ _puppet() apply) case $prev in --catalog) - COMPREPLY=($(compgen -W '-' -- "$cur")) - _filedir json + _comp_compgen -- -W '-' + _comp_compgen -a filedir json return ;; --execute) return ;; -l | --logdest) - _puppet_logdest + _comp_cmd_puppet__logdest return ;; *) if [[ $cur == -* ]]; then - _puppet_subcmd_opts "$1" $subcommand + _comp_cmd_puppet__subcmd_opts "$1" "$subcommand" else - _filedir + _comp_compgen_filedir fi return ;; @@ -174,35 +181,36 @@ _puppet() cert) case $prev in --digest) - _puppet_digest + _comp_cmd_puppet__digest return ;; *) action=$prev - COMPREPLY=($(compgen -W '--digest --debug --help --verbose --version' \ - -- "$cur")) + _comp_compgen -- -W '--digest --debug --help --verbose + --version' case $action in - fingerprint | list | verify | --fingerprint | --list | --verify) - COMPREPLY+=($(compgen -W '--all' -- "$cur")) - _puppet_certs --all + fingerprint | list | verify | --fingerprint | --list | \ + --verify) + _comp_compgen -a -- -W '--all' + _comp_cmd_puppet__certs --all return ;; generate | --generate) - _known_hosts_real -- "$cur" + _comp_compgen -a known_hosts -- "$cur" return ;; clean | print | revoke | --clean | --print | --revoke) - _puppet_certs --all + _comp_cmd_puppet__certs --all return ;; sign | --sign) - COMPREPLY+=($(compgen -W '--all' -- "$cur")) - _puppet_certs + _comp_compgen -a -- -W '--all' + _comp_cmd_puppet__certs return ;; *) - COMPREPLY+=($(compgen -W 'clean fingerprint generate - list print revoke sign verify reinventory' -- "$cur")) + _comp_compgen -a -- -W 'clean fingerprint generate + list print revoke sign verify reinventory' return ;; esac @@ -210,31 +218,31 @@ _puppet() esac ;; describe) - _puppet_subcmd_opts "$1" $subcommand + _comp_cmd_puppet__subcmd_opts "$1" "$subcommand" if [[ $cur != -* ]]; then - _puppet_types + _comp_cmd_puppet__types fi return ;; doc) case $prev in -o | --outputdir) - _filedir -d + _comp_compgen_filedir -d return ;; -m | --mode) - COMPREPLY=($(compgen -W 'text trac pdf rdoc' -- "$cur")) + _comp_compgen -- -W 'text trac pdf rdoc' return ;; -r | --reference) - _puppet_references + _comp_cmd_puppet__references return ;; *) if [[ $cur == -* ]]; then - _puppet_subcmd_opts "$1" $subcommand + _comp_cmd_puppet__subcmd_opts "$1" "$subcommand" else - _filedir + _comp_compgen_filedir fi return ;; @@ -243,20 +251,19 @@ _puppet() filebucket) case $prev in -s | --server) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -b | --bucket) - _filedir -d + _comp_compgen_filedir -d return ;; *) if [[ $cur == -* ]]; then - _puppet_subcmd_opts "$1" $subcommand + _comp_cmd_puppet__subcmd_opts "$1" "$subcommand" else - COMPREPLY=($(compgen -W 'backup get restore' \ - -- "$cur")) - _filedir + _comp_compgen -- -W 'backup get restore' + _comp_compgen -a filedir fi return ;; @@ -268,7 +275,7 @@ _puppet() return ;; --host) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -t | --tag) @@ -276,9 +283,9 @@ _puppet() ;; *) if [[ $cur == -* ]]; then - _puppet_subcmd_opts "$1" $subcommand + _comp_cmd_puppet__subcmd_opts "$1" "$subcommand" else - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" fi return ;; @@ -287,13 +294,14 @@ _puppet() master) case $prev in -l | --logdest) - _puppet_logdest + _comp_cmd_puppet__logdest return ;; *) - _puppet_subcmd_opts "$1" $subcommand - # _parse_usage doesn't grok [-D|--daemonize|--no-daemonize] - COMPREPLY+=($(compgen -W '--no-daemonize' -- "$cur")) + _comp_cmd_puppet__subcmd_opts "$1" "$subcommand" + # _comp_compgen_usage doesn't grok + # [-D|--daemonize|--no-daemonize] + _comp_compgen -a -- -W '--no-daemonize' return ;; esac @@ -302,11 +310,11 @@ _puppet() action=$prev case $action in validate) - _filedir pp + _comp_compgen_filedir pp return ;; *) - COMPREPLY=($(compgen -W 'validate' -- "$cur")) + _comp_compgen -- -W 'validate' return ;; esac @@ -314,25 +322,26 @@ _puppet() queue) case $prev in -l | --logdest) - _puppet_logdest + _comp_cmd_puppet__logdest return ;; *) if [[ $cur == -* ]]; then - _puppet_subcmd_opts "$1" $subcommand + _comp_cmd_puppet__subcmd_opts "$1" "$subcommand" else - _filedir + _comp_compgen_filedir fi return ;; esac ;; resource | *) - _puppet_subcmd_opts "$1" $subcommand + _comp_cmd_puppet__subcmd_opts "$1" ${subcommand:+"$subcommand"} return ;; esac } && - complete -F _puppet puppetmasterd puppetd puppetca ralsh puppetrun puppetqd filebucket puppetdoc puppet + complete -F _comp_cmd_puppet puppetmasterd puppetd puppetca ralsh \ + puppetrun puppetqd filebucket puppetdoc puppet # ex: filetype=sh diff --git a/completions/pv b/completions/pv index 99933f2..ab3f070 100644 --- a/completions/pv +++ b/completions/pv @@ -1,31 +1,34 @@ # pv(1) completion -*- shell-script -*- -_pv() +_comp_cmd_pv() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[VAFDiwHNLBRPd]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | --last-written | --format | --delay-start | --interval | \ - --width | --height | --name | --rate-limit | --buffer-size | -!(-*)[hVAFDiwHNLB]) + --help | --version | --last-written | --format | --delay-start | \ + --interval | --width | --height | --name | --rate-limit | \ + --buffer-size | -${noargopts}[hVAFDiwHNLB]) return ;; - --remote | -!(-*)R) - _pids + --remote | -${noargopts}R) + _comp_compgen_pids return ;; - --pidfile | --watchfd | -!(-*)[Pd]) - _filedir pid + --pidfile | --watchfd | -${noargopts}[Pd]) + _comp_compgen_filedir pid return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help else - _filedir + _comp_compgen_filedir fi } && - complete -F _pv pv + complete -F _comp_cmd_pv pv # ex: filetype=sh diff --git a/completions/pwck b/completions/pwck index fa07b0e..3e74ea5 100644 --- a/completions/pwck +++ b/completions/pwck @@ -1,18 +1,17 @@ # pwck(8) completion -*- shell-script -*- -_pwck() +_comp_cmd_pwck() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - local opts=$(_parse_help "$1") - COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage return fi - _filedir + _comp_compgen_filedir } && - complete -F _pwck pwck + complete -F _comp_cmd_pwck pwck # ex: filetype=sh diff --git a/completions/pwd b/completions/pwd index b9c4fbc..159dacc 100644 --- a/completions/pwd +++ b/completions/pwd @@ -1,9 +1,9 @@ # pwd(1) completion -*- shell-script -*- -_pwd() +_comp_cmd_pwd() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --help | --version) @@ -11,10 +11,8 @@ _pwd() ;; esac - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) - [[ ${COMPREPLY-} ]] || - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage -c help -s "$1" } && - complete -F _pwd pwd + complete -F _comp_cmd_pwd pwd # ex: filetype=sh diff --git a/completions/pwdx b/completions/pwdx index 25a1a1e..ba460f2 100644 --- a/completions/pwdx +++ b/completions/pwdx @@ -1,9 +1,9 @@ # pwdx(1) completion -*- shell-script -*- -_pwdx() +_comp_cmd_pwdx() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -h | --help | -V | --version) @@ -12,13 +12,12 @@ _pwdx() esac if [[ $cur == -* ]]; then - local help='$(_parse_help "$1")' - [[ $help ]] || help=-V - COMPREPLY=($(compgen -W "$help" -- "$cur")) + _comp_compgen_help || + _comp_compgen -- -W '-V' else - _pids + _comp_compgen_pids fi } && - complete -F _pwdx pwdx + complete -F _comp_cmd_pwdx pwdx # ex: filetype=sh diff --git a/completions/pwgen b/completions/pwgen index 50d31d5..515ef1c 100644 --- a/completions/pwgen +++ b/completions/pwgen @@ -1,28 +1,30 @@ # pwgen(1) completion -*- shell-script -*- -_pwgen() +_comp_cmd_pwgen() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[NH]*)' + # shellcheck disable=SC2254 case $prev in - --num-passwords | --help | -!(-*)[Nh]) + --num-passwords | --help | -${noargopts}[Nh]) return ;; - --sha1 | -!(-*)H) - _filedir + --sha1 | -${noargopts}H) + _comp_compgen_filedir return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi } && - complete -F _pwgen pwgen + complete -F _comp_cmd_pwgen pwgen # ex: filetype=sh diff --git a/completions/pycodestyle b/completions/pycodestyle index dec6f37..c8912bb 100644 --- a/completions/pycodestyle +++ b/completions/pycodestyle @@ -1,34 +1,34 @@ # pycodestyle completion -*- shell-script -*- -_pycodestyle() +_comp_cmd_pycodestyle() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -h | --help | --version) return ;; --format) - COMPREPLY=($(compgen -W 'default pylint' -- "$cur")) + _comp_compgen -- -W 'default pylint' return ;; --config) - _filedir + _comp_compgen_filedir return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir py + _comp_compgen_filedir py } && - complete -F _pycodestyle pycodestyle + complete -F _comp_cmd_pycodestyle pycodestyle # ex: filetype=sh diff --git a/completions/pydoc b/completions/pydoc index e7b1178..2cf2987 100644 --- a/completions/pydoc +++ b/completions/pydoc @@ -1,42 +1,41 @@ # pydoc completion -*- shell-script -*- -_pydoc() +_comp_cmd_pydoc() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -k | -p) return ;; -w) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W \ - '$("$1" | command sed -e "s/^pydoc3\{0,1\} //" | _parse_help -)' \ - -- "$cur")) + _comp_compgen_help - <<<"$("$1" | command sed -e "s/^pydoc3\{0,1\} //")" return fi - COMPREPLY=($(compgen -W 'keywords topics modules' -- "$cur")) + _comp_compgen -- -W 'keywords topics modules' - if [[ $cur != @(.|*/)* ]]; then - local python=python - [[ ${1##*/} == *3* ]] && python=python3 - _xfunc python _python_modules $python + if ! _comp_looks_like_path "$cur"; then + # Prefer python in the same dir for resolving modules + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_compgen -ax python modules fi # Note that we don't do "pydoc modules" as it is known to hang on - # some systems; _python_modules tends to work better and faster. - COMPREPLY+=($(compgen -W \ - '$($1 keywords topics | command sed -e /^Here/d)' -- "$cur")) + # some systems; _comp_xfunc_python_modules tends to work better and faster. + _comp_compgen -a split -- "$("$1" keywords topics | + command sed -e '/^Here/d')" - _filedir py + _comp_compgen -a filedir py } && - complete -F _pydoc pydoc pydoc3 + complete -F _comp_cmd_pydoc pydoc pydoc3 # ex: filetype=sh diff --git a/completions/pydocstyle b/completions/pydocstyle index acbf1ec..53f5690 100644 --- a/completions/pydocstyle +++ b/completions/pydocstyle @@ -1,35 +1,35 @@ # bash completion for pydocstyle -*- shell-script -*- -_pydocstyle() +_comp_cmd_pydocstyle() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in - --help | --version | --match | --ignore-decorators | --select | --ignore | \ - --add-select | --add-ignore | -!(-*)h) + --help | --version | --match | --ignore-decorators | --select | \ + --ignore | --add-select | --add-ignore | -!(-*)h) return ;; --config) - _filedir xml + _comp_compgen_filedir xml return ;; --convention) - COMPREPLY=($(compgen -W "pep257 numpy" -- "$cur")) + _comp_compgen -- -W "pep257 numpy" return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir py + _comp_compgen_filedir py } && - complete -F _pydocstyle pydocstyle + complete -F _comp_cmd_pydocstyle pydocstyle # ex: filetype=sh diff --git a/completions/pyflakes b/completions/pyflakes index 0a4e977..a53904e 100644 --- a/completions/pyflakes +++ b/completions/pyflakes @@ -1,9 +1,9 @@ # pyflakes(1) completion -*- shell-script -*- -_pyflakes() +_comp_cmd_pyflakes() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -h | --help | --version) @@ -12,12 +12,12 @@ _pyflakes() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - _filedir py + _comp_compgen_filedir py } && - complete -F _pyflakes pyflakes + complete -F _comp_cmd_pyflakes pyflakes # ex: filetype=sh diff --git a/completions/pylint b/completions/pylint index 8726f8b..84976d9 100644 --- a/completions/pylint +++ b/completions/pylint @@ -1,87 +1,119 @@ # pylint(1) completion -*- shell-script -*- -_pylint() +_comp_cmd_pylint__message_ids() { - local cur prev words cword split - _init_completion -s || return + local filter=p + [[ ${2-} ]] && filter="/^$2 messages/,/^$/p" + # 6: arbitrary, assumed no ids shorter than that + # TODO(scop): The fallback here is slow, maybe memoize whether + # --list-msgs-enabled worked (>= 2.4.0) and avoid unnecessary tries + # again later? + local msgs="$( + set -o pipefail + "$1" --list-msgs-enabled 2>/dev/null | + command sed -ne "$filter" | + command sed -ne 's/^[[:space:]]\{1,\}\([a-z-]\{6,\}\).*/\1/p' || + "$1" --list-msgs 2>/dev/null | + command sed -ne 's/^:\([a-z-]\{6,\}\).*/\1/p' + )" + _comp_delimited , -W "$msgs" +} + +_comp_cmd_pylint() +{ + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return local python=python [[ ${1##*/} == *3* ]] && python=python3 + local noargopts='!(-*|*[edisrjf]*)' + # shellcheck disable=SC2254 case $prev in - --version | --help | --long-help | --help-msg | --init-hook | --ignore | --enable | \ - --evaluation | --max-line-length | --max-module-lines | \ - --indent-string | --min-similarity-lines | --max-args | \ - --ignored-argument-names | --max-locals | --max-returns | --max-branchs | \ - --max-statements | --max-parents | --max-attributes | --min-public-methods | \ - --max-public-methods | --required-attributes | --bad-functions | \ - --module-rgx | --const-rgx | --class-rgx | --function-rgx | --method-rgx | \ - --attr-rgx | --argument-rgx | --variable-rgx | --inlinevar-rgx | --good-names | \ - --bad-names | --no-docstring-rgx | --dummy-variables-rgx | \ - --additional-builtins | --notes | --ignored-classes | --generated-members | \ + --version | --help | --long-help | --init-hook | \ + --ignore | --evaluation | --max-line-length | \ + --max-module-lines | --indent-string | --min-similarity-lines | \ + --max-args | --ignored-argument-names | --max-locals | \ + --max-returns | --max-branches | --max-statements | --max-parents | \ + --max-attributes | --min-public-methods | --max-public-methods | \ + --required-attributes | --bad-functions | --module-rgx | \ + --const-rgx | --class-rgx | --function-rgx | --method-rgx | \ + --attr-rgx | --argument-rgx | --variable-rgx | --inlinevar-rgx | \ + --good-names | --bad-names | --no-docstring-rgx | \ + --dummy-variables-rgx | --additional-builtins | --notes | \ + --ignored-classes | --generated-members | \ --overgeneral-exceptions | --ignore-iface-methods | \ --defining-attr-methods | --valid-classmethod-first-arg | \ - --valid-metaclass-classmethod-first-arg | -!(-*)[he]) + --valid-metaclass-classmethod-first-arg | -${noargopts}[h]) + return + ;; + --fail-on | --help-msg) + _comp_cmd_pylint__message_ids "$1" return ;; - --disable | -!(-*)d) - COMPREPLY=($(compgen -W 'all' -- "$cur")) + --enable | -${noargopts}e) + _comp_cmd_pylint__message_ids "$1" Disabled + return + ;; + --disable | -${noargopts}d) + _comp_cmd_pylint__message_ids "$1" Enabled + _comp_compgen -a -- -W 'all' return ;; --rcfile) - _filedir + _comp_compgen_filedir return ;; - --persistent | --include-ids | --symbols | --files-output | --reports | \ - --comment | --ignore-comments | --ignore-docstrings | --ignore-imports | \ - --init-import | --ignore-mixin-members | --zope | --suggestion-mode | \ - -!(-*)[isr]) - COMPREPLY=($(compgen -W 'yes no' -- "$cur")) + --persistent | --include-ids | --symbols | --files-output | \ + --reports | --comment | --ignore-comments | --ignore-docstrings | \ + --ignore-imports | --init-import | --ignore-mixin-members | \ + --zope | --suggestion-mode | -${noargopts}[isr]) + _comp_compgen -- -W 'yes no' return ;; --load-plugins | --deprecated-modules) - local prefix= - [[ $cur == *,* ]] && prefix="${cur%,*}," - cur="${cur##*,}" - _xfunc python _python_modules $python - ((${#COMPREPLY[@]} == 1)) && COMPREPLY=(${COMPREPLY/#/$prefix}) + _comp_compgen -c "${cur##*,}" -x python modules $python + ((${#COMPREPLY[@]})) && + _comp_delimited , -W '"${COMPREPLY[@]}"' return ;; - --jobs | -!(-*)j) - COMPREPLY=($(compgen -W "{1..$(_ncpus)}" -- "$cur")) + --jobs | -${noargopts}j) + local REPLY + _comp_get_ncpus + _comp_compgen -- -W "{1..$REPLY}" return ;; --confidence) local prefix= [[ $cur == *,* ]] && prefix="${cur%,*}," - COMPREPLY=($(compgen -W "HIGH INFERENCE INFERENCE_FAILURE - UNDEFINED" -- "${cur##*,}")) - ((${#COMPREPLY[@]} == 1)) && COMPREPLY=(${COMPREPLY/#/$prefix}) + _comp_compgen -c "${cur##*,}" -- -W "HIGH INFERENCE + INFERENCE_FAILURE UNDEFINED" + ((${#COMPREPLY[@]} == 1)) && + _comp_compgen -Rv COMPREPLY -- -P "$prefix" -W '"$COMPREPLY"' return ;; - --format | -!(-*)f) - COMPREPLY=($(compgen -W 'text parseable colorized json msvs' \ - -- "$cur")) + --format | -${noargopts}f) + _comp_compgen -- -W 'text parseable colorized json msvs' return ;; --import-graph | --ext-import-graph | --int-import-graph) - _filedir dot + _comp_compgen_filedir dot return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W \ - '$(_parse_help "$1" --long-help)' -- "$cur")) + _comp_compgen_help -- --long-help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - [[ $cur == @(.|*/)* ]] || _xfunc python _python_modules $python - _filedir py + _comp_compgen_set + _comp_looks_like_path "$cur" || _comp_compgen -x python modules $python + _comp_compgen -a filedir py } && - complete -F _pylint pylint pylint-2 pylint-3 + complete -F _comp_cmd_pylint pylint pylint-2 pylint-3 # ex: filetype=sh diff --git a/completions/pytest b/completions/pytest index 7457a84..9ed2575 100644 --- a/completions/pytest +++ b/completions/pytest @@ -1,134 +1,144 @@ # bash completion for pytest(1) -*- shell-script -*- -_pytest() +_comp_cmd_pytest__option_choice_args() { - local cur prev words cword split - _init_completion -s -n : || return + local modes=$("$1" "$2=bash-completion-nonexistent" 2>&1 | + command sed -e 's/[^[:space:][:alnum:]_-]\{1,\}//g' \ + -ne 's/.*choose from //p') + _comp_compgen -a -- -W '$modes' +} +_comp_cmd_pytest() +{ + local cur prev words cword was_split comp_args + _comp_initialize -s -n : -- "$@" || return + + local noargopts='!(-*|*[kmorpcWn]*)' + # shellcheck disable=SC2254 case $prev in - --help | --maxfail | --report | --junit-prefix | --doctest-glob | -!(-*)[hkmorp]) + --help | --maxfail | --report | --junit-prefix | --doctest-glob | \ + -${noargopts}[hkmorp]) return ;; --import-mode) - COMPREPLY=($(compgen -W "prepend append" -- "$cur")) + _comp_compgen -- -W "prepend append importlib" return ;; --capture) - COMPREPLY=($(compgen -W "fd sys no tee-sys" -- "$cur")) + _comp_compgen -- -W "fd sys no tee-sys" return ;; --lfnf | --last-failed-no-failures) - COMPREPLY=($(compgen -W "all none" -- "$cur")) + _comp_compgen -- -W "all none" return ;; --tb) - COMPREPLY=($(compgen -W "auto long short line native no" \ - -- "$cur")) + _comp_compgen -- -W 'auto long short line native no' return ;; --show-capture) - COMPREPLY=($(compgen -W "no stdout stderr log all" -- "$cur")) + _comp_compgen -- -W "no stdout stderr log all" return ;; --color) - COMPREPLY=($(compgen -W "yes no auto" -- "$cur")) + _comp_compgen -- -W "yes no auto" return ;; --pastebin) - COMPREPLY=($(compgen -W "failed all" -- "$cur")) + _comp_compgen -- -W "failed all" return ;; --junit-xml) - _filedir xml + _comp_compgen_filedir xml return ;; --result-log | --log-file) - _filedir log + _comp_compgen_filedir log return ;; - --ignore) - _filedir + --ignore | -${noargopts}c) + _comp_compgen_filedir return ;; --confcutdir | --basetemp | --rsyncdir | --rootdir) - _filedir -d + _comp_compgen_filedir -d return ;; --doctest-report) - COMPREPLY=($(compgen -W "none cdiff ndiff udiff only_first_failure" -- "$cur")) + _comp_compgen -- -W 'none cdiff ndiff udiff only_first_failure' return ;; --assert) - COMPREPLY=($(compgen -W "plain reinterp rewrite" -- "$cur")) + _comp_compgen -- -W "plain reinterp rewrite" return ;; --genscript) - _filedir py + _comp_compgen_filedir py return ;; - --pythonwarnings | -!(-*)W) - _xfunc python _python_warning_actions + --pythonwarnings | -${noargopts}W) + _comp_compgen -x python warning_actions return ;; - --numprocesses | -!(-*)n) - COMPREPLY=($(compgen -W "{1..$(_ncpus)} auto" -- "$cur")) + --numprocesses | -${noargopts}n) + local REPLY + _comp_get_ncpus + _comp_compgen -- -W "{1..$REPLY} auto" return ;; - --dist) - local modes=$("$1" --dist=nonexistent-distmode 2>&1 | - command sed -e 's/[^[:space:][:alnum:]-]\{1,\}//g' \ - -ne 's/.*choose from //p') - COMPREPLY=($(compgen -W '$modes' -- "$cur")) + --dist | --vcr-record?(-mode)) + _comp_cmd_pytest__option_choice_args "$1" "$prev" return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi if [[ $cur == *.py::*:* ]]; then local file=${cur/.py:*/.py} - local class=${cur#*.py::} in_class=false + local class=${cur#*.py::} in_class="" local line class=${class%%:*} while IFS= read -r line; do if [[ $line =~ ^class[[:space:]]+${class}[[:space:]:\(] ]]; then - in_class=true + in_class=set elif [[ $line =~ ^class[[:space:]] ]]; then - in_class=false + in_class="" fi - if $in_class && [[ $line =~ ^[[:space:]]+(async[[:space:]]+)?def[[:space:]]+(test_[A-Za-z0-9_]+) ]]; then - COMPREPLY+=(${BASH_REMATCH[2]}) + if [[ $in_class && $line =~ ^[[:space:]]+(async[[:space:]]+)?def[[:space:]]+(test_[A-Za-z0-9_]+) ]]; then + COMPREPLY+=("${BASH_REMATCH[2]}") fi done 2>/dev/null <"$file" ((!${#COMPREPLY[@]})) || - COMPREPLY=($(compgen -P "$file::$class::" -W '${COMPREPLY[@]}' \ - -- "${cur##*:?(:)}")) - __ltrim_colon_completions "$cur" + _comp_compgen -c "${cur##*:?(:)}" -- -P "$file::$class::" \ + -W '"${COMPREPLY[@]}"' + _comp_ltrim_colon_completions "$cur" return elif [[ $cur == *.py:* ]]; then local file="${cur/.py:*/.py}" line while IFS= read -r line; do if [[ $line =~ ^class[[:space:]]+(Test[A-Za-z0-9_]+) ]]; then - COMPREPLY+=(${BASH_REMATCH[1]}) + COMPREPLY+=("${BASH_REMATCH[1]}") elif [[ $line =~ ^(async[[:space:]]+)?def[[:space:]]+(test_[A-Za-z0-9_]+) ]]; then - COMPREPLY+=(${BASH_REMATCH[2]}) + COMPREPLY+=("${BASH_REMATCH[2]}") fi done 2>/dev/null <"$file" ((!${#COMPREPLY[@]})) || - COMPREPLY=($(compgen -P "$file::" -W '${COMPREPLY[@]}' \ - -- "${cur##*.py:?(:)}")) - __ltrim_colon_completions "$cur" + _comp_compgen -c "${cur##*.py:?(:)}" -- -P "$file::" \ + -W '"${COMPREPLY[@]}"' + _comp_ltrim_colon_completions "$cur" return fi - _filedir py + _comp_compgen_filedir py } && - complete -F _pytest pytest pytest-2 pytest-3 py.test py.test-2 py.test-3 + complete -F _comp_cmd_pytest \ + pytest pytest-2 pytest-3 py.test py.test-2 py.test-3 # ex: filetype=sh diff --git a/completions/python b/completions/python index d50c18f..5bf4b70 100644 --- a/completions/python +++ b/completions/python @@ -1,22 +1,42 @@ # bash completion for python -*- shell-script -*- +# @since 2.12 +_comp_xfunc_python_compgen_modules() +{ + local _python=python + [[ ${comp_args[0]##*/} == *3* ]] && _python=python3 + _comp_cmd_python__compgen_modules "$_python" +} + +# @deprecated 2.12 use `_comp_xfunc_python_compgen_modules` instead _python_modules() { - COMPREPLY+=($(compgen -W \ - "$(${1:-python} ${BASH_SOURCE[0]%/*}/../helpers/python $cur \ - 2>/dev/null)" -- "$cur")) + _comp_compgen -a -i python modules "${1:-python}" +} + +_comp_cmd_python__compgen_modules() +{ + _comp_compgen_split -- "$("$1" \ + "${BASH_SOURCE[0]%/*}/../helpers/python" "$cur" 2>/dev/null)" } +# @since 2.12 +_comp_xfunc_python_compgen_warning_actions() +{ + _comp_compgen -- -W "ignore default all module once error" \ + ${prefix:+-P "$prefix"} +} + +# @deprecated 2.12 use `_comp_xfunc_python_compgen_warning_actions` instead _python_warning_actions() { - COMPREPLY+=($(compgen -W "ignore default all module once error" \ - ${prefix:+-P "$prefix"} -- "$cur")) + _comp_compgen -a -i python warning_actions "${1:-python}" } -_python() +_comp_cmd_python() { - local cur prev words cword prefix - _init_completion || return + local cur prev words cword comp_args prefix + _comp_initialize -- "$@" || return case $cur in -[QWX]?*) @@ -26,42 +46,80 @@ _python() ;; esac + local noargopts='!(-*|*[cmQWX]*)' + + # if command, module, or script is already given by [-c command | -m module + # | script], complete all kind of files. + local i has_command="" + for ((i = 1; i < cword; i++)); do + # shellcheck disable=SC2254 + case ${words[i]} in + -${noargopts}[QWX]) + ((i++)) + ;; + -${noargopts}[cm]?*) + has_command=set + break + ;; + -- | -${noargopts}[cm]) + if ((i + 1 < cword)); then + has_command=set + break + fi + ;; + -*) ;; + *) + has_command=set + break + ;; + esac + done + if [[ $has_command ]]; then + _comp_compgen_filedir + return + fi + + # shellcheck disable=SC2254 case $prev in - --help | --version | -!(-*)[?hVcX]) + --help | --version | -${noargopts}[?hVc]) return ;; - -!(-*)m) - _python_modules "$1" + -${noargopts}m) + _comp_cmd_python__compgen_modules "$1" return ;; - -!(-*)Q) - COMPREPLY=($(compgen -W "old new warn warnall" -P "$prefix" \ - -- "$cur")) + -${noargopts}Q) + _comp_compgen -- -W 'old new warn warnall' -P "$prefix" return ;; - -!(-*)W) - _python_warning_actions + -${noargopts}W) + _comp_xfunc_python_compgen_warning_actions + return + ;; + -${noargopts}X) + _comp_compgen_split -- "$("$1" -h 2>&1 | + _comp_awk '$1 == "-X" && $2 ~ /:$/ { + sub(":$","",$2); sub("=.*","=",$2); print $2 + }')" + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return ;; --jit) # TODO: quite a few others, parse from "--jit help" output? - COMPREPLY=($(compgen -W "help off" -- "$cur")) + _comp_compgen -- -W "help off" return ;; - !(?(*/)python*([0-9.])|?(*/)pypy*([0-9.])|-?)) - [[ $cword -lt 2 || ${words[cword - 2]} != -[QWX] ]] && _filedir - ;; esac - # if -c or -m is already given, complete all kind of files. - if [[ ${words[*]::cword} == *\ -[cm]\ * ]]; then - _filedir - elif [[ $cur != -* ]]; then - _filedir 'py?([cowz])' + if [[ $prev == -- || $cur != -* ]]; then + _comp_compgen_filedir '@(py?([cowz])|zip)' else - COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + _comp_compgen_help - <<<"$("$1" -h | + _comp_awk '{ sub("\\(-bb:","\n-bb "); print }')" fi } && - complete -F _python python python2 python2.7 python3 python3.{3..8} pypy pypy3 micropython + complete -F _comp_cmd_python \ + python python2 python2.7 python3 python3.{3..12} \ + pypy pypy3 pyston pyston3 micropython # ex: filetype=sh diff --git a/completions/pyvenv b/completions/pyvenv index 527a384..c7054df 100644 --- a/completions/pyvenv +++ b/completions/pyvenv @@ -1,9 +1,9 @@ # bash completion for pyvenv -*- shell-script -*- -_pyvenv() +_comp_cmd_pyvenv() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -h | --help) @@ -11,15 +11,15 @@ _pyvenv() ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - _longopt "$1" + _comp_complete_longopt "$@" return fi - _filedir -d + _comp_compgen_filedir -d } && - complete -F _pyvenv pyvenv pyvenv-3.{4..8} + complete -F _comp_cmd_pyvenv pyvenv pyvenv-3.{4..12} # ex: filetype=sh diff --git a/completions/qdbus b/completions/qdbus index 5b5a5e3..daf1065 100644 --- a/completions/qdbus +++ b/completions/qdbus @@ -1,14 +1,14 @@ # Qt qdbus, dcop completion -*- shell-script -*- -_qdbus() +_comp_cmd_qdbus() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - [[ -n $cur ]] && unset "words[$((${#words[@]} - 1))]" - COMPREPLY=($(compgen -W '$(command ${words[@]} 2>/dev/null | \ - command sed "s/(.*)//")' -- "$cur")) + _comp_compgen_split -- "$( + command "${words[@]::cword}" 2>/dev/null | command sed 's/(.*)//' + )" } && - complete -F _qdbus qdbus dcop + complete -F _comp_cmd_qdbus qdbus dcop # ex: filetype=sh diff --git a/completions/qemu b/completions/qemu index 8382981..c8bd741 100644 --- a/completions/qemu +++ b/completions/qemu @@ -1,108 +1,106 @@ # bash completion for qemu -*- shell-script -*- -_qemu() +_comp_cmd_qemu() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in - -fd[ab] | -hd[abcd] | -cdrom | -option-rom | -kernel | -initrd | -bootp | -pidfile | \ - -loadvm | -mtdblock | -sd | -pflash | -bios) - _filedir + -fd[ab] | -hd[abcd] | -cdrom | -option-rom | -kernel | -initrd | \ + -bootp | -pidfile | -loadvm | -mtdblock | -sd | -pflash | -bios) + _comp_compgen_filedir return ;; -tftp | -smb | -L | -chroot) - _filedir -d + _comp_compgen_filedir -d return ;; -boot) - COMPREPLY=($(compgen -W 'a c d n' -- "$cur")) + _comp_compgen -- -W 'a c d n' return ;; -k) - COMPREPLY=($(compgen -W 'ar de-ch es fo fr-ca hu ja mk no pt-br - sv da en-gb et fr fr-ch is lt nl pl ru th de en-us fi fr-be hr - it lv nl-be pt sl tr' -- "$cur")) + local -a keymaps + _comp_expand_glob keymaps '/usr/{local/,}share/qemu/keymaps/!(common|modifiers)' && + _comp_compgen -- -W '"${keymaps[@]##*/}"' return ;; -soundhw) - COMPREPLY=($(compgen -W "$($1 -soundhw help | awk \ - '/^[[:lower:]]/ {print $1}') all" -- "$cur")) + _comp_compgen_split -- "$("$1" -soundhw help | _comp_awk ' + function islower(s) { return length(s) > 0 && s == tolower(s); } + islower(substr($0, 1, 1)) {print $1}') all" return ;; -machine | -M) - COMPREPLY=($(compgen -W "$($1 $prev help | awk \ - '/^[[:lower:]]/ {print $1}')" -- "$cur")) + _comp_compgen_split -- "$("$1" "$prev" help | _comp_awk ' + function islower(s) { return length(s) > 0 && s == tolower(s); } + islower(substr($0, 1, 1)) {print $1}')" return ;; -cpu) - COMPREPLY=($(compgen -W "$($1 -cpu help | awk '{print $2}')" \ - -- "$cur")) + _comp_compgen_split -- "$("$1" -cpu help | _comp_awk '{print $2}')" return ;; -usbdevice) - COMPREPLY=($(compgen -W 'mouse tablet disk: host: serial: braille - net' -- "$cur")) + _comp_compgen -- -W 'mouse tablet disk: host: serial: braille net' return ;; -net) - COMPREPLY=($(compgen -W 'nic user tap socket vde none dump' \ - -- "$cur")) + _comp_compgen -- -W 'nic user tap socket vde none dump' return ;; -serial | -parallel | -monitor) - COMPREPLY=($(compgen -W 'vc pty none null /dev/ file: stdio pipe: - COM udp: tcp: telnet: unix: mon: braille' -- "$cur")) + _comp_compgen -- -W 'vc pty none null /dev/ file: stdio pipe: COM + udp: tcp: telnet: unix: mon: braille' return ;; -redir) - COMPREPLY=($(compgen -S":" -W 'tcp udp' -- "$cur")) + _comp_compgen -- -S":" -W 'tcp udp' return ;; -bt) - COMPREPLY=($(compgen -W 'hci vhci device' -- "$cur")) + _comp_compgen -- -W 'hci vhci device' return ;; -vga) - COMPREPLY=($(compgen -W 'cirrus std vmware xenfb none' -- "$cur")) + _comp_compgen -- -W 'cirrus std vmware xenfb none' return ;; -drive) - COMPREPLY=($(compgen -S"=" -W 'file if bus unit index media cyls - snapshot cache format serial addr' -- "$cur")) + _comp_compgen -- -S"=" -W 'file if bus unit index media cyls + snapshot cache format serial addr' return ;; -balloon) - COMPREPLY=($(compgen -W 'none virtio' -- "$cur")) + _comp_compgen -- -W 'none virtio' return ;; -smbios) - COMPREPLY=($(compgen -W 'file type' -- "$cur")) + _comp_compgen -- -W 'file type' return ;; -watchdog) - COMPREPLY=($(compgen -W "$($1 -watchdog help 2>&1 | - awk '{print $1}')" -- "$cur")) + _comp_compgen_split -- "$("$1" -watchdog help 2>&1 | + _comp_awk '{print $1}')" return ;; -watchdog-action) - COMPREPLY=($(compgen -W 'reset shutdown poweroff pause debug - none' -- "$cur")) + _comp_compgen -- -W 'reset shutdown poweroff pause debug none' return ;; -runas) - _allowed_users + _comp_compgen_allowed_users return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help) -fd{a,b} - -hd{a..d}' -- "$cur")) + _comp_compgen_help -- -help + _comp_compgen -a -- -W '-fd{a,b} -hd{a..d}' else - _filedir + _comp_compgen_filedir fi } && - complete -F _qemu qemu qemu-kvm qemu-system-i386 qemu-system-x86_64 + complete -F _comp_cmd_qemu qemu qemu-kvm qemu-system-i386 qemu-system-x86_64 # ex: filetype=sh diff --git a/completions/qrunner b/completions/qrunner index 3919ea2..cf54b68 100644 --- a/completions/qrunner +++ b/completions/qrunner @@ -1,18 +1,17 @@ # mailman qrunner completion -*- shell-script -*- -_qrunner() +_comp_cmd_qrunner() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--runner --once --list --verbose --subproc - --help' -- "$cur")) + _comp_compgen -- -W '--runner --once --list --verbose --subproc --help' fi } && - complete -F _qrunner qrunner + complete -F _comp_cmd_qrunner qrunner # ex: filetype=sh diff --git a/completions/querybts b/completions/querybts index edeba96..5b9f33a 100644 --- a/completions/querybts +++ b/completions/querybts @@ -1,40 +1,41 @@ # querybts completion -*- shell-script -*- -_querybts() +_comp_cmd_querybts() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[Bu]*)' + # shellcheck disable=SC2254 case $prev in - --bts | -!(-*)B) - COMPREPLY=($(compgen -W "debian guug kde mandrake help" \ - -- "$cur")) + --bts | -${noargopts}B) + _comp_compgen -- -W 'debian guug kde mandrake help' return ;; - --ui | --interface | -!(-*)u) - COMPREPLY=($(compgen -W "newt text gnome" -- "$cur")) + --ui | --interface | -${noargopts}u) + _comp_compgen -- -W "newt text gnome" return ;; --mbox-reader-cmd) - compopt -o filenames - COMPREPLY=($(compgen -c -- "$cur")) + _comp_compgen_commands return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - COMPREPLY=($(compgen -W 'wnpp boot-floppies kernel bugs.debian.org + _comp_compgen -- -W 'wnpp boot-floppies kernel bugs.debian.org cdimage.debian.org general installation-reports listarchives lists.debian.org mirrors nm.debian.org press project qa.debian.org release-notes security.debian.org tech-ctte upgrade-reports - www.debian.org $(_xfunc apt-cache _apt_cache_packages)' -- "$cur")) + www.debian.org' + _comp_compgen -ax apt-cache packages fi } && - complete -F _querybts querybts + complete -F _comp_cmd_querybts querybts # ex: filetype=sh diff --git a/completions/quota b/completions/quota index f5f9cc8..504284c 100644 --- a/completions/quota +++ b/completions/quota @@ -1,49 +1,47 @@ # bash completion for quota-tools -*- shell-script -*- -_user_or_group() +_comp_cmd_quota__user_or_group() { local i # complete on groups if -g was given for ((i = 1; i < cword; i++)); do if [[ ${words[i]} == -@(g|-group) ]]; then - COMPREPLY=($(compgen -g -- "$cur")) + _comp_compgen -- -g return fi done # otherwise complete on users - COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen -- -u } -_quota_parse_help() +_comp_cmd_quota__parse_help() { - local opts=$(_parse_help "$1") - COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage [[ ${COMPREPLY-} == *= ]] && compopt -o nospace } -_quota_formats() +_comp_cmd_quota__formats() { - COMPREPLY=($(compgen -W 'vfsold vfsv0 rpc xfs' -- "$cur")) + _comp_compgen -- -W 'vfsold vfsv0 rpc xfs' } -_filesystems() +_comp_cmd_quota__filesystems() { # Only list filesystems starting with "/", otherwise we also get #+ "binfmt_misc", "proc", "tmpfs", ... - COMPREPLY=($(compgen -W "$(awk '/^\// {print $1}' /etc/mtab)" \ - -- "$cur")) + _comp_compgen_split -- "$(_comp_awk '/^\// {print $1}' /etc/mtab)" } -_quota() +_comp_cmd_quota() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -F | --format) - _quota_formats + _comp_cmd_quota__formats return ;; -h | --help | -V | --version) @@ -51,28 +49,28 @@ _quota() ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - _quota_parse_help "$1" + _comp_cmd_quota__parse_help "$1" else - _user_or_group + _comp_cmd_quota__user_or_group fi } && - complete -F _quota -o default quota + complete -F _comp_cmd_quota -o default quota -_setquota() +_comp_cmd_setquota() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -F | --format) - _quota_formats + _comp_cmd_quota__formats return ;; -p | --prototype) - _user_or_group + _comp_cmd_quota__user_or_group return ;; -h | --help | -V | --version) @@ -80,43 +78,43 @@ _setquota() ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - _quota_parse_help "$1" + _comp_cmd_quota__parse_help "$1" else - local args - _count_args + local REPLY + _comp_count_args - case $args in + case $REPLY in 1) - _user_or_group + _comp_cmd_quota__user_or_group ;; 2) - _filesystems + _comp_cmd_quota__filesystems ;; esac fi } && - complete -F _setquota -o default setquota + complete -F _comp_cmd_setquota -o default setquota -_edquota() +_comp_cmd_edquota() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -F | --format) - _quota_formats + _comp_cmd_quota__formats return ;; -f | --filesystem) - _filesystems + _comp_cmd_quota__filesystems return ;; -p | --prototype) - _user_or_group + _comp_cmd_quota__user_or_group return ;; -h | --help | -V | --version) @@ -124,24 +122,24 @@ _edquota() ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - _quota_parse_help "$1" + _comp_cmd_quota__parse_help "$1" else - _user_or_group + _comp_cmd_quota__user_or_group fi } && - complete -F _edquota -o default edquota + complete -F _comp_cmd_edquota -o default edquota -_quotacheck() +_comp_cmd_quotacheck() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -F | --format) - _quota_formats + _comp_cmd_quota__formats return ;; -h | --help | -V | --version) @@ -149,28 +147,28 @@ _quotacheck() ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - _quota_parse_help "$1" + _comp_cmd_quota__parse_help "$1" else - _filesystems + _comp_cmd_quota__filesystems fi } && - complete -F _quotacheck -o default quotacheck repquota + complete -F _comp_cmd_quotacheck -o default quotacheck repquota -_quotaon() +_comp_cmd_quotaon() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -F | --format) - _quota_formats + _comp_cmd_quota__formats return ;; -x | --xfs-command) - COMPREPLY=($(compgen -W 'delete enforce' -- "$cur")) + _comp_compgen -- -W 'delete enforce' return ;; -h | --help | -V | --version) @@ -178,14 +176,14 @@ _quotaon() ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - _quota_parse_help "$1" + _comp_cmd_quota__parse_help "$1" else - _filesystems + _comp_cmd_quota__filesystems fi } && - complete -F _quotaon -o default quotaon quotaoff + complete -F _comp_cmd_quotaon -o default quotaon quotaoff # ex: filetype=sh diff --git a/completions/radvdump b/completions/radvdump index 850628f..74ce574 100644 --- a/completions/radvdump +++ b/completions/radvdump @@ -1,22 +1,22 @@ # radvdump(8) completion -*- shell-script -*- -_radvdump() +_comp_cmd_radvdump() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -h | --help | -v | --version) return ;; -d | --debug) - COMPREPLY=($(compgen -W '{1..4}' -- "$cur")) + _comp_compgen -- -W '{1..4}' return ;; esac - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help } && - complete -F _radvdump radvdump + complete -F _comp_cmd_radvdump radvdump # ex: filetype=sh diff --git a/completions/rcs b/completions/rcs index c04d89d..aab018e 100644 --- a/completions/rcs +++ b/completions/rcs @@ -1,9 +1,9 @@ # bash completion for rcs -*- shell-script -*- -_rcs() +_comp_cmd_rcs() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local file dir i @@ -13,7 +13,7 @@ _rcs() # deal with relative directory [[ $file == "$dir" ]] && dir=. - COMPREPLY=($(compgen -f -- "$dir/RCS/$file")) + _comp_compgen -c "$dir/RCS/$file" -- -f for i in ${!COMPREPLY[*]}; do file=${COMPREPLY[i]##*/} @@ -21,7 +21,7 @@ _rcs() COMPREPLY[i]=$dir$file done - COMPREPLY+=($(compgen -G "$dir/$file*,v")) + _comp_compgen -aR -- -G "$dir/$file*,v" for i in ${!COMPREPLY[*]}; do COMPREPLY[i]=${COMPREPLY[i]%,v} @@ -29,8 +29,8 @@ _rcs() # default to files if nothing returned and we're checking in. # otherwise, default to directories - [[ ${#COMPREPLY[@]} -eq 0 && $1 == *ci ]] && _filedir || _filedir -d + [[ ${#COMPREPLY[@]} -eq 0 && $1 == *ci ]] && _comp_compgen -a filedir || _comp_compgen -a filedir -d } && - complete -F _rcs ci co rlog rcs rcsdiff + complete -F _comp_cmd_rcs ci co rlog rcs rcsdiff # ex: filetype=sh diff --git a/completions/rdesktop b/completions/rdesktop index 54c1ae6..42d2ccb 100644 --- a/completions/rdesktop +++ b/completions/rdesktop @@ -1,39 +1,34 @@ # bash completion for rdesktop -*- shell-script -*- -_rdesktop() +_comp_cmd_rdesktop() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return case $prev in -*k) - COMPREPLY=($(command ls \ - /usr/share/rdesktop/keymaps 2>/dev/null | - command grep -E -v '(common|modifiers)')) - COMPREPLY+=($(command ls $HOME/.rdesktop/keymaps 2>/dev/null)) - COMPREPLY+=($(command ls ./keymaps 2>/dev/null)) - COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur")) + _comp_expand_glob COMPREPLY '/usr/share/rdesktop/keymaps/!(*@(common|modifiers)*) {"$HOME/.rdesktop",.}/keymaps/*' && + _comp_compgen -- -W '"${COMPREPLY[@]}"' return ;; -*a) - COMPREPLY=($(compgen -W '8 15 16 24' -- "$cur")) + _comp_compgen -- -W '8 15 16 24' return ;; -*x) - COMPREPLY=($(compgen -W 'broadband modem lan' -- "$cur")) + _comp_compgen -- -W 'broadband modem lan' return ;; -*r) case $cur in sound:*) - COMPREPLY=($(compgen -W 'local off remote' \ - -- "${cur#sound:}")) + _comp_compgen -c "${cur#sound:}" -- -W 'local off remote' ;; *:*) ;; *) - COMPREPLY=($(compgen -W 'comport: disk: lptport: - printer: sound: lspci scard' -- "$cur")) + _comp_compgen -- -W 'comport: disk: lptport: printer: + sound: lspci scard' [[ ${COMPREPLY-} == *: ]] && compopt -o nospace ;; esac @@ -45,13 +40,15 @@ _rdesktop() esac if [[ $cur == -* ]]; then - local opts=($(_parse_help "$1")) - COMPREPLY=($(compgen -W '${opts[@]%:}' -- "$cur")) + local -a opts + _comp_compgen -Rv opts help + ((${#opts[@]})) && + _comp_compgen -- -W '"${opts[@]%:}"' else - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" fi } && - complete -F _rdesktop rdesktop + complete -F _comp_cmd_rdesktop rdesktop # ex: filetype=sh diff --git a/completions/remove_members b/completions/remove_members index db7ad0b..4689b03 100644 --- a/completions/remove_members +++ b/completions/remove_members @@ -1,27 +1,30 @@ # mailman remove_members completion -*- shell-script -*- -_remove_members() +_comp_cmd_remove_members() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -f | --file) - _filedir + _comp_compgen_filedir return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--file --all --fromall --nouserack - --noadminack --help' -- "$cur")) + _comp_compgen -- -W '--file --all --fromall --nouserack --noadminack + --help' else - _xfunc list_lists _mailman_lists + # Prefer `list_lists` in the same dir as command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_compgen -x list_lists mailman_lists fi } && - complete -F _remove_members remove_members + complete -F _comp_cmd_remove_members remove_members # ex: filetype=sh diff --git a/completions/removepkg b/completions/removepkg index a56beb0..73b632b 100644 --- a/completions/removepkg +++ b/completions/removepkg @@ -1,25 +1,22 @@ # Slackware Linux removepkg completion -*- shell-script -*- -_removepkg() +_comp_cmd_removepkg() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-copy -keep -preserve -warn' -- "$cur")) + _comp_compgen -- -W '-copy -keep -preserve -warn' return fi - if [[ $cur == */* ]]; then - _filedir + if _comp_looks_like_path "$cur"; then + _comp_compgen_filedir return fi local root=${ROOT:-/} - COMPREPLY=($( - cd "$root/var/log/packages" 2>/dev/null || return 1 - compgen -f -- "$cur" - )) + _comp_compgen -C "$root/var/log/packages" -- -f } && - complete -F _removepkg removepkg + complete -F _comp_cmd_removepkg removepkg # ex: filetype=sh diff --git a/completions/reportbug b/completions/reportbug index 69b12e9..30c4647 100644 --- a/completions/reportbug +++ b/completions/reportbug @@ -1,96 +1,76 @@ # bash completion for (Debian) reportbug -*- shell-script -*- -_reportbug() +_comp_cmd_reportbug() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[CefKHPsoiATjVuQtBS]*)' + # shellcheck disable=SC2254 case $prev in - --class | --header | --pseudo-header | --mirror | --list-cc | --subject | \ - --http_proxy | --proxy | --email | --realname | --smtpuser | --smtppasswd | \ - --replyto | --reply-to | --justification | --package-version | --body | \ - --body-file | --timeout | --max-attachment-size | --envelope-from | \ - -!(-*)[CHPsjV]) + --class | --header | --pseudo-header | --mirror | --list-cc | \ + --subject | --http_proxy | --proxy | --email | --realname | \ + --smtpuser | --smtppasswd | --replyto | --reply-to | \ + --justification | --package-version | --body | --body-file | \ + --timeout | --max-attachment-size | --envelope-from | \ + -${noargopts}[CHPsjV]) return ;; --filename | --include | --mta | --output | --attach | -[fioA]) - _filedir + _comp_compgen_filedir return ;; - --keyid | -!(-*)K) - COMPREPLY=($(compgen -W '$(IFS=: ; \ - gpg --list-keys --with-colons 2>/dev/null \ - | while read -ra row ; do - [[ "${row[0]}" == [ps]ub && ${row[11]} == *s* ]] && \ - printf "%s\n" "${row[4]}" - done)' -- "$cur")) + --keyid | -${noargopts}K) + _comp_compgen_split -- "$( + IFS=: + gpg --list-keys --with-colons 2>/dev/null | + while read -ra row; do + [[ ${row[0]} == [ps]ub && ${row[11]} == *s* ]] && + printf '%s\n' "${row[4]}" + done + )" return ;; - --bts | -!(-*)B) - COMPREPLY=($(compgen -W "debian guug kde mandrake help" -- \ - "$cur")) + --tag | --ui | --interface | --type | --bts | --severity | --mode | -${noargopts}[TutBS]) + _comp_compgen_split -- "$("$1" "$prev" help 2>&1 | + command sed -ne '/^[[:space:]]/p')" return ;; - --editor | --mua | --mbox-reader-cmd | -!(-*)e) - compopt -o filenames - COMPREPLY=($(compgen -c -- "$cur")) - return - ;; - --mode) - COMPREPLY=($(compgen -W "novice standard expert" -- "$cur")) - return - ;; - --severity | -!(-*)S) - COMPREPLY=($(compgen -W "grave serious important normal minor - wishlist" -- "$cur")) - return - ;; - --ui | --interface | -!(-*)u) - COMPREPLY=($(compgen -W "newt text gnome" -- "$cur")) - return - ;; - --type | -!(-*)t) - COMPREPLY=($(compgen -W "gnats debbugs" -- "$cur")) - return - ;; - --tag | -!(-*)T) - COMPREPLY=($(compgen -W "none woody potato sarge sarge-ignore - etch etch-ignore lenny lenny-ignore sid experimental confirmed - d-i fixed fixed-in-experimental fixed-upstream help l10n - moreinfo patch pending security unreproducible upstream wontfix - ipv6 lfs" -- "$cur")) + --editor | --mua | --mbox-reader-cmd | -${noargopts}e) + _comp_compgen_commands return ;; --from-buildd) - COMPREPLY=($(compgen -S "_" -W '$(apt-cache dumpavail | \ - command grep "^Source: $cur" | sort -u | cut -f2 -d" ")')) + _comp_compgen_split -S "_" -- "$(apt-cache dumpavail | + _comp_awk -F ' ' '$1 == "Source:" && !uniq[$2]++ { print $2 }')" return ;; --smtphost) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; --draftpath) - _filedir -d + _comp_compgen_filedir -d return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == -*= ]] && compopt -o nospace return fi - COMPREPLY=($(compgen -W 'wnpp boot-floppies kernel bugs.debian.org + _comp_compgen -- -W 'wnpp boot-floppies kernel bugs.debian.org cdimage.debian.org general installation-reports listarchives lists.debian.org mirrors nm.debian.org press project qa.debian.org release-notes security.debian.org tech-ctte upgrade-reports - www.debian.org $(_xfunc apt-cache _apt_cache_packages)' -- "$cur")) - _filedir + www.debian.org' + _comp_compgen -ax apt-cache packages + _comp_compgen -a filedir } && - complete -F _reportbug reportbug + complete -F _comp_cmd_reportbug reportbug # ex: filetype=sh diff --git a/completions/resolvconf b/completions/resolvconf index b407488..4389fa8 100644 --- a/completions/resolvconf +++ b/completions/resolvconf @@ -1,21 +1,21 @@ # bash completion for resolvconf -*- shell-script -*- -_resolvconf() +_comp_cmd_resolvconf() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -a | -d) - _available_interfaces + _comp_compgen_available_interfaces return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-a -d -u' -- "$cur")) + _comp_compgen -- -W '-a -d -u' fi } && - complete -F _resolvconf resolvconf + complete -F _comp_cmd_resolvconf resolvconf # ex: filetype=sh diff --git a/completions/ri b/completions/ri index 9c34b27..514bf6d 100644 --- a/completions/ri +++ b/completions/ri @@ -1,110 +1,116 @@ # ri completion for Ruby documentation -*- shell-script -*- # by Ian Macdonald <ian@caliban.org> -_ri_get_methods() +# @var[in] ri_version +# @var[in] prefix +# @var[in] classes +_comp_cmd_ri__compgen_methods() { - local regex + local _regex + local IFS=$' \t\n' # needed for ${classes[@]+"${classes[@]}"} in bash-5.2 + local _methods if [[ $ri_version == integrated ]]; then - if [[ -z $separator ]]; then - regex="(Instance|Class)" + if [[ ! $separator ]]; then + _regex="(Instance|Class)" elif [[ $separator == "#" ]]; then - regex=Instance + _regex=Instance else - regex=Class + _regex=Class fi - COMPREPLY+=( - "$(ri "${classes[@]}" 2>/dev/null | ruby -ane \ - 'if /^'"$regex"' methods:/.../^------------------|^$/ and \ + _comp_split -la _methods \ + "$(ri ${classes[@]+"${classes[@]}"} 2>/dev/null | ruby -ane \ + 'if /^'"$_regex"' methods:/.../^------------------|^$/ and \ /^ / then print $_.split(/, |,$/).grep(/^[^\[]*$/).join("\n"); \ - end' 2>/dev/null | sort -u)") + end' 2>/dev/null | sort -u)" else # older versions of ri didn't distinguish between class/module and # instance methods - COMPREPLY+=( - "$(ruby -W0 $ri_path "${classes[@]}" 2>/dev/null | ruby -ane \ + _comp_split -la _methods \ + "$(ruby -W0 "$ri_path" ${classes[@]+"${classes[@]}"} 2>/dev/null | ruby -ane \ 'if /^-/.../^-/ and ! /^-/ and ! /^ +(class|module): / then \ print $_.split(/, |,$| +/).grep(/^[^\[]*$/).join("\n"); \ - end' | sort -u)") - fi - COMPREPLY=($(compgen $prefix -W '${COMPREPLY[@]}' -- $method)) + end' | sort -u)" + fi && + _comp_compgen -- -P "$prefix" -W '"${_methods[@]}"' } # needs at least Ruby 1.8.0 in order to use -W0 -_ri() +_comp_cmd_ri() { - 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 noargopts='!(-*|*[wfd]*)' + # shellcheck disable=SC2254 case $prev in - --help | --width | -!(-*)[hw]) + --help | --width | -${noargopts}[hw]) return ;; - --format | -!(-*)f) - COMPREPLY=($(compgen -W 'ansi bs html rdoc' -- "$cur")) + --format | -${noargopts}f) + _comp_compgen -- -W 'ansi bs html rdoc' return ;; - --doc-dir | -!(-*)d) - _filedir -d + --doc-dir | -${noargopts}d) + _comp_compgen_filedir -d return ;; --dump) - _filedir ri + _comp_compgen_filedir ri return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - local class method prefix ri_path ri_version ri_major separator IFS + local class method prefix="" ri_path ri_version ri_major="" separator local -a classes ri_path=$(type -p ri) # which version of ri are we using? # -W0 is required here to stop warnings from older versions of ri # from being captured when used with Ruby 1.8.1 and later - ri_version="$(ruby -W0 $ri_path -v 2>&1)" || ri_version=integrated + ri_version="$(ruby -W0 "$ri_path" -v 2>&1)" || ri_version=integrated [[ $ri_version != "${ri_version%200*}" ]] && ri_version=integrated [[ $ri_version =~ ri[[:space:]]v?([0-9]+) ]] && ri_major=${BASH_REMATCH[1]} # need to also split on commas - IFS=$', \n\t' if [[ $cur == [A-Z]*[#.]* ]]; then [[ $cur == *#* ]] && separator=# || separator=. # we're completing on class and method - class=${cur%$separator*} - method=${cur#*$separator} - classes=($class) - prefix="-P $class$separator" - _ri_get_methods + class=${cur%"$separator"*} + method=${cur#*"$separator"} + _comp_split -F $', \n\t' classes "$class" + prefix=$class$separator + _comp_compgen -c "$method" -i ri methods return fi if [[ $ri_version == integrated ]]; then # integrated ri from Ruby 1.9 - classes=($(ri -c 2>/dev/null | ruby -ne 'if /^\s*$/..$stdin.eof then \ - if /^ +[A-Z]/ then print; end; end' 2>/dev/null)) + _comp_split -F $', \n\t' classes \ + "$(ri -c 2>/dev/null | ruby -ne 'if /^\s*$/..$stdin.eof then \ + if /^ +[A-Z]/ then print; end; end' 2>/dev/null)" elif [[ $ri_major && $ri_major -ge 3 ]]; then - classes=($(ri -l 2>/dev/null)) + _comp_split -F $', \n\t' classes "$(ri -l 2>/dev/null)" elif [[ $ri_version == "ri 1.8a" ]]; then - classes=($(ruby -W0 $ri_path | + _comp_split -F $', \n\t' classes "$(ruby -W0 "$ri_path" | ruby -ne 'if /^'"'"'ri'"'"' has/..$stdin.eof then \ - if /^ .*[A-Z]/ then print; end; end')) + if /^ .*[A-Z]/ then print; end; end')" else - classes=($(ruby -W0 $ri_path | + _comp_split -F $', \n\t' classes "$(ruby -W0 "$ri_path" | ruby -ne 'if /^I have/..$stdin.eof then \ - if /^ .*[A-Z]/ then print; end; end')) - fi - - COMPREPLY=($(compgen -W '${classes[@]}' -- "$cur")) - __ltrim_colon_completions "$cur" + if /^ .*[A-Z]/ then print; end; end')" + fi && + _comp_compgen -- -W '"${classes[@]}"' + _comp_ltrim_colon_completions "$cur" if [[ $cur == [A-Z]* ]]; then # we're completing on class or module alone @@ -112,9 +118,8 @@ _ri() fi # we're completing on methods - method=$cur - _ri_get_methods + _comp_cmd_ri__compgen_methods } && - complete -F _ri ri + complete -F _comp_cmd_ri ri # ex: filetype=sh diff --git a/completions/rmlist b/completions/rmlist index 0cc473a..f3aca06 100644 --- a/completions/rmlist +++ b/completions/rmlist @@ -1,17 +1,20 @@ # mailman rmlist completion -*- shell-script -*- -_rmlist() +_comp_cmd_rmlist() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--archives --help' -- "$cur")) + _comp_compgen -- -W '--archives --help' else - _xfunc list_lists _mailman_lists + # Prefer `list_lists` in the same dir as command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_compgen -x list_lists mailman_lists fi } && - complete -F _rmlist rmlist + complete -F _comp_cmd_rmlist rmlist # ex: filetype=sh diff --git a/completions/rmmod b/completions/rmmod index 7ec29e6..a57a206 100644 --- a/completions/rmmod +++ b/completions/rmmod @@ -1,10 +1,10 @@ # Linux rmmod(8) completion. -*- shell-script -*- # This completes on a list of all currently installed kernel modules. -_rmmod() +_comp_cmd_rmmod() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -h | --help | -V | --version) @@ -13,12 +13,12 @@ _rmmod() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - _installed_modules "$cur" + _comp_compgen_inserted_kernel_modules } && - complete -F _rmmod rmmod + complete -F _comp_cmd_rmmod rmmod # ex: filetype=sh diff --git a/completions/route b/completions/route index f9b3196..3351415 100644 --- a/completions/route +++ b/completions/route @@ -2,13 +2,13 @@ [[ $OSTYPE == *linux* ]] || return 1 -_route() +_comp_cmd_route() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $prev == dev ]]; then - _available_interfaces + _comp_compgen_available_interfaces return fi @@ -16,15 +16,16 @@ _route() local opt found i for opt in add del -host -net netmask metric mss window irtt reject mod \ dyn reinstate dev default gw; do - found=false - for ((i = 1; i < ${#words[@]} - 1; i++)); do - [[ ${words[i]} == "$opt" ]] && found=true && break + found="" + for ((i = 1; i < cword; i++)); do + [[ ${words[i]} == "$opt" ]] && found=set && break done - $found || COMPREPLY+=("$opt") + [[ $found ]] || COMPREPLY+=("$opt") done - COMPREPLY=($(compgen -W '"${COMPREPLY[@]}"' -- "$cur")) + ((${#COMPREPLY[@]})) && + _comp_compgen -- -W '"${COMPREPLY[@]}"' } && - complete -F _route route + complete -F _comp_cmd_route route # ex: filetype=sh diff --git a/completions/rpcdebug b/completions/rpcdebug index 6e2b88c..59778d9 100644 --- a/completions/rpcdebug +++ b/completions/rpcdebug @@ -1,46 +1,47 @@ # bash completion for rpcdebug -*- shell-script -*- -_rpcdebug_flags() +_comp_cmd_rpcdebug__flags() { local i module for ((i = 1; i < ${#words[@]}; i++)); do if [[ ${words[i]} == -m ]]; then - module=${words[i + 1]} + module=${words[i + 1]-} break fi done - if [[ -n $module ]]; then - COMPREPLY=($(compgen -W "$(rpcdebug -vh 2>&1 | - command sed -ne 's/^'$module'[[:space:]]\{1,\}//p')" -- "$cur")) + if [[ $module ]]; then + _comp_compgen_split -- "$(rpcdebug -vh 2>&1 | + command sed -ne 's/^'"$module"'[[:space:]]\{1,\}//p')" fi } -_rpcdebug() +_comp_cmd_rpcdebug() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*s) - _rpcdebug_flags + _comp_cmd_rpcdebug__flags return ;; -*c) - _rpcdebug_flags + _comp_cmd_rpcdebug__flags return ;; -*m) - COMPREPLY=($(compgen -W 'rpc nfs nfsd nlm' -- "$cur")) + _comp_compgen -- -W 'rpc nfs nfsd nlm' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" -h) -s -c' -- "$cur")) + _comp_compgen_usage -- -h + _comp_compgen -a -- -W '-s -c' fi } && - complete -F _rpcdebug rpcdebug + complete -F _comp_cmd_rpcdebug rpcdebug # ex: filetype=sh diff --git a/completions/rpm b/completions/rpm index 8299a37..b6cafa5 100644 --- a/completions/rpm +++ b/completions/rpm @@ -2,99 +2,114 @@ # helper functions -_rpm_installed_packages() +# @since 2.12 +_comp_xfunc_rpm_compgen_installed_packages() { - if [[ -r /var/log/rpmpkgs && \ + _comp_cmd_rpm__compgen_installed_packages rpm +} + +_comp_cmd_rpm__compgen_installed_packages() +{ + if [[ -r /var/log/rpmpkgs && /var/log/rpmpkgs -nt /var/lib/rpm/Packages ]]; then # using RHL 7.2 or later - this is quicker than querying the DB - COMPREPLY=($(compgen -W "$(command sed -ne \ + _comp_compgen_split -- "$(command sed -ne \ 's|^\([^[:space:]]\{1,\}\)-[^[:space:]-]\{1,\}-[^[:space:]-]\{1,\}\.rpm$|\1|p' \ - /var/log/rpmpkgs)" -- "$cur")) + /var/log/rpmpkgs)" elif type rpmqpack &>/dev/null; then # SUSE's rpmqpack is faster than rpm -qa - COMPREPLY=($(compgen -W '$(rpmqpack)' -- "$cur")) + _comp_compgen_split -- "$(rpmqpack)" else - COMPREPLY=($(${1:-rpm} -qa --nodigest --nosignature \ - --queryformat='%{NAME} ' "$cur*" 2>/dev/null)) + _comp_compgen_split -- "$("${1:-rpm}" -qa --nodigest --nosignature \ + --queryformat='%{NAME} ' "$cur*" 2>/dev/null)" fi } -_rpm_groups() +_comp_deprecate_func 2.12 _rpm_installed_packages \ + _comp_xfunc_rpm_compgen_installed_packages + +_comp_cmd_rpm__groups() { - local IFS=$'\n' - COMPREPLY=($(compgen -W "$(${1:-rpm} -qa --nodigest --nosignature \ - --queryformat='%{GROUP}\n' 2>/dev/null)" -- "$cur")) + _comp_compgen_split -l -- "$("${1:-rpm}" -qa --nodigest --nosignature \ + --queryformat='%{GROUP}\n' 2>/dev/null)" } -_rpm_macros() +_comp_cmd_rpm__macros() { # get a list of macros - COMPREPLY=($(compgen -W "$(${1:-rpm} --showrc | command sed -ne \ - 's/^-\{0,1\}[0-9]\{1,\}[:=][[:space:]]\{1,\}\([^[:space:](]\{3,\}\).*/%\1/p')" \ - -- "$cur")) + _comp_compgen_split -- "$("${1:-rpm}" --showrc | command sed -ne \ + 's/^-\{0,1\}[0-9]\{1,\}[:=][[:space:]]\{1,\}\([^[:space:](]\{3,\}\).*/%\1/p')" } -_rpm_buildarchs() +# shellcheck disable=SC2120 +_comp_cmd_rpm__buildarchs() { - COMPREPLY=($(compgen -W "$(${1:-rpm} --showrc | command sed -ne \ - 's/^\s*compatible\s\s*build\s\s*archs\s*:\s*\(.*\)/\1/ p')" \ - -- "$cur")) + # Case-insensitive BRE to match "compatible build archs" + local regex_header='[cC][oO][mM][pP][aA][tT][iI][bB][lL][eE][[:space:]]\{1,\}[bB][uU][iI][lL][dD][[:space:]]\{1,\}[aA][rR][cC][hH][sS]' + _comp_compgen_split -- "$("${1:-rpm}" --showrc | command sed -ne \ + "s/^[[:space:]]*${regex_header}[[:space:]]*:[[:space:]]*\(.*\)/\1/p")" +} + +# shellcheck disable=SC2120 +_comp_cmd_rpm__configdir() +{ + cfgdir=$("${1:-rpm}" --eval '%{_rpmconfigdir}' 2>/dev/null) } # rpm(8) completion # -_rpm() +_comp_cmd_rpm() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return if ((cword == 1)); then # first parameter on line case $cur in --*) - COMPREPLY=($(compgen -W '--help --version --initdb - --checksig --addsign --delsign --rebuilddb --showrc - --setperms --setugids --eval --install --upgrade --query - --freshen --erase --verify --querytags --import' \ - -- "$cur")) + _comp_compgen -- -W '--help --version --initdb --checksig + --addsign --delsign --rebuilddb --showrc --setperms + --setugids --eval --install --upgrade --query --freshen + --erase --verify --querytags --import' ;; *) - COMPREPLY=($(compgen -W '-e -E -F -i -q -t -U -V' -- "$cur")) + _comp_compgen -- -W '-e -E -F -i -q -t -U -V' ;; esac return fi + local noargopts='!(-*|*[rED]*)' + # shellcheck disable=SC2254 case $prev in - --dbpath | --excludepath | --prefix | --relocate | --root | -!(-*)r) - _filedir -d + --dbpath | --excludepath | --prefix | --relocate | --root | -${noargopts}r) + _comp_compgen_filedir -d return ;; - --eval | -!(-*)E) - _rpm_macros $1 + --eval | -${noargopts}E) + _comp_cmd_rpm__macros "$1" return ;; --pipe) - compopt -o filenames - COMPREPLY=($(compgen -c -- "$cur")) + _comp_compgen_commands return ;; --rcfile) - _filedir + _comp_compgen_filedir return ;; --specfile) # complete on .spec files - _filedir spec + _comp_compgen_filedir spec return ;; --whatenhances | --whatprovides | --whatrecommends | --whatrequires | \ --whatsuggests | --whatsupplements) - if [[ $cur == */* ]]; then - _filedir + if _comp_looks_like_path "$cur"; then + _comp_compgen_filedir else # complete on capabilities - local IFS=$'\n' fmt + local fmt case $prev in *enhances) fmt="%{ENHANCENAME}" ;; *provides) fmt="%{PROVIDENAME}" ;; @@ -103,176 +118,181 @@ _rpm() *suggests) fmt="%{SUGGESTNAME}" ;; *supplements) fmt="%{SUPPLEMENTNAME}" ;; esac - COMPREPLY=($(compgen -W "$($1 -qa --nodigest --nosignature \ - --queryformat=\"$fmt\\n\" 2>/dev/null | - command grep -vF '(none)')" -- "$cur")) + _comp_compgen_split -l -- "$("$1" -qa --nodigest \ + --nosignature --queryformat="\"$fmt\\n\"" 2>/dev/null | + command grep -vF '(none)')" fi return ;; - --define | --fileid | --hdrid | --pkgid | -!(-*)D) + --define | --fileid | --hdrid | --pkgid | -${noargopts}D) # argument required but no completions available return ;; esac - $split && return + [[ $was_split ]] && return # options common to all modes - local opts="--define= --eval= --macros= --nodigest --nosignature --rcfile= - --quiet --pipe --verbose" + local -a opts=( + --define= --eval= --macros= --nodigest --nosignature --rcfile= --quiet + --pipe --verbose + ) case ${words[1]} in -[iFU]* | --install | --freshen | --upgrade) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W "$opts --percent --force --test - --replacepkgs --replacefiles --root --excludedocs --includedocs - --noscripts --ignorearch --dbpath --prefix= --ignoreos --nodeps - --allfiles --ftpproxy --ftpport --justdb --httpproxy --httpport - --noorder --relocate= --badreloc --notriggers --excludepath= - --ignoresize --oldpackage --queryformat --repackage - --nosuggests" -- "$cur")) + _comp_compgen -- -W '"${opts[@]}" --percent --force --test + --replacepkgs --replacefiles --root --excludedocs + --includedocs --noscripts --ignorearch --dbpath --prefix= + --ignoreos --nodeps --allfiles --ftpproxy --ftpport + --justdb --httpproxy --httpport --noorder --relocate= + --badreloc --notriggers --excludepath= --ignoresize + --oldpackage --queryformat --repackage --nosuggests' else - _filedir '[rs]pm' + _comp_compgen_filedir '[rs]pm' fi ;; -e | --erase) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W "$opts --allmatches --noscripts - --notriggers --nodeps --test --repackage" -- "$cur")) + _comp_compgen -- -W '"${opts[@]}" --allmatches --noscripts + --notriggers --nodeps --test --repackage' else - _rpm_installed_packages $1 + _comp_cmd_rpm__compgen_installed_packages "$1" fi ;; -q* | --query) # options common to all query types - opts+=" --changelog --configfiles --conflicts --docfiles --dump + opts+=( + --changelog --configfiles --conflicts --docfiles --dump --enhances --filesbypkg --filecaps --fileclass --filecolor --fileprovide --filerequire --filesbypkg --info --list --obsoletes --pipe --provides --queryformat= --requires --scripts --suggests --triggers --xml --recommends - --supplements --filetriggers --licensefiles" + --supplements --filetriggers --licensefiles + ) if [[ ${words[*]} == *\ -@(*([^ -])f|-file )* ]]; then # -qf completion if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W "$opts --dbpath --fscontext - --last --root --state" -- "$cur")) + _comp_compgen -- -W '"${opts[@]}" --dbpath --fscontext + --last --root --state' else - _filedir + _comp_compgen_filedir fi elif [[ ${words[*]} == *\ -@(*([^ -])g|-group )* ]]; then # -qg completion - _rpm_groups $1 + _comp_cmd_rpm__groups "$1" elif [[ ${words[*]} == *\ -@(*([^ -])p|-package )* ]]; then # -qp; uninstalled package completion if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W "$opts --ftpport --ftpproxy - --httpport --httpproxy --nomanifest" -- "$cur")) + _comp_compgen -- -W '"${opts[@]}" --ftpport --ftpproxy + --httpport --httpproxy --nomanifest' else - _filedir '[rs]pm' + _comp_compgen_filedir '[rs]pm' fi else # -q; installed package completion if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W "$opts --all --file --fileid + _comp_compgen -- -W '"${opts[@]}" --all --file --fileid --dbpath --fscontext --ftswalk --group --hdrid --last --package --pkgid --root= --specfile --state --triggeredby --whatenhances --whatprovides --whatrecommends --whatrequires --whatsuggests - --whatsupplements" \ - -- "$cur")) + --whatsupplements' elif [[ ${words[*]} != *\ -@(*([^ -])a|-all )* ]]; then - _rpm_installed_packages $1 + _comp_cmd_rpm__compgen_installed_packages "$1" fi fi ;; -K* | --checksig) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W "$opts --nopgp --nogpg --nomd5" \ - -- "$cur")) + _comp_compgen -- -W '"${opts[@]}" --nopgp --nogpg --nomd5' else - _filedir '[rs]pm' + _comp_compgen_filedir '[rs]pm' fi ;; -[Vy]* | --verify) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W "$opts --root= --dbpath --nodeps + _comp_compgen -- -W '"${opts[@]}" --root= --dbpath --nodeps --nogroup --nolinkto --nomode --nomtime --nordev --nouser --nofiles --noscripts --nomd5 --querytags --specfile --whatenhances --whatprovides --whatrecommends - --whatrequires --whatsuggests --whatsupplements" \ - -- "$cur")) + --whatrequires --whatsuggests --whatsupplements' # check whether we're doing file completion elif [[ ${words[*]} == *\ -@(*([^ -])f|-file )* ]]; then - _filedir + _comp_compgen_filedir elif [[ ${words[*]} == *\ -@(*([^ -])g|-group )* ]]; then - _rpm_groups $1 + _comp_cmd_rpm__groups "$1" elif [[ ${words[*]} == *\ -@(*([^ -])p|-package )* ]]; then - _filedir '[rs]pm' + _comp_compgen_filedir '[rs]pm' else - _rpm_installed_packages $1 + _comp_cmd_rpm__compgen_installed_packages "$1" fi ;; --resign | --addsign | --delsign) - _filedir '[rs]pm' + _comp_compgen_filedir '[rs]pm' ;; --setperms | --setgids) - _rpm_installed_packages $1 + _comp_cmd_rpm__compgen_installed_packages "$1" ;; --import | --dbpath | --root) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--import --dbpath --root=' \ - -- "$cur")) + _comp_compgen -- -W '--import --dbpath --root=' else - _filedir + _comp_compgen_filedir fi ;; esac [[ ${COMPREPLY-} == *= ]] && compopt -o nospace } && - complete -F _rpm rpm + complete -F _comp_cmd_rpm rpm -_rpmbuild() +_comp_cmd_rpmbuild() { - local cur prev words cword split - _init_completion -s || return - - local rpm="${1%build*}" - [[ $rpm == "$1" ]] || ! type $rpm &>/dev/null && rpm= + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[rED]*)' + # shellcheck disable=SC2119,SC2254 case $prev in - --buildroot | --root | --dbpath | -!(-*)r) - _filedir -d + --buildroot | --root | --dbpath | -${noargopts}r) + _comp_compgen_filedir -d return ;; + --target | --eval | -${noargopts}E | --buildpolicy) + # Prefer `rpm` in the same dir in utility functions + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + ;;& --target) - _rpm_buildarchs $rpm + _comp_cmd_rpm__buildarchs return ;; - --eval | -!(-*)E) - _rpm_macros $rpm + --eval | -${noargopts}E) + _comp_cmd_rpm__macros return ;; --macros | --rcfile) - _filedir + _comp_compgen_filedir return ;; --buildpolicy) - local cfgdir=$($rpm --eval '%{_rpmconfigdir}' 2>/dev/null) + local cfgdir + _comp_cmd_rpm__configdir if [[ $cfgdir ]]; then - COMPREPLY=($(compgen -W "$(command ls $cfgdir 2>/dev/null | - command sed -ne 's/^brp-//p')" -- "$cur")) + _comp_compgen_split -- "$(command ls "$cfgdir" 2>/dev/null | + command sed -ne 's/^brp-//p')" fi ;; - --define | --with | --without | -!(-*)D) + --define | --with | --without | -${noargopts}D) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W "$(_parse_help "$1")" -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi @@ -295,8 +315,8 @@ _rpmbuild() ;; esac done - [[ -n $ext ]] && _filedir $ext + [[ $ext ]] && _comp_compgen_filedir "$ext" } && - complete -F _rpmbuild rpmbuild rpmbuild-md5 + complete -F _comp_cmd_rpmbuild rpmbuild rpmbuild-md5 # ex: filetype=sh diff --git a/completions/rpm2tgz b/completions/rpm2tgz index 5ddcfd5..552a3a1 100644 --- a/completions/rpm2tgz +++ b/completions/rpm2tgz @@ -1,17 +1,17 @@ # Slackware rpm2tgz completion -*- shell-script -*- -_rpm2tgz() +_comp_cmd_rpm2tgz() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-s -S -n -r -d -c' -- "$cur")) + _comp_compgen -- -W '-s -S -n -r -d -c' return fi - _filedir "rpm" + _comp_compgen_filedir "rpm" } && - complete -F _rpm2tgz rpm2tgz rpm2txz rpm2targz + complete -F _comp_cmd_rpm2tgz rpm2tgz rpm2txz rpm2targz # ex: filetype=sh diff --git a/completions/rpmcheck b/completions/rpmcheck index cf4ed95..d7d0348 100644 --- a/completions/rpmcheck +++ b/completions/rpmcheck @@ -1,24 +1,24 @@ # bash completion for rpmcheck -*- shell-script -*- -_rpmcheck() +_comp_cmd_rpmcheck() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -base) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-explain -failures -successes -dump - -dump-all -base -help -compressed-input' -- "$cur")) + _comp_compgen -- -W '-explain -failures -successes -dump -dump-all + -base -help -compressed-input' else - _filedir + _comp_compgen_filedir fi } && - complete -F _rpmcheck rpmcheck + complete -F _comp_cmd_rpmcheck rpmcheck # ex: filetype=sh diff --git a/completions/rrdtool b/completions/rrdtool index dcb9ce6..8f85687 100644 --- a/completions/rrdtool +++ b/completions/rrdtool @@ -1,17 +1,17 @@ # bash completion for rrdtool -*- shell-script -*- -_rrdtool() +_comp_cmd_rrdtool() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if ((${#words[@]} == 2)); then - COMPREPLY=($(compgen -W 'create update updatev graph dump restore - last lastupdate first info fetch tune resize xport' -- "$cur")) + _comp_compgen -- -W 'create update updatev graph dump restore last + lastupdate first info fetch tune resize xport' else - _filedir rrd + _comp_compgen_filedir rrd fi } && - complete -F _rrdtool rrdtool + complete -F _comp_cmd_rrdtool rrdtool # ex: filetype=sh diff --git a/completions/rsync b/completions/rsync index 0bf5389..f471b46 100644 --- a/completions/rsync +++ b/completions/rsync @@ -1,67 +1,75 @@ # bash completion for rsync -*- shell-script -*- -_rsync() +_comp_cmd_rsync() { - 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 noargopts='!(-*|*[Te]*)' + # shellcheck disable=SC2254 case $prev in - --config | --password-file | --include-from | --exclude-from | --files-from | \ - --log-file | --write-batch | --only-write-batch | --read-batch) + --config | --password-file | --include-from | --exclude-from | \ + --files-from | --log-file | --write-batch | --only-write-batch | \ + --read-batch) compopt +o nospace - _filedir + _comp_compgen_filedir return ;; - --temp-dir | --compare-dest | --backup-dir | --partial-dir | --copy-dest | \ - --link-dest | -!(-*)T) + --temp-dir | --compare-dest | --backup-dir | --partial-dir | \ + --copy-dest | --link-dest | -${noargopts}T) compopt +o nospace - _filedir -d + _comp_compgen_filedir -d return ;; - --rsh | -!(-*)e) + --rsh | -${noargopts}e) compopt +o nospace - COMPREPLY=($(compgen -W 'rsh ssh' -- "$cur")) + _comp_compgen -- -W 'rsh ssh' return ;; --compress-level) compopt +o nospace - COMPREPLY=($(compgen -W '{1..9}' -- "$cur")) + _comp_compgen -- -W '{1..9}' + return + ;; + --info) + _comp_delimited , -W ' + backup{,0} + copy{,0} + del{,0} + flist{,0,1,2} + misc{,0,1,2} + mount{,0} + name{,0,1,2} + nonreg{,0,1} + progress{,0,1,2} + remove{,0} + skip{,0,1,2} + stats{,0,1,2,3} + symsafe{,0} + all{,0,1,2,3,4} + none + help + ' return ;; esac - $split && return + [[ $was_split ]] && return - _expand || return + _comp_expand || return case $cur in -*) - COMPREPLY=($(compgen -W '--verbose --quiet --no-motd --checksum - --archive --recursive --relative --no-implied-dirs - --backup --backup-dir= --suffix= --update --inplace --append - --append-verify --dirs --old-dirs --links --copy-links - --copy-unsafe-links --safe-links --copy-dirlinks - --keep-dirlinks --hard-links --perms --executability --chmod= - --acls --xattrs --owner --group --devices --copy-devices - --specials --times --omit-dir-times --super --fake-super - --sparse --dry-run --whole-file --no-whole-file - --one-file-system --block-size= --rsh= --rsync-path= - --existing --ignore-existing --remove-source-files --delete - --delete-before --delete-during --delete-delay --delete-after - --delete-excluded --ignore-errors --force --max-delete= - --max-size= --min-size= --partial --partial-dir= - --delay-updates --prune-empty-dirs --numeric-ids --timeout= - --contimeout= --ignore-times --size-only --modify-window= - --temp-dir= --fuzzy --compare-dest= --copy-dest= --link-dest= - --compress --compress-level= --skip-compress= --cvs-exclude - --filter= --exclude= --exclude-from= --include= --include-from= - --files-from= --from0 --protect-args --address= --port= - --sockopts= --blocking-io --no-blocking-io --stats - --8-bit-output --human-readable --progress --itemize-changes - --out-format= --log-file= --log-file-format= --password-file= - --list-only --bwlimit= --write-batch= --only-write-batch= - --read-batch= --protocol= --iconv= --ipv4 --ipv6 --version - --help --daemon --config= --no-detach' -- "$cur")) + local tmp + # Account for the fact that older rsync versions (before cba00be6, + # meaning before v3.2.0) contain the following unusual line in + # --help: + # "(-h) --help show this help (-h is --help only if used alone)" + _comp_compgen -Rv tmp help - <<<"$("$1" --help 2>&1 | command sed -e 's/^([^)]*)//')" + + _comp_compgen -- -W '"${tmp[@]}" + --daemon --old-d{,irs} + --no-{blocking-io,detach,whole-file,inc-recursive,i-r}' -X '--no-OPTION' [[ ${COMPREPLY-} == *= ]] || compopt +o nospace ;; *:*) @@ -73,14 +81,14 @@ _rsync() break fi done - [[ $shell == ssh ]] && _xfunc ssh _scp_remote_files + [[ $shell == ssh ]] && _comp_compgen -x scp remote_files ;; *) - _known_hosts_real -c -a -- "$cur" - _xfunc ssh _scp_local_files + _comp_compgen_known_hosts -c -a -- "$cur" + _comp_compgen -ax scp local_files ;; esac } && - complete -F _rsync -o nospace rsync + complete -F _comp_cmd_rsync -o nospace rsync # ex: filetype=sh diff --git a/completions/sbcl b/completions/sbcl index 22a93e4..f74f841 100644 --- a/completions/sbcl +++ b/completions/sbcl @@ -2,20 +2,20 @@ # bash programmable completion for various Common Lisp implementations by # Nikodemus Siivola <nikodemus@random-state.net> -_sbcl() +_comp_cmd_sbcl() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return # completing an option (may or may not be separated by a space) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--core --noinform --help --version - --sysinit --userinit --eval --noprint --disable-debugger - --end-runtime-options --end-toplevel-options ' -- "$cur")) + _comp_compgen -- -W '--core --noinform --help --version --sysinit + --userinit --eval --noprint --disable-debugger + --end-runtime-options --end-toplevel-options' else - _filedir + _comp_compgen_filedir fi } && - complete -F _sbcl sbcl sbcl-mt + complete -F _comp_cmd_sbcl sbcl sbcl-mt # ex: filetype=sh diff --git a/completions/sbopkg b/completions/sbopkg index 16bd58f..a2fc5a6 100644 --- a/completions/sbopkg +++ b/completions/sbopkg @@ -1,31 +1,30 @@ # bash completion for sbopkg(8) -*- shell-script -*- -_sbopkg() +_comp_cmd_sbopkg() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + _comp_compgen_help -- -h [[ ${COMPREPLY-} ]] && return fi case "$prev" in -e) - COMPREPLY=($(compgen -W 'ask continue stop' -- "$cur")) + _comp_compgen -- -W 'ask continue stop' return ;; -f) - _filedir + _comp_compgen_filedir return ;; -d) - _filedir -d + _comp_compgen_filedir -d return ;; -V) - COMPREPLY=($(compgen -W "? - $(sbopkg -V '?' 2>&1 | cut -s -f1)" -- "$cur")) + _comp_compgen_split -- "? $(sbopkg -V '?' 2>&1 | cut -s -f1)" return ;; -i | -b) ;; @@ -35,20 +34,20 @@ _sbopkg() ;; esac - local i config + local i REPLY config config="/etc/sbopkg/sbopkg.conf" - for ((i = ${#words[@]} - 1; i > 0; i--)); do + for ((i = ${#words[@]} - 2; i > 0; i--)); do if [[ ${words[i]} == -f ]]; then - config="${words[i + 1]}" - __expand_tilde_by_ref config + _comp_expand_tilde "${words[i + 1]}" + config=$REPLY break fi done - [[ -r $config ]] || return - . $config + [[ -f $config && -r $config ]] || return + . "$config" - for ((i = 1; i < ${#words[@]}; i++)); do + for ((i = 1; i < ${#words[@]} - 1; i++)); do case "${words[i]}" in -V) REPO_NAME="${words[i + 1]%%/*}" @@ -59,15 +58,13 @@ _sbopkg() ;; esac done - [[ -r $REPO_ROOT/$REPO_NAME/$REPO_BRANCH/SLACKBUILDS.TXT ]] || return + local file=${REPO_ROOT-}/${REPO_NAME-}/${REPO_BRANCH-}/SLACKBUILDS.TXT + [[ -f $file && -r $file ]] || return - COMPREPLY=($(command sed -ne "/^SLACKBUILD NAME: $cur/{s/^SLACKBUILD NAME: //;p}" \ - $REPO_ROOT/$REPO_NAME/$REPO_BRANCH/SLACKBUILDS.TXT) - $( - cd $QUEUEDIR - compgen -f -X "!*.sqf" -- "$cur" - )) + _comp_compgen_split -l -- "$(command sed -ne "s/^SLACKBUILD NAME: //p" \ + "$file")" + _comp_compgen -aC "$QUEUEDIR" -- -f -X "!*.sqf" } && - complete -F _sbopkg sbopkg + complete -F _comp_cmd_sbopkg sbopkg # ex: filetype=sh diff --git a/completions/screen b/completions/screen index 651ca2c..ab4b7dd 100644 --- a/completions/screen +++ b/completions/screen @@ -1,12 +1,13 @@ # bash completion for screen -*- shell-script -*- -_screen_sessions() +_comp_cmd_screen__sessions() { - local sessions=($(command screen -ls | command sed -ne \ - 's|^\t\{1,\}\([0-9]\{1,\}\.[^\t]\{1,\}\).*'"$1"'.*$|\1|p')) + local -a sessions + _comp_split sessions "$(command screen -ls | command sed -ne \ + 's|^\t\{1,\}\([0-9]\{1,\}\.[^\t]\{1,\}\).*'"$1"'.*$|\1|p')" || return if [[ $cur == +([0-9])?(.*) ]]; then # Complete sessions including pid prefixes - COMPREPLY=($(compgen -W '${sessions[@]}' -- "$cur")) + _comp_compgen -- -W '"${sessions[@]}"' else # Create unique completions, dropping pids where possible local -A res @@ -17,26 +18,22 @@ _screen_sessions() for i in "${!res[@]}"; do [[ ${res[i]} == \ *\ * ]] && tmp+=" ${res[i]}" || tmp+=" $i" done - COMPREPLY=($(compgen -W '$tmp' -- "$cur")) + _comp_compgen -- -W '$tmp' fi } && - _screen() + _comp_cmd_screen() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if ((cword == 1)); then if [[ $cur == /dev* ]]; then - COMPREPLY=($(compgen -W "$( - shopt -s nullglob - printf '%s\n' \ - /dev/serial/by-id/* /dev/ttyUSB* /dev/ttyACM* 2>/dev/null - )" \ - -- "$cur")) + _comp_expand_glob COMPREPLY '/dev/serial/*/* /dev/ttyUSB* /dev/ttyACM*' && + _comp_compgen -- -W '"${COMPREPLY[@]}"' return fi if [[ $cur == //* ]]; then - COMPREPLY=($(compgen -W '//telnet' -- "$cur")) + _comp_compgen -- -W '//telnet' return fi fi @@ -44,14 +41,14 @@ _screen_sessions() case ${words[1]} in /dev*) if ((cword == 2)); then - COMPREPLY=($(compgen -W '110 300 600 1200 2400 4800 9600 \ - 14400 19200 38400 57600 115200 128000 256000' -- "$cur")) + _comp_compgen -- -W '110 300 600 1200 2400 4800 9600 14400 + 19200 38400 57600 115200 128000 256000' # TODO more, comma separated options fi return ;; //telnet) - ((cword == 2)) && _known_hosts_real -- "$cur" + ((cword == 2)) && _comp_compgen_known_hosts -- "$cur" return ;; esac @@ -59,7 +56,7 @@ _screen_sessions() if ((cword > 2)); then case ${words[cword - 2]} in -*[dD]) - _screen_sessions + _comp_cmd_screen__sessions return ;; esac @@ -77,36 +74,36 @@ _screen_sessions() ;; esac - _command_offset $i + _comp_command_offset $i return done case $prev in -*[rR]) # list detached - _screen_sessions 'Detached' + _comp_cmd_screen__sessions 'Detached' return ;; -*[dD]) # list attached - _screen_sessions 'Attached' + _comp_cmd_screen__sessions 'Attached' return ;; -*x) # list both - _screen_sessions + _comp_cmd_screen__sessions return ;; -*s) - _shells + _comp_compgen_shells return ;; -*c) - _filedir + _comp_compgen_filedir return ;; -T) - _terms + _comp_compgen_terms return ;; -*[ehpSt]) @@ -115,9 +112,9 @@ _screen_sessions() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help fi } && - complete -F _screen screen + complete -F _comp_cmd_screen screen # ex: filetype=sh diff --git a/completions/scrub b/completions/scrub index bbb37be..f989211 100644 --- a/completions/scrub +++ b/completions/scrub @@ -1,36 +1,38 @@ # scrub(1) completion -*- shell-script -*- -_scrub() +_comp_cmd_scrub() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[bsDpX]*)' + # shellcheck disable=SC2254 case $prev in - --version | --help | --blocksize | --device-size | --dirent | -!(-*)[vhbsD]) + --version | --help | --blocksize | --device-size | --dirent | \ + -${noargopts}[vhbsD]) return ;; - --pattern | -!(-*)p) - COMPREPLY=($(compgen -W '$("$1" --help 2>&1 | - awk "/^Available/{flag=1;next}/^ /&&flag{print \$1}")' \ - -- "$cur")) + --pattern | -${noargopts}p) + _comp_compgen_split -- "$("$1" --help 2>&1 | + _comp_awk '/^Available/{flag=1;next}/^ /&&flag{print $1}')" return ;; - --freespace | -!(-*)X) - _filedir -d + --freespace | -${noargopts}X) + _comp_compgen_filedir -d return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir + _comp_compgen_filedir } && - complete -F _scrub scrub + complete -F _comp_cmd_scrub scrub # ex: filetype=sh diff --git a/completions/secret-tool b/completions/secret-tool index 5462fc0..e8aafd8 100644 --- a/completions/secret-tool +++ b/completions/secret-tool @@ -1,50 +1,50 @@ # bash completion for secret-tool(1) -*- shell-script -*- -_secret_tool() +_comp_cmd_secret_tool() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return - $split && return + [[ $was_split ]] && return local -i i - local mode word + local mode="" has_mode="" word for i in ${!words[*]}; do if [[ $i -gt 0 && ${words[i]} != -* ]]; then - ((i != cword)) && mode=${words[i]} + ((i != cword)) && mode=${words[i]} has_mode=set break fi done - if [[ ! -v mode ]]; then - local -a modes - modes=($("$1" nonexistent-mode 2>&1 | + if [[ ! $has_mode ]]; then + # generate modes + _comp_compgen_split -- "$("$1" nonexistent-mode 2>&1 | while read -r first second third rest; do if [[ $first == "${1##*/}" ]]; then printf "%s\n" "$second" elif [[ $first == usage: && $second == "${1##*/}" ]]; then printf "%s\n" "$third" fi - done)) - COMPREPLY=($(compgen -W '${modes[@]}' -- "$cur")) + done)" return fi case $mode in store) if [[ ${words[*]} != *\ --label[\ =]* ]]; then - COMPREPLY=($(compgen -W "--label=" -- "$cur")) + _comp_compgen -- -W "--label=" [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi ;; search) local -A opts=([--all]="" [--unlock]="") for word in "${words[@]:2}"; do - [[ $word ]] && unset opts["$word"] + [[ $word ]] && unset -v 'opts[$word]' done - COMPREPLY=($(compgen -W '${opts[@]}' -- "$cur")) + ((${#opts[@]})) && + _comp_compgen -- -W '"${!opts[@]}"' ;; esac } && - complete -F _secret_tool secret-tool + complete -F _comp_cmd_secret_tool secret-tool # ex: filetype=sh diff --git a/completions/sh b/completions/sh index 5624ffa..5581bcc 100644 --- a/completions/sh +++ b/completions/sh @@ -1,36 +1,35 @@ # POSIX sh(1) completion -*- shell-script -*- -_sh() +_comp_cmd_sh() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -c) return ;; -o | +o) - COMPREPLY=($(compgen -W 'allexport errexit ignoreeof monitor - noclobber noglob noexec nolog notify nounset verbose vi - xtrace' -- "$cur")) + _comp_compgen -- -W 'allexport errexit ignoreeof monitor noclobber + noglob noexec nolog notify nounset verbose vi xtrace' return ;; esac local opts="-a -b -C -e -f -h -i -m -n -o -u -v -x" if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W "$opts -c -s" -- "$cur")) + _comp_compgen -- -W "$opts -c -s" return elif [[ $cur == +* ]]; then - COMPREPLY=($(compgen -W "${opts//-/+}" -- "$cur")) + _comp_compgen -- -W "${opts//-/+}" return fi - local args ext= - _count_args "" "@(-c|[-+]o)" - ((args == 1)) && ext="sh" - _filedir $ext + local REPLY ext= + _comp_count_args -a "@(-c|[-+]o)" + ((REPLY == 1)) && ext="sh" + _comp_compgen_filedir $ext } && - complete -F _sh sh + complete -F _comp_cmd_sh sh # ex: filetype=sh diff --git a/completions/sha256sum b/completions/sha256sum new file mode 100644 index 0000000..adef1cd --- /dev/null +++ b/completions/sha256sum @@ -0,0 +1,38 @@ +# bash completion for sha256(1) and friends -*- shell-script -*- + +_comp_cmd_sha256sum() +{ + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + + case $prev in + -h | --help | --version) + return + ;; + esac + + [[ $was_split ]] && return + + if [[ $cur == -* ]]; then + _comp_complete_longopt "$@" + return + fi + + local sumtype=${1##*/} + sumtype=${sumtype%sum} + + local opt + for opt in "${words[@]}"; do + if [[ $opt == -@(c|-check) ]]; then + _comp_compgen_filedir "$sumtype" + return + fi + done + + local files + _comp_compgen -v files filedir && + _comp_compgen -- -X "*.$sumtype" -W '"${files[@]}"' +} && + complete -F _comp_cmd_sha256sum b2sum md5sum sha{,1,224,256,384,512}sum + +# ex: filetype=sh diff --git a/completions/shellcheck b/completions/shellcheck index 6421d7b..dc14c07 100644 --- a/completions/shellcheck +++ b/completions/shellcheck @@ -1,63 +1,65 @@ # bash completion for shellcheck(1) -*- shell-script -*- -_shellcheck_optarg() +_comp_cmd_shellcheck__optarg() { local args=$("$1" --help 2>&1 | - command sed -e 's/,/ /g' -ne 's/^.*'$2'\>.*(\([^)]*\)).*/\1/p') - COMPREPLY+=($(compgen -W '$args' -- "$cur")) + command sed -e 's/,/ /g' -ne 's/^.*'"$2"'\>.*(\([^)]*\)).*/\1/p') + _comp_compgen -a -- -W '$args' } -_shellcheck() +_comp_cmd_shellcheck() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[eifCsoPW]*)' + # shellcheck disable=SC2254 case $prev in - --version | -!(-*)V*) + --version | -${noargopts}V*) return ;; - --exclude | --include | -!(-*)[ei]) + --exclude | --include | -${noargopts}[ei]) return ;; - --format | -!(-*)f) + --format | -${noargopts}f) local args=$("$1" --format=nonexistent-format /dev/null 2>&1 | command sed -ne '/^Supported formats/,//p' | command sed -ne '/^[[:space:]]/p') - COMPREPLY=($(compgen -W '$args' -- "$cur")) + _comp_compgen -- -W '$args' return ;; - --color | -!(-*)C) - _shellcheck_optarg "$1" --color + --color | -${noargopts}C) + _comp_cmd_shellcheck__optarg "$1" --color return ;; - --shell | -!(-*)s) - _shellcheck_optarg "$1" --shell + --shell | -${noargopts}s) + _comp_cmd_shellcheck__optarg "$1" --shell return ;; - --enable | -!(-*)o) - COMPREPLY=($(compgen -W 'all' -- "$cur")) # TODO others? + --enable | -${noargopts}o) + _comp_compgen -- -W 'all' # TODO others? return ;; - --source-path | -!(-*)P) - _filedir -d - COMPREPLY+=($(compgen -W 'SCRIPTDIR' -- "$cur")) + --source-path | -${noargopts}P) + _comp_compgen_filedir -d + _comp_compgen -a -- -W 'SCRIPTDIR' return ;; - --wiki-link-count | -!(-*)W) + --wiki-link-count | -${noargopts}W) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir + _comp_compgen_filedir } && - complete -F _shellcheck shellcheck + complete -F _comp_cmd_shellcheck shellcheck # ex: filetype=sh diff --git a/completions/sitecopy b/completions/sitecopy index 8515687..87e8775 100644 --- a/completions/sitecopy +++ b/completions/sitecopy @@ -3,31 +3,33 @@ # 2011 Raphaël Droz <raphael.droz+floss@gmail.com> # License: GNU GPL v2 or later -_sitecopy() +_comp_cmd_sitecopy() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[dgrp]*)' + # shellcheck disable=SC2254 case $prev in - --debug | -!(-*)d) - COMPREPLY=($(compgen -W "socket files rcfile ftp http httpbody - rsh sftp xml xmlparse cleartext" -- "$cur")) + --debug | -${noargopts}d) + _comp_compgen -- -W 'socket files rcfile ftp http httpbody rsh sftp + xml xmlparse cleartext' compopt -o nospace return ;; - --logfile | --rcfile | -!(-*)[gr]) - _filedir + --logfile | --rcfile | -${noargopts}[gr]) + _comp_compgen_filedir return ;; - --storepath | -!(-*)p) - _filedir -d + --storepath | -${noargopts}p) + _comp_compgen_filedir -d return ;; esac case $cur in --*) - COMPREPLY=($(compgen -W "$(_parse_help $1)" -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return ;; @@ -41,10 +43,10 @@ _sitecopy() esac if [[ -r ~/.sitecopyrc ]]; then - COMPREPLY=($(compgen -W "$($1 -v | - command sed -n '/^Site:/s/Site: //p')" -- "$cur")) + _comp_compgen_split -- "$("$1" -v | + command sed -n '/^Site:/s/Site: //p')" fi } && - complete -F _sitecopy -o default sitecopy + complete -F _comp_cmd_sitecopy -o default sitecopy # ex: filetype=sh diff --git a/completions/slackpkg b/completions/slackpkg deleted file mode 100644 index 1d87928..0000000 --- a/completions/slackpkg +++ /dev/null @@ -1,112 +0,0 @@ -# bash completion for slackpkg(8) -*- shell-script -*- -# options list is based on `grep '\-.*\=.*)' /usr/sbin/slackpkg | cut -f1 -d\)` - -_slackpkg() -{ - local cur prev words cword - _init_completion -n = || return - - local split=false - if [[ $cur == -?*=* ]]; then - prev="${cur%%?(\\)=*}" - cur="${cur#*=}" - split=true - fi - - case "$prev" in - -delall | -checkmd5 | -checkgpg | -checksize | -postinst | -onoff | -download_all | \ - -dialog | -batch | -only_new_dotnew | -use_includes | -spinning) - COMPREPLY=($(compgen -W 'on off' -- "$cur")) - return - ;; - -default_answer) - COMPREPLY=($(compgen -W 'yes no' -- "$cur")) - return - ;; - -dialog_maxargs | -mirror) - # argument required but no completions available - return - ;; - esac - - $split && return - - if [[ $cur == -* ]]; then - compopt -o nospace - COMPREPLY=($(compgen -W '-delall= -checkmd5= -checkgpg= - -checksize= -postinst= -onoff= -download_all= -dialog= - -dialog_maxargs= -batch= -only_new_dotnew= -use_includes= - -spinning= -default_answer= -mirror=' -- "$cur")) - return - fi - - local confdir="/etc/slackpkg" - local config="$confdir/slackpkg.conf" - - [[ -r $config ]] || return - . "$config" - - local i action - for ((i = 1; i < ${#words[@]}; i++)); do - if [[ ${words[i]} != -* ]]; then - action="${words[i]}" - break - fi - done - - case "$action" in - generate-template | search | file-search) - # argument required but no completions available - return - ;; - install-template | remove-template) - if [[ -e $confdir/templates ]]; then - COMPREPLY=($( - cd "$confdir/templates" - compgen -f -X "!*.template" -- "$cur" - )) - COMPREPLY=(${COMPREPLY[@]%.template}) - fi - return - ;; - remove) - _filedir - COMPREPLY+=($(compgen -W 'a ap d e f k kde kdei l n t tcl x - xap xfce y' -- "$cur")) - COMPREPLY+=($( - cd /var/log/packages - compgen -f -- "$cur" - )) - return - ;; - install | reinstall | upgrade | blacklist | download) - _filedir - COMPREPLY+=($(compgen -W 'a ap d e f k kde kdei l n t tcl x - xap xfce y' -- "$cur")) - COMPREPLY+=($(cut -f 6 -d\ "${WORKDIR}/pkglist" 2>/dev/null | - command grep "^$cur")) - return - ;; - info) - COMPREPLY=($(cut -f 6 -d\ "${WORKDIR}/pkglist" 2>/dev/null | - command grep "^$cur")) - return - ;; - update) - # we should complete the same as the next `list` + "gpg" - COMPREPLY=($(compgen -W 'gpg' -- "$cur")) - ;& - *) - COMPREPLY+=($(compgen -W 'install reinstall upgrade remove - blacklist download update install-new upgrade-all - clean-system new-config check-updates help generate-template - install-template remove-template search file-search info' -- \ - "$cur")) - return - ;; - esac - -} && - complete -F _slackpkg slackpkg - -# ex: filetype=sh diff --git a/completions/slapt-get b/completions/slapt-get index 14c2dbe..1dc09e0 100644 --- a/completions/slapt-get +++ b/completions/slapt-get @@ -1,13 +1,13 @@ # slapt-get(8) completion -*- shell-script -*- -_slapt_get() +_comp_cmd_slapt_get() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case "$prev" in --config | -c) - _filedir + _comp_compgen_filedir return ;; --retry | --search) @@ -17,7 +17,7 @@ _slapt_get() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" --help)' -- "$cur")) + _comp_compgen_help if [[ ${COMPREPLY-} ]]; then [[ $COMPREPLY == *= ]] && compopt -o nospace return @@ -25,7 +25,8 @@ _slapt_get() fi local i t - # search for last action (--install|--install-set|--remove|--show|--filelist) + # search for last action + # (--install|--install-set|--remove|--show|--filelist) for ((i = ${#words[@]} - 1; i > 0; i--)); do if [[ ${words[i]} == --show ]]; then t="all" @@ -46,8 +47,9 @@ _slapt_get() # search for config for ((i = ${#words[@]} - 1; i > 0; i--)); do if [[ ${words[i]} == -@(c|-config) ]]; then - config="${words[i + 1]}" - __expand_tilde_by_ref config + local REPLY + _comp_expand_tilde "${words[i + 1]-}" + config=$REPLY break fi done @@ -58,29 +60,29 @@ _slapt_get() # slapt-get will fail to search for "^name-version" # it can search for names only local name=${cur%%-*} - COMPREPLY=($(LC_ALL=C "$1" -c "$config" --search "^$name" \ - 2>/dev/null | LC_ALL=C command sed -ne "/^$cur/{s/ .*$//;p}")) + _comp_compgen_split -l -- "$( + LC_ALL=C "$1" -c "$config" --search "^$name" 2>/dev/null | + LC_ALL=C command sed -ne "/^$cur/{s/ .*$//;p;}" + )" return ;; avl) # --install|-i| - COMPREPLY=($(LC_ALL=C "$1" -c "$config" --available \ - 2>/dev/null | LC_ALL=C command sed -ne "/^$cur/{s/ .*$//;p}")) + _comp_compgen_split -l -- "$( + LC_ALL=C "$1" -c "$config" --available 2>/dev/null | + LC_ALL=C command sed -ne "/^$cur/{s/ .*$//;p;}" + )" return ;; ins) # --remove|--filelist - COMPREPLY=($( - cd /var/log/packages - compgen -f -- "$cur" - )) + _comp_compgen -C /var/log/packages -- -f return ;; set) # --install-set - COMPREPLY=($(compgen -W 'a ap d e f k kde kdei l n t tcl x - xap xfce y' -- "$cur")) + _comp_compgen -- -W 'a ap d e f k kde kdei l n t tcl x xap xfce y' return ;; esac } && - complete -F _slapt_get slapt-get + complete -F _comp_cmd_slapt_get slapt-get # ex: filetype=sh diff --git a/completions/slapt-src b/completions/slapt-src index 1e3828c..cdf00c2 100644 --- a/completions/slapt-src +++ b/completions/slapt-src @@ -1,13 +1,13 @@ # slapt-src(8) completion -*- shell-script -*- -_slapt_src() +_comp_cmd_slapt_src() { - 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 case "$prev" in --config | -c) - _filedir + _comp_compgen_filedir return ;; --search | -s | --postprocess | -p) @@ -16,17 +16,17 @@ _slapt_src() ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" --help)' -- "$cur")) + _comp_compgen_help if [[ ${COMPREPLY-} ]]; then [[ $COMPREPLY == *= ]] && compopt -o nospace return fi fi - local i t + local i t="" # search for last action (-i|-w|-b|-f) for ((i = ${#words[@]} - 1; i > 0; i--)); do if [[ ${words[i]} == -@([iwfb]|-install|-show|-build|-fetch) ]]; then @@ -42,8 +42,9 @@ _slapt_src() # search for config for ((i = ${#words[@]} - 1; i > 0; i--)); do if [[ ${words[i]} == -@(c|-config) ]]; then - config="${words[i + 1]}" - __expand_tilde_by_ref config + local REPLY + _comp_expand_tilde "${words[i + 1]-}" + config=$REPLY break fi if [[ ${words[i]} == --config=?* ]]; then @@ -55,14 +56,19 @@ _slapt_src() if [[ $cur == *:* ]]; then local name=${cur%:*} - COMPREPLY=($(LC_ALL=C "$1" --config "$config" --search "^$name" \ - 2>/dev/null | LC_ALL=C command sed -ne \ - "/^$cur/{s/^$name:\([^ ]*\) .*$/\1/;p}")) + _comp_compgen_split -l -- "$( + LC_ALL=C + "$1" --config "$config" --search "^$name" 2>/dev/null | + command sed -ne "/^$cur/{s/^$name:\([^ ]*\) .*$/\1/;p;}" + )" else - COMPREPLY=($(LC_ALL=C "$1" --config "$config" --search "^$cur" \ - 2>/dev/null | LC_ALL=C command sed -ne "/^$cur/{s/ .*$//;p}")) + _comp_compgen_split -l -- "$( + LC_ALL=C + "$1" --config "$config" --search "^$cur" 2>/dev/null | + command sed -ne "/^$cur/{s/ .*$//;p;}" + )" fi } && - complete -F _slapt_src slapt-src + complete -F _comp_cmd_slapt_src slapt-src # ex: filetype=sh diff --git a/completions/smartctl b/completions/smartctl index ee45a7c..376ceb8 100644 --- a/completions/smartctl +++ b/completions/smartctl @@ -1,26 +1,17 @@ # bash completion for smartctl(8) -*- shell-script -*- -_smartctl_quietmode() -{ - COMPREPLY=($(compgen -W 'errorsonly silent noserial' -- "$cur")) -} -_smartctl_device() +_comp_cmd_smartctl__device() { case $cur in areca* | 3ware* | megaraid* | cciss*) - # shellcheck disable=SC2054 - COMPREPLY+=(${cur%%,*},{0..31}) - COMPREPLY=($(compgen -W '"${COMPREPLY[@]}"' -- "$cur")) + _comp_compgen -- -W '${cur%%,*},{0..31}' ;; hpt*) - # shellcheck disable=SC2054 - COMPREPLY+=(hpt,{1..4}/{1..8} hpt,{1..4}/{1..8}/{1..5}) - COMPREPLY=($(compgen -W '"${COMPREPLY[@]}"' -- "$cur")) + _comp_compgen -- -W 'hpt,{1..4}/{1..8} hpt,{1..4}/{1..8}/{1..5}' ;; *) - COMPREPLY=($(compgen -W "ata scsi sat usbcypress usbjmicron - usbsunplus marvell areca 3ware hpt megaraid cciss auto test" \ - -- "$cur")) + _comp_compgen -- -W 'ata scsi sat usbcypress usbjmicron usbsunplus + marvell areca 3ware hpt megaraid cciss auto test' case "${COMPREPLY[@]}" in areca | 3ware | hpt | megaraid | cciss) compopt -o nospace @@ -29,137 +20,101 @@ _smartctl_device() ;; esac } -_smartctl_tolerance() -{ - COMPREPLY=($(compgen -W 'normal conservative permissive verypermissive' \ - -- "$cur")) -} -_smartctl_badsum() -{ - COMPREPLY=($(compgen -W 'warn exit ignore' -- "$cur")) -} -_smartctl_report() -{ - COMPREPLY=($(compgen -W 'ioctl ataioctl scsiioctl' -- "$cur")) -} -_smartctl_powermode() -{ - COMPREPLY=($(compgen -W 'never sleep standby idle' -- "$cur")) -} -_smartctl_feature() -{ - COMPREPLY=($(compgen -W 'on off' -- "$cur")) -} -_smartctl_log() -{ - COMPREPLY=($(compgen -W 'error selftest selective directory background - sasphy sasphy,reset sataphy sataphy,reset scttemp scttempsts - scttemphist scterc gplog smartlog xerror xselftest' -- "$cur")) -} -_smartctl_vendorattribute() -{ - COMPREPLY=($(compgen -W 'help 9,minutes 9,seconds 9,halfminutes 9,temp - 192,emergencyretractcyclect 193,loadunload 194,10xCelsius 194,unknown - 198,offlinescanuncsectorct 200,writeerrorcount 201,detectedtacount - 220,temp' -- "$cur")) -} -_smartctl_firmwarebug() -{ - COMPREPLY=($(compgen -W 'none samsung samsung2 samsung3 swapid' \ - -- "$cur")) -} -_smartctl_presets() -{ - COMPREPLY=($(compgen -W 'use ignore show showall' -- "$cur")) -} -_smartctl_test() +_comp_cmd_smartctl__test() { [[ $cur == @(pending|scttempint|vendor), ]] && return - COMPREPLY=($(compgen -W 'offline short long conveyance select, - select,redo select,next afterselect,on afterselect,off pending, - scttempint, vendor,' -- "$cur")) + _comp_compgen -- -W 'offline short long conveyance select, select,redo + select,next afterselect,on afterselect,off pending, scttempint, + vendor,' [[ ${COMPREPLY-} == *, ]] && compopt -o nospace } -_smartctl_drivedb() +_comp_cmd_smartctl__drivedb() { local prefix= if [[ $cur == +* ]]; then prefix=+ cur="${cur#+}" fi - _filedir h - [[ -n $prefix ]] && COMPREPLY=("${COMPREPLY[@]/#/$prefix}") + _comp_compgen_filedir h && [[ $prefix ]] && + _comp_compgen -Rv COMPREPLY -- -P "$prefix" -W '"${COMPREPLY[@]}"' } -_smartctl() +_comp_cmd_smartctl() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[qdTbrnsoSlvFPBt]*)' + # shellcheck disable=SC2254 case $prev in - --quietmode | -!(-*)q) - _smartctl_quietmode + --quietmode | -${noargopts}q) + _comp_compgen -- -W 'errorsonly silent noserial' + return ;; - --device | -!(-*)d) - _smartctl_device + --device | -${noargopts}d) + _comp_cmd_smartctl__device return ;; - --tolerance | -!(-*)T) - _smartctl_tolerance + --tolerance | -${noargopts}T) + _comp_compgen -- -W 'normal conservative permissive verypermissive' return ;; - --badsum | -!(-*)b) - _smartctl_badsum + --badsum | -${noargopts}b) + _comp_compgen -- -W 'warn exit ignore' return ;; - --report | -!(-*)r) - _smartctl_report + --report | -${noargopts}r) + _comp_compgen -- -W 'ioctl ataioctl scsiioctl' return ;; - --nocheck | -!(-*)n) - _smartctl_powermode + --nocheck | -${noargopts}n) + _comp_compgen -- -W 'never sleep standby idle' return ;; - --smart | --offlineauto | --saveauto | -!(-*)[soS]) - _smartctl_feature + --smart | --offlineauto | --saveauto | -${noargopts}[soS]) + _comp_compgen -- -W 'on off' return ;; - --log | -!(-*)l) - _smartctl_log + --log | -${noargopts}l) + _comp_compgen -- -W 'error selftest selective directory background + sasphy sasphy,reset sataphy sataphy,reset scttemp scttempsts + scttemphist scterc gplog smartlog xerror xselftest' return ;; - --vendorattribute | -!(-*)v) - _smartctl_vendorattribute + --vendorattribute | -${noargopts}v) + _comp_compgen -- -W 'help 9,minutes 9,seconds 9,halfminutes 9,temp + 192,emergencyretractcyclect 193,loadunload 194,10xCelsius + 194,unknown 198,offlinescanuncsectorct 200,writeerrorcount + 201,detectedtacount 220,temp' return ;; - --firmwarebug | -!(-*)F) - _smartctl_firmwarebug + --firmwarebug | -${noargopts}F) + _comp_compgen -- -W 'none samsung samsung2 samsung3 swapid' return ;; - --presets | -!(-*)P) - _smartctl_presets + --presets | -${noargopts}P) + _comp_compgen -- -W 'use ignore show showall' return ;; - --drivedb | -!(-*)B) - _smartctl_drivedb + --drivedb | -${noargopts}B) + _comp_cmd_smartctl__drivedb return ;; - --test | -!(-*)t) - _smartctl_test + --test | -${noargopts}t) + _comp_cmd_smartctl__test return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - cur=${cur:=/dev/} - _filedir + _comp_compgen -c "${cur:-/dev/}" filedir fi } && - complete -F _smartctl smartctl + complete -F _comp_cmd_smartctl smartctl # ex: filetype=sh diff --git a/completions/smbclient b/completions/smbclient index cea2107..bd2deeb 100644 --- a/completions/smbclient +++ b/completions/smbclient @@ -1,242 +1,248 @@ # bash completion for samba -*- shell-script -*- -_samba_resolve_order() +_comp_cmd_smbclient__resolve_order() { - COMPREPLY=($(compgen -W 'lmhosts host wins bcast' -- "$cur")) + _comp_compgen -- -W 'lmhosts host wins bcast' } -_samba_domains() +_comp_cmd_smbclient__domains() { - if [[ -n ${COMP_SAMBA_SCAN:-} ]]; then - COMPREPLY=($(compgen -W '$(smbtree -N -D)' -- "$cur")) + if [[ ${BASH_COMPLETION_CMD_SMBTREE_SCAN-${COMP_SAMBA_SCAN-}} ]]; then + _comp_compgen_split -- "$(smbtree -N -D)" fi } -_samba_hosts() +_comp_cmd_smbclient__hosts() { - if [[ -n ${COMP_SAMBA_SCAN:-} ]]; then - COMPREPLY=($(compgen -W "$( - smbtree -N -S | - command sed -ne 's/^[[:space:]]*\\\\*\([^[:space:]]*\).*/\1/p' - )" -- "$cur")) + if [[ ${BASH_COMPLETION_CMD_SMBTREE_SCAN-${COMP_SAMBA_SCAN-}} ]]; then + _comp_compgen_split -- "$(smbtree -N -S | + command sed -ne 's/^[[:space:]]*\\\\*\([^[:space:]]*\).*/\1/p')" fi } -_samba_debuglevel() +_comp_cmd_smbclient__debuglevel() { - COMPREPLY=($(compgen -W '{0..10}' -- "$cur")) + _comp_compgen -- -W '{0..10}' } -_samba_sockopts() +_comp_cmd_smbclient__sockopts() { - COMPREPLY=($(compgen -W 'SO_KEEPALIVE SO_REUSEADDR SO_BROADCAST - TCP_NODELAY IPTOS_LOWDELAY IPTOS_THROUGHPUT SO_SNDBUF SO_RCVBUF - SO_SNDLOWAT SO_RCVLOWAT' -- "$cur")) + _comp_compgen -- -W 'SO_KEEPALIVE SO_REUSEADDR SO_BROADCAST TCP_NODELAY + IPTOS_LOWDELAY IPTOS_THROUGHPUT SO_SNDBUF SO_RCVBUF SO_SNDLOWAT + SO_RCVLOWAT' } -_samba_signing() +_comp_cmd_smbclient__signing() { - COMPREPLY=($(compgen -W 'on off required' -- "$cur")) + _comp_compgen -- -W 'on off required' } -_smbclient() +_comp_cmd_smbclient() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[RtsAlDOTWdLSpMIbUniTcm]*)' + # shellcheck disable=SC2254 case $prev in - --name-resolve | -!(-*)R) - _samba_resolve_order + --name-resolve | -${noargopts}R) + _comp_cmd_smbclient__resolve_order return ;; - -!(-*)t) - COMPREPLY=($(compgen -W 'SJIS EUC JIS7 JIS8 JUNET HEX CAP' \ - -- "$cur")) + -${noargopts}t) + _comp_compgen -- -W 'SJIS EUC JIS7 JIS8 JUNET HEX CAP' return ;; - --configfile | --authentication-file | -!(-*)[sA]) - _filedir + --configfile | --authentication-file | -${noargopts}[sA]) + _comp_compgen_filedir return ;; - --log-basename | --directory | -!(-*)[lD]) - _filedir -d + --log-basename | --directory | -${noargopts}[lD]) + _comp_compgen_filedir -d return ;; - --socket-options | -!(-*)O) - _samba_sockopts + --socket-options | -${noargopts}O) + _comp_cmd_smbclient__sockopts return ;; - -!(-*)T) - COMPREPLY=($(compgen -W 'c x I X F b g q r N a' -- "$cur")) + -${noargopts}T) + _comp_compgen -- -W 'c x I X F b g q r N a' return ;; - --workgroup | -!(-*)W) - _samba_domains + --workgroup | -${noargopts}W) + _comp_cmd_smbclient__domains return ;; - --debuglevel | -!(-*)d) - _samba_debuglevel + --debuglevel | -${noargopts}d) + _comp_cmd_smbclient__debuglevel return ;; - --list | -!(-*)L) - _samba_hosts + --list | -${noargopts}L) + _comp_cmd_smbclient__hosts return ;; - --signing | -!(-*)S) - _samba_signing + --signing | -${noargopts}S) + _comp_cmd_smbclient__signing return ;; - --port | --message | --ip-address | --send-buffer | --user | --netbiosname | \ - --scope | --tar | --command | --max-protocol | -!(-*)[pMIbUniTcm]) + --port | --message | --ip-address | --send-buffer | --user | \ + --netbiosname | --scope | --tar | --command | --max-protocol | \ + -${noargopts}[pMIbUniTcm]) return ;; - --help | --version | -!(-*)[?V]) + --help | --version | -${noargopts}[?V]) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _smbclient smbclient + complete -F _comp_cmd_smbclient smbclient -_smbget() +_comp_cmd_smbget() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[ofdwupb]*)' + # shellcheck disable=SC2254 case $prev in - --outputfile | --rcfile | -!(-*)[of]) - _filedir + --outputfile | --rcfile | -${noargopts}[of]) + _comp_compgen_filedir return ;; - --debuglevel | -!(-*)d) - _samba_debuglevel + --debuglevel | -${noargopts}d) + _comp_cmd_smbclient__debuglevel return ;; - --workgroup | -!(-*)w) - _samba_domains + --workgroup | -${noargopts}w) + _comp_cmd_smbclient__domains return ;; - --username | --password | --blocksize | -!(-*)[upb]) + --username | --password | --blocksize | -${noargopts}[upb]) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _smbget smbget + complete -F _comp_cmd_smbget smbget -_smbcacls() +_comp_cmd_smbcacls() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[AsldOWDMaSCGniU]*)' + # shellcheck disable=SC2254 case $prev in - --configfile | --authentication-file | -!(-*)[As]) - _filedir + --configfile | --authentication-file | -${noargopts}[As]) + _comp_compgen_filedir return ;; - --log-basename | -!(-*)l) - _filedir -d + --log-basename | -${noargopts}l) + _comp_compgen_filedir -d return ;; - --debuglevel | -!(-*)d) - _samba_debuglevel + --debuglevel | -${noargopts}d) + _comp_cmd_smbclient__debuglevel return ;; --signing) - _samba_signing + _comp_cmd_smbclient__signing return ;; - --socket-options | -!(-*)O) - _samba_sockopts + --socket-options | -${noargopts}O) + _comp_cmd_smbclient__sockopts return ;; - --workgroup | -!(-*)W) - _samba_domains + --workgroup | -${noargopts}W) + _comp_cmd_smbclient__domains return ;; - --help | --usage | --delete | --modify | --add | --set | --chown | --chgrp | \ - --netbiosname | --scope | --user | -!(-*)[?DMaSCGniU]) + --help | --usage | --delete | --modify | --add | --set | --chown | \ + --chgrp | --netbiosname | --scope | --user | -${noargopts}[?DMaSCGniU]) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _smbcacls smbcacls + complete -F _comp_cmd_smbcacls smbcacls -_smbcquotas() +_comp_cmd_smbcquotas() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[sAldUuS]*)' + # shellcheck disable=SC2254 case $prev in - --configfile | --authentication-file | -!(-*)[sA]) - _filedir + --configfile | --authentication-file | -${noargopts}[sA]) + _comp_compgen_filedir return ;; - --log-basename | -!(-*)l) - _filedir -d + --log-basename | -${noargopts}l) + _comp_compgen_filedir -d return ;; - --debuglevel | -!(-*)d) - _samba_debuglevel + --debuglevel | -${noargopts}d) + _comp_cmd_smbclient__debuglevel return ;; --signing) - _samba_signing + _comp_cmd_smbclient__signing return ;; - --help | --usage | --user | --set | -!(-*)[?UuS]) + --help | --usage | --user | --set | -${noargopts}[?UuS]) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _smbcquotas smbcquotas + complete -F _comp_cmd_smbcquotas smbcquotas -_smbpasswd() +_comp_cmd_smbpasswd() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*r) - _samba_hosts + _comp_cmd_smbclient__hosts return ;; -*R) - _samba_resolve_order + _comp_cmd_smbclient__resolve_order return ;; -*c) - _filedir + _comp_compgen_filedir return ;; -*D) - _samba_debuglevel + _comp_cmd_smbclient__debuglevel return ;; -*[Uhw]) @@ -245,31 +251,31 @@ _smbpasswd() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + _comp_compgen_help -- -h fi } && - complete -F _smbpasswd smbpasswd + complete -F _comp_cmd_smbpasswd smbpasswd -_smbtar() +_comp_cmd_smbtar() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*[rt]) - _filedir tar + _comp_compgen_filedir tar return ;; -*s) - _samba_hosts + _comp_cmd_smbclient__hosts return ;; -*l) - _samba_debuglevel + _comp_cmd_smbclient__debuglevel return ;; -*N) - _filedir + _comp_compgen_filedir return ;; -*[pxbdu]) @@ -278,45 +284,47 @@ _smbtar() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help fi } && - complete -F _smbtar smbtar + complete -F _comp_cmd_smbtar smbtar -_smbtree() +_comp_cmd_smbtree() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[sAldSU]*)' + # shellcheck disable=SC2254 case $prev in - --configfile | --authentication-file | -!(-*)[sA]) - _filedir + --configfile | --authentication-file | -${noargopts}[sA]) + _comp_compgen_filedir return ;; - --log-basename | -!(-*)l) - _filedir -d + --log-basename | -${noargopts}l) + _comp_compgen_filedir -d return ;; - --debuglevel | -!(-*)d) - _samba_debuglevel + --debuglevel | -${noargopts}d) + _comp_cmd_smbclient__debuglevel return ;; - --signing | -!(-*)S) - _samba_signing + --signing | -${noargopts}S) + _comp_cmd_smbclient__signing return ;; - --help | --usage | --user | -!(-*)[?U]) + --help | --usage | --user | -${noargopts}[?U]) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _smbtree smbtree + complete -F _comp_cmd_smbtree smbtree # ex: filetype=sh diff --git a/completions/snownews b/completions/snownews index 5b585d9..a767a6c 100644 --- a/completions/snownews +++ b/completions/snownews @@ -1,15 +1,15 @@ # snownews(1) completion -*- shell-script -*- -_snownews() +_comp_cmd_snownews() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then # return list of available options - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help fi } && - complete -F _snownews snownews + complete -F _comp_cmd_snownews snownews # ex: filetype=sh diff --git a/completions/sqlite3 b/completions/sqlite3 index 26d38a1..d1393bf 100644 --- a/completions/sqlite3 +++ b/completions/sqlite3 @@ -1,24 +1,23 @@ # sqlite3(1) completion -*- shell-script -*- -_sqlite3() +_comp_cmd_sqlite3() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local dbexts='@(sqlite?(3)|?(s?(3))db)' case $prev in - -help | -version | -lookaside | -mmap | -newline | -nullvalue | -pagecache | \ - -scratch | -separator | *.$dbexts) + -help | -version | -lookaside | -maxsize | -mmap | -newline | \ + -nullvalue | -pagecache | -scratch | -separator | -vfs | *.$dbexts) return ;; -init) - _filedir + _comp_compgen_filedir return ;; -cmd) - compopt -o filenames - COMPREPLY=($(compgen -c -- "$cur")) + _comp_compgen_commands return ;; esac @@ -27,12 +26,12 @@ _sqlite3() return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help return fi - _filedir "$dbexts" + _comp_compgen_filedir "$dbexts" } && - complete -F _sqlite3 sqlite3 + complete -F _comp_cmd_sqlite3 sqlite3 # ex: filetype=sh diff --git a/completions/ss b/completions/ss index 4a27d51..e383fe5 100644 --- a/completions/ss +++ b/completions/ss @@ -1,41 +1,43 @@ # ss(8) completion -*- shell-script -*- -_ss() +_comp_cmd_ss() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[fADF]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | -!(-*)[hV]) + --help | --version | -${noargopts}[hV]) return ;; - --family | -!(-*)f) - COMPREPLY=($(compgen -W 'unix inet inet6 link netlink' \ - -- "$cur")) + --family | -${noargopts}f) + _comp_compgen -- -W 'unix inet inet6 link netlink' return ;; - --query | -!(-*)A) - local prefix= - [[ $cur == *,* ]] && prefix="${cur%,*}," - COMPREPLY=($(compgen -W '$("$1" --help | \ - command sed -e "s/|/ /g" -ne "s/.*QUERY := {\([^}]*\)}.*/\1/p")' \ - -- "${cur##*,}")) - ((${#COMPREPLY[@]} == 1)) && COMPREPLY=(${COMPREPLY/#/$prefix}) + --query | -${noargopts}A) + local queries=$("$1" --help | + command sed -e 's/|/ /g' -ne 's/.*QUERY := {\([^}]*\)}.*/\1/p') + _comp_delimited , -W '$queries' return ;; - --diag | --filter | -!(-*)[DF]) - _filedir + --diag | --filter | -${noargopts}[DF]) + _comp_compgen_filedir return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + elif [[ $prev == state ]]; then + _comp_compgen -- -W 'all connected synchronized bucket big established + syn-sent syn-recv fin-wait-{1,2} time-wait closed close-wait + last-ack listening closing' fi } && - complete -F _ss ss + complete -F _comp_cmd_ss ss # ex: filetype=sh diff --git a/completions/ssh b/completions/ssh index 907c039..386fd25 100644 --- a/completions/ssh +++ b/completions/ssh @@ -1,195 +1,229 @@ # ssh(1) completion -*- shell-script -*- -_ssh_queries() +_comp_cmd_ssh__compgen_queries() { - COMPREPLY+=($(compgen -W \ - "cipher cipher-auth help mac kex key key-cert key-plain key-sig - protocol-version compression sig - ciphers macs kexalgorithms pubkeyacceptedkeytypes - hostkeyalgorithms hostbasedkeytypes hostbasedacceptedkeytypes" \ - -- "${cur,,}")) + local -a queries + _comp_compgen -v queries -i ssh query "$1" help || + queries=(cipher cipher-auth mac kex key key-cert key-plain key-sig + protocol-version compression sig ciphers macs kexalgorithms + pubkeyacceptedkeytypes hostkeyalgorithms hostbasedkeytypes + hostbasedacceptedkeytypes) + _comp_compgen -c "${cur,,}" -U queries -- -W '"${queries[@]}" help' } +# @since 2.12 +_comp_xfunc_ssh_compgen_query() +{ + _comp_cmd_ssh__compgen_query ssh "$1" +} + +# @deprecated 2.12 use _comp_xfunc_ssh_compgen_query _ssh_query() { - ${1:-ssh} -Q $2 2>/dev/null + local -a queries=() + _comp_compgen -v queries -i ssh query "${1:-ssh}" "$2" && + printf "%s\n" "${queries[@]}" } -_ssh_ciphers() +_comp_cmd_ssh__compgen_query() { - local ciphers='$(_ssh_query "$1" cipher)' - [[ $ciphers ]] || ciphers="3des-cbc aes128-cbc aes192-cbc aes256-cbc - aes128-ctr aes192-ctr aes256-ctr arcfour128 arcfour256 arcfour - blowfish-cbc cast128-cbc" - COMPREPLY+=($(compgen -W "$ciphers" -- "$cur")) + _comp_compgen_split -- "$("$1" -Q "$2" 2>/dev/null)" } -_ssh_macs() +_comp_cmd_ssh__compgen_ciphers() { - local macs='$(_ssh_query "$1" mac)' - [[ $macs ]] || macs="hmac-md5 hmac-sha1 umac-64@openssh.com hmac-ripemd160 - hmac-sha1-96 hmac-md5-96" - COMPREPLY+=($(compgen -W "$macs" -- "$cur")) + local -a queries + _comp_compgen -v queries -i ssh query "$1" cipher || + queries=(3des-cbc aes128-cbc aes192-cbc aes256-cbc aes128-ctr + aes192-ctr aes256-ctr arcfour128 arcfour256 arcfour blowfish-cbc + cast128-cbc) + _comp_compgen -U queries -- -W '"${queries[@]}"' } -_ssh_options() +_comp_cmd_ssh__compgen_macs() { - local opts=( - AddKeysToAgent AddressFamily BatchMode BindAddress CanonicalDomains - CanonicalizeFallbackLocal CanonicalizeHostname CanonicalizeMaxDots - CanonicalizePermittedCNAMEs CASignatureAlgorithms CertificateFile - ChallengeResponseAuthentication CheckHostIP Ciphers ClearAllForwardings - Compression ConnectionAttempts ConnectTimeout ControlMaster ControlPath - ControlPersist DynamicForward EnableSSHKeysign EscapeChar - ExitOnForwardFailure FingerprintHash ForwardAgent ForwardX11 - ForwardX11Timeout ForwardX11Trusted GatewayPorts GlobalKnownHostsFile - GSSAPIAuthentication GSSAPIClientIdentity GSSAPIDelegateCredentials - GSSAPIKeyExchange GSSAPIRenewalForcesRekey GSSAPIServerIdentity - GSSAPITrustDns HashKnownHosts Host HostbasedAuthentication - HostbasedKeyTypes HostKeyAlgorithms HostKeyAlias HostName + local -a queries + _comp_compgen -v queries -i ssh query "$1" mac || + queries=(hmac-md5 hmac-sha1 umac-64@openssh.com hmac-ripemd160 + hmac-sha1-96 hmac-md5-96) + _comp_compgen -U queries -- -W '"${queries[@]}"' +} + +# @since 2.12 +_comp_xfunc_ssh_compgen_options() +{ + # curl --silent https://raw.githubusercontent.com/openssh/openssh-portable/master/ssh_config.5 | _comp_awk '$1==".It" && $2=="Cm" && $3!="Host" && $3!="Match" {print " "$3}' | sort + local _opts=( + AddKeysToAgent AddressFamily BatchMode BindAddress BindInterface + CanonicalDomains CanonicalizeFallbackLocal CanonicalizeHostname + CanonicalizeMaxDots CanonicalizePermittedCNAMEs CASignatureAlgorithms + CertificateFile ChallengeResponseAuthentication CheckHostIP Ciphers + ClearAllForwardings Compression ConnectionAttempts ConnectTimeout + ControlMaster ControlPath ControlPersist DynamicForward + EnableSSHKeysign EscapeChar ExitOnForwardFailure FingerprintHash + ForwardAgent ForwardX11 ForwardX11Timeout ForwardX11Trusted + GatewayPorts GlobalKnownHostsFile GSSAPIAuthentication + GSSAPIDelegateCredentials HashKnownHosts HostbasedAuthentication + HostbasedKeyTypes HostKeyAlgorithms HostKeyAlias Hostname IdentitiesOnly IdentityAgent IdentityFile IgnoreUnknown Include IPQoS KbdInteractiveAuthentication KbdInteractiveDevices KexAlgorithms LocalCommand LocalForward LogLevel MACs NoHostAuthenticationForLocalhost NumberOfPasswordPrompts PasswordAuthentication PermitLocalCommand PKCS11Provider Port PreferredAuthentications ProxyCommand ProxyJump ProxyUseFdpass - PubkeyAcceptedKeyTypes PubkeyAuthentication RekeyLimit RemoteCommand - RemoteForward RequestTTY RevokedHostKeys SendEnv ServerAliveCountMax - ServerAliveInterval SmartcardDevice StreamLocalBindMask - StreamLocalBindUnlink StrictHostKeyChecking SyslogFacility TCPKeepAlive - Tunnel TunnelDevice UpdateHostKeys UsePrivilegedPort User - UserKnownHostsFile VerifyHostKeyDNS VisualHostKey XAuthLocation) - local protocols=$(_ssh_query "$1" protocol-version) - if [[ -z $protocols || $protocols == *1* ]]; then - opts+=(Cipher CompressionLevel Protocol RhostsRSAAuthentication + PubkeyAcceptedAlgorithms PubkeyAuthentication RekeyLimit RemoteCommand + RemoteForward RequestTTY RequiredRSASize RevokedHostKeys + SecurityKeyProvider SendEnv ServerAliveCountMax ServerAliveInterval + SetEnv StreamLocalBindMask StreamLocalBindUnlink StrictHostKeyChecking + SyslogFacility TCPKeepAlive Tunnel TunnelDevice UpdateHostKeys User + UserKnownHostsFile VerifyHostKeyDNS VisualHostKey XAuthLocation + ) + # Selected old ones + _opts+=( + GSSAPIKeyExchange GSSAPIRenewalForcesRekey GSSAPIServerIdentity + GSSAPITrustDns PubkeyAcceptedKeyTypes SmartcardDevice UsePrivilegedPort + ) + local -a protocols + _comp_compgen -v protocols -i ssh query ssh protocol-version + if [[ ${protocols[*]-} == *1* ]]; then + _opts+=(Cipher CompressionLevel Protocol RhostsRSAAuthentication RSAAuthentication) fi + _comp_unlocal protocols compopt -o nospace - local IFS=$' \t\n' reset=$(shopt -p nocasematch) - shopt -s nocasematch - local option - COMPREPLY=($(for option in "${opts[@]}"; do - [[ $option == "$cur"* ]] && printf '%s=\n' "$option" - done)) - $reset + _comp_compgen_split -l -- "$( + shopt -s nocasematch + local option + for option in "${_opts[@]}"; do + [[ $option == "$cur"* ]] && printf '%s=\n' "$option" + done + )" } +_comp_deprecate_func 2.12 _ssh_options _comp_xfunc_ssh_compgen_options + # Complete a ssh suboption (like ForwardAgent=y<tab>) -# Two parameters: the string to complete including the equal sign, and -# the ssh executable to invoke (optional). +# @param $1 the ssh executable to invoke +# @param $2 the string to complete including the equal sign # Not all suboptions are completed. # Doesn't handle comma-separated lists. -_ssh_suboption() +_comp_cmd_ssh__compgen_suboption() { # Split into subopt and subval - local prev=${1%%=*} cur=${1#*=} + local _prev=${2%%=*} cur=${2#*=} - case ${prev,,} in + case ${_prev,,} in batchmode | canonicaldomains | canonicalizefallbacklocal | \ challengeresponseauthentication | checkhostip | \ - clearallforwardings | controlpersist | compression | enablesshkeysign | \ - exitonforwardfailure | forwardagent | forwardx11 | forwardx11trusted | \ - gatewayports | gssapiauthentication | gssapikeyexchange | \ - gssapidelegatecredentials | gssapirenewalforcesrekey | gssapitrustdns | \ - hashknownhosts | hostbasedauthentication | identitiesonly | \ - kbdinteractiveauthentication | kbdinteractivedevices | \ - nohostauthenticationforlocalhost | passwordauthentication | permitlocalcommand | \ - proxyusefdpass | pubkeyauthentication | rhostsrsaauthentication | \ + clearallforwardings | controlpersist | compression | \ + enablesshkeysign | exitonforwardfailure | forwardagent | \ + forwardx11 | forwardx11trusted | gatewayports | \ + gssapiauthentication | gssapikeyexchange | \ + gssapidelegatecredentials | gssapirenewalforcesrekey | \ + gssapitrustdns | hashknownhosts | hostbasedauthentication | \ + identitiesonly | kbdinteractiveauthentication | \ + kbdinteractivedevices | nohostauthenticationforlocalhost | \ + passwordauthentication | permitlocalcommand | proxyusefdpass | \ + pubkeyauthentication | rhostsrsaauthentication | \ rsaauthentication | streamlocalbindunlink | \ tcpkeepalive | useprivilegedport | visualhostkey) - COMPREPLY=($(compgen -W 'yes no' -- "$cur")) + _comp_compgen -- -W 'yes no' ;; addkeystoagent) - COMPREPLY=($(compgen -W 'yes ask confirm no' -- "$cur")) + _comp_compgen -- -W 'yes ask confirm no' ;; addressfamily) - COMPREPLY=($(compgen -W 'any inet inet6' -- "$cur")) + _comp_compgen -- -W 'any inet inet6' ;; bindaddress) - _ip_addresses + _comp_compgen_ip_addresses ;; canonicalizehostname) - COMPREPLY=($(compgen -W 'yes no always' -- "$cur")) + _comp_compgen -- -W 'yes no always' ;; identityfile) - _ssh_identityfile + _comp_xfunc_ssh_compgen_identityfile ;; - *file | identityagent | include | controlpath | revokedhostkeys | xauthlocation) - _filedir + *file | identityagent | include | controlpath | revokedhostkeys | \ + xauthlocation) + _comp_compgen_filedir ;; casignaturealgorithms) - COMPREPLY=($(compgen -W '$(_ssh_query "$2" sig)' -- "$cur")) + _comp_cmd_ssh__compgen_query "$1" sig ;; cipher) - COMPREPLY=($(compgen -W 'blowfish des 3des' -- "$cur")) + _comp_compgen -- -W 'blowfish des 3des' ;; ciphers) - _ssh_ciphers "$2" + _comp_cmd_ssh__compgen_ciphers "$1" ;; controlmaster) - COMPREPLY=($(compgen -W 'yes ask auto autoask no' -- "$cur")) + _comp_compgen -- -W 'yes ask auto autoask no' ;; compressionlevel) - COMPREPLY=($(compgen -W '{1..9}' -- "$cur")) + _comp_compgen -- -W '{1..9}' ;; fingerprinthash) - COMPREPLY=($(compgen -W 'md5 sha256' -- "$cur")) + _comp_compgen -- -W 'md5 sha256' ;; ipqos) - COMPREPLY=($(compgen -W 'af1{1..4} af2{2..3} af3{1..3} af4{1..3} - cs{0..7} ef lowdelay throughput reliability' -- "$cur")) + _comp_compgen -- -W 'af1{1..4} af2{2..3} af3{1..3} af4{1..3} + cs{0..7} ef lowdelay throughput reliability' ;; hostbasedkeytypes | hostkeyalgorithms) - COMPREPLY=($(compgen -W '$(_ssh_query "$2" key)' -- "$cur")) + _comp_cmd_ssh__compgen_query "$1" key ;; kexalgorithms) - COMPREPLY=($(compgen -W '$(_ssh_query "$2" kex)' -- "$cur")) + _comp_cmd_ssh__compgen_query "$1" kex ;; loglevel) - COMPREPLY=($(compgen -W 'QUIET FATAL ERROR INFO VERBOSE DEBUG{,1,2,3}' -- "$cur")) + _comp_compgen -- -W 'QUIET FATAL ERROR INFO VERBOSE DEBUG{,1,2,3}' ;; macs) - _ssh_macs "$2" + _comp_cmd_ssh__compgen_macs "$1" ;; pkcs11provider) - _filedir so + _comp_compgen_filedir so ;; preferredauthentications) - COMPREPLY=($(compgen -W 'gssapi-with-mic host-based publickey - keyboard-interactive password' -- "$cur")) + _comp_compgen -- -W 'gssapi-with-mic host-based publickey + keyboard-interactive password' ;; protocol) - local protocols=($(_ssh_query "$2" protocol-version)) - [[ $protocols ]] || protocols=(1 2) + local -a protocols + _comp_compgen -v protocols -i ssh query "$1" protocol-version + [[ ${protocols-} ]] || protocols=(1 2) if ((${#protocols[@]} > 1)); then - COMPREPLY=($(compgen -W '${protocols[@]}' -- "$cur")) + _comp_compgen -- -W '"${protocols[@]}"' fi ;; proxyjump) - _known_hosts_real -a ${configfile:+-F "$configfile"} -- "$cur" + _comp_compgen_known_hosts -a ${configfile:+-F "$configfile"} -- "$cur" ;; proxycommand | remotecommand | localcommand) - COMPREPLY=($(compgen -c -- "$cur")) + _comp_compgen_commands ;; - pubkeyacceptedkeytypes) - COMPREPLY=($(compgen -W '$(_ssh_query "$2" key)' -- "$cur")) + pubkeyacceptedalgorithms | pubkeyacceptedkeytypes) + _comp_cmd_ssh__compgen_query "$1" key ;; requesttty) - COMPREPLY=($(compgen -W 'no yes force auto' -- "$cur")) + _comp_compgen -- -W 'no yes force auto' + ;; + requiredrsasize) + _comp_compgen -- -W '1024 2048 3072 4096 7680 15360' ;; stricthostkeychecking) - COMPREPLY=($(compgen -W 'accept-new ask no off' -- "$cur")) + _comp_compgen -- -W 'accept-new ask no off' ;; syslogfacility) - COMPREPLY=($(compgen -W 'DAEMON USER AUTH LOCAL{0..7}' -- "$cur")) + _comp_compgen -- -W 'DAEMON USER AUTH LOCAL{0..7}' ;; tunnel) - COMPREPLY=($(compgen -W 'yes no point-to-point ethernet' \ - -- "$cur")) + _comp_compgen -- -W 'yes no point-to-point ethernet' ;; updatehostkeys | verifyhostkeydns) - COMPREPLY=($(compgen -W 'yes no ask' -- "$cur")) + _comp_compgen -- -W 'yes no ask' ;; esac return 0 @@ -198,28 +232,46 @@ _ssh_suboption() # Try to complete -o SubOptions= # # Returns 0 if the completion was handled or non-zero otherwise. -_ssh_suboption_check() +# @since 2.12 +_comp_xfunc_ssh_compgen_suboption_check() +{ + _comp_cmd_ssh__compgen_suboption_check ssh +} + +# @param $1 the ssh executable to invoke +_comp_cmd_ssh__compgen_suboption_check() { # Get prev and cur words without splitting on = - local cureq=$(_get_cword :=) preveq=$(_get_pword :=) - if [[ $cureq == *=* && $preveq == -*o ]]; then - _ssh_suboption $cureq "$1" + local cur prev + _comp_get_words -n := cur prev + if [[ $cur == *=* && $prev == -*o ]]; then + _comp_unlocal prev + _comp_cmd_ssh__compgen_suboption "$1" "$cur" return $? fi return 1 } +# @deprecated 2.12 use `_comp_xfunc_ssh_compgen_suboption_check` instead +_ssh_suboption_check() +{ + _comp_cmd_ssh__compgen_suboption_check "${1:-ssh}" +} + # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument -_ssh_configfile() +# @var[out] configfile Found configfile, if any +_comp_cmd_ssh__configfile() { + configfile="" set -- "${words[@]}" while (($# > 0)); do if [[ $1 == -F* ]]; then + local REPLY if ((${#1} > 2)); then - configfile="$(dequote "${1:2}")" + _comp_dequote "${1:2}" && configfile=$REPLY else shift - [[ ${1-} ]] && configfile="$(dequote "$1")" + [[ ${1-} ]] && _comp_dequote "$1" && configfile=$REPLY fi break fi @@ -228,79 +280,86 @@ _ssh_configfile() } # With $1 set, look for public key files, else private +# @since 2.12 # shellcheck disable=SC2120 -_ssh_identityfile() +_comp_xfunc_ssh_compgen_identityfile() { - [[ -z $cur && -d ~/.ssh ]] && cur=~/.ssh/id - _filedir - if ((${#COMPREPLY[@]} > 0)); then - COMPREPLY=($(compgen -W '${COMPREPLY[@]}' \ - -X "${1:+!}*.pub" -- "$cur")) - fi + local cur=$cur tmp + [[ ! $cur && -d ~/.ssh ]] && cur=~/.ssh/id + _comp_compgen -v tmp -c "$cur" filedir && + _comp_compgen -U tmp -- -W '"${tmp[@]}"' -X "${1:+!}*.pub" } -_ssh() +_comp_deprecate_func 2.12 _ssh_identityfile _comp_xfunc_ssh_compgen_identityfile + +_comp_cmd_ssh() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return local configfile - _ssh_configfile + _comp_cmd_ssh__configfile - _ssh_suboption_check "$1" && return + _comp_cmd_ssh__compgen_suboption_check "$1" && return local ipvx + # Keep cases sorted the same they're in ssh's usage message + # (but do group ones with same arg completion) case $prev in + -*B) + _comp_compgen_available_interfaces -a + return + ;; -*b) - _ip_addresses + _comp_compgen_ip_addresses return ;; -*c) - _ssh_ciphers "$1" + _comp_cmd_ssh__compgen_ciphers "$1" return ;; -*[DeLpRW]) return ;; -*[EFS]) - _filedir + _comp_compgen_filedir return ;; - -*i) - _ssh_identityfile + -*I) + _comp_compgen_filedir so return ;; - -*I) - _filedir so + -*i) + _comp_xfunc_ssh_compgen_identityfile return ;; -*J) - _known_hosts_real -a ${configfile:+-F "$configfile"} -- "$cur" + _comp_compgen_known_hosts -a ${configfile:+-F "$configfile"} -- "$cur" return ;; -*l) - COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen -- -u return ;; -*m) - _ssh_macs "$1" + _comp_cmd_ssh__compgen_macs "$1" return ;; -*O) - COMPREPLY=($(compgen -W 'check forward cancel exit stop' -- "$cur")) + _comp_compgen -- -W 'check forward cancel exit stop' return ;; -*o) - _ssh_options "$1" + _comp_xfunc_ssh_compgen_options "$1" return ;; -*Q) - _ssh_queries "$1" + _comp_cmd_ssh__compgen_queries "$1" return ;; -*w) - _available_interfaces + _comp_compgen_available_interfaces return ;; -*4*) @@ -312,67 +371,71 @@ _ssh() esac if [[ $cur == -F* ]]; then - cur=${cur#-F} - _filedir + _comp_compgen -c "${cur#-F}" filedir # Prefix completions with '-F' COMPREPLY=("${COMPREPLY[@]/#/-F}") - cur=-F$cur # Restore cur elif [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage else - _known_hosts_real ${ipvx-} -a ${configfile:+-F "$configfile"} -- "$cur" - - local args - _count_args - if ((args > 1)); then + local REPLY + # Keep glob sort in sync with cases above + _comp_count_args -n "=" -a "-*[BbcDeLpRWEFSIiJlmOoQw]" + if ((REPLY > 1)); then compopt -o filenames - COMPREPLY+=($(compgen -c -- "$cur")) + _comp_compgen_commands + else + _comp_compgen_known_hosts ${ipvx-} -a ${configfile:+-F "$configfile"} \ + -- "$cur" fi fi } && - shopt -u hostcomplete && complete -F _ssh ssh slogin autossh sidedoor + shopt -u hostcomplete && + complete -F _comp_cmd_ssh ssh slogin autossh sidedoor # sftp(1) completion # -_sftp() +_comp_cmd_sftp() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local configfile - _ssh_configfile + _comp_cmd_ssh__configfile - _ssh_suboption_check && return + # Prefer `ssh` from same dir for resolving options, etc + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH - local ipvx + _comp_xfunc_ssh_compgen_suboption_check && return + + local ipvx= case $prev in -*[BDlPRs]) return ;; -*[bF]) - _filedir + _comp_compgen_filedir return ;; -*i) - _ssh_identityfile + _comp_xfunc_ssh_compgen_identityfile return ;; -*c) - _ssh_ciphers + _comp_cmd_ssh__compgen_ciphers return ;; -*J) - _known_hosts_real -a ${configfile:+-F "$configfile"} -- "$cur" + _comp_compgen_known_hosts -a ${configfile:+-F "$configfile"} -- "$cur" return ;; -*o) - _ssh_options + _comp_xfunc_ssh_compgen_options return ;; -*S) - compopt -o filenames - COMPREPLY=($(compgen -c -- "$cur")) + _comp_compgen_commands return ;; -*4*) @@ -384,100 +447,119 @@ _sftp() esac if [[ $cur == -F* ]]; then - cur=${cur#-F} - _filedir + _comp_compgen -c "${cur#-F}" filedir # Prefix completions with '-F' COMPREPLY=("${COMPREPLY[@]/#/-F}") - cur=-F$cur # Restore cur elif [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage else - _known_hosts_real ${ipvx-} -a ${configfile:+-F "$configfile"} -- "$cur" + _comp_compgen_known_hosts ${ipvx:+"$ipvx"} -a ${configfile:+-F "$configfile"} -- "$cur" fi } && - shopt -u hostcomplete && complete -F _sftp sftp + shopt -u hostcomplete && complete -F _comp_cmd_sftp sftp # things we want to backslash escape in scp paths # shellcheck disable=SC2089 -_scp_path_esc='[][(){}<>"'"'"',:;^&!$=?`\\|[:space:]]' +_comp_cmd_scp__path_esc='[][(){}<>"'"'"',:;^&!$=?`\\|[:space:]]' # Complete remote files with ssh. If the first arg is -d, complete on dirs # only. Returns paths escaped with three backslashes. +# @since 2.12 # shellcheck disable=SC2120 -_scp_remote_files() +_comp_xfunc_scp_compgen_remote_files() { - local IFS=$'\n' - # remove backslash escape from the first colon cur=${cur/\\:/:} - local userhost=${cur%%?(\\):*} - local path=${cur#*:} + local _userhost=${cur%%?(\\):*} + local _path=${cur#*:} # unescape (3 backslashes to 1 for chars we escaped) # shellcheck disable=SC2090 - path=$(command sed -e 's/\\\\\\\('$_scp_path_esc'\)/\\\1/g' <<<"$path") + _path=$(command sed -e 's/\\\\\\\('"$_comp_cmd_scp__path_esc"'\)/\\\1/g' <<<"$_path") # default to home dir of specified user on remote host - if [[ -z $path ]]; then - path=$(ssh -o 'Batchmode yes' $userhost pwd 2>/dev/null) + if [[ ! $_path ]]; then + _path=$(ssh -o 'Batchmode yes' "$_userhost" pwd 2>/dev/null) fi - local files - if [[ $1 == -d ]]; then + local _files + if [[ ${1-} == -d ]]; then # escape problematic characters; remove non-dirs # shellcheck disable=SC2090 - files=$(ssh -o 'Batchmode yes' $userhost \ - command ls -aF1dL "$path*" 2>/dev/null | - command sed -e 's/'$_scp_path_esc'/\\\\\\&/g' -e '/[^\/]$/d') + _files=$(ssh -o 'Batchmode yes' "$_userhost" \ + command ls -aF1dL "$_path*" 2>/dev/null | + command sed -e 's/'"$_comp_cmd_scp__path_esc"'/\\\\\\&/g' -e '/[^\/]$/d') else # escape problematic characters; remove executables, aliases, pipes # and sockets; add space at end of file names # shellcheck disable=SC2090 - files=$(ssh -o 'Batchmode yes' $userhost \ - command ls -aF1dL "$path*" 2>/dev/null | - command sed -e 's/'$_scp_path_esc'/\\\\\\&/g' -e 's/[*@|=]$//g' \ + _files=$(ssh -o 'Batchmode yes' "$_userhost" \ + command ls -aF1dL "$_path*" 2>/dev/null | + command sed -e 's/'"$_comp_cmd_scp__path_esc"'/\\\\\\&/g' -e 's/[*@|=]$//g' \ -e 's/[^\/]$/& /g') fi - COMPREPLY+=($files) + _comp_compgen_split -l -- "$_files" } -# This approach is used instead of _filedir to get a space appended -# after local file/dir completions, and -o nospace retained for others. -# If first arg is -d, complete on directory names only. The next arg is -# an optional prefix to add to returned completions. -_scp_local_files() +# @deprecated 2.12 use `_comp_compgen -ax ssh remote_files` instead +_scp_remote_files() { - local IFS=$'\n' + _comp_compgen -ax scp remote_files +} - local dirsonly=false +# This approach is used instead of _comp_compgen_filedir to get a space +# appended after local file/dir completions, and -o nospace retained for +# others. If first arg is -d, complete on directory names only. The next arg +# is an optional prefix to add to returned completions. +# @since 2.12 +_comp_xfunc_scp_compgen_local_files() +{ + local _dirsonly="" if [[ ${1-} == -d ]]; then - dirsonly=true + _dirsonly=set shift fi - if $dirsonly; then - COMPREPLY+=($(command ls -aF1dL $cur* 2>/dev/null | - command sed -e "s/$_scp_path_esc/\\\\&/g" -e '/[^\/]$/d' -e "s/^/${1-}/")) + local files + _comp_expand_glob files '"$cur"*' || return 0 + if [[ $_dirsonly ]]; then + _comp_compgen -U files split -l -- "$( + command ls -aF1dL "${files[@]}" 2>/dev/null | + command sed -e "s/$_comp_cmd_scp__path_esc/\\\\&/g" \ + -e '/[^\/]$/d' -e "s/^/${1-}/" + )" else - COMPREPLY+=($(command ls -aF1dL $cur* 2>/dev/null | - command sed -e "s/$_scp_path_esc/\\\\&/g" -e 's/[*@|=]$//g' \ - -e 's/[^\/]$/& /g' -e "s/^/${1-}/")) + _comp_compgen -U files split -l -- "$( + command ls -aF1dL "${files[@]}" 2>/dev/null | + command sed -e "s/$_comp_cmd_scp__path_esc/\\\\&/g" \ + -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g' -e "s/^/${1-}/" + )" fi } +# @deprecated 2.12 +_scp_local_files() +{ + _comp_compgen -ax scp local_files "$@" +} + # scp(1) completion # -_scp() +_comp_cmd_scp() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return local configfile - _ssh_configfile + _comp_cmd_ssh__configfile - _ssh_suboption_check && { - COMPREPLY=("${COMPREPLY[@]/%/ }") + # Prefer `ssh` from same dir for resolving options, remote files, etc + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + + _comp_xfunc_ssh_compgen_suboption_check && { + ((${#COMPREPLY[@]})) && COMPREPLY=("${COMPREPLY[@]/%/ }") return } @@ -485,34 +567,34 @@ _scp() case $prev in -*c) - _ssh_ciphers + _comp_cmd_ssh__compgen_ciphers COMPREPLY=("${COMPREPLY[@]/%/ }") return ;; -*F) - _filedir + _comp_compgen_filedir compopt +o nospace return ;; -*i) - _ssh_identityfile + _comp_xfunc_ssh_compgen_identityfile compopt +o nospace return ;; -*J) - _known_hosts_real -a ${configfile:+-F "$configfile"} -- "$cur" + _comp_compgen_known_hosts -a ${configfile:+-F "$configfile"} -- "$cur" return ;; -*[lP]) return ;; -*o) - _ssh_options + _comp_xfunc_ssh_compgen_options return ;; -*S) - compopt +o nospace -o filenames - COMPREPLY=($(compgen -c -- "$cur")) + compopt +o nospace + _comp_compgen_commands return ;; -*4*) @@ -523,12 +605,12 @@ _scp() ;; esac - _expand || return + _comp_expand || return case $cur in !(*:*)/* | [.~]*) ;; # looks like a path *:*) - _scp_remote_files + _comp_xfunc_scp_compgen_remote_files return ;; esac @@ -541,23 +623,21 @@ _scp() else case $cur in -*) - COMPREPLY=($(compgen -W '$(_parse_usage "${words[0]}")' \ - -- "$cur")) + _comp_compgen_usage COMPREPLY=("${COMPREPLY[@]/%/ }") return ;; - */* | [.~]*) - # not a known host, pass through - ;; *) - _known_hosts_real ${ipvx-} -c -a \ - ${configfile:+-F "$configfile"} -- "$cur" + if ! _comp_looks_like_path "$cur"; then + _comp_compgen_known_hosts ${ipvx-} -c -a \ + ${configfile:+-F "$configfile"} -- "$cur" + fi ;; esac fi - _scp_local_files "${prefix-}" + _comp_compgen -ax scp local_files "${prefix-}" } && - complete -F _scp -o nospace scp + complete -F _comp_cmd_scp -o nospace scp # ex: filetype=sh diff --git a/completions/ssh-add b/completions/ssh-add index d8f7492..23c73e0 100644 --- a/completions/ssh-add +++ b/completions/ssh-add @@ -1,35 +1,35 @@ # ssh-add(1) completion -*- shell-script -*- -_ssh_add() +_comp_cmd_ssh_add() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*E) - COMPREPLY=($(compgen -W 'md5 sha256' -- "$cur")) + _comp_compgen -- -W 'md5 sha256' return ;; -*t) return ;; -*T) - _filedir + _comp_compgen_filedir return ;; -*[se]) - _filedir so + _comp_compgen_filedir so return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" "-\?")' -- "$cur")) + _comp_compgen_help -- '-?' return fi - _filedir + _comp_compgen_filedir } && - complete -F _ssh_add ssh-add + complete -F _comp_cmd_ssh_add ssh-add # ex: filetype=sh diff --git a/completions/ssh-copy-id b/completions/ssh-copy-id index f628194..52aa9d7 100644 --- a/completions/ssh-copy-id +++ b/completions/ssh-copy-id @@ -1,32 +1,36 @@ # ssh-copy-id(1) completion -*- shell-script -*- -_ssh_copy_id() +_comp_cmd_ssh_copy_id() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return - _xfunc ssh _ssh_suboption_check "$1" && return + # Prefer `ssh` from same dir for resolving options, etc + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + + _comp_compgen -x ssh suboption_check && return case $prev in -i) - _xfunc ssh _ssh_identityfile pub + _comp_compgen -x ssh identityfile pub return ;; -p) return ;; -o) - _xfunc ssh _ssh_options + _comp_compgen -x ssh options return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + _comp_compgen_usage -- --help else - _known_hosts_real -a -- "$cur" + _comp_compgen_known_hosts -a -- "$cur" fi } && - complete -F _ssh_copy_id ssh-copy-id + complete -F _comp_cmd_ssh_copy_id ssh-copy-id # ex: filetype=sh diff --git a/completions/ssh-keygen b/completions/ssh-keygen index 0e629a5..3f9d175 100644 --- a/completions/ssh-keygen +++ b/completions/ssh-keygen @@ -1,16 +1,16 @@ # ssh-keygen(1) completion -*- shell-script -*- -_ssh_keygen() +_comp_cmd_ssh_keygen() { - local cur prev words cword - _init_completion -n := || return + local cur prev words cword comp_args + _comp_initialize -n := -- "$@" || return case $prev in -*[aCIJjMNPSVWz]) return ;; -*b) - local -a sizes + local -a sizes=() case "${words[*]}" in *" -t dsa"?( *)) sizes=(1024) @@ -22,102 +22,110 @@ _ssh_keygen() sizes=(1024 2048 3072 4096) ;; esac - COMPREPLY=($(compgen -W '${sizes[@]}' -- "$cur")) + ((${#sizes[@]})) && + _comp_compgen -- -W '"${sizes[@]}"' return ;; -*E) - COMPREPLY=($(compgen -W 'md5 sha256' -- "$cur")) + _comp_compgen -- -W 'md5 sha256' return ;; -*[FR]) # TODO: trim this down to actual entries in known hosts files - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; -*[Dw]) - _filedir so + _comp_compgen_filedir so return ;; -*[fGKsT]) - _filedir + _comp_compgen_filedir return ;; -*m) - COMPREPLY=($(compgen -W 'PEM PKCS8 RFC4716' -- "$cur")) + _comp_compgen -- -W 'PEM PKCS8 RFC4716' return ;; -*n) [[ ${words[*]} != *\ -*Y\ * ]] || return - local prefix= - [[ $cur == *,* ]] && prefix="${cur%,*}," if [[ ${words[*]} == *\ -*h\ * ]]; then - _known_hosts_real -- "${cur##*,}" + _comp_compgen_known_hosts -- "${cur##*,}" + ((${#COMPREPLY[@]})) && + _comp_delimited , -W '"${COMPREPLY[@]}"' else - COMPREPLY=($(compgen -u -- "${cur##*,}")) + _comp_delimited , -u fi - ((${#COMPREPLY[@]} == 1)) && COMPREPLY=(${COMPREPLY/#/$prefix}) return ;; -*O) if [[ $cur != *=* ]]; then - COMPREPLY=($(compgen -W ' - clear critical: extension: force-command= + _comp_compgen -- -W 'clear critical: extension: force-command= no-agent-forwarding no-port-forwarding no-pty no-user-rc no-x11-forwarding permit-agent-forwarding permit-port-forwarding permit-pty permit-user-rc permit-X11-forwarding no-touch-required source-address= + verify-required lines= start-line= checkpoint= memory= start= generator= - application challenge= device resident user - write-attestation-path - ' -- "$cur")) + application= challenge= device= no-touch-required resident + user= write-attestation=' + [[ ${COMPREPLY-} == *[:=] ]] && compopt -o nospace - __ltrim_colon_completions "$cur" + _comp_ltrim_colon_completions "$cur" else case $cur in force-command=*) compopt -o filenames - COMPREPLY=($(compgen -c -- "${cur#*=}")) + _comp_compgen -c "${cur#*=}" commands + ;; + checkpoint=* | challenge=* | write-attestation=*) + _comp_compgen -c "${cur#*=}" filedir + ;; + application=*([^:=])) + _comp_compgen -c "${cur#*=}" -- -W "ssh:" + compopt -o nospace ;; - checkpoint=* | challenge=*) - cur=${cur#*=} - _filedir + user=*) + _comp_compgen -c "${cur#*=}" -- -u ;; esac fi return ;; -*r) - [[ ${words[*]} != *\ -*Y\ * ]] || _filedir + [[ ${words[*]} != *\ -*Y\ * ]] || _comp_compgen_filedir return ;; -*t) - local protocols=$(_xfunc ssh _ssh_query "$1" protocol-version) + # Prefer `ssh` from same dir for resolving options, etc + local pathcmd protocols + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_compgen -v protocols -x ssh query protocol-version local types='dsa ecdsa ecdsa-sk ed25519 ed25519-sk rsa' - if [[ $protocols == *1* ]]; then + if [[ ${protocols[*]} == *1* ]]; then types+=' rsa1' fi - COMPREPLY=($(compgen -W "$types" -- "$cur")) + _comp_compgen -- -W "$types" return ;; -*Y) - COMPREPLY=($(compgen -W 'find-principals check-novalidate sign - verify' -- "$cur")) + _comp_compgen -- -W 'find-principals check-novalidate sign verify' return ;; esac + _comp_compgen_set if [[ $cur == -* ]]; then - local opts=$(_parse_usage "$1" "-?") - [[ -z $opts ]] && opts=$(_parse_help "$1" "-?") # OpenSSH < 7 - COMPREPLY=($(compgen -W "$opts" -- "$cur")) + _comp_compgen_usage -- "-?" || + _comp_compgen_help -- "-?" # OpenSSH < 7 fi if [[ ${words[*]} == *\ -*s\ * ]]; then - _filedir pub + _comp_compgen -a filedir pub fi } && - complete -F _ssh_keygen ssh-keygen + complete -F _comp_cmd_ssh_keygen ssh-keygen # ex: filetype=sh diff --git a/completions/ssh-keyscan b/completions/ssh-keyscan new file mode 100644 index 0000000..f5e4364 --- /dev/null +++ b/completions/ssh-keyscan @@ -0,0 +1,39 @@ +# ssh-keyscan(1) completion -*- shell-script -*- + +_comp_cmd_ssh_keyscan() +{ + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + + local ipvx + + case $prev in + -*4*) + ipvx=-4 + ;; + -*6*) + ipvx=-6 + ;; + -*f) + _comp_compgen_filedir + return + ;; + -*p | -*T) + return + ;; + -*t) + _comp_delimited , -W "dsa ecdsa ed25519 rsa" + return + ;; + esac + + if [[ $cur == -* ]]; then + _comp_compgen_usage + return + fi + + _comp_compgen_known_hosts ${ipvx-} -- "$cur" +} && + complete -F _comp_cmd_ssh_keyscan ssh-keyscan + +# ex: filetype=sh diff --git a/completions/sshfs b/completions/sshfs index 223d029..4b3f388 100644 --- a/completions/sshfs +++ b/completions/sshfs @@ -1,23 +1,23 @@ # sshfs(1) completion -*- shell-script -*- -_sshfs() +_comp_cmd_sshfs() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return - _expand || return + _comp_expand || return if [[ $cur == *:* ]]; then - _xfunc ssh _scp_remote_files -d + _comp_compgen -x scp remote_files -d # unlike scp and rsync, sshfs works with 1 backslash instead of 3 COMPREPLY=("${COMPREPLY[@]//\\\\\\/\\}") return fi - [[ $cur == @(*/|[.~])* ]] || _known_hosts_real -c -a -- "$cur" + [[ $cur == @(*/|[.~])* ]] || _comp_compgen_known_hosts -c -a -- "$cur" - _xfunc ssh _scp_local_files -d + _comp_compgen -ax scp local_files -d } && - complete -F _sshfs -o nospace sshfs + complete -F _comp_cmd_sshfs -o nospace sshfs # ex: filetype=sh diff --git a/completions/sshmitm b/completions/sshmitm index ee893e5..136d2f9 100644 --- a/completions/sshmitm +++ b/completions/sshmitm @@ -1,17 +1,17 @@ # sshmitm completion -*- shell-script -*- -_sshmitm() +_comp_cmd_sshmitm() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage else - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" fi } && - complete -F _sshmitm sshmitm + complete -F _comp_cmd_sshmitm sshmitm # ex: filetype=sh diff --git a/completions/sshow b/completions/sshow index 917444e..0d21bbb 100644 --- a/completions/sshow +++ b/completions/sshow @@ -1,26 +1,26 @@ # sshow completion -*- shell-script -*- -_sshow() +_comp_cmd_sshow() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*i) - _available_interfaces -a + _comp_compgen_available_interfaces -a return ;; -*p) - _filedir pcap + _comp_compgen_filedir pcap return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage fi } && - complete -F _sshow sshow + complete -F _comp_cmd_sshow sshow # ex: filetype=sh diff --git a/completions/strace b/completions/strace index 2b46ce8..917f64d 100644 --- a/completions/strace +++ b/completions/strace @@ -1,9 +1,9 @@ # bash completion for strace -*- shell-script -*- -_strace() +_comp_cmd_strace() { - local cur prev words cword - _init_completion -n = || return + local cur prev words cword comp_args + _comp_initialize -n = -- "$@" || return # check if we're still completing strace local offset=0 i @@ -22,7 +22,7 @@ _strace() done if ((offset > 0)); then - _command_offset $offset + _comp_command_offset $offset else case $prev in @@ -38,11 +38,11 @@ _strace() local define syscall rest local -A syscalls while read -r define syscall rest; do - [[ $define == "#define" && \ - $syscall =~ ^__NR_(.+) ]] && - syscalls[${BASH_REMATCH[1]}]=1 + [[ $define == "#define" && + $syscall =~ ^__NR_(.+) ]] && + syscalls[${BASH_REMATCH[1]}]=set done 2>/dev/null </usr/include/asm/unistd.h - if [[ ! $syscalls ]]; then + if ((${#syscalls[@]} == 0)); then local unistd arch=$(command uname -m) if [[ $arch == *86 ]]; then unistd=/usr/include/asm/unistd_32.h @@ -50,50 +50,50 @@ _strace() unistd=/usr/include/asm/unistd_64.h fi while read -r define syscall rest; do - [[ $define == "#define" && \ - $syscall =~ ^__NR_(.+) ]] && - syscalls[${BASH_REMATCH[1]}]=1 + [[ $define == "#define" && + $syscall =~ ^__NR_(.+) ]] && + syscalls[${BASH_REMATCH[1]}]=set done 2>/dev/null <$unistd fi - COMPREPLY=($(compgen -W '${!syscalls[@]} file - process network signal ipc desc all none' \ - -- "$cur")) + _comp_compgen -- -W \ + '${syscalls[@]+"${!syscalls[@]}"} file process + network signal ipc desc all none' return ;; esac else compopt -o nospace - COMPREPLY=($(compgen -S"=" -W 'trace abbrev verbose raw - signal read write' -- "$cur")) + _comp_compgen -- -S"=" -W 'trace abbrev verbose raw signal + read write' fi return ;; -*o) - _filedir + _comp_compgen_filedir return ;; -*p) - _pids + _comp_compgen_pids return ;; -*S) - COMPREPLY=($(compgen -W 'time calls name nothing' -- "$cur")) + _comp_compgen -- -W 'time calls name nothing' return ;; -*u) - _allowed_users + _comp_compgen_allowed_users return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + _comp_compgen_help -- -h else - COMPREPLY=($(compgen -c -- "$cur")) + _comp_compgen_commands fi fi } && - complete -F _strace -o default strace + complete -F _comp_cmd_strace -o default strace # ex: filetype=sh diff --git a/completions/strings b/completions/strings index 059f557..45f0e60 100644 --- a/completions/strings +++ b/completions/strings @@ -1,45 +1,50 @@ # strings(1) completion -*- shell-script -*- -_strings() +_comp_cmd_strings() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[nstTe]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | --bytes | -!(-*)[hvVn]) + --help | --version | --bytes | --output-separator | -arch | \ + -${noargopts}[hvVns]) return ;; - --radix | -!(-*)t) - COMPREPLY=($(compgen -W 'o d x' -- "$cur")) + --radix | -${noargopts}t) + _comp_compgen -- -W 'o d x' return ;; - --target | -!(-*)T) - COMPREPLY=($(compgen -W '$(LC_ALL=C "$1" --help 2>/dev/null | \ - command sed -ne "s/: supported targets: \(.*\)/\1/p")' \ - -- "$cur")) + --target | -${noargopts}T) + _comp_compgen_split -- "$(LC_ALL=C "$1" --help 2>/dev/null | + command sed -ne 's/: supported targets: \(.*\)/\1/p')" return ;; - --encoding | -!(-*)e) - COMPREPLY=($(compgen -W 's S b l B L' -- "$cur")) + --encoding | -${noargopts}e) + _comp_compgen_split -F , -- "$(LC_ALL=C "$1" --help 2>/dev/null | + command sed -ne 's/.*--encoding={\([^}]*\)}.*/\1/p')" return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + # macOS: ... [-t format] [-number] [-n number] ... + _comp_compgen_help || + _comp_compgen_usage - <<<"$("$1" --help 2>&1 | + command sed -e "s/\[-number\]//")" [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return elif [[ $cur == @* ]]; then - cur=${cur:1} - _filedir + _comp_compgen -c "${cur:1}" filedir COMPREPLY=("${COMPREPLY[@]/#/@}") return fi - _filedir + _comp_compgen_filedir } && - complete -F _strings strings + complete -F _comp_cmd_strings strings # ex: filetype=sh diff --git a/completions/sudo b/completions/sudo index c9a806b..2cfcf84 100644 --- a/completions/sudo +++ b/completions/sudo @@ -1,56 +1,58 @@ # bash completion for sudo(8) -*- shell-script -*- -_sudo() +_comp_cmd_sudo() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return local i mode=normal [[ $1 == *sudoedit ]] && mode=edit + local noargopts='!(-*|*[uUgCp]*)' [[ $mode == normal ]] && for ((i = 1; i <= cword; i++)); do if [[ ${words[i]} != -* ]]; then local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin - local root_command=${words[i]} - _command_offset $i + local _comp_root_command=$1 + _comp_command_offset $i return fi - if [[ ${words[i]} == -@(!(-*)e*|-edit) ]]; then + # shellcheck disable=SC2254 + if [[ ${words[i]} == -@(${noargopts}e*|-edit) ]]; then mode=edit break fi - [[ ${words[i]} == \ - -@(user|other-user|group|close-from|prompt|!(-*)[uUgCp]) ]] && + # shellcheck disable=SC2254 + [[ ${words[i]} == @(--@(user|other-user|group|close-from|prompt)|-${noargopts}[uUgCp]) ]] && ((i++)) done + # shellcheck disable=SC2254 case "$prev" in - --user | --other-user | -!(-*)[uU]) - COMPREPLY=($(compgen -u -- "$cur")) + --user | --other-user | -${noargopts}[uU]) + _comp_compgen -- -u return ;; - --group | -!(-*)g) - COMPREPLY=($(compgen -g -- "$cur")) + --group | -${noargopts}g) + _comp_compgen -- -g return ;; - --close-from | --prompt | -!(-*)[Cp]) + --close-from | --prompt | -${noargopts}[Cp]) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - local opts=$(_parse_help "$1") - COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi if [[ $mode == edit ]]; then - _filedir + _comp_compgen_filedir fi } && - complete -F _sudo sudo sudoedit + complete -F _comp_cmd_sudo sudo sudoedit # ex: filetype=sh diff --git a/completions/svcadm b/completions/svcadm index 5269c7b..8505457 100644 --- a/completions/svcadm +++ b/completions/svcadm @@ -11,25 +11,25 @@ # but to not clutter the interface with all completions, we will only # cut every completion alternative at the next slash. # -# For example, if the user types <nothing><tab>, we will propose for svc://foo/bar/bar/baz -# the following completion: foo/, bar/ and baz +# For example, if the user types <nothing><tab>, we will propose +# for svc://foo/bar/bar/baz the following completion: foo/, bar/ and baz # If the user types <b><tab>, we will propose: bar/ and baz # If the user types <bar/><tab>, we will propose: bar/bar/ and bar/baz # -# By default, the function proproses only abbreviated completions except if the user already -# began to type svc:. In that case we will propose only the complete FMRI beginning with the -# pattern +# By default, the function proproses only abbreviated completions except if the +# user already began to type svc:. In that case we will propose only the +# complete FMRI beginning with the pattern # -_smf_complete_fmri() +_comp_cmd_svcadm__fmri() { local cur="$1" prefix="$2" local cur_prefix fmri fmri_list="" - local exact_mode pattern + local exact_mode="" pattern if [[ $cur == $prefix* ]]; then [[ $cur == "$prefix" ]] && cur+="/" pattern="$cur*" - exact_mode=1 + exact_mode=set else pattern="$prefix*/$cur*" fi @@ -38,22 +38,22 @@ _smf_complete_fmri() for fmri in $(svcs -H -o FMRI "$pattern" 2>/dev/null); do local fmri_part_list fmri_part - if [[ -z $exact_mode ]]; then - fmri=${fmri#$prefix/} + if [[ ! $exact_mode ]]; then + fmri=${fmri#"$prefix/"} - # we generate all possibles abbrevations for the FMRI + # we generate all possibles abbreviations for the FMRI # no need to have a generic loop as we will have a finite # number of components - local ifs="$IFS" - IFS="/" - set -- $fmri - IFS=$ifs - case $# in - 1) fmri_part_list=" $1" ;; - 2) fmri_part_list=" $2 $1/$2" ;; - 3) fmri_part_list=" $3 $2/$3 $1/$2/$3" ;; - 4) fmri_part_list=" $4 $3/$4 $2/$3/$4 $1/$2/$3/$4" ;; - esac + local -a tmp + if _comp_split -F / tmp "$fmri"; then + set -- "${tmp[@]}" + case $# in + 1) fmri_part_list=" $1" ;; + 2) fmri_part_list=" $2 $1/$2" ;; + 3) fmri_part_list=" $3 $2/$3 $1/$2/$3" ;; + 4) fmri_part_list=" $4 $3/$4 $2/$3/$4 $1/$2/$3/$4" ;; + esac + fi else fmri_part_list="$fmri" fi @@ -62,14 +62,14 @@ _smf_complete_fmri() # we cut them at the first slash for fmri_part in $fmri_part_list; do [[ $fmri_part == $cur* ]] || continue - local first_part=${fmri_part#$cur_prefix} + local first_part=${fmri_part#"$cur_prefix"} first_part=$cur_prefix${first_part%%/*} [[ $first_part != "$fmri_part" ]] && first_part+="/" fmri_list+=" $first_part" done done - COMPREPLY=($fmri_list) + _comp_split COMPREPLY "$fmri_list" # here we want to detect if there only one completion proposed and that # it ends with a slash. That means the users will still have to complete @@ -83,7 +83,7 @@ _smf_complete_fmri() ((i--)) done if ((i == 0)); then - _smf_complete_fmri "${COMPREPLY[0]}" "$prefix" + _comp_cmd_svcadm__fmri "${COMPREPLY[0]}" "$prefix" return fi fi @@ -98,53 +98,54 @@ _smf_complete_fmri() done } -_svcadm() +_comp_cmd_svcadm() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return local command_list="enable disable restart refresh clear mark milestone" - local command i + local command="" i for ((i = 1; i < cword; i++)); do if [[ ${words[i]} == @(enable|disable|restart|refresh|clear|mark|milestone) ]]; then command=${words[i]} + break fi done - if [[ ! -v command ]]; then + if [[ ! $command ]]; then if [[ ${cur} == -* ]]; then - COMPREPLY=($(compgen -W "-v" -- ${cur})) + _comp_compgen -- -W "-v" else - COMPREPLY=($(compgen -W "$command_list" -- ${cur})) + _comp_compgen -- -W "$command_list" fi else if [[ ${cur} == -* ]]; then case "$command" in enable) - COMPREPLY=($(compgen -W "-r -s -t" -- ${cur})) + _comp_compgen -- -W "-r -s -t" ;; disable) - COMPREPLY=($(compgen -W "-s -t" -- ${cur})) + _comp_compgen -- -W "-s -t" ;; mark) - COMPREPLY=($(compgen -W "-I -t" -- ${cur})) + _comp_compgen -- -W "-I -t" ;; milestone) - COMPREPLY=($(compgen -W "-d" -- ${cur})) + _comp_compgen -- -W "-d" ;; esac else - if [[ $command == "mark" ]] && [[ $prev != @(degraded|maintenance) ]]; then - COMPREPLY=($(compgen -W "degraded maintenance" -- ${cur})) + if [[ $command == "mark" && $prev != @(degraded|maintenance) ]]; then + _comp_compgen -- -W "degraded maintenance" elif [[ $command == "milestone" ]]; then - _smf_complete_fmri "${cur}" "svc:/milestone" + _comp_cmd_svcadm__fmri "${cur}" "svc:/milestone" else - _smf_complete_fmri "${cur}" "svc:" + _comp_cmd_svcadm__fmri "${cur}" "svc:" fi fi fi } && - complete -F _svcadm svcadm + complete -F _comp_cmd_svcadm svcadm # ex: filetype=sh diff --git a/completions/svk b/completions/svk index 9079df1..cfa6ede 100644 --- a/completions/svk +++ b/completions/svk @@ -1,9 +1,9 @@ # svk(1) completion -*- shell-script -*- -_svk() +_comp_cmd_svk() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local commands options command @@ -16,18 +16,18 @@ _svk() if ((cword == 1)); then if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--version' -- "$cur")) + _comp_compgen -- -W '--version' else - COMPREPLY=($(compgen -W "$commands" -- "$cur")) + _comp_compgen -- -W "$commands" fi else case $prev in -F | --file | --targets) - _filedir + _comp_compgen_filedir return ;; --encoding) - _xfunc iconv _iconv_charsets + _comp_compgen -x iconv charsets return ;; esac @@ -172,26 +172,24 @@ _svk() esac options+=" --help -h" - COMPREPLY=($(compgen -W "$options" -- "$cur")) + _comp_compgen -- -W "$options" else case $command in help | h | \?) - COMPREPLY=($(compgen -W "$commands environment commands - intro" -- "$cur")) + _comp_compgen -- -W "$commands environment commands intro" ;; admin) - COMPREPLY=($(compgen -W 'help deltify dump hotcopy - list-dblogs list-unused-dblogs load lstxns recover - rmtxns setlog verify rmcache' -- "$cur")) + _comp_compgen -- -W 'help deltify dump hotcopy list-dblogs + list-unused-dblogs load lstxns recover rmtxns setlog + verify rmcache' ;; patch) - COMPREPLY=($(compgen -W '--ls --list --cat --view - --regen --regenerate --up --update --apply --rm - --delete' -- "$cur")) + _comp_compgen -- -W '--ls --list --cat --view --regen + --regenerate --up --update --apply --rm --delete' ;; sync) - COMPREPLY=($(compgen -W "$($1 mirror --list \ - 2>/dev/null | awk '/^\//{print $1}')" -- "$cur")) + _comp_compgen_split -- "$("$1" mirror --list \ + 2>/dev/null | _comp_awk '/^\//{print $1}')" ;; co | checkout | push | pull) if [[ $cur == //*/* ]]; then @@ -199,16 +197,16 @@ _svk() else path=// fi - COMPREPLY=($(compgen -W "$($1 list $path 2>/dev/null | - command sed -e 's|\(.*\)|'$path'\1|')" -- "$cur")) + _comp_compgen_split -- "$("$1" list "$path" 2>/dev/null | + command sed -e 's|\(.*\)|'"$path"'\1|')" ;; *) - _filedir + _comp_compgen_filedir ;; esac fi fi } && - complete -F _svk svk + complete -F _comp_cmd_svk svk # ex: filetype=sh diff --git a/completions/sync_members b/completions/sync_members index 397f8b0..e8c07a7 100644 --- a/completions/sync_members +++ b/completions/sync_members @@ -1,31 +1,34 @@ # mailman sync_members completion -*- shell-script -*- -_sync_members() +_comp_cmd_sync_members() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -w | -g | -d | --welcome-msg | --goodbye-msg | --digest) - COMPREPLY=($(compgen -W 'y n' -- "$cur")) + _comp_compgen -- -W 'y n' return ;; --file) - _filedir + _comp_compgen_filedir return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--no-change --welcome-msg --goodbye-msg - --digest --notifyadmin --file --help' -- "$cur")) + _comp_compgen -- -W '--no-change --welcome-msg --goodbye-msg --digest + --notifyadmin --file --help' else - _xfunc list_lists _mailman_lists + # Prefer `list_lists` in the same dir as command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_compgen -x list_lists mailman_lists fi } && - complete -F _sync_members sync_members + complete -F _comp_cmd_sync_members sync_members # ex: filetype=sh diff --git a/completions/synclient b/completions/synclient index c4a0d42..12a7d54 100644 --- a/completions/synclient +++ b/completions/synclient @@ -1,9 +1,9 @@ # bash completion for synclient(1) -*- shell-script -*- -_synclient() +_comp_cmd_synclient() { - local cur prev words cword - _init_completion -n = || return + local cur prev words cword comp_args + _comp_initialize -n = -- "$@" || return case $prev in -\? | -h | -V) @@ -12,13 +12,13 @@ _synclient() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage elif [[ $cur != *=?* ]]; then - COMPREPLY=($(compgen -S = -W '$($1 -l 2>/dev/null | \ - awk "/^[ \t]/ { print \$1 }")' -- "$cur")) + _comp_compgen_split -S = -- "$("$1" -l 2>/dev/null | + _comp_awk '/^[ \t]/ { print $1 }')" compopt -o nospace fi } && - complete -F _synclient synclient + complete -F _comp_cmd_synclient synclient # ex: filetype=sh diff --git a/completions/sysbench b/completions/sysbench index 0af7cc3..7f9e87e 100644 --- a/completions/sysbench +++ b/completions/sysbench @@ -1,9 +1,9 @@ # bash completion for sysbench -*- shell-script -*- -_sysbench() +_comp_cmd_sysbench() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in --num-threads | --max-requests | --max-time | --thread-stack-size | \ @@ -11,122 +11,121 @@ _sysbench() return ;; --init-rng | --debug | --validate) - COMPREPLY=($(compgen -W 'on off' -- "$cur")) + _comp_compgen -- -W 'on off' return ;; --test) - COMPREPLY=($(compgen -W 'fileio cpu memory threads mutex oltp' \ - -- "$cur")) + _comp_compgen -- -W 'fileio cpu memory threads mutex oltp' return ;; --cpu-max-prime) return ;; --file-test-mode) - COMPREPLY=($(compgen -W 'seqwr seqrewr seqrd rndrd rndwr rndrw' \ - -- "$cur")) + _comp_compgen -- -W 'seqwr seqrewr seqrd rndrd rndwr rndrw' return ;; --file-io-mode) - COMPREPLY=($(compgen -W 'sync async fastmmap slowmmap' -- "$cur")) + _comp_compgen -- -W 'sync async fastmmap slowmmap' return ;; --file-extra-flags) - COMPREPLY=($(compgen -W 'sync dsync direct' -- "$cur")) + _comp_compgen -- -W 'sync dsync direct' return ;; --file-fsync-all | --file-fsync-end) - COMPREPLY=($(compgen -W 'on off' -- "$cur")) + _comp_compgen -- -W 'on off' return ;; --file-fsync-mode) - COMPREPLY=($(compgen -W 'fsync fdatasync' -- "$cur")) + _comp_compgen -- -W 'fsync fdatasync' return ;; --memory-scope) - COMPREPLY=($(compgen -W 'global local' -- "$cur")) + _comp_compgen -- -W 'global local' return ;; --memory-hugetlb) - COMPREPLY=($(compgen -W 'on off' -- "$cur")) + _comp_compgen -- -W 'on off' return ;; --memory-oper) - COMPREPLY=($(compgen -W 'read write none' -- "$cur")) + _comp_compgen -- -W 'read write none' return ;; --memory-access-mode) - COMPREPLY=($(compgen -W 'seq rnd' -- "$cur")) + _comp_compgen -- -W 'seq rnd' return ;; --oltp-test-mode) - COMPREPLY=($(compgen -W 'simple complex nontrx sp' -- "$cur")) + _comp_compgen -- -W 'simple complex nontrx sp' return ;; --oltp-read-only | --oltp-skip-trx | --oltp-quto-inc | --mysql-ssl) - COMPREPLY=($(compgen -W 'on off' -- "$cur")) + _comp_compgen -- -W 'on off' return ;; --oltp-nontrx-mode) - COMPREPLY=($(compgen -W 'select update_key update_nokey insert - delete' -- "$cur")) + _comp_compgen -- -W 'select update_key update_nokey insert delete' return ;; --oltp-dist-type) - COMPREPLY=($(compgen -W 'uniform gaussian special' -- "$cur")) + _comp_compgen -- -W 'uniform gaussian special' return ;; --db-driver) - COMPREPLY=($(compgen -W "$($1 --test=oltp help 2>/dev/null | + _comp_compgen_split -- "$("$1" --test=oltp help 2>/dev/null | command sed -e '/^.*database drivers:/,/^$/!d' \ - -ne 's/^ *\([^ ]*\) .*/\1/p')" -- "$cur")) + -ne 's/^ *\([^ ]*\) .*/\1/p')" return ;; --db-ps-mode) - COMPREPLY=($(compgen -W 'auto disable' -- "$cur")) + _comp_compgen -- -W 'auto disable' return ;; --mysql-socket) - _filedir sock + _comp_compgen_filedir sock return ;; --mysql-table-engine) - COMPREPLY=($(compgen -W 'myisam innodb bdb heap ndbcluster - federated' -- "$cur")) + _comp_compgen -- -W 'myisam innodb bdb heap ndbcluster federated' return ;; --mysql-engine-trx) - COMPREPLY=($(compgen -W 'yes no auto' -- "$cur")) + _comp_compgen -- -W 'yes no auto' return ;; --*) - $split && return + [[ $was_split ]] && return ;; esac # find out which test we're running - local i test + local i test="" has_test="" for ((i = 1; i < ${#words[@]} - 1; i++)); do # TODO --test= is deprecated, bare test name preferred - if [[ ${words[i]} == --test* ]]; then + if [[ ${words[i]} == --test=* ]]; then test=${words[i]#*=} + has_test=set break fi done - local opts=$(_parse_help "$1") - if [[ -v test ]]; then - local help=($(_parse_help "$1" "--test=$test help")) - opts="${opts/--test=/} ${help[*]} prepare run cleanup help version" + local opts + _comp_compgen -v opts help + if [[ $has_test ]]; then + opts=("${opts[@]/#--test=/}") + _comp_compgen -aRv opts help -- --test="$test" help + opts+=(prepare run cleanup help version) fi - if [[ $cur == -* || ! -v test ]]; then - COMPREPLY=($(compgen -W "$opts" -- "$cur")) + if [[ $cur == -* || ! $has_test ]]; then + _comp_compgen -- -W '"${opts[@]}"' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - COMPREPLY=($(compgen -W "prepare run cleanup help version" -- "$cur")) + _comp_compgen -- -W "prepare run cleanup help version" fi } && - complete -F _sysbench sysbench + complete -F _comp_cmd_sysbench sysbench # ex: filetype=sh diff --git a/completions/sysctl b/completions/sysctl index 005452d..4062a7f 100644 --- a/completions/sysctl +++ b/completions/sysctl @@ -1,31 +1,33 @@ # bash completion for sysctl -*- shell-script -*- -_sysctl() +_comp_cmd_sysctl() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[rpf]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | --pattern | -!(-*)[hVr]) + --help | --version | --pattern | -${noargopts}[hVr]) return ;; - --load | -!(-*)[pf]) - _filedir conf + --load | -${noargopts}[pf]) + _comp_compgen_filedir conf return ;; esac if [[ $cur == -* ]]; then - local opts="$(_parse_help "$1")" - COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage else local suffix= [[ $prev == -w ]] && suffix="=" - COMPREPLY=($(compgen -S "$suffix" -W \ - "$(PATH="$PATH:/sbin" $1 -N -a 2>/dev/null)" -- "$cur")) + _comp_compgen_split -S "$suffix" -- "$( + PATH="$PATH:/sbin" $1 -N -a 2>/dev/null + )" [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _sysctl sysctl + complete -F _comp_cmd_sysctl sysctl # ex: filetype=sh diff --git a/completions/tar b/completions/tar index 04b7fc0..83a4073 100644 --- a/completions/tar +++ b/completions/tar @@ -12,15 +12,15 @@ # # We rather advice the 'tar -czf /tmp/archive.tar -T patterns.txt' format of # arguments. Though, if user starts the 'first' tar argument without leading -# dash, we treat the command line apropriately. +# dash, we treat the command line appropriately. # # # long/short options origin # ------------------------- # # For GNU tar, everything is parsed from `tar --help` output so not so much -# per-distribution work should be needed. The _parse_help does not seem to be -# good enough so parsed here directly. +# per-distribution work should be needed. The _comp_compgen_help does not seem +# to be good enough so parsed here directly. # # # FIXME: --starting-file (-K) (should be matched for extraction only) @@ -37,8 +37,29 @@ # - mode option should be advised only once # - format option should be advised only once # ... +# +# Tar files vs internal paths +# =========================== +# +# bash's programmable completion is limited in how it handles the list of +# possible completions it returns. +# +# Because the paths returned from within the tar file are likely not existing +# paths on the file system, `-o dirnames` must be passed to the `complete` +# built-in to make it treat them as such. However, then bash will append a +# space when completing on directories during pathname completion to the tar +# files themselves. +# +# It's more important to have proper completion of paths to tar files than it +# is to have completion for their contents, so this sacrifice was made and +# `-o filenames` is used with complete instead by default. Setting the +# `$BASH_COMPLETION_CMD_TAR_INTERNAL_PATHS` environment variable to a non-null +# value *before sourcing* this completion toggles that the other way around. -__gtar_parse_help_opt() +_comp_deprecate_var 2.12 \ + COMP_TAR_INTERNAL_PATHS BASH_COMPLETION_CMD_TAR_INTERNAL_PATHS + +_comp_cmd_gtar__parse_help_opt() { local opttype arg opt separator optvar opttype=long @@ -77,35 +98,36 @@ __gtar_parse_help_opt() eval "$optvar=\"\$$optvar$separator\"\"$opt\"" } -__gtar_parse_help_line() +_comp_cmd_gtar__parse_help_line() { local i - - for i in $1; do - case "$i" in - # regular options - --* | -*) - __gtar_parse_help_opt "$i" "$2" - ;; - - # end once there is single non-option word - *) - break - ;; - esac - done + local -a tmp + while read -ra tmp; do + for i in "${tmp[@]}"; do + case "$i" in + # regular options + --* | -*) + _comp_cmd_gtar__parse_help_opt "$i" "$2" + ;; + + # end once there is single non-option word + *) + break + ;; + esac + done + done <<<"$1" } -__gnu_tar_parse_help() +_comp_cmd_gtar__parse_help() { local str line arg - while IFS= read line; do + while IFS= read -r line; do # Ok, this requires some comment probably. The GNU help output prints # options on lines beginning with spaces. After that, there is one # or more options separated by ', ' separator string. We are matching # like this then: ^<spaces>(<separator>?<option>)+<whatever>$ - if [[ $line =~ \ - ^[[:blank:]]{1,10}(((,[[:blank:]])?(--?([\]\[a-zA-Z0-9?=-]+))(,[[:space:]])?)+).*$ ]]; then + if [[ $line =~ ^[[:blank:]]{1,10}(((,[[:blank:]])?(--?([\]\[a-zA-Z0-9?=-]+))(,[[:space:]])?)+).*$ ]]; then line=${BASH_REMATCH[1]} str="${line//,/ }" @@ -116,10 +138,10 @@ __gnu_tar_parse_help() # variable may contain e.g. '-X, --XXX[=NAME], -XXX2[=NAME]'. arg=none if [[ $line =~ --[A-Za-z0-9-]+(\[?)= ]]; then - [[ -n ${BASH_REMATCH[1]} ]] && arg=opt || arg=req + [[ ${BASH_REMATCH[1]} ]] && arg=opt || arg=req fi - __gtar_parse_help_line "$str" "$arg" + _comp_cmd_gtar__parse_help_line "$str" "$arg" fi done <<<"$(tar --help)" @@ -130,59 +152,55 @@ __gnu_tar_parse_help() } # Hack: parse --warning keywords from tar's error output -__gtar_parse_warnings() +_comp_cmd_gtar__parse_warnings() { - local line - LC_ALL=C tar --warning= 2>&1 | while IFS= read line; do + local -a warnings=() + local lines line + _comp_split -l lines "$(LC_ALL=C exec tar --warning= 2>&1)" + for line in "${line[@]}"; do if [[ $line =~ ^[[:blank:]]*-[[:blank:]]*[\`\']([a-zA-Z0-9-]+)\'$ ]]; then - echo "${BASH_REMATCH[1]} no-${BASH_REMATCH[1]}" + warnings+=("${BASH_REMATCH[1]}" "no-${BASH_REMATCH[1]}") fi done + _comp_compgen -- -W '"${warnings[@]}"' } -# Helper to obtain last character of string. -__tar_last_char() -{ - echo "${1:$((${#1} - 1))}" -} - -__tar_parse_old_opt() +_comp_cmd_tar__parse_old_opt() { local first_word char # current word is the first word - [[ $cword -eq 1 && -n $cur && ${cur:0:1} != '-' ]] && - old_opt_progress=1 + [[ $cword -eq 1 && $cur && ${cur:0:1} != '-' ]] && + old_opt_progress=set # check that first argument does not begin with "-" first_word=${words[1]} - [[ -n $first_word && ${first_word:0:1} != "-" ]] && - old_opt_used=1 + [[ $first_word && ${first_word:0:1} != "-" ]] && + old_opt_used=set # parse the old option (if present) contents to allow later code expect # corresponding arguments - if ((old_opt_used == 1)); then + if [[ $old_opt_used ]]; then char=${first_word:0:1} - while [[ -n $char ]]; do - if __tar_is_argreq "$char"; then + while [[ $char ]]; do + if _comp_cmd_tar__is_argreq "$char"; then old_opt_parsed+=("$char") fi - first_word=${first_word##$char} + first_word=${first_word##"$char"} char=${first_word:0:1} done fi } # Make the analysis of whole command line. -__tar_preparse_cmdline() +_comp_cmd_tar__preparse_cmdline() { - local first_arg i modes="ctxurdA" + local first_arg=set i modes="ctxurdA" shift # progname - __tar_parse_old_opt + _comp_cmd_tar__parse_old_opt - first_arg=1 for i in "$@"; do case "$i" in --delete | --test-label) @@ -201,36 +219,36 @@ __tar_preparse_cmdline() ;; *[$modes]*) # Only the first arg may be "MODE" without leading dash - if ((first_arg == 1)); then + if [[ $first_arg ]]; then tar_mode=${i//[^$modes]/} tar_mode=${tar_mode:0:1} tar_mode_arg=$i fi ;; esac - first_arg=0 + first_arg="" done } # Generate completions for -f/--file. -__tar_file_option() +_comp_cmd_tar__file_option() { local ext="$1" case "$tar_mode" in c) # no need to advise user to re-write existing tarball - _filedir -d + _comp_compgen_filedir -d ;; *) - _filedir "$ext" + _comp_compgen_filedir "$ext" ;; esac } # Returns truth if option requires argument. No equal sign must be pasted. # Accepts option in format: 'c', '-c', '--create' -__tar_is_argreq() +_comp_cmd_tar__is_argreq() { local opt opt=$1 @@ -250,14 +268,14 @@ __tar_is_argreq() } # Called only for short parameter -__tar_complete_mode() +_comp_cmd_tar__mode() { local short_modes rawopt generated \ allshort_raw_unused allshort_raw \ filler i short_modes="ctx" - [[ ! -v basic_tar ]] && short_modes="ctxurdA" + [[ ! $basic_tar ]] && short_modes="ctxurdA" # Remove prefix when needed rawopt=${cur#-} @@ -270,25 +288,25 @@ __tar_complete_mode() # when user passed something like 'tar cf' do not put the '-' before filler= - if [[ -z $cur && ! -v basic_tar ]]; then + if [[ ! $cur && ! $basic_tar ]]; then filler=- fi generated="" for ((i = 0; 1; i++)); do local c="${short_modes:i:1}" - [[ -z $c ]] && break + [[ ! $c ]] && break generated+=" $filler$cur$c" done - COMPREPLY=($(compgen -W "$generated")) + _comp_compgen -R -- -W "$generated" return 0 fi # The last short option requires argument, like '-cf<TAB>'. Cut the # completion here to enforce argument processing. - if ((old_opt_progress == 0)) && - __tar_is_argreq "$(__tar_last_char "$cur")"; then + if [[ ! $old_opt_progress ]] && + _comp_cmd_tar__is_argreq "${cur: -1}"; then COMPREPLY=("$cur") && return 0 fi @@ -300,25 +318,25 @@ __tar_complete_mode() generated= for ((i = 0; 1; i++)); do local c="${allshort_raw_unused:i:1}" - [[ -z $c ]] && break + [[ ! $c ]] && break generated+=" $cur$c" done - COMPREPLY=($(compgen -W "$generated")) + _comp_compgen -R -- -W "$generated" return 0 } -__gtar_complete_lopts() +_comp_cmd_tar__gnu_long_options() { local rv - COMPREPLY=($(compgen -W "$long_opts" -- "$cur")) + _comp_compgen -- -W "$long_opts" rv=$? [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return $rv } -__gtar_complete_sopts() +_comp_cmd_tar__gnu_short_options() { local generated short_mode_opts i c short_mode_opts="ctxurdA" @@ -326,52 +344,51 @@ __gtar_complete_sopts() for ((i = 0; 1; i++)); do c="${allshort_raw_unused:i:1}" - [[ -z $c ]] && break + [[ ! $c ]] && break generated+=" $cur$c" done - COMPREPLY=($(compgen -W "$generated" -- "$cur")) + _comp_compgen -- -W "$generated" } -__tar_try_mode() +_comp_cmd_tar__try_mode() { case "$cur" in --*) # posix tar does not support long opts - [[ -v basic_tar ]] && return 0 - __gtar_complete_lopts + [[ $basic_tar ]] && return 0 + _comp_cmd_tar__gnu_long_options return $? ;; -*) - # posix tar does not support short optios - [[ -v basic_tar ]] && return 0 + # posix tar does not support short options + [[ $basic_tar ]] && return 0 - __tar_complete_mode && return 0 + _comp_cmd_tar__mode && return 0 ;; *) if [[ $cword -eq 1 || $tar_mode == none ]]; then - __tar_complete_mode && return 0 + _comp_cmd_tar__mode && return 0 fi ;; esac return 1 } -__tar_adjust_PREV_from_old_option() +_comp_cmd_tar__adjust_PREV_from_old_option() { # deal with old style arguments here # $ tar cfTC # expects this sequence of arguments: # $ tar cfTC ARCHIVE_FILE PATTERNS_FILE CHANGE_DIR - if ((old_opt_used == 1 && cword > 1 && \ - cword < ${#old_opt_parsed[@]} + 2)); then + if [[ $old_opt_used ]] && ((cword > 1 && cword < ${#old_opt_parsed[@]} + 2)); then # make e.g. 'C' option from 'cffCT' prev="-${old_opt_parsed[cword - 2]}" fi } -__tar_extract_like_mode() +_comp_cmd_tar__extract_like_mode() { local i for i in x d t delete; do @@ -380,14 +397,15 @@ __tar_extract_like_mode() return 1 } -__tar_try_list_archive() +_comp_cmd_tar__try_list_archive() { - local tarball tarbin untar i + local tarball="" tarbin untar i - __tar_extract_like_mode || return 1 + _comp_cmd_tar__extract_like_mode || return 1 # This all is just to approach directory completion from "virtual" - # directory structure in tarball (for which the _filedir is unusable) + # directory structure in tarball (for which the _comp_compgen_filedir is + # unusable) set -- "${words[@]}" tarbin=$1 @@ -400,29 +418,39 @@ __tar_try_list_archive() break fi done - if [[ -n $tarball ]]; then - local IFS=$'\n' - COMPREPLY=($(compgen -o filenames -W "$( + if [[ $tarball ]]; then + _comp_compgen -c "$(printf %q "$cur")" split -lo filenames -- "$( $tarbin $untar "$tarball" 2>/dev/null | - while read line; do - printf "%q\n" "$(printf %q"\n" "$line")" + while read -r line; do + printf "%q\n" "$line" done - )" -- "$(printf "%q\n" "$cur")")) + )" return 0 fi } -__tar_cleanup_prev() +_comp_cmd_tar__cleanup_prev() { if [[ $prev =~ ^-[a-zA-Z0-9?]*$ ]]; then # transform '-caf' ~> '-f' - prev="-$(__tar_last_char "$prev")" + prev="-${prev: -1}" fi } -__tar_detect_ext() +_comp_cmd_tar__detect_ext() { - local tars='@(@(tar|gem|spkg)?(.@(Z|[bgx]z|bz2|lz?(ma|o)|zst))|t@([abglx]z|b?(z)2|zst))' + local tars='@(@(tar|spkg)?(.@(Z|[bgx]z|bz2|lz?(ma|o)|zst))|t@([abglx]z|b?(z)2|zst)|cbt|gem|xbps)' + if [[ ${COMP_WORDS[0]} == ?(*/)bsdtar ]]; then + # https://github.com/libarchive/libarchive/wiki/LibarchiveFormats + tars=${tars/%\)/|pax|cpio|iso|zip|@(j|x)ar|mtree|a|7z|warc} + if _comp_cmd_tar__extract_like_mode; then + # read only + tars+="|l@(ha|zh)|rar|cab)" + else + # write only + tars+="|shar)" + fi + fi ext="$tars" case "$tar_mode_arg" in @@ -430,7 +458,7 @@ __tar_detect_ext() # Should never happen? ;; ?(-)*[cr]*f) - ext='@(tar|gem|spkg)' + ext='@(tar|gem|spkg|cbt|xpbs)' case ${words[1]} in *a*) ext="$tars" ;; *z*) ext='t?(ar.)gz' ;; @@ -443,24 +471,24 @@ __tar_detect_ext() # Pass through using defaults above ;; *[Zz]*f) - ext='@(@(t?(ar.)|gem.|spkg.)@(gz|Z)|taz)' + ext='@(@(t?(ar.)|spkg.)@(gz|Z)|taz)' ;; *[jy]*f) - ext='@(@(t?(ar.)|gem.)bz?(2)|spkg|tb2)' + ext='@(t?(ar.)bz?(2)|spkg|tb2)' ;; *[J]*f) - ext='@(@(tar|gem|spkg).@(lzma|xz)|t[lx]z)' + ext='@(@(tar|spkg).@(lzma|xz)|t[lx]z)' ;; esac } -_gtar() +_comp_cmd_tar__gnu() { - local long_opts short_opts \ + local long_opts short_opts basic_tar="" \ long_arg_none="" long_arg_opt="" long_arg_req="" \ short_arg_none="" short_arg_opt="" short_arg_req="" \ - tar_mode tar_mode_arg old_opt_progress=0 \ - old_opt_used=0 old_opt_parsed=() + tar_mode tar_mode_arg old_opt_progress="" \ + old_opt_used="" old_opt_parsed=() # Main mode, e.g. -x or -c (extract/creation) local tar_mode=none @@ -469,81 +497,93 @@ _gtar() # FIXME: handle long options local tar_mode_arg= - if [[ -v BASHCOMP_TAR_OPT_DEBUG ]]; then + if [[ -v _comp_cmd_tar__debug ]]; then set -x - PS4='$BASH_SOURCE:$LINENO: ' + local PS4='$BASH_SOURCE:$LINENO: ' fi - local cur prev words cword split + local cur prev words cword was_split comp_args - _init_completion -s || return + _comp_initialize -s -- "$@" || return # Fill the {long,short}_{opts,arg*} - __gnu_tar_parse_help + _comp_cmd_gtar__parse_help - __tar_preparse_cmdline "${words[@]}" + _comp_cmd_tar__preparse_cmdline "${words[@]}" local ext - __tar_detect_ext + _comp_cmd_tar__detect_ext while true; do # just-for-easy-break while, not looping - __tar_adjust_PREV_from_old_option - __tar_posix_prev_handle && break - __tar_cleanup_prev + _comp_cmd_tar__adjust_PREV_from_old_option + _comp_cmd_tar__posix_prev_handle && break + _comp_cmd_tar__cleanup_prev # Handle all options *REQUIRING* argument. Optional arguments are up to # user (TODO: is there any sane way to deal with this?). This case # statement successes only if there already is PREV. + local noargopts='!(-*|*[TXgCFIfH]*)' + # shellcheck disable=SC2254 case $prev in - --directory | -!(-*)C) - _filedir -d + --add-file | --exclude | --exclude-ignore | \ + --exclude-ignore-recursive | --exclude-tag | \ + --exclude-tag-all | --exclude-tag-under | --files-from | \ + --exclude-from | --listed-incremental | --group-map | \ + --mtime | --owner-map | --volno-file | --newer | \ + --after-date | --index-file | -${noargopts}[TXg]) + _comp_compgen_filedir + break + ;; + --directory | -${noargopts}C) + _comp_compgen_filedir -d + break + ;; + --hole-detection) + _comp_compgen -- -W 'raw seek' + break + ;; + --to-command | --info-script | --new-volume-script | \ + --rmt-command | --rsh-command | --use-compress-program | \ + -${noargopts}[FI]) + _comp_compgen_commands break ;; --atime-preserve) - COMPREPLY=($(compgen -W 'replace system' -- "$cur")) + _comp_compgen -- -W 'replace system' break ;; --group) - COMPREPLY=($(compgen -g -- "$cur")) + _comp_compgen -- -g break ;; --owner) - COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen -- -u break ;; - --info-script | --new-volume-script | --rmt-command | --rsh-command | \ - --use-compress-program | -!(-*)[FI]) - compopt -o filenames - COMPREPLY=($(compgen -c -- "$cur")) + --sort) + _comp_compgen -- -W 'none name inode' break ;; - --volno-file | --add-file | --files-from | --exclude-from | \ - --index-file | --listed-incremental | -!(-*)[TXg]) - _filedir + --file | -${noargopts}f) + _comp_cmd_tar__file_option "$ext" break ;; - --format | -!(-*)H) - COMPREPLY=($(compgen -W 'gnu oldgnu pax posix ustar v7' \ - -- "$cur")) + --format | -${noargopts}H) + _comp_compgen -- -W 'gnu oldgnu pax posix ustar v7' break ;; --quoting-style) - COMPREPLY=($(compgen -W 'literal shell shell-always c c-maybe - escape locale clocale' -- "$cur")) + _comp_compgen -- -W 'literal shell shell-always shell-escape + shell-escape-always c c-maybe escape locale clocale' break ;; --totals) - COMPREPLY=($(compgen -W 'SIGHUP SIGQUIT SIGINT SIGUSR1 SIGUSR2' \ - -- "$cur")) + _comp_compgen -- -W 'SIGHUP SIGQUIT SIGINT SIGUSR1 SIGUSR2' break ;; --warning) - COMPREPLY=($(compgen -W "$(__gtar_parse_warnings)" -- "$cur")) - break - ;; - --file | -!(-*)f) - __tar_file_option "$ext" + _comp_cmd_gtar__parse_warnings break ;; --*) @@ -557,12 +597,12 @@ _gtar() # if there is some unknown option with '=', for example # (literally) user does --nonexistent=<TAB>, we do not want # continue also - $split && break + [[ $was_split ]] && break # Most probably, when code goes here, the PREV variable contains # some string from "$long_arg_none" and we want continue. ;; - -!(-*)[a-zA-Z0-9?]) + -${noargopts}[a-zA-Z0-9?]) # argument required but no completion yet [[ $short_arg_req =~ ${prev##-} ]] && break ;; @@ -578,17 +618,17 @@ _gtar() # Handle the main operational mode of tar. We should do it as soon as # possible. - __tar_try_mode && break + _comp_cmd_tar__try_mode && break # handle others case "$cur" in --*) - __gtar_complete_lopts + _comp_cmd_tar__gnu_long_options break ;; -*) # called only if it is *not* first parameter - __gtar_complete_sopts + _comp_cmd_tar__gnu_short_options break ;; esac @@ -597,27 +637,26 @@ _gtar() # was truth - the 'break' statement would have been already called ((cword == 1)) && break - __tar_try_list_archive && break + _comp_cmd_tar__try_list_archive && break # file completion on relevant files if [[ $tar_mode != none ]]; then - _filedir + _comp_compgen_filedir fi break done # just-for-easy-break while - if [[ -v BASHCOMP_TAR_OPT_DEBUG ]]; then + if [[ -v _comp_cmd_tar__debug ]]; then set +x - unset PS4 fi } -__tar_posix_prev_handle() +_comp_cmd_tar__posix_prev_handle() { case "$prev" in -f) - __tar_file_option "$ext" + _comp_cmd_tar__file_option "$ext" return 0 ;; -b) @@ -628,13 +667,13 @@ __tar_posix_prev_handle() return 1 } -_posix_tar() +_comp_cmd_tar__posix() { - local long_opts short_opts basic_tar \ + local long_opts short_opts basic_tar=set \ long_arg_none="" long_arg_opt long_arg_req="" \ short_arg_none short_arg_opt short_arg_req \ - tar_mode tar_mode_arg old_opt_progress=0 \ - old_opt_used=1 old_opt_parsed=() + tar_mode tar_mode_arg old_opt_progress="" \ + old_opt_used=set old_opt_parsed=() # Main mode, e.g. -x or -c (extract/creation) local tar_mode=none @@ -642,11 +681,10 @@ _posix_tar() # The mode argument, e.g. -cpf or -c local tar_mode_arg= - local cur prev words cword split + local cur prev words cword was_split comp_args - _init_completion -s || return + _comp_initialize -s -- "$@" || return - basic_tar=yes tar_mode=none # relatively compatible modes are {c,t,x} @@ -655,57 +693,57 @@ _posix_tar() short_arg_none="wmv" short_opts="$short_arg_req$short_arg_none" - __tar_preparse_cmdline "${words[@]}" + _comp_cmd_tar__preparse_cmdline "${words[@]}" local ext - __tar_detect_ext + _comp_cmd_tar__detect_ext - __tar_adjust_PREV_from_old_option + _comp_cmd_tar__adjust_PREV_from_old_option - __tar_posix_prev_handle && return + _comp_cmd_tar__posix_prev_handle && return - __tar_try_mode && return + _comp_cmd_tar__try_mode && return - __tar_try_list_archive && return + _comp_cmd_tar__try_list_archive && return # file completion on relevant files - _filedir + _comp_compgen_filedir } -_tar() +_comp_cmd_tar() { local cmd=${COMP_WORDS[0]} func line - line="$($cmd --version 2>/dev/null)" + line="$("$cmd" --version 2>/dev/null)" case "$line" in *GNU*) - func=_gtar + func=_comp_cmd_tar__gnu ;; *) - func=_posix_tar + func=_comp_cmd_tar__posix ;; esac $func "$@" # Install real completion for subsequent completions - if [[ ${COMP_TAR_INTERNAL_PATHS-} ]]; then + if [[ ${BASH_COMPLETION_CMD_TAR_INTERNAL_PATHS-} ]]; then complete -F $func -o dirnames tar else complete -F $func tar fi - unset -f _tar + unset -f "$FUNCNAME" } -if [[ ${COMP_TAR_INTERNAL_PATHS-} ]]; then - complete -F _tar -o dirnames tar - complete -F _gtar -o dirnames gtar - complete -F _posix_tar -o dirnames bsdtar - complete -F _posix_tar -o dirnames star +if [[ ${BASH_COMPLETION_CMD_TAR_INTERNAL_PATHS-} ]]; then + complete -F _comp_cmd_tar -o dirnames tar + complete -F _comp_cmd_tar__gnu -o dirnames gtar + complete -F _comp_cmd_tar__posix -o dirnames bsdtar + complete -F _comp_cmd_tar__posix -o dirnames star else - complete -F _tar tar - complete -F _gtar gtar - complete -F _posix_tar bsdtar - complete -F _posix_tar star + complete -F _comp_cmd_tar tar + complete -F _comp_cmd_tar__gnu gtar + complete -F _comp_cmd_tar__posix bsdtar + complete -F _comp_cmd_tar__posix star fi # ex: filetype=sh diff --git a/completions/tcpdump b/completions/tcpdump index 9a7c2e9..f09dc6f 100644 --- a/completions/tcpdump +++ b/completions/tcpdump @@ -1,64 +1,64 @@ # bash completion for tcpdump -*- shell-script -*- -_tcpdump() +_comp_cmd_tcpdump() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[rwFVimTzZBcCDEGMsWyjQ]*)' + # shellcheck disable=SC2254 case $prev in - -!(-*)[rwFV]) - _filedir + -${noargopts}[rwFV]) + _comp_compgen_filedir return ;; - --interface | -!(-*)i) - _available_interfaces -a + --interface | -${noargopts}i) + _comp_compgen_available_interfaces -a return ;; - -!(-*)m) - _filedir mib + -${noargopts}m) + _comp_compgen_filedir mib return ;; - -!(-*)T) - COMPREPLY=($(compgen -W 'aodv carp cnfp lmp pgm pgm_zmtp1 radius - resp rpc rtcp rtp rtcp snmp tftp vat vxlan wb zmtp1' \ - -- "$cur")) + -${noargopts}T) + _comp_compgen -- -W 'aodv carp cnfp lmp pgm pgm_zmtp1 radius resp + rpc rtcp rtp rtcp snmp tftp vat vxlan wb zmtp1' return ;; - -!(-*)z) - compopt -o filenames - COMPREPLY=($(compgen -c -- "$cur")) + -${noargopts}z) + _comp_compgen_commands return ;; - --relinquish-privileges | -!(-*)Z) - _allowed_users + --relinquish-privileges | -${noargopts}Z) + _comp_compgen_allowed_users return ;; - -!(-*)[BcCDEGMsWy]) + -${noargopts}[BcCDEGMsWy]) return ;; - --time-stamp-type | -!(-*)j) - COMPREPLY=($(compgen -W 'host host_lowprec host_hiprec adapter - adapter_unsynced' -- "$cur")) + --time-stamp-type | -${noargopts}j) + _comp_compgen -- -W 'host host_lowprec host_hiprec adapter + adapter_unsynced' return ;; - --direction | -!(-*)Q) - COMPREPLY=($(compgen -W 'in out inout' -- "$cur")) + --direction | -${noargopts}Q) + _comp_compgen -- -W 'in out inout' return ;; --time-stamp-precision) - COMPREPLY=($(compgen -W 'micro nano' -- "$cur")) + _comp_compgen -- -W 'micro nano' return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _tcpdump tcpdump + complete -F _comp_cmd_tcpdump tcpdump # ex: filetype=sh diff --git a/completions/tcpkill b/completions/tcpkill index 189d928..87bf51a 100644 --- a/completions/tcpkill +++ b/completions/tcpkill @@ -1,22 +1,22 @@ # tcpkill completion -*- shell-script -*- -_tcpkill() +_comp_cmd_tcpkill() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*i) - _available_interfaces -a + _comp_compgen_available_interfaces -a return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-i -1 -2 -3 -4 -5 -6 -7 -8 -9' -- "$cur")) + _comp_compgen -- -W '-i -1 -2 -3 -4 -5 -6 -7 -8 -9' fi } && - complete -F _tcpkill tcpkill + complete -F _comp_cmd_tcpkill tcpkill # ex: filetype=sh diff --git a/completions/tcpnice b/completions/tcpnice index c6a94d6..b33d7db 100644 --- a/completions/tcpnice +++ b/completions/tcpnice @@ -1,22 +1,22 @@ # tcpnice completion -*- shell-script -*- -_tcpnice() +_comp_cmd_tcpnice() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*i) - _available_interfaces -a + _comp_compgen_available_interfaces -a return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage fi } && - complete -F _tcpnice tcpnice + complete -F _comp_cmd_tcpnice tcpnice # ex: filetype=sh diff --git a/completions/timeout b/completions/timeout index 32ff2e3..f5115d2 100644 --- a/completions/timeout +++ b/completions/timeout @@ -1,39 +1,38 @@ # timeout(1) completion -*- shell-script -*- -_timeout() +_comp_cmd_timeout() { - local cur prev words cword split i found=false - _init_completion -s || return + local cur prev words cword was_split comp_args i + _comp_initialize -s -- "$@" || return - for ((i = 1; i <= COMP_CWORD; i++)); do - if [[ ${COMP_WORDS[i]} != -* && ${COMP_WORDS[i - 1]} != = ]]; then - if $found; then - _command_offset $i - return - fi - found=true + local noargopts='!(-*|*[ks]*)' + for ((i = 1; i < cword; i++)); do + if [[ ${words[i]} != -* ]]; then + _comp_command_offset "$((i + 1))" + return fi - [[ ${COMP_WORDS[i]} == -@(-kill-after|-signal|!(-*)[ks]) ]] && ((i++)) + # shellcheck disable=SC2254 + [[ ${words[i]} == -@(-kill-after|-signal|${noargopts}[ks]) ]] && ((i++)) done + # shellcheck disable=SC2254 case $prev in - --help | --version | --kill-after | -!(-*)k) + --help | --version | --kill-after | -${noargopts}k) return ;; - --signal | -!(-*)s) - _signals + --signal | -${noargopts}s) + _comp_compgen_signals return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - local opts=$(_parse_help "$1") - COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _timeout timeout + complete -F _comp_cmd_timeout timeout # ex: filetype=sh diff --git a/completions/tipc b/completions/tipc index 44ade36..11d35a6 100644 --- a/completions/tipc +++ b/completions/tipc @@ -1,26 +1,26 @@ # tipc(8) completion -*- shell-script -*- -_tipc_media() +_comp_cmd_tipc__media() { local optind=$1 if ((cword == optind)); then - COMPREPLY=($(compgen -W 'media' -- $cur)) + _comp_compgen -- -W 'media' return 0 elif ((cword == optind + 1)); then - COMPREPLY=($(compgen -W 'udp eth ib' -- $cur)) + _comp_compgen -- -W 'udp eth ib' return 0 fi return 1 } -_tipc_bearer() +_comp_cmd_tipc__bearer() { local optind=$1 - local media i + local media="" i - if _tipc_media $optind; then + if _comp_cmd_tipc__media "$optind"; then return fi @@ -33,52 +33,54 @@ _tipc_bearer() if ((cword == optind + 2)); then case "$media" in "udp") - COMPREPLY=($(compgen -W 'name' -- $cur)) + _comp_compgen -- -W 'name' ;; "eth" | "ib") - COMPREPLY=($(compgen -W 'device' -- $cur)) + _comp_compgen -- -W 'device' ;; esac elif ((cword == optind + 3)); then case "$media" in "udp") - local names=$(tipc bearer list 2>/dev/null | awk -F: '/^udp:/ {print $2}') - COMPREPLY=($(compgen -W '$names' -- $cur)) + local names=$( + tipc bearer list 2>/dev/null | _comp_awk -F : '/^udp:/ {print $2}' + ) + _comp_compgen -- -W '$names' ;; "eth") local interfaces=$(command ls /sys/class/net/) - COMPREPLY=($(compgen -W '$interfaces' -- $cur)) + _comp_compgen -- -W '$interfaces' ;; esac fi } -_tipc_link_opts() +_comp_cmd_tipc__link_opts() { - COMPREPLY=($(compgen -W 'priority tolerance window' -- $cur)) + _comp_compgen -- -W 'priority tolerance window' } -_tipc_link() +_comp_cmd_tipc__link() { local optind=$1 local filter=$2 if ((cword == optind)); then - COMPREPLY=($(compgen -W 'link' -- $cur)) + _comp_compgen -- -W 'link' elif ((cword == optind + 1)); then # awk drops link state and last trailing : local links=$(tipc link list 2>/dev/null | - awk '{print substr($1, 0, length($1))}') + _comp_awk '{print substr($1, 0, length($1))}') local -a exclude [[ $filter == peers ]] && exclude=(-X broadcast-link) - COMPREPLY=($(compgen "${exclude[@]}" -W '$links' -- $cur)) + _comp_compgen -- "${exclude[@]}" -W '$links' fi } -_tipc() +_comp_cmd_tipc() { - local cur prev words cword optind i p - _init_completion || return + local cur prev words cword comp_args optind i p + _comp_initialize -- "$@" || return optind=1 COMPREPLY=() @@ -86,13 +88,13 @@ _tipc() # Flags can be placed anywhere in the commandline case "$cur" in -*) - COMPREPLY=($(compgen -W '-h --help' -- $cur)) + _comp_compgen -- -W '-h --help' return ;; esac if ((cword == 1)); then - COMPREPLY=($(compgen -W 'bearer link media nametable node socket' -- $cur)) + _comp_compgen -- -W 'bearer link media nametable node socket' return fi @@ -101,17 +103,17 @@ _tipc() ((optind++)) if ((cword == optind)); then - COMPREPLY=($(compgen -W 'enable disable set get list' -- $cur)) + _comp_compgen -- -W 'enable disable set get list' return fi case "${words[optind]}" in enable) - local media params + local media="" params ((optind++)) if ((cword < optind + 4)); then - _tipc_bearer $optind + _comp_cmd_tipc__bearer $optind return fi @@ -122,20 +124,20 @@ _tipc() done case "$media" in "udp") - declare -a params=("localip" "localport" "remoteip" + local -a params=("localip" "localport" "remoteip" "remoteport" "domain" "priority") ;; "eth" | "ib") - declare -a params=("domain" "priority") + local -a params=("domain" "priority") ;; *) return ;; esac - # If the previous word was a known parameter, we assume a value for - # that key. Note that this would break if the user attempts to use - # a known key as value. + # If the previous word was a known parameter, we assume a + # value for that key. Note that this would break if the + # user attempts to use a known key as value. for i in "${params[@]}"; do if [[ $prev == "$i" ]]; then return @@ -151,29 +153,29 @@ _tipc() done done - COMPREPLY=($(compgen -W '${params[@]}' -- $cur)) + _comp_compgen -- -W '"${params[@]}"' -X '' ;; disable) ((optind++)) - _tipc_bearer $optind + _comp_cmd_tipc__bearer $optind ;; get) ((optind++)) if ((cword == optind)); then - _tipc_link_opts + _comp_cmd_tipc__link_opts elif ((cword >= optind + 1)); then - _tipc_bearer $((optind + 1)) + _comp_cmd_tipc__bearer $((optind + 1)) fi ;; set) ((optind++)) if ((cword == optind)); then - _tipc_link_opts + _comp_cmd_tipc__link_opts elif ((cword >= optind + 2)); then - _tipc_bearer $((optind + 2)) + _comp_cmd_tipc__bearer $((optind + 2)) fi ;; esac @@ -182,7 +184,7 @@ _tipc() ((optind++)) if ((cword == optind)); then - COMPREPLY=($(compgen -W 'get set list statistics' -- $cur)) + _comp_compgen -- -W 'get set list statistics' return fi @@ -191,31 +193,31 @@ _tipc() ((optind++)) if ((cword == optind)); then - _tipc_link_opts + _comp_cmd_tipc__link_opts elif ((cword >= optind + 1)); then - _tipc_link $((optind + 1)) "peers" + _comp_cmd_tipc__link $((optind + 1)) "peers" fi ;; set) ((optind++)) if ((cword == optind)); then - _tipc_link_opts + _comp_cmd_tipc__link_opts elif ((cword >= optind + 2)); then - _tipc_link $((optind + 2)) "peers" + _comp_cmd_tipc__link $((optind + 2)) "peers" fi ;; statistics) ((optind++)) if ((cword == optind)); then - COMPREPLY=($(compgen -W 'show reset' -- $cur)) + _comp_compgen -- -W 'show reset' return fi case "${words[optind]}" in show | reset) - _tipc_link $((optind + 1)) + _comp_cmd_tipc__link $((optind + 1)) ;; esac ;; @@ -225,7 +227,7 @@ _tipc() ((optind++)) if ((cword == optind)); then - COMPREPLY=($(compgen -W 'get set list' -- $cur)) + _comp_compgen -- -W 'get set list' return fi @@ -234,18 +236,18 @@ _tipc() ((optind++)) if ((cword == optind)); then - _tipc_link_opts + _comp_cmd_tipc__link_opts elif ((cword >= optind + 1)); then - _tipc_media $((optind + 1)) + _comp_cmd_tipc__media $((optind + 1)) fi ;; set) ((optind++)) if ((cword == optind)); then - _tipc_link_opts + _comp_cmd_tipc__link_opts elif ((cword >= optind + 2)); then - _tipc_media $((optind + 2)) + _comp_cmd_tipc__media $((optind + 2)) fi ;; esac @@ -254,14 +256,14 @@ _tipc() ((optind++)) if ((cword == optind)); then - COMPREPLY=($(compgen -W 'show' -- $cur)) + _comp_compgen -- -W 'show' fi ;; node) ((optind++)) if ((cword == optind)); then - COMPREPLY=($(compgen -W 'list get set' -- $cur)) + _comp_compgen -- -W 'list get set' return fi @@ -270,7 +272,7 @@ _tipc() ((optind++)) if ((cword == optind)); then - COMPREPLY=($(compgen -W 'address netid' -- $cur)) + _comp_compgen -- -W 'address netid' fi ;; esac @@ -279,11 +281,11 @@ _tipc() ((optind++)) if ((cword == optind)); then - COMPREPLY=($(compgen -W 'list' -- $cur)) + _comp_compgen -- -W 'list' fi ;; esac } && - complete -F _tipc tipc + complete -F _comp_cmd_tipc tipc # ex: filetype=sh diff --git a/completions/tox b/completions/tox index 0ea656e..b4b88bd 100644 --- a/completions/tox +++ b/completions/tox @@ -1,9 +1,9 @@ # tox completion -*- shell-script -*- -_tox() +_comp_cmd_tox() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return # Complete defaults following a "--" if [[ "${words[*]:0:cword} " == *\ --\ * && $cur != -- ]]; then @@ -11,19 +11,22 @@ _tox() return fi + local noargopts='!(-*|*[nice]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | --num | --index-url | --hashseed | --force-dep | -!(-*)[hni]) + --help | --version | --num | --index-url | --hashseed | --force-dep | \ + -${noargopts}[hni]) return ;; - -!(-*)c) - _filedir ini + -${noargopts}c) + _comp_compgen_filedir ini return ;; --installpkg | --result-json | --workdir) - _filedir + _comp_compgen_filedir return ;; - -!(-*)e) + -${noargopts}e) local envs=$( { "$1" --listenvs-all || "$1" --listenvs @@ -33,19 +36,17 @@ _tox() command sed -e 's/,/ /g' -ne 's/^envlist[[:space:]]*=//p' \ tox.ini 2>/dev/null ) - local prefix="" - [[ $cur == *,* ]] && prefix="${cur%,*}," - COMPREPLY=($(compgen -X '*[{}]*' -W "$envs ALL" -- "${cur##*,}")) - ((${#COMPREPLY[@]} == 1)) && COMPREPLY=(${COMPREPLY/#/$prefix}) + _comp_delimited , -X '*[{}]*' -W "$envs ALL" return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1") --' -- "$cur")) + _comp_compgen_help + _comp_compgen -a -- -W '--' return fi } && - complete -F _tox tox + complete -F _comp_cmd_tox tox # ex: filetype=sh diff --git a/completions/tracepath b/completions/tracepath index 176534f..d8269bd 100644 --- a/completions/tracepath +++ b/completions/tracepath @@ -1,9 +1,9 @@ # tracepath(8) completion -*- shell-script -*- -_tracepath() +_comp_cmd_tracepath() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*[lmp]) @@ -12,15 +12,14 @@ _tracepath() esac if [[ $cur == -* ]]; then - local opts=$(_parse_help "$1") - COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage return fi local ipvx [[ $1 == *6 ]] && ipvx=-6 - _known_hosts_real ${ipvx-} -- "$cur" + _comp_compgen_known_hosts ${ipvx-} -- "$cur" } && - complete -F _tracepath tracepath tracepath6 + complete -F _comp_cmd_tracepath tracepath tracepath6 # ex: filetype=sh diff --git a/completions/tree b/completions/tree new file mode 100644 index 0000000..d274137 --- /dev/null +++ b/completions/tree @@ -0,0 +1,46 @@ +# tree(1) completion -*- shell-script -*- + +_comp_cmd_tree() +{ + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + + local noargopts='!(-*|*[LPIHTo]*)' + # shellcheck disable=SC2254 + case $prev in + -${noargopts}[LPIHT] | --filelimit | --timefmt | --help | --version) + return + ;; + --charset) + _comp_compgen -x iconv charsets + return + ;; + -${noargopts}o) + _comp_compgen_filedir + return + ;; + --sort) + _comp_compgen -- -W "name version size mtime ctime" + return + ;; + esac + + [[ $was_split ]] && return + + if [[ $cur == -* ]]; then + _comp_compgen_help + return + fi + + # Note: bash-4.2 has a bug with [[ ${arr[*]} == *text* ]], so we + # assign ${words[*]} in a temporary variable "line". + local line="${words[*]}" + if [[ $line == *\ --fromfile\ * ]]; then + _comp_compgen_filedir + else + _comp_compgen_filedir -d + fi +} && + complete -F _comp_cmd_tree tree + +# ex: filetype=sh diff --git a/completions/truncate b/completions/truncate new file mode 100644 index 0000000..94534a2 --- /dev/null +++ b/completions/truncate @@ -0,0 +1,32 @@ +# truncate(1) completion -*- shell-script -*- + +_comp_cmd_truncate() +{ + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + + local noargopts='!(-*|*[sr]*)' + # shellcheck disable=SC2254 + case $prev in + -${noargopts}s | --size | --help | --version) + return + ;; + -${noargopts}r | --reference) + _comp_compgen_filedir + return + ;; + esac + + [[ $was_split ]] && return + + if [[ $cur == -* ]]; then + _comp_compgen_help + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _comp_compgen_filedir +} && + complete -F _comp_cmd_truncate truncate + +# ex: filetype=sh diff --git a/completions/tshark b/completions/tshark index 396fbcb..249670f 100644 --- a/completions/tshark +++ b/completions/tshark @@ -1,9 +1,9 @@ # tshark(1) completion -*- shell-script -*- -_tshark() +_comp_cmd_tshark() { - local cur prev words cword prefix - _init_completion -n : || return + local cur prev words cword comp_args prefix + _comp_initialize -n : -- "$@" || return case $cur in -o*) @@ -20,15 +20,14 @@ _tshark() ;; -o*) if [[ $cur == *:* ]]; then - cur=${cur#*:} - _filedir + _comp_compgen -c "${cur#*:}" filedir else - [[ -v _tshark_prefs ]] || - _tshark_prefs="$("$1" -G defaultprefs 2>/dev/null | command sed -ne 's/^#\{0,1\}\([a-z0-9_.-]\{1,\}:\).*/\1/p' | + [[ -v _comp_cmd_tshark__prefs ]] || + _comp_cmd_tshark__prefs="$("$1" -G defaultprefs 2>/dev/null | command sed -ne 's/^#\{0,1\}\([a-z0-9_.-]\{1,\}:\).*/\1/p' | tr '\n' ' ')" : ${prefix:=} - COMPREPLY=($(compgen -P "$prefix" -W "$_tshark_prefs" \ - -- "${cur:${#prefix}}")) + _comp_compgen -c "${cur:${#prefix}}" -- -P "$prefix" \ + -W "$_comp_cmd_tshark__prefs" [[ ${COMPREPLY-} == *: ]] && compopt -o nospace fi return @@ -37,8 +36,7 @@ _tshark() return ;; -*i) - COMPREPLY=($(compgen -W \ - "$("$1" -D 2>/dev/null | awk '{print $2}')" -- "$cur")) + _comp_compgen_split -- "$("$1" -D 2>/dev/null | _comp_awk '{print $2}')" return ;; -*y) @@ -49,88 +47,81 @@ _tshark() break fi done - COMPREPLY=($(compgen -W "$("$1" $opts -L 2>/dev/null | - awk '/^ / { print $1 }')" -- "$cur")) + # shellcheck disable=SC2086 + _comp_compgen_split -- "$("$1" $opts -L 2>/dev/null | + _comp_awk '/^ / { print $1 }')" return ;; -*[ab]) - COMPREPLY=($(compgen -W 'duration: filesize: files:' -- "$cur")) + _comp_compgen -- -W 'duration: filesize: files:' [[ ${COMPREPLY-} == *: ]] && compopt -o nospace return ;; -*[rH]) # -r accepts a lot of different file types - _filedir + _comp_compgen_filedir return ;; -*w) - _filedir + _comp_compgen_filedir [[ $cur == @(|-) ]] && COMPREPLY+=(-) return ;; -*F) - COMPREPLY=($(compgen -W "$("$1" -F 2>&1 | - awk '/^ / { print $1 }')" -- "$cur")) + _comp_compgen_split -- "$("$1" -F 2>&1 | _comp_awk '/^ / { print $1 }')" return ;; -*O) - local prefix= - [[ $cur == *,* ]] && prefix="${cur%,*}," - [[ -v _tshark_protocols ]] || - _tshark_protocols="$("$1" -G protocols 2>/dev/null | + [[ -v _comp_cmd_tshark__protocols ]] || + _comp_cmd_tshark__protocols="$("$1" -G protocols 2>/dev/null | cut -f 3 | tr '\n' ' ')" - COMPREPLY=($(compgen -W "$_tshark_protocols" -- "${cur##*,}")) - ((${#COMPREPLY[@]} == 1)) && COMPREPLY=(${COMPREPLY/#/$prefix}) + _comp_delimited , -W "$_comp_cmd_tshark__protocols" return ;; -*T) - # Parse from: tshark -T . 2>&1 | awk -F \" '/^\t*"/ { print $2 }' - COMPREPLY=($(compgen -W \ - 'pdml ps psml json jsonraw ek tabs text fields' -- "$cur")) + # Parse from: tshark -T . 2>&1 | _comp_awk -F \" '/^\t*"/ { print $2 }' + _comp_compgen -- -W 'pdml ps psml json jsonraw ek tabs text fields' return ;; -*t) - # Parse from: tshark -t . 2>&1 | awk -F \" '/^\t*"/ { print $2 }' - COMPREPLY=($(compgen -W \ - 'a ad adoy d dd e r u ud udoy' -- "$cur")) + # Parse from: tshark -t . 2>&1 | _comp_awk -F \" '/^\t*"/ { print $2 }' + _comp_compgen -- -W 'a ad adoy d dd e r u ud udoy' return ;; -*u) # TODO: could be parsed from "-u ." output - COMPREPLY=($(compgen -W 's hms' -- "$cur")) + _comp_compgen -- -W 's hms' return ;; -*W) - COMPREPLY=($(compgen -W 'n' -- "$cur")) + _comp_compgen -- -W 'n' return ;; -*X) if [[ ${cur:${#prefix}} == lua_script:* ]]; then - cur=${cur#*:} - _filedir lua + _comp_compgen -c "${cur#*:}" filedir lua else - COMPREPLY=($(compgen -P "$prefix" -W 'lua_script:' -- \ - "${cur:${#prefix}}")) + _comp_compgen -c "${cur:${#prefix}}" -- -P "$prefix" \ + -W 'lua_script:' [[ ${COMPREPLY-} == *: ]] && compopt -o nospace fi return ;; -*G) - COMPREPLY=($(compgen -W "$("$1" -G \? 2>/dev/null | - awk '/^[ \t]*-G / \ - { sub("^[[]","",$2); sub("[]]$","",$2); print $2 }')" \ - -- "$cur")) + _comp_compgen_split -- "$("$1" -G \? 2>/dev/null | + _comp_awk '/^[ \t]*-G / { + sub("^[[]","",$2); sub("[]]$","",$2); print $2 + }')" return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -h 2>/dev/null)' \ - -- "$cur")) + _comp_compgen_help -- -h return fi } && - complete -F _tshark tshark + complete -F _comp_cmd_tshark tshark # ex: filetype=sh diff --git a/completions/tsig-keygen b/completions/tsig-keygen index 017e9d8..01fabe8 100644 --- a/completions/tsig-keygen +++ b/completions/tsig-keygen @@ -1,28 +1,28 @@ # tsig-keygen(8) completion -*- shell-script -*- -_tsig_keygen() +_comp_cmd_tsig_keygen() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -h) return ;; -a) - COMPREPLY=($(compgen -W 'hmac-{md5,sha{1,224,256,384,512}}' -- "$cur")) + _comp_compgen -- -W 'hmac-{md5,sha{1,224,256,384,512}}' return ;; -r) - COMPREPLY=($(compgen -W keyboard -- "$cur")) - _filedir + _comp_compgen -- -W keyboard + _comp_compgen -a filedir return ;; esac [[ $cur != -* ]] || - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help } && - complete -F _tsig_keygen tsig-keygen + complete -F _comp_cmd_tsig_keygen tsig-keygen # ex: filetype=sh diff --git a/completions/tune2fs b/completions/tune2fs index 66d629c..6d62aa2 100644 --- a/completions/tune2fs +++ b/completions/tune2fs @@ -1,32 +1,32 @@ # tune2fs(8) completion -*- shell-script -*- -_tune2fs() +_comp_cmd_tune2fs() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*[cCEiJLmrT]) return ;; -*e) - COMPREPLY=($(compgen -W 'continue remount-ro panic' -- "$cur")) + _comp_compgen -- -W 'continue remount-ro panic' return ;; -*g) - _gids - COMPREPLY=($(compgen -g -W '${COMPREPLY[@]}' -- "$cur")) + _comp_compgen_gids + _comp_compgen -a -- -g return ;; -*M) - _filedir -d + _comp_compgen_filedir -d return ;; -*o) local -a opts=(^debug ^bsdgroups ^user_xattr ^acl ^uid16 ^journal_data ^journal_data_ordered ^journal_data_writeback ^nobarrier ^block_validity ^discard ^nodelalloc) - COMPREPLY=($(compgen -W '${opts[@]} ${opts[@]#^}' -- "$cur")) + _comp_compgen -- -W '"${opts[@]}" "${opts[@]#^}"' return ;; -*O) @@ -34,28 +34,27 @@ _tune2fs() ^filetype ^flex_bg ^has_journal ^huge_file ^large_file ^metadata_csum ^mmp ^project ^quota ^read-only ^resize_inode ^sparse_super ^uninit_bg) - COMPREPLY=($(compgen -W '${opts[@]} ${opts[@]#^}' -- "$cur")) + _comp_compgen -- -W '"${opts[@]}" "${opts[@]#^}"' return ;; -*u) - _uids - COMPREPLY=($(compgen -u -W '${COMPREPLY[@]}' -- "$cur")) + _comp_compgen_uids + _comp_compgen -a -- -u return ;; -*U) - COMPREPLY=($(compgen -W 'clear random time' -- "$cur")) + _comp_compgen -- -W 'clear random time' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage return fi - cur=${cur:=/dev/} - _filedir + _comp_compgen -c "${cur:-/dev/}" filedir } && - complete -F _tune2fs tune2fs + complete -F _comp_cmd_tune2fs tune2fs # ex: filetype=sh diff --git a/completions/ulimit b/completions/ulimit index e596bf7..9f6f13b 100644 --- a/completions/ulimit +++ b/completions/ulimit @@ -1,16 +1,16 @@ # bash completion for ulimit -*- shell-script -*- -_ulimit() +_comp_cmd_ulimit() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return # TODO combined option support (-aH, -Sc etc) - local mode + local mode= case $prev in -a) - COMPREPLY=($(compgen -W "-S -H" -- "$cur")) + _comp_compgen -- -W "-S -H" return ;; -[SH]) ;; @@ -20,23 +20,20 @@ _ulimit() ;; esac - if [[ ! -v mode ]]; then + if [[ ! $mode ]]; then local word for word in "${words[@]}"; do [[ $word == -*a* ]] && return done if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage -c help -s "$1" return fi fi - local args - _count_args - ((args == 1)) && - COMPREPLY=($(compgen -W "soft hard unlimited" -- "$cur")) + [[ ${mode-} ]] && _comp_compgen -- -W "soft hard unlimited" } && - complete -F _ulimit ulimit + complete -F _comp_cmd_ulimit ulimit # ex: filetype=sh diff --git a/completions/unace b/completions/unace index 7d6bd42..da647b8 100644 --- a/completions/unace +++ b/completions/unace @@ -1,20 +1,20 @@ # unace(1) completion -*- shell-script -*- -_unace() +_comp_cmd_unace() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-c -c- -f -f- -o -o- -p -y -y-' -- "$cur")) + _comp_compgen -- -W '-c -c- -f -f- -o -o- -p -y -y-' else if ((cword == 1)); then - COMPREPLY=($(compgen -W 'e l t v x' -- "$cur")) + _comp_compgen -- -W 'e l t v x' else - _filedir ace + _comp_compgen_filedir '@(ace|cba)' fi fi } && - complete -F _unace unace + complete -F _comp_cmd_unace unace # ex: filetype=sh diff --git a/completions/unpack200 b/completions/unpack200 index 8814259..3724f37 100644 --- a/completions/unpack200 +++ b/completions/unpack200 @@ -1,48 +1,50 @@ # unpack200(1) completion -*- shell-script -*- -_unpack200() +_comp_cmd_unpack200() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[Hl]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | -!(-*)[?hVJ]) + --help | --version | -${noargopts}[?hVJ]) return ;; - --deflate-hint | -!(-*)H) - COMPREPLY=($(compgen -W 'true false keep' -- "$cur")) + --deflate-hint | -${noargopts}H) + _comp_compgen -- -W 'true false keep' return ;; - --log-file | -!(-*)l) - COMPREPLY=($(compgen -W '-' -- "$cur")) - _filedir log + --log-file | -${noargopts}l) + _comp_compgen -- -W '-' + _comp_compgen -a filedir log return ;; esac - $split && return + [[ $was_split ]] && return # Check if a pack or a jar was already given. - local word pack=false jar=false + local word pack="" jar="" for word in "${words[@]:1}"; do case $word in - *.pack | *.pack.gz) pack=true ;; - *.jar) jar=true ;; + *.pack | *.pack.gz) pack=set ;; + *.jar) jar=set ;; esac done - if ! $pack; then + if [[ ! $pack ]]; then if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--deflate-hint= --remove-pack-file - --verbose --quiet --log-file= --help --version' -- "$cur")) + _comp_compgen -- -W '--deflate-hint= --remove-pack-file --verbose + --quiet --log-file= --help --version' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else - _filedir 'pack?(.gz)' + _comp_compgen_filedir 'pack?(.gz)' fi - elif ! $jar; then - _filedir jar + elif [[ ! $jar ]]; then + _comp_compgen_filedir jar fi } && - complete -F _unpack200 unpack200 + complete -F _comp_cmd_unpack200 unpack200 # ex: filetype=sh diff --git a/completions/unrar b/completions/unrar index 4cbac8f..f3d4549 100644 --- a/completions/unrar +++ b/completions/unrar @@ -1,23 +1,23 @@ # unrar(1) completion -*- shell-script -*- -_unrar() +_comp_cmd_unrar() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-ad -ap -av- -c- -cfg- -cl -cu -dh -ep -f - -idp -ierr -inul -kb -o+ -o- -ow -p -p- -r -ta -tb -tn -to -u -v - -ver -vp -x -x@ -y' -- "$cur")) + _comp_compgen -- -W '-ad -ap -av- -c- -cfg- -cl -cu -dh -ep -f -idp + -ierr -inul -kb -o+ -o- -ow -p -p- -r -ta -tb -tn -to -u -v -ver + -vp -x -x@ -y' else if ((cword == 1)); then - COMPREPLY=($(compgen -W 'e l lb lt p t v vb vt x' -- "$cur")) + _comp_compgen -- -W 'e l lb lt p t v vb vt x' else - _filedir '@(rar|exe)' + _comp_compgen_filedir '@(rar|exe|cbr)' fi fi } && - complete -F _unrar unrar + complete -F _comp_cmd_unrar unrar # ex: filetype=sh diff --git a/completions/unshunt b/completions/unshunt index 95a1601..0486d1f 100644 --- a/completions/unshunt +++ b/completions/unshunt @@ -1,17 +1,17 @@ # mailman unshunt completion -*- shell-script -*- -_unshunt() +_comp_cmd_unshunt() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help else - _filedir -d + _comp_compgen_filedir -d fi } && - complete -F _unshunt unshunt + complete -F _comp_cmd_unshunt unshunt # ex: filetype=sh diff --git a/completions/update-alternatives b/completions/update-alternatives index 25d2ce6..0d678fc 100644 --- a/completions/update-alternatives +++ b/completions/update-alternatives @@ -1,8 +1,8 @@ # bash completion for update-alternatives -*- shell-script -*- -_installed_alternatives() +_comp_cmd_update_alternatives__installed() { - local admindir + local i admindir # find the admin dir for i in alternatives dpkg/alternatives rpm/alternatives; do [[ -d /var/lib/$i ]] && admindir=/var/lib/$i && break @@ -13,17 +13,17 @@ _installed_alternatives() break fi done - COMPREPLY=($(compgen -W '$(command ls $admindir)' -- "$cur")) + [[ -d $admindir ]] && _comp_compgen_split -- "$(command ls "$admindir")" } -_update_alternatives() +_comp_cmd_update_alternatives() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --altdir | --admindir) - _filedir -d + _comp_compgen_filedir -d return ;; --help | --usage | --version) @@ -31,7 +31,7 @@ _update_alternatives() ;; esac - local mode args i + local mode="" args i # find which mode to use and how many real args used so far for ((i = 1; i < cword; i++)); do @@ -46,10 +46,10 @@ _update_alternatives() --install) case $args in 1 | 3) - _filedir + _comp_compgen_filedir ;; 2) - _installed_alternatives + _comp_cmd_update_alternatives__installed ;; 4) # priority - no completions @@ -57,13 +57,13 @@ _update_alternatives() *) case $((args % 4)) in 0 | 2) - _filedir + _comp_compgen_filedir ;; 1) - COMPREPLY=($(compgen -W '--slave' -- "$cur")) + _comp_compgen -- -W '--slave' ;; 3) - _installed_alternatives + _comp_cmd_update_alternatives__installed ;; esac ;; @@ -72,21 +72,21 @@ _update_alternatives() --remove | --set) case $args in 1) - _installed_alternatives + _comp_cmd_update_alternatives__installed ;; 2) - _filedir + _comp_compgen_filedir ;; esac ;; --auto | --remove-all | --display | --config) - _installed_alternatives + _comp_cmd_update_alternatives__installed ;; *) - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help ;; esac } && - complete -F _update_alternatives update-alternatives alternatives + complete -F _comp_cmd_update_alternatives update-alternatives alternatives # ex: filetype=sh diff --git a/completions/update-rc.d b/completions/update-rc.d index 9b281d5..a5040d4 100644 --- a/completions/update-rc.d +++ b/completions/update-rc.d @@ -2,57 +2,57 @@ # # Copyright (C) 2004 Servilio Afre Puentes <servilio@gmail.com> -_update_rc_d() +_comp_cmd_update_rc_d() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local sysvdir services options [[ -d /etc/rc.d/init.d ]] && sysvdir=/etc/rc.d/init.d || sysvdir=/etc/init.d - services=($(printf '%s ' $sysvdir/!(README*|*.sh|$_backup_glob))) - services=(${services[@]#$sysvdir/}) + _comp_expand_glob services '"$sysvdir"/!(README*|*.sh|$_comp_backup_glob)' && + services=("${services[@]#$sysvdir/}") options=(-f -n) if [[ $cword -eq 1 || $prev == -* ]]; then - COMPREPLY=($(compgen -W '${options[@]} ${services[@]}' \ - -X '$(tr " " "|" <<<${words[@]})' -- "$cur")) - elif [[ $prev == ?($(tr " " "|" <<<"${services[*]}")) ]]; then - COMPREPLY=($(compgen -W 'remove defaults start stop' -- "$cur")) + _comp_compgen -- -W '"${options[@]}" ${services[@]+"${services[@]}"}' \ + -X '$(tr " " "|" <<<${words[@]})' + elif ((${#services[@]})) && [[ $prev == ?($(tr " " "|" <<<"${services[*]}")) ]]; then + _comp_compgen -- -W 'remove defaults start stop' elif [[ $prev == defaults && $cur == [0-9] ]]; then COMPREPLY=(0 1 2 3 4 5 6 7 8 9) elif [[ $prev == defaults && $cur == [sk]?([0-9]) ]]; then COMPREPLY=(0 1 2 3 4 5 6 7 8 9) - elif [[ $prev == defaults && -z $cur ]]; then + elif [[ $prev == defaults && ! $cur ]]; then COMPREPLY=(0 1 2 3 4 5 6 7 8 9 s k) elif [[ $prev == ?(start|stop) ]]; then - if [[ $cur == [0-9] || -z $cur ]]; then + if [[ $cur == [0-9] || ! $cur ]]; then COMPREPLY=(0 1 2 3 4 5 6 7 8 9) elif [[ $cur == [0-9][0-9] ]]; then - COMPREPLY=($cur) + COMPREPLY=("$cur") else COMPREPLY=() fi elif [[ $prev == ?([0-9][0-9]|[0-6S]) ]]; then - if [[ -z $cur ]]; then + if [[ ! $cur ]]; then if [[ $prev == [0-9][0-9] ]]; then COMPREPLY=(0 1 2 3 4 5 6 S) else COMPREPLY=(0 1 2 3 4 5 6 S .) fi elif [[ $cur == [0-6S.] ]]; then - COMPREPLY=($cur) + COMPREPLY=("$cur") else COMPREPLY=() fi elif [[ $prev == "." ]]; then - COMPREPLY=($(compgen -W "start stop" -- "$cur")) + _comp_compgen -- -W "start stop" else COMPREPLY=() fi } && - complete -F _update_rc_d update-rc.d + complete -F _comp_cmd_update_rc_d update-rc.d # ex: filetype=sh diff --git a/completions/upgradepkg b/completions/upgradepkg index d3ce608..f359e9a 100644 --- a/completions/upgradepkg +++ b/completions/upgradepkg @@ -1,30 +1,28 @@ # Slackware Linux upgradepkg completion -*- shell-script -*- -_upgradepkg() +_comp_cmd_upgradepkg() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--dry-run --install-new --reinstall - --verbose' -- "$cur")) + _comp_compgen -- -W '--dry-run --install-new --reinstall --verbose' return fi if [[ $cur == ?*%* ]]; then prev="${cur%%?(\\)%*}" cur="${cur#*%}" - local nofiles IFS=$'\n' + local nofiles="" compopt -o filenames - COMPREPLY=($(compgen -P "$prev%" -f -X "!*.@(t[bgxl]z)" -- "$cur")) - [[ ${COMPREPLY-} ]] || nofiles=1 - COMPREPLY+=($(compgen -P "$prev%" -S '/' -d -- "$cur")) - [[ -v nofiles ]] && compopt -o nospace + _comp_compgen -- -P "$prev%" -f -X "!*.@(t[bgxl]z)" || nofiles=set + _comp_compgen -a -- -P "$prev%" -S '/' -d + [[ $nofiles ]] && compopt -o nospace return fi - _filedir 't[bglx]z' + _comp_compgen_filedir 't[bglx]z' } && - complete -F _upgradepkg upgradepkg + complete -F _comp_cmd_upgradepkg upgradepkg # ex: filetype=sh diff --git a/completions/urlsnarf b/completions/urlsnarf index e327076..6ac58a4 100644 --- a/completions/urlsnarf +++ b/completions/urlsnarf @@ -1,26 +1,26 @@ # urlsnarf completion -*- shell-script -*- -_urlsnarf() +_comp_cmd_urlsnarf() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*i) - _available_interfaces -a + _comp_compgen_available_interfaces -a return ;; -*p) - _filedir pcap + _comp_compgen_filedir pcap return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage fi } && - complete -F _urlsnarf urlsnarf + complete -F _comp_cmd_urlsnarf urlsnarf # ex: filetype=sh diff --git a/completions/uscan b/completions/uscan index 441bae3..e82f625 100644 --- a/completions/uscan +++ b/completions/uscan @@ -1,33 +1,34 @@ -# uscan completion -*- shell-script -*- +# uscan completion -*- shell-script -*- -_uscan() +_comp_cmd_uscan() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in --package) - COMPREPLY=($(_xfunc apt-cache _apt_cache_src_packages)) + _comp_compgen -x apt-cache sources return ;; --watchfile) - _filedir + _comp_compgen_filedir return ;; --destdir) - _filedir -d + _comp_compgen_filedir -d return ;; - --timeout | --upstream-version | --download-version | --check-dirname-level | --check-dirname-regex) + --timeout | --upstream-version | --download-version | \ + --check-dirname-level | --check-dirname-regex) COMPREPLY=() return ;; esac - $split && return + [[ $was_split ]] && return - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help } && - complete -F _uscan uscan + complete -F _comp_cmd_uscan uscan # ex: filetype=sh diff --git a/completions/useradd b/completions/useradd index ceeca91..6c0bef1 100644 --- a/completions/useradd +++ b/completions/useradd @@ -1,46 +1,57 @@ # useradd(8) completion -*- shell-script -*- -_useradd() +_comp_cmd_useradd() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return # TODO: if -o/--non-unique is given, could complete on existing uids # with -u/--uid + local word chroot="" has_chroot="" + for word in "${words[@]}"; do + if [[ $has_chroot ]]; then + chroot=$word + break + fi + [[ $word != -@(R|-root) ]] || has_chroot=set + done + + local noargopts='!(-*|*[cefKpubdkRgGZs]*)' + # shellcheck disable=SC2254 case $prev in - --comment | --help | --expiredate | --inactive | --key | --password | --uid | \ - --selinux-user | -!(-*)[chefKpuZ]) + --comment | --help | --expiredate | --inactive | --key | --password | \ + --uid | -${noargopts}[chefKpu]) + return + ;; + --base-dir | --home-dir | --skel | --root | -${noargopts}[bdkR]) + _comp_compgen_filedir -d return ;; - --base-dir | --home-dir | --skel | --root | -!(-*)[bdkR]) - _filedir -d + --gid | -${noargopts}g) + _comp_compgen_gids + _comp_compgen -a -- -g return ;; - --gid | -!(-*)g) - _gids - COMPREPLY=($(compgen -W '${COMPREPLY[@]} $(compgen -g)' \ - -- "$cur")) + --groups | -${noargopts}G) + _comp_delimited , -g return ;; - --groups | -!(-*)G) - local prefix= - [[ $cur == *,* ]] && prefix="${cur%,*}," - COMPREPLY=($(compgen -g -- "${cur##*,}")) - ((${#COMPREPLY[@]} == 1)) && COMPREPLY=(${COMPREPLY/#/$prefix}) + --selinux-user | -${noargopts}Z) + _comp_compgen_selinux_users return ;; - --shell | -!(-*)s) - _shells + --shell | -${noargopts}s) + _comp_compgen_shells "${chroot-}" return ;; esac - $split && return + [[ $was_split ]] && return [[ $cur == -* ]] && - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help } && - complete -F _useradd useradd + complete -F _comp_cmd_useradd useradd # ex: filetype=sh diff --git a/completions/userdel b/completions/userdel index ed98447..e95da5c 100644 --- a/completions/userdel +++ b/completions/userdel @@ -1,27 +1,29 @@ # userdel(8) completion -*- shell-script -*- -_userdel() +_comp_cmd_userdel() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[R]*)' + # shellcheck disable=SC2254 case $prev in - --help | -!(-*)h) + --help | -${noargopts}h) return ;; - --root | -!(-*)R) - _filedir -d + --root | -${noargopts}R) + _comp_compgen_filedir -d return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen -- -u } && - complete -F _userdel userdel + complete -F _comp_cmd_userdel userdel # ex: filetype=sh diff --git a/completions/usermod b/completions/usermod index 77ab33c..797e536 100644 --- a/completions/usermod +++ b/completions/usermod @@ -1,51 +1,62 @@ # usermod(8) completion -*- shell-script -*- -_usermod() +_comp_cmd_usermod() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return # TODO: if -o/--non-unique is given, could complete on existing uids # with -u/--uid + local word chroot="" has_chroot="" + for word in "${words[@]}"; do + if [[ $has_chroot ]]; then + chroot=$word + break + fi + [[ $word != -@(R|-root) ]] || has_chroot=set + done + + local noargopts='!(-*|*[cdeflpugGRZs]*)' + # shellcheck disable=SC2254 case $prev in - --comment | --home | --expiredate | --inactive | --help | --login | --password | \ - --uid | --selinux-user | -!(-*)[cdefhlpuZ]) + --comment | --home | --expiredate | --inactive | --help | --login | \ + --password | --uid | -${noargopts}[cdefhlpu]) + return + ;; + --gid | -${noargopts}g) + _comp_compgen_gids + _comp_compgen -a -- -g return ;; - --gid | -!(-*)g) - _gids - COMPREPLY=($(compgen -W '${COMPREPLY[@]} $(compgen -g)' \ - -- "$cur")) + --groups | -${noargopts}G) + _comp_delimited , -g return ;; - --groups | -!(-*)G) - local prefix= - [[ $cur == *,* ]] && prefix="${cur%,*}," - COMPREPLY=($(compgen -g -- "${cur##*,}")) - ((${#COMPREPLY[@]} == 1)) && COMPREPLY=(${COMPREPLY/#/$prefix}) + --root | -${noargopts}R) + _comp_compgen_filedir -d return ;; - --root | -!(-*)R) - _filedir -d + --selinux-user | -${noargopts}Z) + _comp_compgen_selinux_users return ;; - --shell | -!(-*)s) - _shells + --shell | -${noargopts}s) + _comp_compgen_shells "${chroot-}" return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then # TODO: -U/--unlock, -p/--password, -L/--lock mutually exclusive - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - COMPREPLY=($(compgen -u -- "$cur")) + _comp_compgen -- -u } && - complete -F _usermod usermod + complete -F _comp_cmd_usermod usermod # ex: filetype=sh diff --git a/completions/valgrind b/completions/valgrind index f541161..7043aa3 100644 --- a/completions/valgrind +++ b/completions/valgrind @@ -1,22 +1,19 @@ # valgrind(1) completion -*- shell-script -*- -_valgrind() +_comp_cmd_valgrind() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return local i - # Note: intentionally using COMP_WORDS and COMP_CWORD instead of - # words and cword here due to splitting on = causing index differences - # (_command_offset assumes the former). - for ((i = 1; i <= COMP_CWORD; i++)); do - if [[ ${COMP_WORDS[i]} != @([-=])* && ${COMP_WORDS[i - 1]} != = ]]; then - _command_offset $i + for ((i = 1; i <= cword; i++)); do + if [[ ${words[i]} != @([-=])* ]]; then + _comp_command_offset $i return fi done - local word tool + local word tool="" for word in "${words[@]:1}"; do if [[ $word == --tool=?* ]]; then tool=$word @@ -31,81 +28,83 @@ _valgrind() --tool) # Tools seem to be named e.g. like memcheck-amd64-linux from which # we want to grab memcheck. - COMPREPLY=($(compgen -W '$( - for f in /usr{,/local}/lib{,64,exec}{/*-linux-gnu,}/valgrind/* - do - [[ $f != *.so && -x $f && $f =~ ^.*/(.*)-[^-]+-[^-]+ ]] && - printf "%s\n" "${BASH_REMATCH[1]}" - done)' -- "$cur")) + local -a files + if _comp_expand_glob files '/usr{,/local}/lib{,64,exec}{/*-linux-gnu,}/valgrind/*'; then + _comp_compgen_split -- "$( + for f in "${files[@]}"; do + [[ $f != *.so && -x $f && $f =~ ^.*/(.*)-[^-]+-[^-]+ ]] && + printf '%s\n' "${BASH_REMATCH[1]}" + done + )" + fi return ;; --sim-hints) - COMPREPLY=($(compgen -W 'lax-ioctls enable-outer' -- "$cur")) + _comp_compgen -- -W 'lax-ioctls enable-outer' return ;; --soname-synonyms) - COMPREPLY=($(compgen -W 'somalloc' -S = -- "$cur")) + _comp_compgen -- -W 'somalloc' -S = [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return ;; --kernel-variant) - COMPREPLY=($(compgen -W 'bproc' -- "$cur")) + _comp_compgen -- -W 'bproc' return ;; # callgrind: --callgrind-out-file) - _filedir + _comp_compgen_filedir return ;; # exp-dhat: --sort-by) - COMPREPLY=($(compgen -W 'max-bytes-live tot-bytes-allocd - max-blocks-live' -- "$cur")) + _comp_compgen -- -W 'max-bytes-live tot-bytes-allocd + max-blocks-live' return ;; # massif: --time-unit) - COMPREPLY=($(compgen -W 'i ms B' -- "$cur")) + _comp_compgen -- -W 'i ms B' return ;; # generic cases parsed from --help output --+([-A-Za-z0-9_])) - local value=$($1 --help-debug ${tool-} 2>/dev/null | - command sed -ne "s|^[[:blank:]]*$prev=\([^[:blank:]]\{1,\}\).*|\1|p") + # shellcheck disable=SC2086 + local value=$("$1" --help-debug $tool 2>/dev/null | + command sed \ + -ne "s|^[[:blank:]]*$prev=\([^[:blank:]]\{1,\}\).*|\1|p") case $value in \<file*\>) - _filedir + _comp_compgen_filedir return ;; \<command\>) - compopt -o filenames - COMPREPLY=($(compgen -c -- "$cur")) + _comp_compgen_commands return ;; \<+([0-9])..+([0-9])\>) - COMPREPLY=($(compgen -W "{${value:1:${#value}-2}}" \ - -- "$cur")) + _comp_compgen -- -W "{${value:1:${#value}-2}}" return ;; # "yes", "yes|no", etc (but not "string", "STR", # "hint1,hint2,...") yes | +([-a-z0-9])\|+([-a-z0-9\|])) - COMPREPLY=($(IFS='|' compgen -W '$value' -- "$cur")) + _comp_compgen -F '|' -- -W '$value' return ;; esac ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" "--help ${tool-}")' \ - -- "$cur")) + _comp_compgen_help -- --help ${tool:+"$tool"} [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi } && - complete -F _valgrind valgrind + complete -F _comp_cmd_valgrind valgrind # ex: filetype=sh diff --git a/completions/vipw b/completions/vipw index b3a7415..bfaa48a 100644 --- a/completions/vipw +++ b/completions/vipw @@ -1,22 +1,24 @@ # vipw(8) and vigr completion -*- shell-script -*- -_vipw() +_comp_cmd_vipw() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[R]*)' + # shellcheck disable=SC2254 case $prev in - --help | -!(-*)h) + --help | -${noargopts}h) return ;; - --root | -!(-*)R) - _filedir -d + --root | -${noargopts}R | -d) + _comp_compgen_filedir -d return ;; esac - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage } && - complete -F _vipw vipw vigr + complete -F _comp_cmd_vipw vipw vigr # ex: filetype=sh diff --git a/completions/vmstat b/completions/vmstat index e36934a..36f9bb8 100644 --- a/completions/vmstat +++ b/completions/vmstat @@ -1,27 +1,29 @@ # vmstat(8) completion -*- shell-script -*- -_vmstat() +_comp_cmd_vmstat() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local noargopts='!(-*|*[cMNnwpS]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | --partition | -!(-*)[hVcMNnwp]) + --help | --version | --partition | -${noargopts}[hVcMNnwp]) return ;; - --unit | -!(-*)S) + --unit | -${noargopts}S) [[ $OSTYPE == *linux* ]] && - COMPREPLY=($(compgen -W 'k K m M' -- "$cur")) + _comp_compgen -- -W 'k K m M' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} ]] || - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage fi } && - complete -F _vmstat vmstat + complete -F _comp_cmd_vmstat vmstat # ex: filetype=sh diff --git a/completions/vncviewer b/completions/vncviewer index ba55226..17dd7da 100644 --- a/completions/vncviewer +++ b/completions/vncviewer @@ -1,74 +1,74 @@ # bash completion for vncviewer -*- shell-script -*- -_vncviewer_bootstrap() +_comp_cmd_vncviewer__bootstrap() { - local fname - case $(_realcommand vncviewer) in - *xvnc4viewer) fname=_xvnc4viewer ;; - *tightvncviewer) fname=_tightvncviewer ;; - *) fname=_known_hosts ;; + local fname REPLY + _comp_realcommand vncviewer + case $REPLY in + *xvnc4viewer) fname=_comp_cmd_xvnc4viewer ;; + *tightvncviewer) fname=_comp_cmd_tightvncviewer ;; + *) fname=_comp_complete_known_hosts ;; esac # Install real completion for subsequent completions complete -F $fname vncviewer - $fname # Generate completions once for now - unset -f _vncviewer_bootstrap + $fname "$@" # Generate completions once for now + unset -f "$FUNCNAME" } && - complete -F _vncviewer_bootstrap vncviewer + complete -F _comp_cmd_vncviewer__bootstrap vncviewer -_tightvncviewer() +_comp_cmd_tightvncviewer() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -passwd) - _filedir + _comp_compgen_filedir return ;; -encodings) - COMPREPLY=($(compgen -W 'copyrect tight hextile zlib corre rre - raw' -- "$cur")) + _comp_compgen -- -W 'copyrect tight hextile zlib corre rre raw' return ;; -via) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-help -listen -via -shared -noshared - -viewonly -fullscreen -noraiseonbeep -passwd -encodings -bgr233 - -owncmap -truecolour -truecolor -depth -compresslevel -quality - -nojpeg -nocursorshape -x11cursor' -- "$cur")) + _comp_compgen -- -W '-help -listen -via -shared -noshared -viewonly + -fullscreen -noraiseonbeep -passwd -encodings -bgr233 -owncmap + -truecolour -truecolor -depth -compresslevel -quality -nojpeg + -nocursorshape -x11cursor' else - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" fi } && - complete -F _tightvncviewer tightvncviewer + complete -F _comp_cmd_tightvncviewer tightvncviewer # NOTE: - VNC Viewer options are case insensitive. # Preferred case is taken from -help. -_xvnc4viewer() +_comp_cmd_xvnc4viewer() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return # Both single dash (-) and double dash (--) are allowed as option prefix local opt=${prev/#--/-} case ${opt,,} in # -passwd, -PasswordFile -passwd | -passwordfile) - _filedir + _comp_compgen_filedir return ;; -preferredencoding) - COMPREPLY=($(compgen -W 'zrle hextile raw' -- "$cur")) + _comp_compgen -- -W 'zrle hextile raw' return ;; -via) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; esac @@ -83,17 +83,17 @@ _xvnc4viewer() WMDecorationWidth ZlibLevel) [[ $cur == --* ]] && dash=-- || dash=- - local IFS=$' \t\n' reset=$(shopt -p nocasematch) - shopt -s nocasematch - local option - COMPREPLY=($(for option in "${options[@]}"; do - [[ $dash$option == "$cur"* ]] && printf '%s\n' $dash$option - done)) - $reset + _comp_split COMPREPLY "$( + shopt -s nocasematch + local option + for option in "${options[@]}"; do + [[ $dash$option == "$cur"* ]] && printf '%s\n' "$dash$option" + done + )" else - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" fi } && - complete -F _xvnc4viewer xvnc4viewer + complete -F _comp_cmd_xvnc4viewer xvnc4viewer # ex: filetype=sh diff --git a/completions/vpnc b/completions/vpnc index bbdb8ee..79ffff3 100644 --- a/completions/vpnc +++ b/completions/vpnc @@ -1,82 +1,78 @@ # bash completion for vpnc -*- shell-script -*- -_vpnc() +_comp_cmd_vpnc() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in - --help | --long-help | --version | --id | --username | --domain | --ifname | \ - --application-version | --local-addr | --local-port | --udp-port | --dpd-idle | \ - --target-network | --ifmtu) + --help | --long-help | --version | --id | --username | --domain | \ + --ifname | --application-version | --local-addr | --local-port | \ + --udp-port | --dpd-idle | --target-network | --ifmtu) return ;; --gateway) - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" return ;; --vendor) - COMPREPLY=($(compgen -W 'cisco netscreen' -- "$cur")) + _comp_compgen -- -W 'cisco netscreen' return ;; --natt-mode) - COMPREPLY=($(compgen -W 'natt none force-natt cisco-udp' \ - -- "$cur")) + _comp_compgen -- -W 'natt none force-natt cisco-udp' return ;; --script | --pid-file | --ca-file) - _filedir + _comp_compgen_filedir return ;; --dh) - COMPREPLY=($(compgen -W 'dh1 dh2 dh5' -- "$cur")) + _comp_compgen -- -W 'dh1 dh2 dh5' return ;; --pfs) - COMPREPLY=($(compgen -W 'nopfs dh1 dh2 dh5 server' -- "$cur")) + _comp_compgen -- -W 'nopfs dh1 dh2 dh5 server' return ;; --ifmode) - COMPREPLY=($(compgen -W 'tun tap' -- "$cur")) + _comp_compgen -- -W 'tun tap' return ;; --debug) - COMPREPLY=($(compgen -W '0 1 2 3 99' -- "$cur")) + _comp_compgen -- -W '0 1 2 3 99' return ;; --auth-mode) - COMPREPLY=($(compgen -W 'psk cert hybrid' -- "$cur")) + _comp_compgen -- -W 'psk cert hybrid' return ;; --ca-dir) - _filedir -d + _comp_compgen_filedir -d return ;; --password-helper) - compopt -o filenames - COMPREPLY=($(compgen -c -- "$cur")) + _comp_compgen_commands return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" --long-help)' -- "$cur")) - elif [[ $cur == */* ]]; then + _comp_compgen_help -- --long-help + elif _comp_looks_like_path "$cur"; then # explicit filename - _filedir conf + _comp_compgen_filedir conf else # config name, /etc/vpnc/<name>.conf - local IFS=$' \t\n' reset=$(shopt -p nullglob) - shopt -s nullglob - local -a configs=(/etc/vpnc/*.conf) - configs=("${configs[@]##*/}") - configs=("${configs[@]%.conf}") - $reset - IFS=$'\n' - compopt -o filenames - COMPREPLY=($(compgen -W '${configs[@]}' -- "$cur")) + local -a configs + if _comp_expand_glob configs '/etc/vpnc/*.conf'; then + configs=("${configs[@]##*/}") + configs=("${configs[@]%.conf}") + compopt -o filenames + _comp_compgen -- -W '"${configs[@]}"' + fi fi } && - complete -F _vpnc vpnc + complete -F _comp_cmd_vpnc vpnc # ex: filetype=sh diff --git a/completions/watch b/completions/watch index efc0a98..443bed3 100644 --- a/completions/watch +++ b/completions/watch @@ -1,19 +1,21 @@ # watch(1) completion -*- shell-script -*- -[[ $OSTYPE == *linux* ]] || return 1 +[[ $OSTYPE == *@(linux|darwin)* ]] || return 1 -_watch() +_comp_cmd_watch() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return local offset=0 i + local noargopts='!(-*|*[dn]*)' + # shellcheck disable=SC2254 for ((i = 1; i <= cword; i++)); do case ${words[i]} in - --help | --version | -!(-*)h) + --help | --version | -${noargopts}h) return ;; - --interval | -!(-*)n) + --interval | -${noargopts}n) ((i++)) continue ;; @@ -26,29 +28,30 @@ _watch() done if ((offset > 0)); then - _command_offset $offset + _comp_command_offset $offset return fi + # shellcheck disable=SC2254 case $prev in - --differences | -!(-*)d) + --differences | -${noargopts}d) [[ $cur != -* ]] && - COMPREPLY=($(compgen -W 'cumulative' -- "$cur")) + _comp_compgen -- -W 'cumulative' return ;; - --interval | -!(-*)n) + --interval | -${noargopts}n) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi } && - complete -F _watch watch + complete -F _comp_cmd_watch watch # ex: filetype=sh diff --git a/completions/webmitm b/completions/webmitm index 549c5ef..df6faa2 100644 --- a/completions/webmitm +++ b/completions/webmitm @@ -1,17 +1,17 @@ # webmitm completion -*- shell-script -*- -_webmitm() +_comp_cmd_webmitm() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_usage else - _known_hosts_real -- "$cur" + _comp_compgen_known_hosts -- "$cur" fi } && - complete -F _webmitm webmitm + complete -F _comp_cmd_webmitm webmitm # ex: filetype=sh diff --git a/completions/wget b/completions/wget index d6a2fe9..fcc59aa 100644 --- a/completions/wget +++ b/completions/wget @@ -1,24 +1,26 @@ # wget(1) completion -*- shell-script -*- -_wget() +_comp_cmd_wget() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[DPoaOitTwlQeBUARIX]*)' + # shellcheck disable=SC2254 case $prev in - --version | --help | -!(-*)[hV]) + --version | --help | -${noargopts}[hV]) return ;; --progress) - COMPREPLY=($(compgen -W 'bar dot' -- "$cur")) + _comp_compgen -- -W 'bar dot' return ;; --bind-address) - _ip_addresses + _comp_compgen_ip_addresses return ;; - --domains | --exclude-domains | -!(-*)D) - _known_hosts_real -- "$cur" + --domains | --exclude-domains | -${noargopts}D) + _comp_compgen_known_hosts -- "$cur" return ;; --restrict-file-names) @@ -47,84 +49,87 @@ _wget() local lastopt=${cur/*,/} prevopt= [[ $cur == *,* ]] && prevopt=${cur%,*}, - COMPREPLY=($(compgen -P "$prevopt" -X "@($excludes_str)" \ - -W 'unix windows nocontrol ascii lowercase uppercase' \ - -- "$lastopt")) + _comp_compgen -c "$lastopt" -- -P "$prevopt" \ + -X "@($excludes_str)" \ + -W 'unix windows nocontrol ascii lowercase uppercase' # +o nospace when no more valid option is possible (= append a space) - local opt_as_arr=(${COMPREPLY[0]//,/ }) + local -a opt_as_arr + _comp_split -F $', \t\n' opt_as_arr "${COMPREPLY[0]}" ((${#opt_as_arr[@]} < 4)) && compopt -o nospace return ;; --prefer-family) - COMPREPLY=($(compgen -W 'IPv4 IPv6 none' -- "$cur")) + _comp_compgen -- -W 'IPv4 IPv6 none' return ;; - --directory-prefix | --ca-directory | --warc-tempdir | -!(-*)P) - _filedir -d + --directory-prefix | --ca-directory | --warc-tempdir | -${noargopts}P) + _comp_compgen_filedir -d return ;; - --output-file | --append-output | --config | --load-cookies | --save-cookies | \ - --post-file | --certificate | --ca-certificate | --private-key | \ - --random-file | --egd-file | --warc-file | --warc-dedup | -!(-*)[oa]) - _filedir + --output-file | --append-output | --config | --load-cookies | \ + --save-cookies | --post-file | --certificate | --ca-certificate | \ + --private-key | --random-file | --egd-file | --warc-file | \ + --warc-dedup | -${noargopts}[oa]) + _comp_compgen_filedir return ;; - --output-document | --input-file | -!(-*)[Oi]) - _filedir && [[ $cur == - || -z $cur ]] && COMPREPLY+=(-) + --output-document | --input-file | -${noargopts}[Oi]) + _comp_compgen_filedir && [[ $cur == - || ! $cur ]] && COMPREPLY+=(-) return ;; --secure-protocol) - COMPREPLY=($(compgen -W 'auto SSLv2 SSLv3 TLSv1' -- "$cur")) + _comp_compgen -- -W 'auto SSLv2 SSLv3 TLSv1' return ;; --certificate-type | --private-key-type) - COMPREPLY=($(compgen -W 'PEM DER' -- "$cur")) + _comp_compgen -- -W 'PEM DER' return ;; --follow-tags | --ignore-tags) local lastopt=${cur/*,/} prevopt= [[ $cur == *,* ]] && prevopt=${cur%,*}, - COMPREPLY=($(compgen -P "$prevopt" -W 'a abbr acronym address - applet area b base basefont bdo big blockquote body br button - caption center cite code col colgroup dd del dir div dfn dl dt - em fieldset font form frame frameset h6 head hr html i iframe - img input ins isindex kbd label legend li link map menu meta - noframes noscript object ol optgroup option p param pre q s - samp script select small span strike strong style sub sup table - tbody td textarea tfoot th thead title tr tt u ul var xmp' \ - -- "$lastopt")) - return - ;; - --tries | --timeout | --dns-timeout | --connect-timeout | --read-timeout | \ - --wait | --waitretry | --cut-dirs | --max-redirect | --level | -!(-*)[tTwl]) + _comp_compgen -c "$lastopt" -- -P "$prevopt" -W 'a abbr acronym + address applet area b base basefont bdo big blockquote body br + button caption center cite code col colgroup dd del dir div dfn + dl dt em fieldset font form frame frameset h6 head hr html i + iframe img input ins isindex kbd label legend li link map menu + meta noframes noscript object ol optgroup option p param pre q + s samp script select small span strike strong style sub sup + table tbody td textarea tfoot th thead title tr tt u ul var + xmp' + return + ;; + --tries | --timeout | --dns-timeout | --connect-timeout | \ + --read-timeout | --wait | --waitretry | --cut-dirs | \ + --max-redirect | --level | -${noargopts}[tTwl]) # expect integer number - COMPREPLY+=($(compgen -P "$cur" -W "{0..9}")) + _comp_compgen -aR -- -P "$cur" -W "{0..9}" compopt -o nospace return ;; - --quota | --limit-rate | --warc-max-size | -!(-*)Q) + --quota | --limit-rate | --warc-max-size | -${noargopts}Q) # expect size if [[ $cur == *[km] ]]; then - COMPREPLY=($(compgen -W "$cur")) + _comp_compgen -R -- -W "$cur" elif [[ $cur ]]; then - COMPREPLY=($(compgen -P "$cur" -W "{0..9} k m")) + _comp_compgen -R -- -P "$cur" -W "{0..9} k m" compopt -o nospace else - COMPREPLY=($(compgen -W "{0..9}")) + _comp_compgen -R -- -W "{0..9}" compopt -o nospace fi return ;; --user | --http-user | --proxy-user | --ftp-user) - COMPREPLY=($(compgen -W "$(command sed -n \ + _comp_compgen_split -- "$(command sed -n \ '/^login/s/^[[:blank:]]*login[[:blank:]]//p' ~/.netrc \ - 2>/dev/null)" -- "$cur")) + 2>/dev/null)" return ;; --header) - COMPREPLY=($(compgen -W 'Accept Accept-Charset Accept-Encoding + _comp_compgen -- -W 'Accept Accept-Charset Accept-Encoding Accept-Language Accept-Ranges Age Allow Authorization Cache-Control Connection Content-Encoding Content-Language Content-Length Content-Location Content-MD5 Content-Range @@ -133,42 +138,43 @@ _wget() Last-Modified Location Max-Forwards Pragma Proxy-Authenticate Proxy-Authorization Range Referer Retry-After Server TE Trailer Transfer-Encoding Upgrade User-Agent Vary Via Warning - WWW-Authenticate' -- "$cur")) + WWW-Authenticate' compopt -o nospace return ;; --local-encoding | --remote-encoding) - type -P xauth &>/dev/null && _xfunc iconv _iconv_charsets + type -P xauth &>/dev/null && _comp_compgen -x iconv charsets return ;; - --execute | -!(-*)e) + --execute | -${noargopts}e) return # TODO base=STR ;; --report-speed) - COMPREPLY=($(compgen -W 'bits' -- "$cur")) + _comp_compgen -- -W 'bits' return ;; --regex-type) - COMPREPLY=($(compgen -W 'posix' -- "$cur")) + _comp_compgen -- -W 'posix' return ;; - --base | --password | --ftp-password | --http-password | --proxy-password | \ - --default-page | --referer | --user-agent | --post-data | --warc-header | \ - --accept | --reject | --accept-regex | --reject-regex | --include-directories | \ - --exclude-directories | -!(-*)[BUARIX]) + --base | --password | --ftp-password | --http-password | \ + --proxy-password | --default-page | --referer | --user-agent | \ + --post-data | --warc-header | --accept | --reject | \ + --accept-regex | --reject-regex | --include-directories | \ + --exclude-directories | -${noargopts}[BUARIX]) # argument required but no completions available return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _wget wget + complete -F _comp_cmd_wget wget # ex: filetype=sh diff --git a/completions/wine b/completions/wine index 429fede..239f44b 100644 --- a/completions/wine +++ b/completions/wine @@ -1,20 +1,26 @@ # bash completion for wine(1) -*- shell-script -*- -_wine() +_comp_cmd_wine() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + + case $prev in + --help | --version) + return + ;; + esac if ((cword == 1)); then if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--help --version' -- "$cur")) + _comp_compgen -- -W '--help --version' [[ ${COMPREPLY-} ]] && return fi - _filedir '@([eE][xX][eE]?(.[sS][oO])|[cC][oO][mM]|[sS][cC][rR]|[mM][sS][iI])' + _comp_compgen_filedir '@([eE][xX][eE]?(.[sS][oO])|[cC][oO][mM]|[sS][cC][rR]|[mM][sS][iI])' else - _filedir + _comp_compgen_filedir fi } && - complete -F _wine wine wine-development wine-stable + complete -F _comp_cmd_wine wine{,64}{,-development,-stable} # ex: filetype=sh diff --git a/completions/withlist b/completions/withlist index 4142471..f687511 100644 --- a/completions/withlist +++ b/completions/withlist @@ -1,18 +1,20 @@ # mailman withlist completion -*- shell-script -*- -_withlist() +_comp_cmd_withlist() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--lock --interactive --run --all --quiet - --help' -- "$cur")) + _comp_compgen -- -W '--lock --interactive --run --all --quiet --help' else - _xfunc list_lists _mailman_lists + # Prefer `list_lists` in the same dir as command + local pathcmd + pathcmd=$(type -P "$1") && local PATH=${pathcmd%/*}:$PATH + _comp_compgen -x list_lists mailman_lists fi } && - complete -F _withlist withlist + complete -F _comp_cmd_withlist withlist # ex: filetype=sh diff --git a/completions/wodim b/completions/wodim index b308291..095fa0d 100644 --- a/completions/wodim +++ b/completions/wodim @@ -1,9 +1,9 @@ # bash completion for cdrecord/wodim -*- shell-script -*- -_cdrecord() +_comp_cmd_wodim() { - local cur prev words cword - _init_completion -n = || return + local cur prev words cword comp_args + _comp_initialize -n = -- "$@" || return local generic_options track_options track_mode @@ -13,11 +13,11 @@ _cdrecord() cur=${cur#*=} case $prev in textfile | cuefile | msifile) - _filedir + _comp_compgen_filedir ;; blank) - COMPREPLY=($(compgen -W 'help all fast track unreserve trtail - unclose session' -- "$cur")) + _comp_compgen -- -W 'help all fast track unreserve trtail + unclose session' ;; driveropts) if [[ $cur == *=* ]]; then @@ -25,30 +25,29 @@ _cdrecord() cur=${cur#*=} case $prev in varirec) - COMPREPLY=($(compgen -W "-2 -1 0 1 2" -- "$cur")) + _comp_compgen -- -W "-2 -1 0 1 2" ;; gigarec) - COMPREPLY=($(compgen -W "0.6 0.7 0.8 1.0 1.2 1.3 - 1.4" -- "$cur")) + _comp_compgen -- -W "0.6 0.7 0.8 1.0 1.2 1.3 1.4" ;; tattoofile) - _filedir + _comp_compgen_filedir ;; esac else - COMPREPLY=($(compgen -W 'burnfree noburnfree varirec= - gigarec= audiomaster forcespeed noforcespeed speedread + _comp_compgen -- -W 'burnfree noburnfree varirec= gigarec= + audiomaster forcespeed noforcespeed speedread nospeedread singlesession nosinglesession hidecdr - nohidecdr tattooinfo tattoofile=' -- "$cur")) + nohidecdr tattooinfo tattoofile=' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi ;; driver) - COMPREPLY=($(compgen -W "$($1 driver=help 2>&1 | - awk 'NR > 1 { print $1 }') help" -- "$cur")) + _comp_compgen_split -- "$("$1" driver=help 2>&1 | + _comp_awk 'NR > 1 { print $1 }') help" ;; minbuf) - COMPREPLY=($(compgen -W '{25..95}' -- "$cur")) + _comp_compgen -- -W '{25..95}' ;; esac return @@ -66,15 +65,15 @@ _cdrecord() -isosize -pad -nopad -shorttrack -noshorttrack -preemp -nopreemp -copy -nocopy -scms "isrc=" "index=" "padsize=" "pregap=" "tsize=") # look if previous was either a file or a track option - track_mode=0 + track_mode="" if ((cword > 1)); then if [[ -f $prev ]]; then - track_mode=1 + track_mode=set else local opt for opt in "${track_options[@]}"; do if [[ $opt == "$prev" ]]; then - track_mode=1 + track_mode=set break fi done @@ -82,15 +81,15 @@ _cdrecord() fi # files are always eligible completion - _filedir + _comp_compgen_filedir # track options are always available - COMPREPLY+=($(compgen -W '${track_options[@]}' -- "$cur")) + _comp_compgen -a -- -W '"${track_options[@]}"' # general options are no more available after file or track option - if ((track_mode == 0)); then - COMPREPLY+=($(compgen -W '${generic_options[@]}' -- "$cur")) + if [[ ! $track_mode ]]; then + _comp_compgen -a -- -W '"${generic_options[@]}"' fi [[ ${COMPREPLY-} == *= ]] && compopt -o nospace } && - complete -F _cdrecord cdrecord wodim + complete -F _comp_cmd_wodim wodim cdrecord # ex: filetype=sh diff --git a/completions/wol b/completions/wol index eada070..7e409a1 100644 --- a/completions/wol +++ b/completions/wol @@ -1,42 +1,45 @@ # wol(1) completion -*- shell-script -*- -_wol() +_comp_cmd_wol() { - 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 noargopts='!(-*|*[pwhif]*)' + # shellcheck disable=SC2254 case $prev in - --version | --help | --port | --passwd | --wait | -!(-*)[Vpw]) + --version | --help | --port | --passwd | --wait | -${noargopts}[Vpw]) return ;; - --host | --ipaddr | -!(-*)[hi]) + --host | --ipaddr | -${noargopts}[hi]) # Broadcast addresses local PATH=$PATH:/sbin - COMPREPLY=($({ - ip addr show || ifconfig -a + _comp_compgen_split -- "$({ + ip -c=never addr show || ip addr show || ifconfig -a } 2>/dev/null | - command sed -ne 's/.*[[:space:]]Bcast:\([^[:space:]]*\).*/\1/p' -ne \ - 's/.*inet.*[[:space:]]brd[[:space:]]\([^[:space:]]*\).*/\1/p' -ne \ - 's/.*[[:space:]]broadcast[[:space:]]\{1,\}\([^[:space:]]*\).*/\1/p')) - _known_hosts_real -- "$cur" + command sed \ + -ne 's/.*[[:space:]]Bcast:\([^[:space:]]*\).*/\1/p' \ + -ne 's/.*inet.*[[:space:]]brd[[:space:]]\([^[:space:]]*\).*/\1/p' \ + -ne 's/.*[[:space:]]broadcast[[:space:]]\{1,\}\([^[:space:]]*\).*/\1/p')" + _comp_compgen -a known_hosts -- "$cur" return ;; - --file | -!(-*)f) - _filedir + --file | -${noargopts}f) + _comp_compgen_filedir return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _mac_addresses + _comp_compgen_mac_addresses } && - complete -F _wol wol + complete -F _comp_cmd_wol wol # ex: filetype=sh diff --git a/completions/wsimport b/completions/wsimport index d5bec9f..cee8c09 100644 --- a/completions/wsimport +++ b/completions/wsimport @@ -1,48 +1,48 @@ # wsimport(1) completion -*- shell-script -*- -_wsimport() +_comp_cmd_wsimport() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return case $prev in -help | -version | -B | -p | -wsdllocation) return ;; -b) - _filedir '@(xml|xjb)' + _comp_compgen_filedir '@(xml|xjb)' return ;; -catalog) - _filedir '@(xml|soc|catalog)' + _comp_compgen_filedir '@(xml|soc|catalog)' return ;; -d | –s) - _filedir -d + _comp_compgen_filedir -d return ;; -target) - COMPREPLY=($(compgen -W '2.0 2.1 2.2' -- "$cur")) + _comp_compgen -- -W '2.0 2.1 2.2' return ;; -clientjar) - _filedir jar + _comp_compgen_filedir jar return ;; esac if [[ $cur == -httpproxy:* ]]; then - _known_hosts_real -- "${cur#-httpproxy:}" + _comp_compgen_known_hosts -- "${cur#-httpproxy:}" return elif [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help [[ ${COMPREPLY-} == *: ]] && compopt -o nospace - __ltrim_colon_completions "$cur" + _comp_ltrim_colon_completions "$cur" return fi - _filedir wsdl + _comp_compgen_filedir wsdl } && - complete -F _wsimport wsimport + complete -F _comp_cmd_wsimport wsimport # ex: filetype=sh diff --git a/completions/wtf b/completions/wtf index 27fc10a..c565c56 100644 --- a/completions/wtf +++ b/completions/wtf @@ -1,42 +1,45 @@ # wtf completion -*- shell-script -*- # Raphael Droz, 25/09/2009 -_wtf() +_comp_cmd_wtf() { - local cur prev words cword addf - _init_completion || return + local cur prev words cword comp_args addf + _comp_initialize -- "$@" || return - [[ $prev == -f ]] && _filedir && return + [[ $prev == -f ]] && _comp_compgen_filedir && return [[ ${words[*]} == *\ -f* ]] && addf= || addf=-f if [[ $cur == -* ]]; then - COMPREPLY=($addf) + COMPREPLY=(${addf:+"$addf"}) return fi - local db + local db="" has_db="" set -- "${words[@]}" while (($# > 0)); do if [[ $1 == -f ]]; then shift - db=$1 + if (($# > 0)); then + db=$1 + has_db=set + fi break fi shift done - if [[ ! -v db ]]; then + if [[ ! $has_db ]]; then local f for f in "${ACRONYMDB-}" /usr/share/misc/acronyms \ /usr/share/games/bsdgames/acronyms; do - [[ -f $f ]] && db="$f" && break + [[ -f $f ]] && db="$f" has_db=set && break done - [[ -v db ]] || return + [[ $has_db ]] || return fi - COMPREPLY=($(compgen -W "$(cut -f 1 -s $db* 2>/dev/null) $addf" \ - -- "${cur^^}")) + _comp_compgen -c "${cur^^}" split \ + -- "$(cut -f 1 -s "$db"* 2>/dev/null) $addf" } && - complete -F _wtf wtf + complete -F _comp_cmd_wtf wtf # ex: filetype=sh diff --git a/completions/wvdial b/completions/wvdial index 8667400..bdadeac 100644 --- a/completions/wvdial +++ b/completions/wvdial @@ -1,24 +1,24 @@ # bash completion for wvdial -*- shell-script -*- -_wvdial() +_comp_cmd_wvdial() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in --config) - _filedir + _comp_compgen_filedir return ;; esac - $split && return + [[ $was_split ]] && return local config i IFS=$'\n' case $cur in -*) - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace ;; *) @@ -33,14 +33,14 @@ _wvdial() done # parse config files for sections and # remove default section - COMPREPLY=($(command sed -ne "s|^\[Dialer \($cur.*\)\]$|\1|p" $config \ - 2>/dev/null | command grep -v '^Defaults$')) + _comp_compgen_split -l -X 'Defaults' -- "$(command sed -ne \ + 's/^\[Dialer \(.*\)\]$/\1/p' "$config" 2>/dev/null)" # escape spaces - COMPREPLY=(${COMPREPLY[@]// /\\ }) + COMPREPLY=("${COMPREPLY[@]// /\\ }") ;; esac } && - complete -F _wvdial wvdial + complete -F _comp_cmd_wvdial wvdial # ex: filetype=sh diff --git a/completions/xdg-mime b/completions/xdg-mime index 74c26c4..db97034 100644 --- a/completions/xdg-mime +++ b/completions/xdg-mime @@ -1,74 +1,85 @@ # xdg-mime(1) completion -*- shell-script -*- -_xdg_mime_mimetype() +_comp_cmd_xdg_mime__mimetype() { - COMPREPLY+=($(compgen -S / -W 'application audio font image message model - multipart text video' -- "$cur")) - [[ ${COMPREPLY-} == */ ]] && compopt -o nospace + local d i + local -a arr + for d in /usr/share/mime /usr/local/share/mime; do + _comp_compgen -v arr -C "$d" -- -f -o plusdirs -X "!*.xml" || continue + for i in "${!arr[@]}"; do + case ${arr[i]} in + packages*) unset -v "arr[i]" ;; # not a MIME type dir + *.xml) arr[i]=${arr[i]%.xml} ;; + */*) ;; + *) arr[i]+=/ ;; + esac + done + ((${#arr[@]})) && + COMPREPLY+=("${arr[@]}") + done + [[ ${COMPREPLY-} != */ ]] || compopt -o nospace } -_xdg_mime() +_comp_cmd_xdg_mime() { - local cur prev words cword - _init_completion || return - - local args - _count_args + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + local REPLY + _comp_count_args + local args=$REPLY if ((args == 1)); then if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--help --manual --version' -- "$cur")) + _comp_compgen -- -W '--help --manual --version' return fi - COMPREPLY=($(compgen -W \ - 'query default install uninstall' -- "$cur")) + _comp_compgen -- -W 'query default install uninstall' return fi case ${words[1]} in query) if ((args == 2)); then - COMPREPLY=($(compgen -W 'filetype default' -- "$cur")) + _comp_compgen -- -W 'filetype default' return fi - case ${words[2]} in # TODO and args == 3 (takes only one arg!) - filetype) _filedir ;; - default) _xdg_mime_mimetype ;; + ((args == 3)) || return + case ${words[2]} in + filetype) _comp_compgen_filedir ;; + default) _comp_cmd_xdg_mime__mimetype ;; esac ;; default) if ((args == 2)); then - local IFS=$' \t\n' reset=$(shopt -p nullglob) - shopt -s nullglob - local -a desktops=(/usr/share/applications/*.desktop) - desktops=("${desktops[@]##*/}") - $reset - IFS=$'\n' - COMPREPLY=($(compgen -W '${desktops[@]}' -- "$cur")) + local -a desktops + if _comp_expand_glob desktops '/usr/share/applications/*.desktop'; then + desktops=("${desktops[@]##*/}") + _comp_compgen -- -W '"${desktops[@]}"' + fi else - _xdg_mime_mimetype + _comp_cmd_xdg_mime__mimetype fi ;; install) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--mode --novendor' -- "$cur")) + _comp_compgen -- -W '--mode --novendor' elif [[ $prev == --mode ]]; then - COMPREPLY=($(compgen -W 'user system' -- "$cur")) + _comp_compgen -- -W 'user system' else - _filedir xml + _comp_compgen_filedir xml fi ;; uninstall) if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '--mode' -- "$cur")) + _comp_compgen -- -W '--mode' elif [[ $prev == --mode ]]; then - COMPREPLY=($(compgen -W 'user system' -- "$cur")) + _comp_compgen -- -W 'user system' else - _filedir xml + _comp_compgen_filedir xml fi ;; esac } && - complete -F _xdg_mime xdg-mime + complete -F _comp_cmd_xdg_mime xdg-mime # ex: filetype=sh diff --git a/completions/xdg-settings b/completions/xdg-settings index abd9246..df03222 100644 --- a/completions/xdg-settings +++ b/completions/xdg-settings @@ -1,9 +1,9 @@ # xdg-settings completion -*- shell-script -*- -_xdg_settings() +_comp_cmd_xdg_settings() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --help | --list | --manual | --version) @@ -12,20 +12,18 @@ _xdg_settings() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$("$1" --help | - tr "{|" "\n" | _parse_help -)' -- "$cur")) + _comp_compgen_help - <<<"$("$1" --help | tr '{|' '\n')" return fi - local args - _count_args - if ((args == 1)); then - COMPREPLY=($(compgen -W "get check set" -- "$cur")) - elif ((args == 2)); then - COMPREPLY=($(compgen -W \ - '$("$1" --list | awk "!/^Known/ { print \$1 }")' -- "$cur")) + local REPLY + _comp_count_args + if ((REPLY == 1)); then + _comp_compgen -- -W "get check set" + elif ((REPLY == 2)); then + _comp_compgen_split -- "$("$1" --list | _comp_awk '!/^Known/ { print $1 }')" fi } && - complete -F _xdg_settings xdg-settings + complete -F _comp_cmd_xdg_settings xdg-settings # ex: filetype=sh diff --git a/completions/xev b/completions/xev new file mode 100644 index 0000000..78df177 --- /dev/null +++ b/completions/xev @@ -0,0 +1,31 @@ +# xev(1) completion -*- shell-script -*- + +_comp_cmd_xev() +{ + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + + case $prev in + -display | -geometry | -bw | -id | -name) + return + ;; + -bs) + _comp_compgen -- -W 'NotUseful WhenMapped Always' + return + ;; + -event) + _comp_compgen -- -W 'keyboard mouse expose visibility structure + substructure focus property colormap owner_grab_button randr + button' + return + ;; + esac + + if [[ $cur == -* ]]; then + _comp_compgen_help + return + fi +} && + complete -F _comp_cmd_xev xev + +# ex: filetype=sh diff --git a/completions/xfreerdp b/completions/xfreerdp index f17414f..66b42ad 100644 --- a/completions/xfreerdp +++ b/completions/xfreerdp @@ -1,67 +1,78 @@ # xfreerdp completion -*- shell-script -*- -_xfreerdp() +_comp_cmd_xfreerdp() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return - case $prev in # old/dash syntax + case $prev in -k) - COMPREPLY=($(compgen -W '$("$1" --kbd-list | - awk "/^0x/ { print \$1 }")' -- "$cur")) + _comp_compgen_split -- "$("$1" --kbd-list | + _comp_awk '/^0x/ { print $1 }')" return ;; -a) - COMPREPLY=($(compgen -W '8 15 16 24 32' -- "$cur")) + _comp_compgen -- -W '8 15 16 24 32' return ;; -x) - COMPREPLY=($(compgen -W 'broadband modem lan' -- "$cur")) + _comp_compgen -- -W 'broadband modem lan' return ;; --plugin) - COMPREPLY=($(compgen -W 'cliprdr rdpsnd rdpdr' -- "$cur")) + _comp_compgen -- -W 'cliprdr rdpsnd rdpdr' + return + ;; + /help | /version | -h | --help | --version) return ;; esac - case $cur in # new/slash syntax + case $cur in /kbd:*) - COMPREPLY=($(compgen -W '$("$1" /kbd-list | - awk "/^0x/ { print \$1 }")' -- "${cur#/kbd:}")) + local kbd_list + kbd_list=$("$1" /kbd-list 2>/dev/null) || + kbd_list=$("$1" /list:kbd 2>/dev/null) + _comp_compgen -c "${cur#/kbd:}" split -- "$( + _comp_awk '/^0x/ { print $1 }' <<<"$kbd_list" + )" return ;; /bpp:*) - COMPREPLY=($(compgen -W '8 15 16 24 32' -- "${cur#/bpp:}")) + _comp_compgen -c "${cur#/bpp:}" -- -W '8 15 16 24 32' return ;; - /*:* | /help | /version | -h | --help | --version) + /*:*) return ;; esac if [[ $cur == /* ]]; then - COMPREPLY=($(compgen -W '$("$1" --help | - awk "\$1 ~ /^\\// && \$1 !~ /^.(flag\$|option:)/ { sub(\":.*\",\":\",\$1); print \$1 }")' \ - -- "$cur")) + _comp_compgen_filedir rdp + _comp_compgen -a split -- "$( + "$1" --help | _comp_awk '$1 ~ /^\// && $1 !~ /^.(flag$|option:)/ { + sub(":.*",":",$1); print $1 }' + )" [[ ${COMPREPLY-} == *: ]] && compopt -o nospace elif [[ $cur == [+-]* ]]; then local char=${cur:0:1} - local help="$($1 --help)" + local help="$("$1" --help)" if [[ $help == */help* ]]; then # new/slash syntax - COMPREPLY=($(compgen -W '$(awk " - \$1 ~ /^[+-]/ && \$1 !~ /^.toggle\$/ { sub(\"^.\",\"$char\",\$1); print \$1 } - " <<<"$help")' -- "$cur")) + _comp_compgen_split -- "$(_comp_awk '$1 ~ /^[+-]/ && $1 !~ /^.toggle$/ { + sub("^.","'"$char"'",$1); print $1 }' <<<"$help")" else # old/dash syntax - COMPREPLY=($(_parse_help - <<<"$help")) - COMPREPLY=($(compgen -W '${COMPREPLY[@]%:}' -- "$cur")) + _comp_compgen -R help - <<<"$help" + ((${#COMPREPLY[@]})) && + _comp_compgen -- -W '"${COMPREPLY[@]%:}"' fi else - COMPREPLY=($(compgen -W "$(awk '{print $1}' ~/.freerdp/known_hosts \ - 2>/dev/null)" -- "$cur")) + _comp_compgen_filedir rdp + _comp_compgen -a split -- "$( + _comp_awk '{print $1}' ~/.freerdp/known_hosts 2>/dev/null + )" fi } && - complete -F _xfreerdp xfreerdp + complete -F _comp_cmd_xfreerdp xfreerdp # ex: filetype=sh diff --git a/completions/xgamma b/completions/xgamma index 8d77ba3..2a0c409 100644 --- a/completions/xgamma +++ b/completions/xgamma @@ -1,15 +1,15 @@ # bash completion for xgamma(1) -*- shell-script -*- -_xgamma() +_comp_cmd_xgamma() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return case "$prev" in -screen) local screens=$(xrandr --query 2>/dev/null | command sed -n \ '/^Screen /s|^Screen \{1,\}\(.*\):.*$|\1|p' 2>/dev/null) - COMPREPLY=($(compgen -W "$screens" -- "$cur")) + _comp_compgen -- -W "$screens" return ;; -gamma | -rgamma | -ggamma | -bgamma) @@ -17,7 +17,7 @@ _xgamma() if [[ $cur && $cur != *.* ]]; then COMPREPLY=(.) fi - COMPREPLY+=($(compgen -W "{0..9}")) + _comp_compgen -aR -- -W "{0..9}" compopt -o nospace return ;; @@ -26,18 +26,17 @@ _xgamma() if [[ $cur == :* && $cur != :*.* ]]; then # FIXME: where to get local display numbers? local display=${cur#:} - COMPREPLY=($(compgen -W "${display:-0}.")) + _comp_compgen -R -- -W "${display:-0}." compopt -o nospace elif [[ $cur == :*.* ]]; then # local screen numbers local t screens=$(xrandr --query 2>/dev/null | command sed -ne \ '/^Screen /s|^Screen \{1,\}\(.*\):.*$|\1|p' 2>/dev/null) t="${cur#:}" - COMPREPLY=($(compgen -P "${t%.*}." -W "$screens" -- \ - "${cur##*.}")) + _comp_compgen -c "${cur##*.}" -- -P "${t%.*}." -W '$screens' elif [[ $cur != *:* ]]; then # complete hostnames - _known_hosts_real -c -- "$cur" + _comp_compgen_known_hosts -c -- "$cur" if [[ ! $cur ]]; then COMPREPLY+=(:) fi @@ -49,13 +48,13 @@ _xgamma() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help if [[ ${COMPREPLY-} ]]; then [[ $COMPREPLY == *= ]] && compopt -o nospace return fi fi } && - complete -F _xgamma xgamma + complete -F _comp_cmd_xgamma xgamma # ex: filetype=sh diff --git a/completions/xhost b/completions/xhost index 648ae4f..9491030 100644 --- a/completions/xhost +++ b/completions/xhost @@ -1,16 +1,16 @@ # xhost(1) completion -*- shell-script -*- -_xhost() +_comp_cmd_xhost() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $cur in - +*) _known_hosts_real -p+ -- "${cur:1}" ;; - -*) _known_hosts_real -p- -- "${cur:1}" ;; - *) _known_hosts_real -- "$cur" ;; + +*) _comp_compgen_known_hosts -p+ -- "${cur:1}" ;; + -*) _comp_compgen_known_hosts -p- -- "${cur:1}" ;; + *) _comp_compgen_known_hosts -- "$cur" ;; esac } && - complete -F _xhost xhost + complete -F _comp_cmd_xhost xhost # ex: filetype=sh diff --git a/completions/xmllint b/completions/xmllint index a6ef38f..57445bb 100644 --- a/completions/xmllint +++ b/completions/xmllint @@ -1,13 +1,13 @@ # bash completion for xmllint(1) -*- shell-script -*- -_xmllint() +_comp_cmd_xmllint() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -o | --output) - _filedir + _comp_compgen_filedir return ;; --path | --dtdvalidfpi | --maxmem | --pattern | --xpath) @@ -15,39 +15,39 @@ _xmllint() return ;; --dtdvalid) - _filedir 'dtd?(.gz)' + _comp_compgen_filedir 'dtd?(.gz)' return ;; --relaxng) - _filedir 'rng?(.gz)' + _comp_compgen_filedir 'rng?(.gz)' return ;; --schema) - _filedir 'xsd?(.gz)' + _comp_compgen_filedir 'xsd?(.gz)' return ;; --schematron) - _filedir 'sch?(.gz)' + _comp_compgen_filedir 'sch?(.gz)' return ;; --encode) - _xfunc iconv _iconv_charsets + _comp_compgen -x iconv charsets return ;; --pretty) - COMPREPLY=($(compgen -W '{0..2}' -- "$cur")) + _comp_compgen -- -W '{0..2}' return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help COMPREPLY=("${COMPREPLY[@]%:}") return fi - _filedir '@(*ml|htm|svg?(z)|xs[dl]|rng|wsdl|jnlp|tld|dbk|docbook|page)?(.gz)' + _comp_compgen_filedir '@(*ml|htm|svg?(z)|xs[dl]|rng|wsdl|jnlp|tld|dbk|docbook|page)?(.gz)' } && - complete -F _xmllint xmllint + complete -F _comp_cmd_xmllint xmllint # ex: filetype=sh diff --git a/completions/xmlwf b/completions/xmlwf index b397af9..d047ee1 100644 --- a/completions/xmlwf +++ b/completions/xmlwf @@ -1,32 +1,31 @@ # bash completion for xmlwf(1) -*- shell-script -*- -_xmlwf() +_comp_cmd_xmlwf() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -*d) - _filedir -d + _comp_compgen_filedir -d return ;; -*e) - COMPREPLY=($(compgen -W 'US-ASCII UTF-8 UTF-16 ISO-8859-1' \ - -- "$cur")) + _comp_compgen -- -W 'US-ASCII UTF-8 UTF-16 ISO-8859-1' return ;; - -*v) + -*[abv]) return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + _comp_compgen_help || _comp_compgen_usage return fi - _filedir '@(*ml|htm|svg|xs[dl]|rng|wsdl|jnlp|tld|dbk|docbook|page)' + _comp_compgen_filedir '@(*ml|htm|svg|xs[dl]|rng|wsdl|jnlp|tld|dbk|docbook|page)' } && - complete -F _xmlwf xmlwf + complete -F _comp_cmd_xmlwf xmlwf # ex: filetype=sh diff --git a/completions/xmms b/completions/xmms index af4aefe..49bc381 100644 --- a/completions/xmms +++ b/completions/xmms @@ -1,29 +1,31 @@ # bash completion for xmms -*- shell-script -*- -_xmms() +_comp_cmd_xmms() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[SRA]*)' + # shellcheck disable=SC2254 case $prev in - --help | --version | -!(-*)[hv]) + --help | --version | -${noargopts}[hv]) return ;; - --toggle-shuffle | --toggle-repeat | --toggle-advance | -!(-*)[SRA]) - COMPREPLY=($(compgen -W 'on off' -- "$cur")) + --toggle-shuffle | --toggle-repeat | --toggle-advance | -${noargopts}[SRA]) + _comp_compgen -- -W 'on off' return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help else - _filedir '@(mp[23]|ogg|wav|pls|m3u|xm|mod|s[3t]m|it|mtm|ult|flac)' + _comp_compgen_filedir '@(mp[23]|ogg|wav|pls|m3u|xm|mod|s[3t]m|it|mtm|ult|flac)' fi } && - complete -F _xmms xmms + complete -F _comp_cmd_xmms xmms # ex: filetype=sh diff --git a/completions/xmodmap b/completions/xmodmap index 7cfa230..f8d2957 100644 --- a/completions/xmodmap +++ b/completions/xmodmap @@ -1,9 +1,9 @@ # xmodmap(1) completion -*- shell-script -*- -_xmodmap() +_comp_cmd_xmodmap() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -display | -e) @@ -12,12 +12,12 @@ _xmodmap() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + _comp_compgen_help -- -help return fi - _filedir + _comp_compgen_filedir } && - complete -F _xmodmap xmodmap + complete -F _comp_cmd_xmodmap xmodmap # ex: filetype=sh diff --git a/completions/xrandr b/completions/xrandr index 16704e3..c071ab4 100644 --- a/completions/xrandr +++ b/completions/xrandr @@ -1,63 +1,178 @@ # bash completion for xrandr -*- shell-script -*- -_xrandr() +_comp_cmd_xrandr__compgen_outputs() { - local cur prev words cword - _init_completion || return + _comp_compgen_split -- "$("$1" -q 2>/dev/null | _comp_awk '/connected/ {print $1}')" +} + +_comp_cmd_xrandr__compgen_monitors() +{ + _comp_compgen_split -- "$( + "$1" --listmonitors 2>/dev/null | + command sed -ne 's/.* [0-9]*: [+\*]*\([^ ]*\).*/\1/p' + )" +} + +_comp_cmd_xrandr__compgen_providers() +{ + _comp_compgen_split -- "$("$1" --listproviders 2>/dev/null | + command sed -ne "s/.*cap:.*$2.* name:\([^ ]*\).*/\1/p")" +} + +_comp_cmd_xrandr__compgen_modes() +{ + _comp_compgen_split -- "$( + "$1" -q 2>/dev/null | command sed \ + -e "1,/^$2 / d" \ + -e '/connected/,$ d' \ + -e '/^[[:space:]]*h: / d' \ + -e '/^[[:space:]]*v: / d' \ + -e 's/\([^[:space:]]\)[[:space:]].*/\1/' + )" +} + +_comp_cmd_xrandr__compgen_all_modes() +{ + _comp_compgen_split -- "$( + "$1" -q 2>/dev/null | command sed \ + -e '/^[^[:space:]].*/ d' \ + -e '/^[[:space:]]*h: / d' \ + -e '/^[[:space:]]*v: / d' \ + -e 's/[[:space:]]*\([^[:space:]]*\)[[:space:]].*/\1/' + )" +} + +_comp_cmd_xrandr() +{ + local cur prev words cword comp_args + _comp_initialize -- "$@" || return + + local i output has_output="" + for ((i = cword - 1; i > 0; i--)); do + if [[ ${words[i]} == --output ]]; then + output=${words[i + 1]} + has_output=set + break + fi + done case "$prev" in - -display | -d | -help | -s | --size | -r | --rate | --refresh | --screen | --fb | --fbmm | \ - --dpi | --pos | --set | --scale | --transform | --crtc | --panning | --gamma | \ - --newmode | --rmmode | --addmode | --delmode) + -display | -d | -s | --size | -r | --rate | --refresh | --screen | \ + --fb | --fbmm | --pos | --set | --scale | --transform | --crtc | \ + --panning | --gamma | --newmode | --rmmode | --setmonitor) + return + ;; + --output | --addmode | --delmode | --dpi) + _comp_cmd_xrandr__compgen_outputs "$1" return ;; - --output | --left-of | --right-of | --above | --below | --same-as) - local outputs=$("$1" | awk '/connected/ {print $1}') - COMPREPLY=($(compgen -W "$outputs" -- "$cur")) + --left-of | --right-of | --above | --below | --same-as) + if [[ $has_output ]]; then + _comp_cmd_xrandr__compgen_outputs "$1" + fi return ;; --mode) - local i output - for ((i = 1; i < cword; i++)); do - if [[ ${words[i]} == --output ]]; then - output=${words[i + 1]} - break - fi - done - if [[ -v output ]]; then - local modes=$("$1" | command sed -e "1,/^$output / d" \ - -e "/connected/,$ d" \ - -e "s/\([^[:space:]]\)[[:space:]].*/\1/") - COMPREPLY=($(compgen -W "$modes" -- "$cur")) + if [[ $has_output ]]; then + _comp_cmd_xrandr__compgen_modes "$1" "$output" fi return ;; -o | --orientation) - COMPREPLY=($(compgen -W 'normal inverted left right 0 1 2 3' -- \ - "$cur")) + _comp_compgen -- -W 'normal inverted left right 0 1 2 3' return ;; --reflect) - COMPREPLY=($(compgen -W 'normal x y xy' -- "$cur")) + if [[ $has_output ]]; then + _comp_compgen -- -W 'normal x y xy' + fi return ;; --rotate) - COMPREPLY=($(compgen -W 'normal inverted left right' -- "$cur")) + if [[ $has_output ]]; then + _comp_compgen -- -W 'normal inverted left right' + fi return ;; - --setprovideroutputsource | --setprovideroffloadsink) - local providers=$("$1" --listproviders 2>/dev/null | - command sed -ne 's/.* name:\([^ ]*\).*/\1/p') - COMPREPLY=($(compgen -W "$providers" -- "$cur")) - # TODO 2nd arg needed, is that a provider as well? + --filter) + if [[ $has_output ]]; then + _comp_compgen -- -W 'bilinear nearest' + fi + return + ;; + --setprovideroutputsource) + _comp_cmd_xrandr__compgen_providers "$1" "Sink Output" + return + ;; + --setprovideroffloadsink) + _comp_cmd_xrandr__compgen_providers "$1" "Source Offload" + return + ;; + --delmonitor) + _comp_cmd_xrandr__compgen_monitors "$1" return ;; esac - COMPREPLY=($(compgen -W '$("$1" -help 2>&1 | - command sed -e "s/ or / /g" -e "s/<[^>]*>]//g" | _parse_help -)' \ - -- "$cur")) + # second arguments + if ((cword >= 2)); then + case "${words[cword - 2]}" in + --set) + return + ;; + --addmode) + _comp_cmd_xrandr__compgen_all_modes "$1" + return + ;; + --delmode) + _comp_cmd_xrandr__compgen_modes "$1" "${words[cword - 1]}" + return + ;; + --setmonitor) + _comp_compgen -- -W 'auto' + return + ;; + --setprovideroutputsource) + _comp_cmd_xrandr__compgen_providers "$1" "Source Output" + _comp_compgen -a -- -W "0x0" + return + ;; + --setprovideroffloadsink) + _comp_cmd_xrandr__compgen_providers "$1" "Sink Offload" + _comp_compgen -a -- -W "0x0" + return + ;; + esac + fi + + # third arguments + if ((cword >= 3)); then + case "${words[cword - 3]}" in + --setmonitor) + _comp_compgen -c "${cur##*,}" -i xrandr outputs "$1" + _comp_compgen -ac "${cur##*,}" -- -W "none" + _comp_delimited , -W '"${COMPREPLY[@]}"' + return + ;; + esac + fi + + local options + if [[ $has_output ]]; then + _comp_compgen -v options help - <<<"$( + "$1" --help 2>/dev/null | + command sed -e 's/ or /\n /g' -e 's/<[^>]*>]//g' + )" + else + # if no output is specified, remove per-output options + _comp_compgen -v options help - <<<"$( + "$1" --help 2>/dev/null | + command sed -e '/^ -/!d' -e 's/ or /\n /g' -e 's/<[^>]*>]//g' + )" + fi + + _comp_compgen -- -W '"${options[@]}"' } && - complete -F _xrandr xrandr + complete -F _comp_cmd_xrandr xrandr # ex: filetype=sh diff --git a/completions/xrdb b/completions/xrdb index f46f90b..0bd2598 100644 --- a/completions/xrdb +++ b/completions/xrdb @@ -1,27 +1,27 @@ # xrdb(1) completion -*- shell-script -*- -_xrdb() +_comp_cmd_xrdb() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -backup | -display | -help) return ;; -cpp | -edit) - _filedir + _comp_compgen_filedir return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help return fi - _filedir + _comp_compgen_filedir } && - complete -F _xrdb xrdb + complete -F _comp_cmd_xrdb xrdb # ex: filetype=sh diff --git a/completions/xsltproc b/completions/xsltproc index 4cb7071..5d75596 100644 --- a/completions/xsltproc +++ b/completions/xsltproc @@ -1,13 +1,13 @@ # xsltproc(1) completion -*- shell-script -*- -_xsltproc() +_comp_cmd_xsltproc() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in --output | -o) - _filedir + _comp_compgen_filedir return ;; # TODO : number only @@ -16,8 +16,8 @@ _xsltproc() ;; --encoding) # some aliases removed - COMPREPLY=($(compgen -X '@(UTF[1378]|8859|ISO[0-9_])*' \ - -W "$(iconv -l | command sed -e 's/\/.*//')" -- "$cur")) + local encodings=$(iconv -l | command sed -e 's/\/.*//') + _comp_compgen -- -X '@(UTF[1378]|8859|ISO[0-9_])*' -W '$encodings' return ;; --param | --stringparam) @@ -25,25 +25,25 @@ _xsltproc() ;; # not really like --writesubtree --path) - _filedir -d + _comp_compgen_filedir -d return ;; --writesubtree) - _filedir -d + _comp_compgen_filedir -d return ;; esac - [[ $cword -gt 2 && $(_get_cword '' 2) == --?(string)param ]] && return + [[ $cword -gt 2 && ${words[cword - 2]} == --?(string)param ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help COMPREPLY=("${COMPREPLY[@]%:}") else # TODO: 1st file xsl|xslt, 2nd XML - _filedir '@(xsl|xslt|xml|dbk|docbook|page)' + _comp_compgen_filedir '@(xsl|xslt|xml|dbk|docbook|page)' fi } && - complete -F _xsltproc xsltproc + complete -F _comp_cmd_xsltproc xsltproc # ex: filetype=sh diff --git a/completions/xvfb-run b/completions/xvfb-run index ed2788a..9ae1fc8 100644 --- a/completions/xvfb-run +++ b/completions/xvfb-run @@ -1,36 +1,39 @@ # bash completion for xvfb-run -*- shell-script -*- -_xvfb_run() +_comp_cmd_xvfb_run() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*[npsef]*)' local i - for ((i = 1; i <= COMP_CWORD; i++)); do - if [[ ${COMP_WORDS[i]} != -* ]]; then - _command_offset $i + for ((i = 1; i <= cword; i++)); do + if [[ ${words[i]} != -* ]]; then + _comp_command_offset $i return fi - [[ ${COMP_WORDS[i]} == -!(-*)[npsef] ]] && ((i++)) + # shellcheck disable=SC2254 + [[ ${words[i]} == -${noargopts}[npsef] ]] && ((i++)) done + # shellcheck disable=SC2254 case $prev in - --help | --server-num | --xauth-protocol | --server-args | -!(-*)[hnps]) + --help | --server-num | --xauth-protocol | --server-args | -${noargopts}[hnps]) return ;; - --error-file | --auth-file | -!(-*)[ef]) - _filedir + --error-file | --auth-file | -${noargopts}[ef]) + _comp_compgen_filedir return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace fi } && - complete -F _xvfb_run xvfb-run + complete -F _comp_cmd_xvfb_run xvfb-run # ex: filetype=sh diff --git a/completions/xxd b/completions/xxd index a470bb0..b9facde 100644 --- a/completions/xxd +++ b/completions/xxd @@ -1,23 +1,24 @@ # xxd(1) completion -*- shell-script -*- -_xxd() +_comp_cmd_xxd() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in - -h | -help | -c | -cols | -g | -groupsize | -l | -len | -s | -seek | -v | -version) + -h | -help | -c | -cols | -g | -groupsize | -l | -len | -s | -seek | \ + -v | -version) return ;; esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + _comp_compgen_help -- -h return fi - _filedir + _comp_compgen_filedir } && - complete -F _xxd xxd + complete -F _comp_cmd_xxd xxd # ex: filetype=sh diff --git a/completions/xz b/completions/xz index 73958c5..8d6c53b 100644 --- a/completions/xz +++ b/completions/xz @@ -1,56 +1,59 @@ # xz(1) completion -*- shell-script -*- -_xz() +_comp_cmd_xz() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return local xspec="*.@(xz|lzma|txz|tlz)" + local noargopts='!(-*|*[CFTMS]*)' + # shellcheck disable=SC2254 case $prev in - --decompress | --list | --test | -!(-*)[dlt]*) + --decompress | --list | --test | -${noargopts}[dlt]*) xspec="!"$xspec ;; --files | --files0) - _filedir + _comp_compgen_filedir return ;; - --check | -!(-*)C) - COMPREPLY=($(compgen -W 'crc32 crc64 sha256 none' -- "$cur")) + --check | -${noargopts}C) + _comp_compgen -- -W 'crc32 crc64 sha256 none' return ;; - --format | -!(-*)F) - COMPREPLY=($(compgen -W 'auto xz lzma raw' -- "$cur")) + --format | -${noargopts}F) + _comp_compgen -- -W 'auto xz lzma raw' return ;; - --threads | -!(-*)T) - COMPREPLY=($(compgen -W "{0..$(_ncpus)}" -- "$cur")) + --threads | -${noargopts}T) + local REPLY + _comp_get_ncpus + _comp_compgen -- -W "{0..$REPLY}" return ;; --memlimit | --memlimit-compress | --memlimit-decompress | --memory | \ - --suffix | --delta | --lzma1 | --lzma2 | -!(-*)[MS]) + --suffix | --delta | --lzma1 | --lzma2 | -${noargopts}[MS]) return ;; - --help | --long-help | --version | --info-memory | -!(-*)[hHV]) + --help | --long-help | --version | --info-memory | -${noargopts}[hHV]) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1" --long-help) {-1..-9}' \ - -- "$cur")) + _comp_compgen_help -- --long-help + _comp_compgen -a -- -W '{-1..-9}' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _tilde "$cur" || return + _comp_compgen_tilde && return - local IFS=$'\n' compopt -o filenames - COMPREPLY=($(compgen -f -X "$xspec" -- "$cur") $(compgen -d -- "$cur")) + _comp_compgen -- -f -X "$xspec" -o plusdirs } && - complete -F _xz xz pxz + complete -F _comp_cmd_xz xz pxz # ex: filetype=sh diff --git a/completions/xzdec b/completions/xzdec index 993bd2b..21ee6ec 100644 --- a/completions/xzdec +++ b/completions/xzdec @@ -1,29 +1,31 @@ # xzdec(1) completion -*- shell-script -*- -_xzdec() +_comp_cmd_xzdec() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return + local noargopts='!(-*|*M*)' + # shellcheck disable=SC2254 case $prev in - --memory | -!(-*)M) + --memory | -${noargopts}M) return ;; - --help | --version | -!(-*)[hV]) + --help | --version | -${noargopts}[hV]) return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + _comp_compgen_help [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi - _filedir xz # no lzma support here as of xz 4.999.9beta + _comp_compgen_filedir xz # no lzma support here as of xz 4.999.9beta } && - complete -F _xzdec xzdec + complete -F _comp_cmd_xzdec xzdec # ex: filetype=sh diff --git a/completions/ypmatch b/completions/ypmatch index 13249f0..db5a233 100644 --- a/completions/ypmatch +++ b/completions/ypmatch @@ -1,9 +1,9 @@ # bash completion for yp-tools -*- shell-script -*- -_ypmatch() +_comp_cmd_ypmatch() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return local map cmd=${1##*/} @@ -12,15 +12,12 @@ _ypmatch() if [[ $cmd == ypmatch && $cword -eq 1 && ${#words[@]} -eq 3 ]]; then map=${words[2]} - COMPREPLY=($(compgen -W '$(ypcat $map 2>/dev/null | \ - cut -d':' -f 1)' -- "$cur")) + _comp_compgen_split -- "$(ypcat "$map" 2>/dev/null | cut -d':' -f 1)" else [[ $cmd == ypmatch && $cword -ne 2 ]] && return - COMPREPLY=($(compgen -W \ - '$(printf "%s\n" $(ypcat -x 2>/dev/null | \ - cut -d"\"" -f 2))' -- "$cur")) + _comp_compgen_split -- "$(ypcat -x 2>/dev/null | cut -d'"' -f 2)" fi } && - complete -F _ypmatch ypmatch ypcat + complete -F _comp_cmd_ypmatch ypmatch ypcat # ex: filetype=sh diff --git a/completions/yum-arch b/completions/yum-arch index 883c77e..070d020 100644 --- a/completions/yum-arch +++ b/completions/yum-arch @@ -1,16 +1,16 @@ # yum-arch(8) completion -*- shell-script -*- -_yum_arch() +_comp_cmd_yum_arch() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W '-d -v -vv -n -c -z -s -l -q' -- "$cur")) + _comp_compgen -- -W '-d -v -vv -n -c -z -s -l -q' else - _filedir -d + _comp_compgen_filedir -d fi } && - complete -F _yum_arch yum-arch + complete -F _comp_cmd_yum_arch yum-arch # ex: filetype=sh diff --git a/completions/zopfli b/completions/zopfli index 8c02885..49d5305 100644 --- a/completions/zopfli +++ b/completions/zopfli @@ -1,9 +1,9 @@ # bash completion for zopfli -*- shell-script -*- -_zopfli() +_comp_cmd_zopfli() { - local cur prev words cword - _init_completion || return + local cur prev words cword comp_args + _comp_initialize -- "$@" || return case $prev in -h) @@ -12,18 +12,19 @@ _zopfli() esac if [[ $cur == -* ]]; then - COMPREPLY=($(compgen -W \ - '$(_parse_help "$1" -h | command sed -e "s/#$//")' -- "$cur")) + _comp_compgen -R help -- -h + ((${#COMPREPLY[@]})) && + _comp_compgen -- -W '"${COMPREPLY[@]%#}"' [[ ${COMPREPLY-} == --i ]] && compopt -o nospace return fi - _tilde "$cur" || return + _comp_compgen_tilde && return - local IFS=$'\n' xspec="*.@(gz|t[ag]z)" + local xspec="*.@(gz|t[ag]z)" compopt -o filenames - COMPREPLY=($(compgen -f -X "$xspec" -- "$cur") $(compgen -d -- "$cur")) + _comp_compgen -- -f -X "$xspec" -o plusdirs } && - complete -F _zopfli zopfli + complete -F _comp_cmd_zopfli zopfli # ex: filetype=sh diff --git a/completions/zopflipng b/completions/zopflipng index 4526cd9..76a0c30 100644 --- a/completions/zopflipng +++ b/completions/zopflipng @@ -1,39 +1,40 @@ # bash completion for zopflipng -*- shell-script -*- -_zopflipng() +_comp_cmd_zopflipng() { - local cur prev words cword split - _init_completion -s || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return case $prev in -h | --help) return ;; --splitting) - COMPREPLY=($(compgen -W '{0..3}' -- "$cur")) + _comp_compgen -- -W '{0..3}' return ;; esac - $split && return + [[ $was_split ]] && return if [[ $cur == -* ]]; then - COMPREPLY=($(_parse_help "$1" -h)) - COMPREPLY=($(compgen -W '${COMPREPLY[@]%:}' -- "$cur")) + _comp_compgen -R help -- -h + ((${#COMPREPLY[@]})) && + _comp_compgen -- -W '"${COMPREPLY[@]%:}"' [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi if [[ ${words[*]} != *\ --prefix=* ]]; then # 2 png args only if --prefix not given - local args - _count_args - ((args < 3)) && _filedir png + local REPLY + _comp_count_args + ((REPLY < 3)) && _comp_compgen_filedir png else # otherwise arbitrary number of png args - _filedir png + _comp_compgen_filedir png fi } && - complete -F _zopflipng zopflipng + complete -F _comp_cmd_zopflipng zopflipng # ex: filetype=sh |