From 6c18848a903eb3ee06dccd915859ce64195c257c Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Mon, 15 Apr 2024 18:24:27 +0200 Subject: Adding upstream version 1:2.11. Signed-off-by: Daniel Baumann --- .dir-locals.el | 10 + .dockerignore | 1 + .editorconfig | 18 + .gitignore | 23 + .markdownlint.yaml | 4 + .perltidyrc | 6 + .pre-commit-config.yaml | 97 + .shellcheckrc | 16 + .travis.yml | 56 + AUTHORS | 7 + CHANGES | 3141 ++++++++++++++++++++ CONTRIBUTING.md | 191 ++ COPYING | 339 +++ Makefile.am | 41 + README.md | 347 +++ bash-completion-config-version.cmake.in | 7 + bash-completion-config.cmake.in | 12 + bash-completion.pc.in | 12 + bash_completion | 2266 ++++++++++++++ bash_completion.sh.in | 16 + completions/.gitignore | 235 ++ completions/2to3 | 39 + completions/7z | 128 + completions/Makefile.am | 950 ++++++ completions/_adb | 69 + completions/_cal | 38 + completions/_chfn | 8 + completions/_chsh | 31 + completions/_dmesg | 33 + completions/_eject | 33 + completions/_hexdump | 31 + completions/_hwclock | 26 + completions/_ionice | 60 + completions/_look | 17 + completions/_mock | 69 + completions/_modules | 85 + completions/_mount | 65 + completions/_mount.linux | 252 ++ completions/_newgrp | 19 + completions/_nmcli | 201 ++ completions/_renice | 32 + completions/_repomanage | 24 + completions/_reptyr | 26 + completions/_rfkill | 31 + completions/_rtcwake | 32 + completions/_runuser | 8 + completions/_su | 41 + completions/_svn | 210 ++ completions/_svnadmin | 78 + completions/_svnlook | 63 + completions/_udevadm | 77 + completions/_umount | 24 + completions/_umount.linux | 145 + completions/_write | 8 + completions/_xm | 224 ++ completions/_yum | 144 + completions/a2x | 39 + completions/abook | 49 + completions/aclocal | 35 + completions/acpi | 22 + completions/add_members | 31 + completions/alias | 20 + completions/ant | 102 + completions/apache2ctl | 16 + completions/appdata-validate | 32 + completions/apt-build | 54 + completions/apt-cache | 85 + completions/apt-get | 104 + completions/aptitude | 119 + completions/arch | 46 + completions/arp | 59 + completions/arping | 31 + completions/arpspoof | 28 + completions/asciidoc | 52 + completions/aspell | 88 + completions/autoconf | 40 + completions/automake | 36 + completions/autoreconf | 41 + completions/autorpm | 14 + completions/autoscan | 34 + completions/avctrl | 20 + completions/badblocks | 29 + completions/bind | 36 + completions/bk | 18 + completions/brctl | 40 + completions/btdownloadheadless.py | 32 + completions/bts | 112 + completions/bzip2 | 42 + completions/cancel | 27 + completions/cardctl | 15 + completions/carton | 81 + completions/ccache | 38 + completions/ccze | 44 + completions/cfagent | 21 + completions/cfrun | 47 + completions/chage | 30 + completions/change_pw | 25 + completions/check_db | 17 + completions/check_perms | 15 + completions/checksec | 37 + completions/chgrp | 39 + completions/chkconfig | 37 + completions/chmod | 41 + completions/chown | 46 + completions/chpasswd | 30 + completions/chromium-browser | 50 + completions/chronyc | 61 + completions/chrpath | 27 + completions/cksfv | 29 + completions/cleanarch | 16 + completions/clisp | 22 + completions/clone_member | 25 + completions/complete | 49 + completions/config_list | 27 + completions/configure | 42 + completions/convert | 324 ++ completions/cowsay | 23 + completions/cpan2dist | 37 + completions/cpio | 78 + completions/cppcheck | 91 + completions/crontab | 48 + completions/cryptsetup | 103 + completions/curl | 99 + completions/cvs | 398 +++ completions/cvsps | 58 + completions/dd | 42 + completions/deja-dup | 32 + completions/desktop-file-validate | 23 + completions/dhclient | 34 + completions/dict | 64 + completions/dmypy | 48 + completions/dnssec-keygen | 48 + completions/dnsspoof | 26 + completions/dot | 45 + completions/dpkg | 126 + completions/dpkg-source | 98 + completions/dselect | 29 + completions/dsniff | 26 + completions/dumpdb | 18 + completions/dumpe2fs | 28 + completions/e2freefrag | 24 + completions/e2label | 15 + completions/ebtables | 78 + completions/ecryptfs-migrate-home | 22 + completions/eog | 26 + completions/ether-wake | 27 + completions/evince | 32 + completions/explodepkg | 5 + completions/export | 65 + completions/faillog | 27 + completions/fbgs | 50 + completions/fbi | 54 + completions/feh | 120 + completions/file | 32 + completions/file-roller | 42 + completions/filefrag | 17 + completions/filesnarf | 22 + completions/find | 113 + completions/find_member | 25 + completions/fio | 90 + completions/firefox | 46 + completions/flake8 | 42 + completions/freebsd-update | 29 + completions/freeciv | 41 + completions/freeciv-server | 22 + completions/function | 37 + completions/fusermount | 28 + completions/gcc | 75 + completions/gcl | 21 + completions/gdb | 47 + completions/genaliases | 15 + completions/gendiff | 12 + completions/genisoimage | 38 + completions/geoiplookup | 33 + completions/getconf | 32 + completions/getent | 77 + completions/gkrellm | 39 + completions/gm | 40 + completions/gnatmake | 26 + completions/gnokii | 237 ++ completions/gnome-mplayer | 38 + completions/gnome-screenshot | 31 + completions/gpasswd | 25 + completions/gpg | 38 + completions/gpg2 | 42 + completions/gpgv | 46 + completions/gphoto2 | 55 + completions/gprof | 56 + completions/groupadd | 26 + completions/groupdel | 27 + completions/groupmems | 27 + completions/groupmod | 29 + completions/growisofs | 39 + completions/grpck | 25 + completions/gssdp-discover | 34 + completions/gzip | 43 + completions/hcitool | 380 +++ completions/hddtemp | 38 + completions/hid2hci | 15 + completions/hostname | 23 + completions/hping2 | 35 + completions/htop | 33 + completions/htpasswd | 36 + completions/hunspell | 43 + completions/iconv | 38 + completions/id | 18 + completions/idn | 26 + completions/ifstat | 68 + completions/iftop | 26 + completions/ifup | 39 + completions/influx | 35 + completions/info | 74 + completions/inject | 26 + completions/inotifywait | 47 + completions/insmod | 18 + completions/installpkg | 33 + completions/interdiff | 33 + completions/invoke-rc.d | 38 + completions/ip | 378 +++ completions/ipcalc | 25 + completions/iperf | 69 + completions/ipmitool | 199 ++ completions/ipsec | 102 + completions/iptables | 51 + completions/ipv6calc | 38 + completions/iscsiadm | 66 + completions/isort | 41 + completions/isql | 14 + completions/iwconfig | 90 + completions/iwlist | 22 + completions/iwpriv | 31 + completions/iwspy | 20 + completions/jar | 27 + completions/jarsigner | 57 + completions/java | 333 +++ completions/javaws | 34 + completions/jpegoptim | 38 + completions/jps | 25 + completions/jq | 54 + completions/jshint | 38 + completions/json_xs | 31 + completions/jsonschema | 30 + completions/k3b | 48 + completions/kcov | 64 + completions/kill | 29 + completions/killall | 36 + completions/kldload | 21 + completions/kldunload | 15 + completions/koji | 245 ++ completions/ktutil | 120 + completions/larch | 39 + completions/lastlog | 25 + completions/ldapsearch | 231 ++ completions/ldapvi | 51 + completions/lftp | 28 + completions/lftpget | 14 + completions/lilo | 66 + completions/links | 100 + completions/lintian | 176 ++ completions/lisp | 22 + completions/list_admins | 17 + completions/list_lists | 21 + completions/list_members | 36 + completions/list_owners | 18 + completions/locale-gen | 32 + completions/lpq | 28 + completions/lpr | 33 + completions/lrzip | 52 + completions/lsof | 56 + completions/lspci | 41 + completions/lsscsi | 27 + completions/lsusb | 20 + completions/lua | 23 + completions/luac | 27 + completions/luseradd | 40 + completions/luserdel | 23 + completions/lvm | 861 ++++++ completions/lz4 | 52 + completions/lzip | 47 + completions/lzma | 34 + completions/lzop | 59 + completions/macof | 22 + completions/mailmanctl | 18 + completions/make | 170 ++ completions/makepkg | 48 + completions/man | 101 + completions/mc | 29 + completions/mcrypt | 67 + completions/mdadm | 149 + completions/mdtool | 62 + completions/medusa | 30 + completions/mii-diag | 26 + completions/mii-tool | 32 + completions/minicom | 40 + completions/mkinitrd | 50 + completions/mktemp | 29 + completions/mmsitepass | 15 + completions/modinfo | 47 + completions/modprobe | 123 + completions/monodevelop | 19 + completions/mplayer | 287 ++ completions/mr | 91 + completions/msynctool | 42 + completions/mtx | 44 + completions/munin-node-configure | 33 + completions/munin-run | 28 + completions/munin-update | 27 + completions/munindoc | 13 + completions/mussh | 52 + completions/mutt | 160 + completions/mypy | 57 + completions/mysql | 99 + completions/mysqladmin | 63 + completions/nc | 51 + completions/ncftp | 27 + completions/nethogs | 26 + completions/newlist | 25 + completions/newusers | 30 + completions/ngrep | 38 + completions/nmap | 56 + completions/nproc | 23 + completions/nslookup | 86 + completions/nsupdate | 40 + completions/ntpdate | 35 + completions/oggdec | 38 + completions/op | 59 + completions/openssl | 138 + completions/opera | 47 + completions/optipng | 52 + completions/p4 | 51 + completions/pack200 | 74 + completions/passwd | 24 + completions/patch | 70 + completions/pdftotext | 39 + completions/perl | 146 + completions/perlcritic | 51 + completions/perltidy | 55 + completions/pgrep | 62 + completions/pidof | 27 + completions/pine | 32 + completions/ping | 71 + completions/pkg-config | 45 + completions/pkg-get | 72 + completions/pkg_delete | 18 + completions/pkgadd | 62 + completions/pkgrm | 46 + completions/pkgtool | 35 + completions/pkgutil | 95 + completions/plague-client | 14 + completions/pm-hibernate | 12 + completions/pm-is-supported | 13 + completions/pm-powersave | 12 + completions/pngfix | 36 + completions/portinstall | 31 + completions/portsnap | 25 + completions/portupgrade | 19 + completions/postcat | 39 + completions/postconf | 39 + completions/postfix | 33 + completions/postmap | 41 + completions/postsuper | 56 + completions/povray | 64 + completions/prelink | 42 + completions/printenv | 23 + completions/protoc | 63 + completions/psql | 188 ++ completions/puppet | 338 +++ completions/pv | 31 + completions/pwck | 18 + completions/pwd | 20 + completions/pwdx | 24 + completions/pwgen | 28 + completions/pycodestyle | 34 + completions/pydoc | 42 + completions/pydocstyle | 35 + completions/pyflakes | 23 + completions/pylint | 87 + completions/pytest | 134 + completions/python | 67 + completions/pyvenv | 25 + completions/qdbus | 14 + completions/qemu | 108 + completions/qrunner | 18 + completions/querybts | 40 + completions/quota | 191 ++ completions/radvdump | 22 + completions/rcs | 36 + completions/rdesktop | 57 + completions/remove_members | 27 + completions/removepkg | 25 + completions/reportbug | 96 + completions/resolvconf | 21 + completions/ri | 120 + completions/rmlist | 17 + completions/rmmod | 24 + completions/route | 30 + completions/rpcdebug | 46 + completions/rpm | 302 ++ completions/rpm2tgz | 17 + completions/rpmcheck | 24 + completions/rrdtool | 17 + completions/rsync | 86 + completions/sbcl | 21 + completions/sbopkg | 73 + completions/screen | 123 + completions/scrub | 36 + completions/secret-tool | 50 + completions/sh | 36 + completions/shellcheck | 63 + completions/sitecopy | 50 + completions/slackpkg | 112 + completions/slapt-get | 86 + completions/slapt-src | 68 + completions/smartctl | 165 + completions/smbclient | 322 ++ completions/snownews | 15 + completions/sqlite3 | 38 + completions/ss | 41 + completions/ssh | 563 ++++ completions/ssh-add | 35 + completions/ssh-copy-id | 32 + completions/ssh-keygen | 123 + completions/sshfs | 23 + completions/sshmitm | 17 + completions/sshow | 26 + completions/strace | 99 + completions/strings | 45 + completions/sudo | 56 + completions/svcadm | 150 + completions/svk | 214 ++ completions/sync_members | 31 + completions/synclient | 24 + completions/sysbench | 132 + completions/sysctl | 31 + completions/tar | 711 +++++ completions/tcpdump | 64 + completions/tcpkill | 22 + completions/tcpnice | 22 + completions/timeout | 39 + completions/tipc | 289 ++ completions/tox | 51 + completions/tracepath | 26 + completions/tshark | 136 + completions/tsig-keygen | 28 + completions/tune2fs | 61 + completions/ulimit | 42 + completions/unace | 20 + completions/unpack200 | 48 + completions/unrar | 23 + completions/unshunt | 17 + completions/update-alternatives | 92 + completions/update-rc.d | 58 + completions/upgradepkg | 30 + completions/urlsnarf | 26 + completions/uscan | 33 + completions/useradd | 46 + completions/userdel | 27 + completions/usermod | 51 + completions/valgrind | 111 + completions/vipw | 22 + completions/vmstat | 27 + completions/vncviewer | 99 + completions/vpnc | 82 + completions/watch | 54 + completions/webmitm | 17 + completions/wget | 174 ++ completions/wine | 20 + completions/withlist | 18 + completions/wodim | 96 + completions/wol | 42 + completions/wsimport | 48 + completions/wtf | 42 + completions/wvdial | 46 + completions/xdg-mime | 74 + completions/xdg-settings | 31 + completions/xfreerdp | 67 + completions/xgamma | 61 + completions/xhost | 16 + completions/xmllint | 53 + completions/xmlwf | 32 + completions/xmms | 29 + completions/xmodmap | 23 + completions/xrandr | 63 + completions/xrdb | 27 + completions/xsltproc | 49 + completions/xvfb-run | 36 + completions/xxd | 23 + completions/xz | 56 + completions/xzdec | 29 + completions/ypmatch | 26 + completions/yum-arch | 16 + completions/zopfli | 29 + completions/zopflipng | 39 + configure.ac | 20 + doc/Makefile.am | 8 + doc/bash_completion.txt | 66 + doc/bashrc | 1 + doc/inputrc | 1 + doc/main.txt | 18 + doc/makeHtml.sh | 4 + doc/styleguide.txt | 134 + doc/testing.txt | 112 + extra/git-post-commit.sh | 23 + extra/git-pre-push.sh | 44 + extra/make-changelog.py | 38 + helpers/Makefile.am | 4 + helpers/perl | 98 + helpers/python | 14 + pyproject.toml | 3 + setup-symlinks.sh | 11 + test/.gitignore | 2 + test/Makefile.am | 14 + test/config/bashrc | 62 + test/config/inputrc | 22 + test/docker/Dockerfile | 6 + test/docker/docker-script.sh | 16 + test/fixtures/7z/a.7z | Bin 0 -> 109 bytes test/fixtures/7z/f.txt | 1 + test/fixtures/_filedir/a b/i | 0 test/fixtures/_filedir/a$b/h | 0 test/fixtures/_filedir/a&b/f | 0 test/fixtures/_filedir/a'b/c | 0 test/fixtures/_filedir/ab/e | 0 "test/fixtures/_filedir/a\303\251/g" | 0 test/fixtures/_filedir/brackets/[x] | 1 + test/fixtures/_filedir/brackets/x | 1 + test/fixtures/_filedir/ext/ee.e1 | 0 test/fixtures/_filedir/ext/ff.e2 | 0 test/fixtures/_filedir/ext/foo/.gitignore | 0 test/fixtures/_filedir/ext/gg.e1 | 0 test/fixtures/_filedir/ext/hh.e2 | 0 test/fixtures/_filedir/ext/ii.E1 | 0 test/fixtures/_get_cword/sea | 0 test/fixtures/_get_cword/seb | 0 test/fixtures/_get_cword/sec | 0 .../\303\244\303\244\303\244\303\244\302\247" | 0 .../_known_hosts_real/.ssh/config_asterisk_1 | 1 + .../_known_hosts_real/.ssh/config_asterisk_2 | 1 + .../_known_hosts_real/.ssh/config_question_mark | 1 + .../_known_hosts_real/.ssh/config_relative_path | 1 + test/fixtures/_known_hosts_real/config | 7 + test/fixtures/_known_hosts_real/config_full_path | 1 + test/fixtures/_known_hosts_real/config_include | 7 + .../_known_hosts_real/config_include_recursion | 1 + test/fixtures/_known_hosts_real/config_tilde | 4 + .../fixtures/_known_hosts_real/gee-filename-canary | 0 test/fixtures/_known_hosts_real/known_hosts | 14 + test/fixtures/_known_hosts_real/known_hosts2 | 1 + test/fixtures/_known_hosts_real/known_hosts3 | 1 + test/fixtures/_known_hosts_real/known_hosts4 | 1 + test/fixtures/_known_hosts_real/localhost_config | 1 + test/fixtures/_known_hosts_real/localhost_hosts | 3 + test/fixtures/_known_hosts_real/spaced conf | 8 + .../fixtures/_known_hosts_real/spaced known_hosts | 4 + test/fixtures/_longopt/grep--help.txt | 70 + test/fixtures/_longopt/various.txt | 5 + test/fixtures/acroread/bar | 0 test/fixtures/acroread/foo.d/.gitignore | 0 test/fixtures/acroread/t.pdf | 0 test/fixtures/ant/.gitignore | 1 + test/fixtures/ant/build-with-import.xml | 8 + test/fixtures/ant/build.xml | 17 + test/fixtures/ant/imported-build.xml | 6 + test/fixtures/ant/named-build.xml | 6 + test/fixtures/compgen/a'b/c | 0 test/fixtures/compgen/t1.txt | 121 + test/fixtures/compgen/t2.txt | 121 + test/fixtures/compgen/t3.txt | 121 + test/fixtures/cvs/.cvspass | 2 + test/fixtures/cvs/foo/CVS/Entries | 2 + test/fixtures/cvs/foo/bar | 0 test/fixtures/cvs/foo/quux | 0 test/fixtures/dnssec-keygen/dnssec-keygen | 76 + .../dpkg/bash-completion-test-nonsubject.txt | 0 .../fixtures/dpkg/bash-completion-test-subject.deb | 0 test/fixtures/evince/.BMP | 0 test/fixtures/evince/.CBR | 0 test/fixtures/evince/.CBZ | 0 test/fixtures/evince/.DJV | 0 test/fixtures/evince/.DJVU | 0 test/fixtures/evince/.DVI | 0 test/fixtures/evince/.DVI.BZ2 | 0 test/fixtures/evince/.DVI.GZ | 0 test/fixtures/evince/.DVI.bz2 | 0 test/fixtures/evince/.DVI.gz | 0 test/fixtures/evince/.EPS | 0 test/fixtures/evince/.EPS.BZ2 | 0 test/fixtures/evince/.EPS.GZ | 0 test/fixtures/evince/.EPS.bz2 | 0 test/fixtures/evince/.EPS.gz | 0 test/fixtures/evince/.GIF | 0 test/fixtures/evince/.ICO | 0 test/fixtures/evince/.JPEG | 0 test/fixtures/evince/.JPG | 0 test/fixtures/evince/.MIFF | 0 test/fixtures/evince/.PBM | 0 test/fixtures/evince/.PCX | 0 test/fixtures/evince/.PDF | 0 test/fixtures/evince/.PDF.BZ2 | 0 test/fixtures/evince/.PDF.GZ | 0 test/fixtures/evince/.PDF.bz2 | 0 test/fixtures/evince/.PDF.gz | 0 test/fixtures/evince/.PGM | 0 test/fixtures/evince/.PNG | 0 test/fixtures/evince/.PNM | 0 test/fixtures/evince/.PPM | 0 test/fixtures/evince/.PS | 0 test/fixtures/evince/.PS.BZ2 | 0 test/fixtures/evince/.PS.GZ | 0 test/fixtures/evince/.PS.bz2 | 0 test/fixtures/evince/.PS.gz | 0 test/fixtures/evince/.TGA | 0 test/fixtures/evince/.TIF | 0 test/fixtures/evince/.TIFF | 0 test/fixtures/evince/.XPM | 0 test/fixtures/evince/.XWD | 0 test/fixtures/evince/.bmp | 0 test/fixtures/evince/.cbr | 0 test/fixtures/evince/.cbz | 0 test/fixtures/evince/.djv | 0 test/fixtures/evince/.djvu | 0 test/fixtures/evince/.dvi | 0 test/fixtures/evince/.dvi.BZ2 | 0 test/fixtures/evince/.dvi.GZ | 0 test/fixtures/evince/.dvi.bz2 | 0 test/fixtures/evince/.dvi.gz | 0 test/fixtures/evince/.eps | 0 test/fixtures/evince/.eps.BZ2 | 0 test/fixtures/evince/.eps.GZ | 0 test/fixtures/evince/.eps.bz2 | 0 test/fixtures/evince/.eps.gz | 0 test/fixtures/evince/.gif | 0 test/fixtures/evince/.ico | 0 test/fixtures/evince/.jpeg | 0 test/fixtures/evince/.jpg | 0 test/fixtures/evince/.miff | 0 test/fixtures/evince/.pbm | 0 test/fixtures/evince/.pcx | 0 test/fixtures/evince/.pdf | 0 test/fixtures/evince/.pdf.BZ2 | 0 test/fixtures/evince/.pdf.GZ | 0 test/fixtures/evince/.pdf.bz2 | 0 test/fixtures/evince/.pdf.gz | 0 test/fixtures/evince/.pgm | 0 test/fixtures/evince/.png | 0 test/fixtures/evince/.pnm | 0 test/fixtures/evince/.ppm | 0 test/fixtures/evince/.ps | 0 test/fixtures/evince/.ps.BZ2 | 0 test/fixtures/evince/.ps.GZ | 0 test/fixtures/evince/.ps.bz2 | 0 test/fixtures/evince/.ps.gz | 0 test/fixtures/evince/.tga | 0 test/fixtures/evince/.tif | 0 test/fixtures/evince/.tiff | 0 test/fixtures/evince/.txt | 0 test/fixtures/evince/.xpm | 0 test/fixtures/evince/.xwd | 0 test/fixtures/evince/foo/.gitignore | 0 test/fixtures/gdb/core | 0 test/fixtures/gdb/core-NOT | 0 test/fixtures/gdb/core.12345 | 0 ...core.weston.1000.deadbeef.5308.1555362132000000 | 0 test/fixtures/gdb/corenot | 0 test/fixtures/htpasswd/htpasswd | 2 + test/fixtures/info/bash-completion.info | 0 test/fixtures/isql/odbc.ini | 3 + test/fixtures/java/a/b$c.class | 0 test/fixtures/java/a/b.class | 0 test/fixtures/java/a/c/README.txt | 2 + test/fixtures/java/a/c/d.class | 0 test/fixtures/java/a/d.txt | 0 test/fixtures/java/bashcomp.jar | Bin 0 -> 788 bytes test/fixtures/java/bashcomp.war | 0 test/fixtures/java/no-complete.txt | 1 + test/fixtures/kdvi/.DVI | 0 test/fixtures/kdvi/.DVI.Z | 0 test/fixtures/kdvi/.DVI.bz2 | 0 test/fixtures/kdvi/.DVI.gz | 0 test/fixtures/kdvi/.dvi | 0 test/fixtures/kdvi/.dvi.Z | 0 test/fixtures/kdvi/.dvi.bz2 | 0 test/fixtures/kdvi/.dvi.gz | 0 test/fixtures/kdvi/.txt | 0 test/fixtures/kdvi/foo/.gitignore | 0 test/fixtures/kpdf/.EPS | 0 test/fixtures/kpdf/.PDF | 0 test/fixtures/kpdf/.PS | 0 test/fixtures/kpdf/.eps | 0 test/fixtures/kpdf/.pdf | 0 test/fixtures/kpdf/.ps | 0 test/fixtures/kpdf/.txt | 0 test/fixtures/kpdf/foo/.gitignore | 0 test/fixtures/lftp/.lftp/bookmarks | 3 + test/fixtures/lilo/lilo.conf | 34 + test/fixtures/make/.gitignore | 1 + test/fixtures/make/Makefile | 46 + test/fixtures/make/sample.c | 8 + test/fixtures/make/sample.d | 3 + test/fixtures/make/sample.h | 0 test/fixtures/man/man/quux.8 | 0 .../man/man1/bash-completion-testcase.1.bz2 | 0 test/fixtures/man/man1/foo.1 | 0 test/fixtures/mount/bin/showmount | 12 + test/fixtures/mount/test-fstab | 24 + test/fixtures/mplayer/.mplayer/config | 2 + test/fixtures/mplayer/.mplayer/mencoder.conf | 1 + test/fixtures/mutt/bar/.gitignore | 0 test/fixtures/mutt/bar/muttrc_b | 1 + test/fixtures/mutt/foo/.gitignore | 0 test/fixtures/mutt/foo/muttrc_f | 0 test/fixtures/mutt/muttrc | 4 + test/fixtures/nmap/nmap-h.txt | 114 + test/fixtures/perl/Devel/BashCompletion.pm | 3 + test/fixtures/perldoc/BashCompletionDoc.pod | 0 test/fixtures/perldoc/BashCompletionModule.pm | 4 + test/fixtures/pkgtools/db/a-1.0,1/.gitignore | 0 test/fixtures/pkgtools/db/b-c-d-2.0_2/.gitignore | 0 test/fixtures/pkgtools/ports/.gitignore | 2 + test/fixtures/pkgtools/ports/INDEX.dist | 3 + test/fixtures/pytest/test_async.py | 17 + .../ri/BashCompletion/cdesc-BashCompletion.ri | Bin 0 -> 197 bytes .../ri/BashCompletion/cdesc-BashCompletion.yaml | 15 + test/fixtures/ri/bashcompletion.rb | 2 + test/fixtures/ri/cache.ri | Bin 0 -> 136 bytes test/fixtures/ri/created.rid | 1 + test/fixtures/scp/config | 8 + test/fixtures/scp/known_hosts | 5 + test/fixtures/scp/spaced conf | 6 + test/fixtures/sftp/config | 8 + test/fixtures/sftp/known_hosts | 5 + test/fixtures/sftp/spaced conf | 6 + test/fixtures/shared/.ssh/known_hosts | 1 + test/fixtures/shared/bin/arp | 16 + test/fixtures/shared/bin/ifconfig | 24 + test/fixtures/shared/default/bar | 0 test/fixtures/shared/default/bar bar.d/foo | 0 test/fixtures/shared/default/foo | 1 + test/fixtures/shared/default/foo.d/foo | 0 test/fixtures/shared/empty_dir/.nothing_here | 0 test/fixtures/shared/ld.so.conf.d/foo.txt | 0 test/fixtures/shared/ld.so.conf.d/libfoo.conf | 0 test/fixtures/shared/ld.so.conf.d/libfoo.so | 0 test/fixtures/shared/ld.so.conf.d/libfoo.so.1 | 0 test/fixtures/slackware/home/abc-4-i686-1.txz | 1 + test/fixtures/slackware/home/opq-1.0-2.i386.rpm | 1 + test/fixtures/slackware/home/tcl.d/tcl.tgz | 1 + .../slackware/usr/src/slapt-src/slackbuilds_data | 20 + .../var/log/packages/radeontool-1.6.1-i486-1 | 24 + .../slackware/var/log/packages/rzip-2.1-i486-1 | 29 + test/fixtures/slackware/var/slapt-get/package_data | 47 + test/fixtures/ssh-copy-id/.ssh/id_rsa | 0 test/fixtures/ssh-copy-id/.ssh/id_rsa.pub | 1 + test/fixtures/ssh/config | 1 + test/fixtures/ssh/known_hosts | 5 + test/fixtures/ssh/spaced conf | 6 + test/fixtures/tar/archive.tar.xz | Bin 0 -> 10240 bytes test/fixtures/tar/dir/fileA | 0 test/fixtures/tar/dir/fileB | 0 test/fixtures/tar/dir/fileC | 0 test/fixtures/tar/dir/hello | 0 test/fixtures/tar/dir2/.nothing_here | 0 test/fixtures/tar/escape.tar | Bin 0 -> 10240 bytes test/fixtures/tox/tox.ini | 6 + test/fixtures/xz/a/b | 0 test/fixtures/xz/bashcomp.lzma | 0 test/fixtures/xz/bashcomp.tar | 0 test/fixtures/xz/bashcomp.tar.xz | Bin 0 -> 196 bytes test/fixtures/xz/bashcomp.tlz | 0 test/fixtures/xz/bashcomp.xz | 0 test/generate | 60 + test/requirements-dev.txt | 4 + test/requirements.txt | 5 + test/runLint | 51 + test/setup.cfg | 18 + test/t/Makefile.am | 698 +++++ test/t/conftest.py | 637 ++++ test/t/test_2to3.py | 11 + test/t/test_7z.py | 33 + test/t/test_a2ps.py | 11 + test/t/test_a2x.py | 11 + test/t/test_abook.py | 7 + test/t/test_aclocal.py | 11 + test/t/test_acpi.py | 7 + test/t/test_acroread.py | 7 + test/t/test_adb.py | 11 + test/t/test_add_members.py | 7 + test/t/test_alias.py | 21 + test/t/test_alpine.py | 7 + test/t/test_animate.py | 7 + test/t/test_ant.py | 35 + test/t/test_apache2ctl.py | 7 + test/t/test_appdata_validate.py | 12 + test/t/test_apt_build.py | 8 + test/t/test_apt_cache.py | 17 + test/t/test_apt_get.py | 16 + test/t/test_aptitude.py | 23 + test/t/test_arch.py | 8 + test/t/test_arp.py | 13 + test/t/test_arping.py | 11 + test/t/test_arpspoof.py | 12 + test/t/test_asciidoc.py | 11 + test/t/test_aspell.py | 7 + test/t/test_autoconf.py | 7 + test/t/test_autoheader.py | 7 + test/t/test_automake.py | 11 + test/t/test_autoreconf.py | 7 + test/t/test_autorpm.py | 7 + test/t/test_autoscan.py | 11 + test/t/test_autossh.py | 7 + test/t/test_autoupdate.py | 7 + test/t/test_avctrl.py | 7 + test/t/test_awk.py | 11 + test/t/test_badblocks.py | 12 + test/t/test_base64.py | 11 + test/t/test_bash.py | 7 + test/t/test_bc.py | 7 + test/t/test_bind.py | 11 + test/t/test_bison.py | 7 + test/t/test_bk.py | 7 + test/t/test_bmake.py | 7 + test/t/test_brctl.py | 7 + test/t/test_btdownloadcurses_py.py | 8 + test/t/test_btdownloadgui_py.py | 8 + test/t/test_btdownloadheadless_py.py | 8 + test/t/test_bts.py | 11 + test/t/test_bzip2.py | 15 + test/t/test_cal.py | 11 + test/t/test_cancel.py | 34 + test/t/test_cardctl.py | 7 + test/t/test_carton.py | 11 + test/t/test_cat.py | 11 + test/t/test_cc.py | 7 + test/t/test_ccache.py | 27 + test/t/test_ccze.py | 19 + test/t/test_cd.py | 26 + test/t/test_cdrecord.py | 7 + test/t/test_cfagent.py | 7 + test/t/test_cfrun.py | 7 + test/t/test_chage.py | 11 + test/t/test_change_pw.py | 8 + test/t/test_check_db.py | 7 + test/t/test_check_perms.py | 7 + test/t/test_checksec.py | 7 + test/t/test_chfn.py | 7 + test/t/test_chgrp.py | 7 + test/t/test_chkconfig.py | 15 + test/t/test_chmod.py | 25 + test/t/test_chown.py | 82 + test/t/test_chpasswd.py | 7 + test/t/test_chromium_browser.py | 25 + test/t/test_chronyc.py | 11 + test/t/test_chroot.py | 16 + test/t/test_chrpath.py | 11 + test/t/test_chsh.py | 15 + test/t/test_ci.py | 7 + test/t/test_ciptool.py | 7 + test/t/test_civclient.py | 7 + test/t/test_civserver.py | 7 + test/t/test_cksfv.py | 7 + test/t/test_cleanarch.py | 8 + test/t/test_clisp.py | 7 + test/t/test_clone_member.py | 7 + test/t/test_co.py | 7 + test/t/test_colordiff.py | 11 + test/t/test_compare.py | 7 + test/t/test_compgen.py | 7 + test/t/test_complete.py | 11 + test/t/test_composite.py | 7 + test/t/test_config_list.py | 7 + test/t/test_configure.py | 17 + test/t/test_conjure.py | 7 + test/t/test_convert.py | 15 + test/t/test_cowsay.py | 7 + test/t/test_cp.py | 11 + test/t/test_cpan2dist.py | 9 + test/t/test_cpio.py | 12 + test/t/test_cplusplus.py | 8 + test/t/test_cppcheck.py | 31 + test/t/test_createdb.py | 11 + test/t/test_createuser.py | 11 + test/t/test_crontab.py | 16 + test/t/test_cryptsetup.py | 11 + test/t/test_csplit.py | 11 + test/t/test_curl.py | 28 + test/t/test_cut.py | 11 + test/t/test_cvs.py | 20 + test/t/test_cvsps.py | 12 + test/t/test_date.py | 11 + test/t/test_dcop.py | 7 + test/t/test_dd.py | 17 + test/t/test_declare.py | 20 + test/t/test_deja_dup.py | 12 + test/t/test_desktop_file_validate.py | 12 + test/t/test_df.py | 11 + test/t/test_dfutool.py | 7 + test/t/test_dhclient.py | 7 + test/t/test_dict.py | 7 + test/t/test_diff.py | 7 + test/t/test_dir.py | 11 + test/t/test_display.py | 11 + test/t/test_dmesg.py | 7 + test/t/test_dmypy.py | 14 + test/t/test_dnssec_keygen.py | 80 + test/t/test_dnsspoof.py | 7 + test/t/test_dot.py | 7 + test/t/test_dpkg.py | 15 + test/t/test_dpkg_deb.py | 12 + test/t/test_dpkg_query.py | 18 + test/t/test_dpkg_reconfigure.py | 8 + test/t/test_dpkg_source.py | 8 + test/t/test_dropdb.py | 11 + test/t/test_dropuser.py | 7 + test/t/test_dselect.py | 11 + test/t/test_dsniff.py | 7 + test/t/test_du.py | 11 + test/t/test_dumpdb.py | 8 + test/t/test_dumpe2fs.py | 11 + test/t/test_e2freefrag.py | 11 + test/t/test_e2label.py | 7 + test/t/test_ebtables.py | 7 + test/t/test_ecryptfs_migrate_home.py | 12 + test/t/test_eject.py | 7 + test/t/test_enscript.py | 7 + test/t/test_env.py | 7 + test/t/test_eog.py | 11 + test/t/test_ether_wake.py | 18 + test/t/test_etherwake.py | 7 + test/t/test_evince.py | 22 + test/t/test_expand.py | 7 + test/t/test_explodepkg.py | 23 + test/t/test_export.py | 36 + test/t/test_faillog.py | 7 + test/t/test_fbgs.py | 7 + test/t/test_fbi.py | 7 + test/t/test_feh.py | 31 + test/t/test_file.py | 11 + test/t/test_file_roller.py | 8 + test/t/test_filefrag.py | 11 + test/t/test_filesnarf.py | 7 + test/t/test_find.py | 37 + test/t/test_find_member.py | 7 + test/t/test_finger.py | 33 + test/t/test_fio.py | 15 + test/t/test_firefox.py | 12 + test/t/test_flake8.py | 17 + test/t/test_fmt.py | 9 + test/t/test_fold.py | 7 + test/t/test_freebsd_update.py | 8 + test/t/test_freeciv.py | 7 + test/t/test_freeciv_server.py | 8 + test/t/test_function.py | 7 + test/t/test_fusermount.py | 11 + test/t/test_g4.py | 7 + test/t/test_g77.py | 7 + test/t/test_gcc.py | 64 + test/t/test_gcj.py | 7 + test/t/test_gcl.py | 7 + test/t/test_gdb.py | 14 + test/t/test_genaliases.py | 8 + test/t/test_gendiff.py | 7 + test/t/test_genisoimage.py | 11 + test/t/test_geoiplookup.py | 7 + test/t/test_getconf.py | 25 + test/t/test_getent.py | 18 + test/t/test_gkrellm.py | 10 + test/t/test_gm.py | 19 + test/t/test_gmplayer.py | 7 + test/t/test_gnatmake.py | 7 + test/t/test_gnokii.py | 11 + test/t/test_gnome_mplayer.py | 17 + test/t/test_gnome_screenshot.py | 8 + test/t/test_gpasswd.py | 11 + test/t/test_gpc.py | 7 + test/t/test_gperf.py | 7 + test/t/test_gpg.py | 7 + test/t/test_gpg2.py | 7 + test/t/test_gpgv.py | 15 + test/t/test_gphoto2.py | 7 + test/t/test_gplusplus.py | 8 + test/t/test_gprof.py | 7 + test/t/test_grep.py | 16 + test/t/test_groupadd.py | 11 + test/t/test_groupdel.py | 11 + test/t/test_groupmems.py | 7 + test/t/test_groupmod.py | 11 + test/t/test_growisofs.py | 7 + test/t/test_grpck.py | 11 + test/t/test_grub.py | 7 + test/t/test_gssdp_discover.py | 22 + test/t/test_gzip.py | 15 + test/t/test_hciattach.py | 7 + test/t/test_hciconfig.py | 7 + test/t/test_hcitool.py | 11 + test/t/test_hddtemp.py | 7 + test/t/test_head.py | 7 + test/t/test_hexdump.py | 7 + test/t/test_hid2hci.py | 8 + test/t/test_host.py | 7 + test/t/test_hostname.py | 7 + test/t/test_hping2.py | 11 + test/t/test_hping3.py | 7 + test/t/test_htop.py | 7 + test/t/test_htpasswd.py | 23 + test/t/test_hunspell.py | 11 + test/t/test_hwclock.py | 7 + test/t/test_iconv.py | 21 + test/t/test_id.py | 7 + test/t/test_identify.py | 7 + test/t/test_idn.py | 7 + test/t/test_ifdown.py | 14 + test/t/test_ifstat.py | 21 + test/t/test_iftop.py | 11 + test/t/test_ifup.py | 20 + test/t/test_import.py | 7 + test/t/test_influx.py | 15 + test/t/test_info.py | 12 + test/t/test_inject.py | 8 + test/t/test_inotifywait.py | 15 + test/t/test_inotifywatch.py | 15 + test/t/test_insmod.py | 7 + test/t/test_installpkg.py | 39 + test/t/test_interdiff.py | 11 + test/t/test_invoke_rc_d.py | 14 + test/t/test_ionice.py | 7 + test/t/test_ip.py | 15 + test/t/test_ipcalc.py | 23 + test/t/test_iperf.py | 24 + test/t/test_iperf3.py | 20 + test/t/test_ipmitool.py | 11 + test/t/test_ipsec.py | 7 + test/t/test_iptables.py | 7 + test/t/test_ipv6calc.py | 11 + test/t/test_irb.py | 11 + test/t/test_iscsiadm.py | 7 + test/t/test_isort.py | 11 + test/t/test_isql.py | 8 + test/t/test_iwconfig.py | 7 + test/t/test_iwlist.py | 7 + test/t/test_iwpriv.py | 7 + test/t/test_iwspy.py | 7 + test/t/test_jar.py | 7 + test/t/test_jarsigner.py | 7 + test/t/test_java.py | 49 + test/t/test_javac.py | 11 + test/t/test_javadoc.py | 17 + test/t/test_javaws.py | 11 + test/t/test_jpegoptim.py | 11 + test/t/test_jps.py | 7 + test/t/test_jq.py | 30 + test/t/test_jshint.py | 11 + test/t/test_json_xs.py | 11 + test/t/test_jsonschema.py | 13 + test/t/test_k3b.py | 11 + test/t/test_kcov.py | 16 + test/t/test_kdvi.py | 10 + test/t/test_kill.py | 15 + test/t/test_killall.py | 21 + test/t/test_kldload.py | 7 + test/t/test_kldunload.py | 16 + test/t/test_koji.py | 11 + test/t/test_kpdf.py | 7 + test/t/test_kplayer.py | 7 + test/t/test_ktutil.py | 11 + test/t/test_l2ping.py | 7 + test/t/test_larch.py | 7 + test/t/test_lastlog.py | 7 + test/t/test_ld.py | 11 + test/t/test_ldapadd.py | 7 + test/t/test_ldapcompare.py | 7 + test/t/test_ldapdelete.py | 7 + test/t/test_ldapmodrdn.py | 7 + test/t/test_ldappasswd.py | 7 + test/t/test_ldapsearch.py | 7 + test/t/test_ldapvi.py | 7 + test/t/test_ldapwhoami.py | 7 + test/t/test_ldd.py | 13 + test/t/test_less.py | 11 + test/t/test_lftp.py | 16 + test/t/test_lftpget.py | 7 + test/t/test_lilo.py | 16 + test/t/test_links.py | 11 + test/t/test_lintian.py | 7 + test/t/test_lintian_info.py | 12 + test/t/test_lisp.py | 7 + test/t/test_list_admins.py | 7 + test/t/test_list_lists.py | 7 + test/t/test_list_members.py | 7 + test/t/test_list_owners.py | 8 + test/t/test_ln.py | 11 + test/t/test_locale_gen.py | 13 + test/t/test_look.py | 16 + test/t/test_lpq.py | 7 + test/t/test_lpr.py | 7 + test/t/test_lrzip.py | 15 + test/t/test_ls.py | 40 + test/t/test_lsof.py | 11 + test/t/test_lspci.py | 13 + test/t/test_lsscsi.py | 11 + test/t/test_lsusb.py | 10 + test/t/test_lua.py | 11 + test/t/test_luac.py | 11 + test/t/test_luseradd.py | 7 + test/t/test_luserdel.py | 11 + test/t/test_lusermod.py | 7 + test/t/test_lvchange.py | 9 + test/t/test_lvcreate.py | 9 + test/t/test_lvdisplay.py | 11 + test/t/test_lvextend.py | 9 + test/t/test_lvm.py | 7 + test/t/test_lvmdiskscan.py | 11 + test/t/test_lvreduce.py | 9 + test/t/test_lvremove.py | 9 + test/t/test_lvrename.py | 9 + test/t/test_lvresize.py | 9 + test/t/test_lvs.py | 9 + test/t/test_lvscan.py | 9 + test/t/test_lz4.py | 15 + test/t/test_lzip.py | 11 + test/t/test_lzma.py | 19 + test/t/test_lzop.py | 11 + test/t/test_m4.py | 9 + test/t/test_macof.py | 7 + test/t/test_mailmanctl.py | 8 + test/t/test_mailsnarf.py | 7 + test/t/test_make.py | 47 + test/t/test_makepkg.py | 17 + test/t/test_man.py | 115 + test/t/test_mc.py | 7 + test/t/test_mcrypt.py | 19 + test/t/test_md5sum.py | 11 + test/t/test_mdadm.py | 7 + test/t/test_mdecrypt.py | 7 + test/t/test_mdtool.py | 7 + test/t/test_medusa.py | 7 + test/t/test_mencoder.py | 12 + test/t/test_mii_diag.py | 12 + test/t/test_mii_tool.py | 12 + test/t/test_minicom.py | 7 + test/t/test_mkdir.py | 21 + test/t/test_mkfifo.py | 11 + test/t/test_mkinitrd.py | 7 + test/t/test_mkisofs.py | 15 + test/t/test_mknod.py | 11 + test/t/test_mktemp.py | 7 + test/t/test_mmsitepass.py | 7 + test/t/test_mock.py | 13 + test/t/test_modinfo.py | 32 + test/t/test_modprobe.py | 36 + test/t/test_module.py | 7 + test/t/test_mogrify.py | 7 + test/t/test_monodevelop.py | 11 + test/t/test_montage.py | 7 + test/t/test_mount.py | 22 + test/t/test_mplayer.py | 12 + test/t/test_mr.py | 58 + test/t/test_msgsnarf.py | 7 + test/t/test_msynctool.py | 7 + test/t/test_mtx.py | 7 + test/t/test_munin_node_configure.py | 19 + test/t/test_munin_run.py | 8 + test/t/test_munindoc.py | 10 + test/t/test_mussh.py | 7 + test/t/test_mutt.py | 33 + test/t/test_muttng.py | 7 + test/t/test_mv.py | 11 + test/t/test_mypy.py | 15 + test/t/test_mysql.py | 15 + test/t/test_mysqladmin.py | 7 + test/t/test_nc.py | 7 + test/t/test_ncftp.py | 11 + test/t/test_nethogs.py | 11 + test/t/test_netstat.py | 11 + test/t/test_newgrp.py | 7 + test/t/test_newlist.py | 7 + test/t/test_newusers.py | 11 + test/t/test_ngrep.py | 11 + test/t/test_nl.py | 11 + test/t/test_nm.py | 11 + test/t/test_nmap.py | 47 + test/t/test_nmcli.py | 7 + test/t/test_nproc.py | 17 + test/t/test_nslookup.py | 7 + test/t/test_nsupdate.py | 11 + test/t/test_ntpdate.py | 7 + test/t/test_objcopy.py | 11 + test/t/test_objdump.py | 7 + test/t/test_od.py | 11 + test/t/test_oggdec.py | 11 + test/t/test_op.py | 11 + test/t/test_openssl.py | 16 + test/t/test_opera.py | 11 + test/t/test_optipng.py | 11 + test/t/test_p4.py | 7 + test/t/test_pack200.py | 7 + test/t/test_passwd.py | 11 + test/t/test_paste.py | 11 + test/t/test_patch.py | 11 + test/t/test_pdftotext.py | 11 + test/t/test_perl.py | 91 + test/t/test_perlcritic.py | 15 + test/t/test_perldoc.py | 18 + test/t/test_perltidy.py | 19 + test/t/test_pgrep.py | 35 + test/t/test_phing.py | 11 + test/t/test_pidof.py | 15 + test/t/test_pine.py | 7 + test/t/test_pinfo.py | 12 + test/t/test_ping.py | 11 + test/t/test_pkg_config.py | 12 + test/t/test_pkg_deinstall.py | 15 + test/t/test_pkg_delete.py | 7 + test/t/test_pkg_get.py | 8 + test/t/test_pkg_info.py | 7 + test/t/test_pkgadd.py | 8 + test/t/test_pkgrm.py | 8 + test/t/test_pkgtool.py | 7 + test/t/test_pkgutil.py | 7 + test/t/test_pkill.py | 11 + test/t/test_plague_client.py | 8 + test/t/test_pm_hibernate.py | 8 + test/t/test_pm_is_supported.py | 8 + test/t/test_pm_powersave.py | 8 + test/t/test_pngfix.py | 11 + test/t/test_portinstall.py | 27 + test/t/test_portsnap.py | 7 + test/t/test_portupgrade.py | 8 + test/t/test_postcat.py | 11 + test/t/test_postconf.py | 20 + test/t/test_postfix.py | 22 + test/t/test_postmap.py | 11 + test/t/test_postsuper.py | 7 + test/t/test_povray.py | 7 + test/t/test_pr.py | 11 + test/t/test_prelink.py | 11 + test/t/test_printenv.py | 19 + test/t/test_protoc.py | 20 + test/t/test_psql.py | 11 + test/t/test_ptx.py | 11 + test/t/test_puppet.py | 11 + test/t/test_pushd.py | 7 + test/t/test_pv.py | 15 + test/t/test_pvchange.py | 9 + test/t/test_pvcreate.py | 9 + test/t/test_pvdisplay.py | 11 + test/t/test_pvmove.py | 9 + test/t/test_pvremove.py | 9 + test/t/test_pvs.py | 9 + test/t/test_pvscan.py | 9 + test/t/test_pwck.py | 11 + test/t/test_pwd.py | 7 + test/t/test_pwdx.py | 19 + test/t/test_pwgen.py | 7 + test/t/test_pycodestyle.py | 15 + test/t/test_pydoc.py | 11 + test/t/test_pydocstyle.py | 13 + test/t/test_pyflakes.py | 11 + test/t/test_pylint.py | 11 + test/t/test_pylint_3.py | 12 + test/t/test_pytest.py | 50 + test/t/test_python.py | 39 + test/t/test_python3.py | 39 + test/t/test_pyvenv.py | 7 + test/t/test_qemu.py | 11 + test/t/test_qrunner.py | 7 + test/t/test_querybts.py | 7 + test/t/test_quota.py | 11 + test/t/test_quotacheck.py | 7 + test/t/test_quotaon.py | 7 + test/t/test_radvdump.py | 11 + test/t/test_rcs.py | 7 + test/t/test_rcsdiff.py | 7 + test/t/test_rdesktop.py | 7 + test/t/test_rdict.py | 7 + test/t/test_readelf.py | 7 + test/t/test_readonly.py | 7 + test/t/test_remove_members.py | 7 + test/t/test_removepkg.py | 15 + test/t/test_renice.py | 11 + test/t/test_repomanage.py | 11 + test/t/test_reportbug.py | 7 + test/t/test_reptyr.py | 11 + test/t/test_resolvconf.py | 7 + test/t/test_rfcomm.py | 7 + test/t/test_rfkill.py | 11 + test/t/test_ri.py | 16 + test/t/test_rlog.py | 7 + test/t/test_rm.py | 11 + test/t/test_rmdir.py | 16 + test/t/test_rmlist.py | 7 + test/t/test_rmmod.py | 7 + test/t/test_route.py | 7 + test/t/test_rpcdebug.py | 7 + test/t/test_rpm.py | 15 + test/t/test_rpm2tgz.py | 26 + test/t/test_rpmbuild.py | 7 + test/t/test_rrdtool.py | 7 + test/t/test_rsync.py | 16 + test/t/test_rtcwake.py | 11 + test/t/test_runuser.py | 7 + test/t/test_sbcl.py | 7 + test/t/test_sbcl_mt.py | 8 + test/t/test_sbopkg.py | 7 + test/t/test_scp.py | 79 + test/t/test_screen.py | 48 + test/t/test_scrub.py | 19 + test/t/test_sdptool.py | 7 + test/t/test_secret_tool.py | 12 + test/t/test_sed.py | 7 + test/t/test_seq.py | 7 + test/t/test_service.py | 7 + test/t/test_set.py | 7 + test/t/test_setquota.py | 11 + test/t/test_sftp.py | 46 + test/t/test_sh.py | 19 + test/t/test_sha1sum.py | 7 + test/t/test_shar.py | 7 + test/t/test_shellcheck.py | 19 + test/t/test_sitecopy.py | 7 + test/t/test_slackpkg.py | 7 + test/t/test_slapt_get.py | 44 + test/t/test_slapt_src.py | 43 + test/t/test_smartctl.py | 7 + test/t/test_smbcacls.py | 7 + test/t/test_smbclient.py | 7 + test/t/test_smbcquotas.py | 7 + test/t/test_smbget.py | 7 + test/t/test_smbpasswd.py | 7 + test/t/test_smbtar.py | 7 + test/t/test_smbtree.py | 7 + test/t/test_snownews.py | 7 + test/t/test_sort.py | 7 + test/t/test_split.py | 7 + test/t/test_spovray.py | 7 + test/t/test_sqlite3.py | 15 + test/t/test_ss.py | 15 + test/t/test_ssh.py | 60 + test/t/test_ssh_add.py | 17 + test/t/test_ssh_copy_id.py | 16 + test/t/test_ssh_keygen.py | 59 + test/t/test_sshfs.py | 8 + test/t/test_sshmitm.py | 7 + test/t/test_sshow.py | 7 + test/t/test_strace.py | 7 + test/t/test_stream.py | 7 + test/t/test_strings.py | 11 + test/t/test_strip.py | 7 + test/t/test_su.py | 11 + test/t/test_sudo.py | 83 + test/t/test_sum.py | 11 + test/t/test_svcadm.py | 7 + test/t/test_svk.py | 7 + test/t/test_svn.py | 7 + test/t/test_svnadmin.py | 7 + test/t/test_svnlook.py | 7 + test/t/test_sync_members.py | 7 + test/t/test_synclient.py | 16 + test/t/test_sysbench.py | 11 + test/t/test_sysctl.py | 15 + test/t/test_tac.py | 7 + test/t/test_tail.py | 7 + test/t/test_tar.py | 120 + test/t/test_tcpdump.py | 7 + test/t/test_tcpkill.py | 7 + test/t/test_tcpnice.py | 7 + test/t/test_tee.py | 11 + test/t/test_texindex.py | 7 + test/t/test_tightvncviewer.py | 7 + test/t/test_time.py | 23 + test/t/test_timeout.py | 11 + test/t/test_tipc.py | 7 + test/t/test_totem.py | 7 + test/t/test_touch.py | 7 + test/t/test_tox.py | 19 + test/t/test_tr.py | 7 + test/t/test_tracepath.py | 11 + test/t/test_tshark.py | 34 + test/t/test_tsig_keygen.py | 12 + test/t/test_tune2fs.py | 11 + test/t/test_udevadm.py | 11 + test/t/test_ulimit.py | 35 + test/t/test_umount.py | 85 + test/t/test_unace.py | 7 + test/t/test_uname.py | 7 + test/t/test_unexpand.py | 7 + test/t/test_uniq.py | 7 + test/t/test_units.py | 9 + test/t/test_unpack200.py | 7 + test/t/test_unrar.py | 7 + test/t/test_unset.py | 7 + test/t/test_unshunt.py | 7 + test/t/test_update_alternatives.py | 8 + test/t/test_update_rc_d.py | 8 + test/t/test_upgradepkg.py | 51 + test/t/test_urlsnarf.py | 7 + test/t/test_uscan.py | 7 + test/t/test_useradd.py | 11 + test/t/test_userdel.py | 11 + test/t/test_usermod.py | 11 + test/t/test_valgrind.py | 42 + test/t/test_vdir.py | 11 + test/t/test_vgcfgbackup.py | 11 + test/t/test_vgcfgrestore.py | 11 + test/t/test_vgchange.py | 9 + test/t/test_vgck.py | 9 + test/t/test_vgconvert.py | 9 + test/t/test_vgcreate.py | 13 + test/t/test_vgdisplay.py | 9 + test/t/test_vgexport.py | 9 + test/t/test_vgextend.py | 9 + test/t/test_vgimport.py | 9 + test/t/test_vgmerge.py | 9 + test/t/test_vgmknodes.py | 9 + test/t/test_vgreduce.py | 9 + test/t/test_vgremove.py | 9 + test/t/test_vgrename.py | 9 + test/t/test_vgs.py | 9 + test/t/test_vgscan.py | 9 + test/t/test_vgsplit.py | 9 + test/t/test_vi.py | 11 + test/t/test_vipw.py | 7 + test/t/test_vmstat.py | 7 + test/t/test_vncviewer.py | 8 + test/t/test_vpnc.py | 13 + test/t/test_watch.py | 7 + test/t/test_wc.py | 7 + test/t/test_webmitm.py | 7 + test/t/test_wget.py | 11 + test/t/test_who.py | 9 + test/t/test_wine.py | 11 + test/t/test_withlist.py | 7 + test/t/test_wodim.py | 7 + test/t/test_wol.py | 20 + test/t/test_write.py | 7 + test/t/test_wsimport.py | 18 + test/t/test_wtf.py | 8 + test/t/test_wvdial.py | 7 + test/t/test_xdg_mime.py | 28 + test/t/test_xdg_settings.py | 16 + test/t/test_xfreerdp.py | 60 + test/t/test_xgamma.py | 12 + test/t/test_xhost.py | 22 + test/t/test_xm.py | 7 + test/t/test_xmllint.py | 11 + test/t/test_xmlwf.py | 11 + test/t/test_xmms.py | 11 + test/t/test_xmodmap.py | 11 + test/t/test_xpovray.py | 7 + test/t/test_xrandr.py | 15 + test/t/test_xrdb.py | 11 + test/t/test_xsltproc.py | 11 + test/t/test_xvfb_run.py | 12 + test/t/test_xvnc4viewer.py | 15 + test/t/test_xxd.py | 11 + test/t/test_xz.py | 26 + test/t/test_xzdec.py | 11 + test/t/test_ypcat.py | 7 + test/t/test_ypmatch.py | 8 + test/t/test_yum.py | 7 + test/t/test_yum_arch.py | 8 + test/t/test_zopfli.py | 15 + test/t/test_zopflipng.py | 11 + test/t/unit/Makefile.am | 24 + test/t/unit/test_unit_count_args.py | 66 + test/t/unit/test_unit_expand.py | 31 + test/t/unit/test_unit_expand_tilde_by_ref.py | 46 + test/t/unit/test_unit_filedir.py | 235 ++ .../unit/test_unit_find_unique_completion_pair.py | 55 + test/t/unit/test_unit_get_comp_words_by_ref.py | 260 ++ test/t/unit/test_unit_get_cword.py | 154 + test/t/unit/test_unit_init_completion.py | 34 + test/t/unit/test_unit_ip_addresses.py | 49 + test/t/unit/test_unit_known_hosts_real.py | 158 + test/t/unit/test_unit_longopt.py | 52 + test/t/unit/test_unit_parse_help.py | 183 ++ test/t/unit/test_unit_parse_usage.py | 69 + test/t/unit/test_unit_quote.py | 36 + test/t/unit/test_unit_quote_readline.py | 15 + test/t/unit/test_unit_tilde.py | 42 + test/t/unit/test_unit_variables.py | 41 + test/t/unit/test_unit_xinetd_services.py | 22 + test/test-cmd-list.txt | 687 +++++ test/update-test-cmd-list | 13 + 1483 files changed, 50639 insertions(+) create mode 100644 .dir-locals.el create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .markdownlint.yaml create mode 100644 .perltidyrc create mode 100644 .pre-commit-config.yaml create mode 100644 .shellcheckrc create mode 100644 .travis.yml create mode 100644 AUTHORS create mode 100644 CHANGES create mode 100644 CONTRIBUTING.md create mode 100644 COPYING create mode 100644 Makefile.am create mode 100644 README.md create mode 100644 bash-completion-config-version.cmake.in create mode 100644 bash-completion-config.cmake.in create mode 100644 bash-completion.pc.in create mode 100644 bash_completion create mode 100644 bash_completion.sh.in create mode 100644 completions/.gitignore create mode 100644 completions/2to3 create mode 100644 completions/7z create mode 100644 completions/Makefile.am create mode 100644 completions/_adb create mode 100644 completions/_cal create mode 100644 completions/_chfn create mode 100644 completions/_chsh create mode 100644 completions/_dmesg create mode 100644 completions/_eject create mode 100644 completions/_hexdump create mode 100644 completions/_hwclock create mode 100644 completions/_ionice create mode 100644 completions/_look create mode 100644 completions/_mock create mode 100644 completions/_modules create mode 100644 completions/_mount create mode 100644 completions/_mount.linux create mode 100644 completions/_newgrp create mode 100644 completions/_nmcli create mode 100644 completions/_renice create mode 100644 completions/_repomanage create mode 100644 completions/_reptyr create mode 100644 completions/_rfkill create mode 100644 completions/_rtcwake create mode 100644 completions/_runuser create mode 100644 completions/_su create mode 100644 completions/_svn create mode 100644 completions/_svnadmin create mode 100644 completions/_svnlook create mode 100644 completions/_udevadm create mode 100644 completions/_umount create mode 100644 completions/_umount.linux create mode 100644 completions/_write create mode 100644 completions/_xm create mode 100644 completions/_yum create mode 100644 completions/a2x create mode 100644 completions/abook create mode 100644 completions/aclocal create mode 100644 completions/acpi create mode 100644 completions/add_members create mode 100644 completions/alias create mode 100644 completions/ant create mode 100644 completions/apache2ctl create mode 100644 completions/appdata-validate create mode 100644 completions/apt-build create mode 100644 completions/apt-cache create mode 100644 completions/apt-get create mode 100644 completions/aptitude create mode 100644 completions/arch create mode 100644 completions/arp create mode 100644 completions/arping create mode 100644 completions/arpspoof create mode 100644 completions/asciidoc create mode 100644 completions/aspell create mode 100644 completions/autoconf create mode 100644 completions/automake create mode 100644 completions/autoreconf create mode 100644 completions/autorpm create mode 100644 completions/autoscan create mode 100644 completions/avctrl create mode 100644 completions/badblocks create mode 100644 completions/bind create mode 100644 completions/bk create mode 100644 completions/brctl create mode 100644 completions/btdownloadheadless.py create mode 100644 completions/bts create mode 100644 completions/bzip2 create mode 100644 completions/cancel create mode 100644 completions/cardctl create mode 100644 completions/carton create mode 100644 completions/ccache create mode 100644 completions/ccze create mode 100644 completions/cfagent create mode 100644 completions/cfrun create mode 100644 completions/chage create mode 100644 completions/change_pw create mode 100644 completions/check_db create mode 100644 completions/check_perms create mode 100644 completions/checksec create mode 100644 completions/chgrp create mode 100644 completions/chkconfig create mode 100644 completions/chmod create mode 100644 completions/chown create mode 100644 completions/chpasswd create mode 100644 completions/chromium-browser create mode 100644 completions/chronyc create mode 100644 completions/chrpath create mode 100644 completions/cksfv create mode 100644 completions/cleanarch create mode 100644 completions/clisp create mode 100644 completions/clone_member create mode 100644 completions/complete create mode 100644 completions/config_list create mode 100644 completions/configure create mode 100644 completions/convert create mode 100644 completions/cowsay create mode 100644 completions/cpan2dist create mode 100644 completions/cpio create mode 100644 completions/cppcheck create mode 100644 completions/crontab create mode 100644 completions/cryptsetup create mode 100644 completions/curl create mode 100644 completions/cvs create mode 100644 completions/cvsps create mode 100644 completions/dd create mode 100644 completions/deja-dup create mode 100644 completions/desktop-file-validate create mode 100644 completions/dhclient create mode 100644 completions/dict create mode 100644 completions/dmypy create mode 100644 completions/dnssec-keygen create mode 100644 completions/dnsspoof create mode 100644 completions/dot create mode 100644 completions/dpkg create mode 100644 completions/dpkg-source create mode 100644 completions/dselect create mode 100644 completions/dsniff create mode 100644 completions/dumpdb create mode 100644 completions/dumpe2fs create mode 100644 completions/e2freefrag create mode 100644 completions/e2label create mode 100644 completions/ebtables create mode 100644 completions/ecryptfs-migrate-home create mode 100644 completions/eog create mode 100644 completions/ether-wake create mode 100644 completions/evince create mode 100644 completions/explodepkg create mode 100644 completions/export create mode 100644 completions/faillog create mode 100644 completions/fbgs create mode 100644 completions/fbi create mode 100644 completions/feh create mode 100644 completions/file create mode 100644 completions/file-roller create mode 100644 completions/filefrag create mode 100644 completions/filesnarf create mode 100644 completions/find create mode 100644 completions/find_member create mode 100644 completions/fio create mode 100644 completions/firefox create mode 100644 completions/flake8 create mode 100644 completions/freebsd-update create mode 100644 completions/freeciv create mode 100644 completions/freeciv-server create mode 100644 completions/function create mode 100644 completions/fusermount create mode 100644 completions/gcc create mode 100644 completions/gcl create mode 100644 completions/gdb create mode 100644 completions/genaliases create mode 100644 completions/gendiff create mode 100644 completions/genisoimage create mode 100644 completions/geoiplookup create mode 100644 completions/getconf create mode 100644 completions/getent create mode 100644 completions/gkrellm create mode 100644 completions/gm create mode 100644 completions/gnatmake create mode 100644 completions/gnokii create mode 100644 completions/gnome-mplayer create mode 100644 completions/gnome-screenshot create mode 100644 completions/gpasswd create mode 100644 completions/gpg create mode 100644 completions/gpg2 create mode 100644 completions/gpgv create mode 100644 completions/gphoto2 create mode 100644 completions/gprof create mode 100644 completions/groupadd create mode 100644 completions/groupdel create mode 100644 completions/groupmems create mode 100644 completions/groupmod create mode 100644 completions/growisofs create mode 100644 completions/grpck create mode 100644 completions/gssdp-discover create mode 100644 completions/gzip create mode 100644 completions/hcitool create mode 100644 completions/hddtemp create mode 100644 completions/hid2hci create mode 100644 completions/hostname create mode 100644 completions/hping2 create mode 100644 completions/htop create mode 100644 completions/htpasswd create mode 100644 completions/hunspell create mode 100644 completions/iconv create mode 100644 completions/id create mode 100644 completions/idn create mode 100644 completions/ifstat create mode 100644 completions/iftop create mode 100644 completions/ifup create mode 100644 completions/influx create mode 100644 completions/info create mode 100644 completions/inject create mode 100644 completions/inotifywait create mode 100644 completions/insmod create mode 100644 completions/installpkg create mode 100644 completions/interdiff create mode 100644 completions/invoke-rc.d create mode 100644 completions/ip create mode 100644 completions/ipcalc create mode 100644 completions/iperf create mode 100644 completions/ipmitool create mode 100644 completions/ipsec create mode 100644 completions/iptables create mode 100644 completions/ipv6calc create mode 100644 completions/iscsiadm create mode 100644 completions/isort create mode 100644 completions/isql create mode 100644 completions/iwconfig create mode 100644 completions/iwlist create mode 100644 completions/iwpriv create mode 100644 completions/iwspy create mode 100644 completions/jar create mode 100644 completions/jarsigner create mode 100644 completions/java create mode 100644 completions/javaws create mode 100644 completions/jpegoptim create mode 100644 completions/jps create mode 100644 completions/jq create mode 100644 completions/jshint create mode 100644 completions/json_xs create mode 100644 completions/jsonschema create mode 100644 completions/k3b create mode 100644 completions/kcov create mode 100644 completions/kill create mode 100644 completions/killall create mode 100644 completions/kldload create mode 100644 completions/kldunload create mode 100644 completions/koji create mode 100644 completions/ktutil create mode 100644 completions/larch create mode 100644 completions/lastlog create mode 100644 completions/ldapsearch create mode 100644 completions/ldapvi create mode 100644 completions/lftp create mode 100644 completions/lftpget create mode 100644 completions/lilo create mode 100644 completions/links create mode 100644 completions/lintian create mode 100644 completions/lisp create mode 100644 completions/list_admins create mode 100644 completions/list_lists create mode 100644 completions/list_members create mode 100644 completions/list_owners create mode 100644 completions/locale-gen create mode 100644 completions/lpq create mode 100644 completions/lpr create mode 100644 completions/lrzip create mode 100644 completions/lsof create mode 100644 completions/lspci create mode 100644 completions/lsscsi create mode 100644 completions/lsusb create mode 100644 completions/lua create mode 100644 completions/luac create mode 100644 completions/luseradd create mode 100644 completions/luserdel create mode 100644 completions/lvm create mode 100644 completions/lz4 create mode 100644 completions/lzip create mode 100644 completions/lzma create mode 100644 completions/lzop create mode 100644 completions/macof create mode 100644 completions/mailmanctl create mode 100644 completions/make create mode 100644 completions/makepkg create mode 100644 completions/man create mode 100644 completions/mc create mode 100644 completions/mcrypt create mode 100644 completions/mdadm create mode 100644 completions/mdtool create mode 100644 completions/medusa create mode 100644 completions/mii-diag create mode 100644 completions/mii-tool create mode 100644 completions/minicom create mode 100644 completions/mkinitrd create mode 100644 completions/mktemp create mode 100644 completions/mmsitepass create mode 100644 completions/modinfo create mode 100644 completions/modprobe create mode 100644 completions/monodevelop create mode 100644 completions/mplayer create mode 100644 completions/mr create mode 100644 completions/msynctool create mode 100644 completions/mtx create mode 100644 completions/munin-node-configure create mode 100644 completions/munin-run create mode 100644 completions/munin-update create mode 100644 completions/munindoc create mode 100644 completions/mussh create mode 100644 completions/mutt create mode 100644 completions/mypy create mode 100644 completions/mysql create mode 100644 completions/mysqladmin create mode 100644 completions/nc create mode 100644 completions/ncftp create mode 100644 completions/nethogs create mode 100644 completions/newlist create mode 100644 completions/newusers create mode 100644 completions/ngrep create mode 100644 completions/nmap create mode 100644 completions/nproc create mode 100644 completions/nslookup create mode 100644 completions/nsupdate create mode 100644 completions/ntpdate create mode 100644 completions/oggdec create mode 100644 completions/op create mode 100644 completions/openssl create mode 100644 completions/opera create mode 100644 completions/optipng create mode 100644 completions/p4 create mode 100644 completions/pack200 create mode 100644 completions/passwd create mode 100644 completions/patch create mode 100644 completions/pdftotext create mode 100644 completions/perl create mode 100644 completions/perlcritic create mode 100644 completions/perltidy create mode 100644 completions/pgrep create mode 100644 completions/pidof create mode 100644 completions/pine create mode 100644 completions/ping create mode 100644 completions/pkg-config create mode 100644 completions/pkg-get create mode 100644 completions/pkg_delete create mode 100644 completions/pkgadd create mode 100644 completions/pkgrm create mode 100644 completions/pkgtool create mode 100644 completions/pkgutil create mode 100644 completions/plague-client create mode 100644 completions/pm-hibernate create mode 100644 completions/pm-is-supported create mode 100644 completions/pm-powersave create mode 100644 completions/pngfix create mode 100644 completions/portinstall create mode 100644 completions/portsnap create mode 100644 completions/portupgrade create mode 100644 completions/postcat create mode 100644 completions/postconf create mode 100644 completions/postfix create mode 100644 completions/postmap create mode 100644 completions/postsuper create mode 100644 completions/povray create mode 100644 completions/prelink create mode 100644 completions/printenv create mode 100644 completions/protoc create mode 100644 completions/psql create mode 100644 completions/puppet create mode 100644 completions/pv create mode 100644 completions/pwck create mode 100644 completions/pwd create mode 100644 completions/pwdx create mode 100644 completions/pwgen create mode 100644 completions/pycodestyle create mode 100644 completions/pydoc create mode 100644 completions/pydocstyle create mode 100644 completions/pyflakes create mode 100644 completions/pylint create mode 100644 completions/pytest create mode 100644 completions/python create mode 100644 completions/pyvenv create mode 100644 completions/qdbus create mode 100644 completions/qemu create mode 100644 completions/qrunner create mode 100644 completions/querybts create mode 100644 completions/quota create mode 100644 completions/radvdump create mode 100644 completions/rcs create mode 100644 completions/rdesktop create mode 100644 completions/remove_members create mode 100644 completions/removepkg create mode 100644 completions/reportbug create mode 100644 completions/resolvconf create mode 100644 completions/ri create mode 100644 completions/rmlist create mode 100644 completions/rmmod create mode 100644 completions/route create mode 100644 completions/rpcdebug create mode 100644 completions/rpm create mode 100644 completions/rpm2tgz create mode 100644 completions/rpmcheck create mode 100644 completions/rrdtool create mode 100644 completions/rsync create mode 100644 completions/sbcl create mode 100644 completions/sbopkg create mode 100644 completions/screen create mode 100644 completions/scrub create mode 100644 completions/secret-tool create mode 100644 completions/sh create mode 100644 completions/shellcheck create mode 100644 completions/sitecopy create mode 100644 completions/slackpkg create mode 100644 completions/slapt-get create mode 100644 completions/slapt-src create mode 100644 completions/smartctl create mode 100644 completions/smbclient create mode 100644 completions/snownews create mode 100644 completions/sqlite3 create mode 100644 completions/ss create mode 100644 completions/ssh create mode 100644 completions/ssh-add create mode 100644 completions/ssh-copy-id create mode 100644 completions/ssh-keygen create mode 100644 completions/sshfs create mode 100644 completions/sshmitm create mode 100644 completions/sshow create mode 100644 completions/strace create mode 100644 completions/strings create mode 100644 completions/sudo create mode 100644 completions/svcadm create mode 100644 completions/svk create mode 100644 completions/sync_members create mode 100644 completions/synclient create mode 100644 completions/sysbench create mode 100644 completions/sysctl create mode 100644 completions/tar create mode 100644 completions/tcpdump create mode 100644 completions/tcpkill create mode 100644 completions/tcpnice create mode 100644 completions/timeout create mode 100644 completions/tipc create mode 100644 completions/tox create mode 100644 completions/tracepath create mode 100644 completions/tshark create mode 100644 completions/tsig-keygen create mode 100644 completions/tune2fs create mode 100644 completions/ulimit create mode 100644 completions/unace create mode 100644 completions/unpack200 create mode 100644 completions/unrar create mode 100644 completions/unshunt create mode 100644 completions/update-alternatives create mode 100644 completions/update-rc.d create mode 100644 completions/upgradepkg create mode 100644 completions/urlsnarf create mode 100644 completions/uscan create mode 100644 completions/useradd create mode 100644 completions/userdel create mode 100644 completions/usermod create mode 100644 completions/valgrind create mode 100644 completions/vipw create mode 100644 completions/vmstat create mode 100644 completions/vncviewer create mode 100644 completions/vpnc create mode 100644 completions/watch create mode 100644 completions/webmitm create mode 100644 completions/wget create mode 100644 completions/wine create mode 100644 completions/withlist create mode 100644 completions/wodim create mode 100644 completions/wol create mode 100644 completions/wsimport create mode 100644 completions/wtf create mode 100644 completions/wvdial create mode 100644 completions/xdg-mime create mode 100644 completions/xdg-settings create mode 100644 completions/xfreerdp create mode 100644 completions/xgamma create mode 100644 completions/xhost create mode 100644 completions/xmllint create mode 100644 completions/xmlwf create mode 100644 completions/xmms create mode 100644 completions/xmodmap create mode 100644 completions/xrandr create mode 100644 completions/xrdb create mode 100644 completions/xsltproc create mode 100644 completions/xvfb-run create mode 100644 completions/xxd create mode 100644 completions/xz create mode 100644 completions/xzdec create mode 100644 completions/ypmatch create mode 100644 completions/yum-arch create mode 100644 completions/zopfli create mode 100644 completions/zopflipng create mode 100644 configure.ac create mode 100644 doc/Makefile.am create mode 100644 doc/bash_completion.txt create mode 120000 doc/bashrc create mode 120000 doc/inputrc create mode 100644 doc/main.txt create mode 100755 doc/makeHtml.sh create mode 100644 doc/styleguide.txt create mode 100644 doc/testing.txt create mode 100755 extra/git-post-commit.sh create mode 100755 extra/git-pre-push.sh create mode 100755 extra/make-changelog.py create mode 100644 helpers/Makefile.am create mode 100644 helpers/perl create mode 100644 helpers/python create mode 100644 pyproject.toml create mode 100755 setup-symlinks.sh create mode 100644 test/.gitignore create mode 100644 test/Makefile.am create mode 100644 test/config/bashrc create mode 100644 test/config/inputrc create mode 100644 test/docker/Dockerfile create mode 100755 test/docker/docker-script.sh create mode 100644 test/fixtures/7z/a.7z create mode 100644 test/fixtures/7z/f.txt create mode 100644 test/fixtures/_filedir/a b/i create mode 100644 test/fixtures/_filedir/a$b/h create mode 100644 test/fixtures/_filedir/a&b/f create mode 100644 test/fixtures/_filedir/a'b/c create mode 100644 test/fixtures/_filedir/ab/e create mode 100644 "test/fixtures/_filedir/a\303\251/g" create mode 100644 test/fixtures/_filedir/brackets/[x] create mode 100644 test/fixtures/_filedir/brackets/x create mode 100644 test/fixtures/_filedir/ext/ee.e1 create mode 100644 test/fixtures/_filedir/ext/ff.e2 create mode 100644 test/fixtures/_filedir/ext/foo/.gitignore create mode 100644 test/fixtures/_filedir/ext/gg.e1 create mode 100644 test/fixtures/_filedir/ext/hh.e2 create mode 100644 test/fixtures/_filedir/ext/ii.E1 create mode 100644 test/fixtures/_get_cword/sea create mode 100644 test/fixtures/_get_cword/seb create mode 100644 test/fixtures/_get_cword/sec create mode 100644 "test/fixtures/_get_cword/\303\244\303\244\303\244\303\244\302\247" create mode 100644 test/fixtures/_known_hosts_real/.ssh/config_asterisk_1 create mode 100644 test/fixtures/_known_hosts_real/.ssh/config_asterisk_2 create mode 100644 test/fixtures/_known_hosts_real/.ssh/config_question_mark create mode 100644 test/fixtures/_known_hosts_real/.ssh/config_relative_path create mode 100644 test/fixtures/_known_hosts_real/config create mode 100644 test/fixtures/_known_hosts_real/config_full_path create mode 100644 test/fixtures/_known_hosts_real/config_include create mode 100644 test/fixtures/_known_hosts_real/config_include_recursion create mode 100644 test/fixtures/_known_hosts_real/config_tilde create mode 100644 test/fixtures/_known_hosts_real/gee-filename-canary create mode 100644 test/fixtures/_known_hosts_real/known_hosts create mode 100644 test/fixtures/_known_hosts_real/known_hosts2 create mode 100644 test/fixtures/_known_hosts_real/known_hosts3 create mode 100644 test/fixtures/_known_hosts_real/known_hosts4 create mode 100644 test/fixtures/_known_hosts_real/localhost_config create mode 100644 test/fixtures/_known_hosts_real/localhost_hosts create mode 100644 test/fixtures/_known_hosts_real/spaced conf create mode 100644 test/fixtures/_known_hosts_real/spaced known_hosts create mode 100644 test/fixtures/_longopt/grep--help.txt create mode 100644 test/fixtures/_longopt/various.txt create mode 100644 test/fixtures/acroread/bar create mode 100644 test/fixtures/acroread/foo.d/.gitignore create mode 100644 test/fixtures/acroread/t.pdf create mode 100644 test/fixtures/ant/.gitignore create mode 100644 test/fixtures/ant/build-with-import.xml create mode 100644 test/fixtures/ant/build.xml create mode 100644 test/fixtures/ant/imported-build.xml create mode 100644 test/fixtures/ant/named-build.xml create mode 100644 test/fixtures/compgen/a'b/c create mode 100644 test/fixtures/compgen/t1.txt create mode 100644 test/fixtures/compgen/t2.txt create mode 100644 test/fixtures/compgen/t3.txt create mode 100644 test/fixtures/cvs/.cvspass create mode 100644 test/fixtures/cvs/foo/CVS/Entries create mode 100644 test/fixtures/cvs/foo/bar create mode 100644 test/fixtures/cvs/foo/quux create mode 100755 test/fixtures/dnssec-keygen/dnssec-keygen create mode 100644 test/fixtures/dpkg/bash-completion-test-nonsubject.txt create mode 100644 test/fixtures/dpkg/bash-completion-test-subject.deb create mode 100644 test/fixtures/evince/.BMP create mode 100644 test/fixtures/evince/.CBR create mode 100644 test/fixtures/evince/.CBZ create mode 100644 test/fixtures/evince/.DJV create mode 100644 test/fixtures/evince/.DJVU create mode 100644 test/fixtures/evince/.DVI create mode 100644 test/fixtures/evince/.DVI.BZ2 create mode 100644 test/fixtures/evince/.DVI.GZ create mode 100644 test/fixtures/evince/.DVI.bz2 create mode 100644 test/fixtures/evince/.DVI.gz create mode 100644 test/fixtures/evince/.EPS create mode 100644 test/fixtures/evince/.EPS.BZ2 create mode 100644 test/fixtures/evince/.EPS.GZ create mode 100644 test/fixtures/evince/.EPS.bz2 create mode 100644 test/fixtures/evince/.EPS.gz create mode 100644 test/fixtures/evince/.GIF create mode 100644 test/fixtures/evince/.ICO create mode 100644 test/fixtures/evince/.JPEG create mode 100644 test/fixtures/evince/.JPG create mode 100644 test/fixtures/evince/.MIFF create mode 100644 test/fixtures/evince/.PBM create mode 100644 test/fixtures/evince/.PCX create mode 100644 test/fixtures/evince/.PDF create mode 100644 test/fixtures/evince/.PDF.BZ2 create mode 100644 test/fixtures/evince/.PDF.GZ create mode 100644 test/fixtures/evince/.PDF.bz2 create mode 100644 test/fixtures/evince/.PDF.gz create mode 100644 test/fixtures/evince/.PGM create mode 100644 test/fixtures/evince/.PNG create mode 100644 test/fixtures/evince/.PNM create mode 100644 test/fixtures/evince/.PPM create mode 100644 test/fixtures/evince/.PS create mode 100644 test/fixtures/evince/.PS.BZ2 create mode 100644 test/fixtures/evince/.PS.GZ create mode 100644 test/fixtures/evince/.PS.bz2 create mode 100644 test/fixtures/evince/.PS.gz create mode 100644 test/fixtures/evince/.TGA create mode 100644 test/fixtures/evince/.TIF create mode 100644 test/fixtures/evince/.TIFF create mode 100644 test/fixtures/evince/.XPM create mode 100644 test/fixtures/evince/.XWD create mode 100644 test/fixtures/evince/.bmp create mode 100644 test/fixtures/evince/.cbr create mode 100644 test/fixtures/evince/.cbz create mode 100644 test/fixtures/evince/.djv create mode 100644 test/fixtures/evince/.djvu create mode 100644 test/fixtures/evince/.dvi create mode 100644 test/fixtures/evince/.dvi.BZ2 create mode 100644 test/fixtures/evince/.dvi.GZ create mode 100644 test/fixtures/evince/.dvi.bz2 create mode 100644 test/fixtures/evince/.dvi.gz create mode 100644 test/fixtures/evince/.eps create mode 100644 test/fixtures/evince/.eps.BZ2 create mode 100644 test/fixtures/evince/.eps.GZ create mode 100644 test/fixtures/evince/.eps.bz2 create mode 100644 test/fixtures/evince/.eps.gz create mode 100644 test/fixtures/evince/.gif create mode 100644 test/fixtures/evince/.ico create mode 100644 test/fixtures/evince/.jpeg create mode 100644 test/fixtures/evince/.jpg create mode 100644 test/fixtures/evince/.miff create mode 100644 test/fixtures/evince/.pbm create mode 100644 test/fixtures/evince/.pcx create mode 100644 test/fixtures/evince/.pdf create mode 100644 test/fixtures/evince/.pdf.BZ2 create mode 100644 test/fixtures/evince/.pdf.GZ create mode 100644 test/fixtures/evince/.pdf.bz2 create mode 100644 test/fixtures/evince/.pdf.gz create mode 100644 test/fixtures/evince/.pgm create mode 100644 test/fixtures/evince/.png create mode 100644 test/fixtures/evince/.pnm create mode 100644 test/fixtures/evince/.ppm create mode 100644 test/fixtures/evince/.ps create mode 100644 test/fixtures/evince/.ps.BZ2 create mode 100644 test/fixtures/evince/.ps.GZ create mode 100644 test/fixtures/evince/.ps.bz2 create mode 100644 test/fixtures/evince/.ps.gz create mode 100644 test/fixtures/evince/.tga create mode 100644 test/fixtures/evince/.tif create mode 100644 test/fixtures/evince/.tiff create mode 100644 test/fixtures/evince/.txt create mode 100644 test/fixtures/evince/.xpm create mode 100644 test/fixtures/evince/.xwd create mode 100644 test/fixtures/evince/foo/.gitignore create mode 100644 test/fixtures/gdb/core create mode 100644 test/fixtures/gdb/core-NOT create mode 100644 test/fixtures/gdb/core.12345 create mode 100644 test/fixtures/gdb/core.weston.1000.deadbeef.5308.1555362132000000 create mode 100644 test/fixtures/gdb/corenot create mode 100644 test/fixtures/htpasswd/htpasswd create mode 100644 test/fixtures/info/bash-completion.info create mode 100644 test/fixtures/isql/odbc.ini create mode 100644 test/fixtures/java/a/b$c.class create mode 100644 test/fixtures/java/a/b.class create mode 100644 test/fixtures/java/a/c/README.txt create mode 100644 test/fixtures/java/a/c/d.class create mode 100644 test/fixtures/java/a/d.txt create mode 100644 test/fixtures/java/bashcomp.jar create mode 100644 test/fixtures/java/bashcomp.war create mode 100644 test/fixtures/java/no-complete.txt create mode 100644 test/fixtures/kdvi/.DVI create mode 100644 test/fixtures/kdvi/.DVI.Z create mode 100644 test/fixtures/kdvi/.DVI.bz2 create mode 100644 test/fixtures/kdvi/.DVI.gz create mode 100644 test/fixtures/kdvi/.dvi create mode 100644 test/fixtures/kdvi/.dvi.Z create mode 100644 test/fixtures/kdvi/.dvi.bz2 create mode 100644 test/fixtures/kdvi/.dvi.gz create mode 100644 test/fixtures/kdvi/.txt create mode 100644 test/fixtures/kdvi/foo/.gitignore create mode 100644 test/fixtures/kpdf/.EPS create mode 100644 test/fixtures/kpdf/.PDF create mode 100644 test/fixtures/kpdf/.PS create mode 100644 test/fixtures/kpdf/.eps create mode 100644 test/fixtures/kpdf/.pdf create mode 100644 test/fixtures/kpdf/.ps create mode 100644 test/fixtures/kpdf/.txt create mode 100644 test/fixtures/kpdf/foo/.gitignore create mode 100644 test/fixtures/lftp/.lftp/bookmarks create mode 100644 test/fixtures/lilo/lilo.conf create mode 100644 test/fixtures/make/.gitignore create mode 100644 test/fixtures/make/Makefile create mode 100644 test/fixtures/make/sample.c create mode 100644 test/fixtures/make/sample.d create mode 100644 test/fixtures/make/sample.h create mode 100644 test/fixtures/man/man/quux.8 create mode 100644 test/fixtures/man/man1/bash-completion-testcase.1.bz2 create mode 100644 test/fixtures/man/man1/foo.1 create mode 100755 test/fixtures/mount/bin/showmount create mode 100644 test/fixtures/mount/test-fstab create mode 100644 test/fixtures/mplayer/.mplayer/config create mode 100644 test/fixtures/mplayer/.mplayer/mencoder.conf create mode 100644 test/fixtures/mutt/bar/.gitignore create mode 100644 test/fixtures/mutt/bar/muttrc_b create mode 100644 test/fixtures/mutt/foo/.gitignore create mode 100644 test/fixtures/mutt/foo/muttrc_f create mode 100644 test/fixtures/mutt/muttrc create mode 100644 test/fixtures/nmap/nmap-h.txt create mode 100644 test/fixtures/perl/Devel/BashCompletion.pm create mode 100644 test/fixtures/perldoc/BashCompletionDoc.pod create mode 100644 test/fixtures/perldoc/BashCompletionModule.pm create mode 100644 test/fixtures/pkgtools/db/a-1.0,1/.gitignore create mode 100644 test/fixtures/pkgtools/db/b-c-d-2.0_2/.gitignore create mode 100644 test/fixtures/pkgtools/ports/.gitignore create mode 100644 test/fixtures/pkgtools/ports/INDEX.dist create mode 100644 test/fixtures/pytest/test_async.py create mode 100644 test/fixtures/ri/BashCompletion/cdesc-BashCompletion.ri create mode 100644 test/fixtures/ri/BashCompletion/cdesc-BashCompletion.yaml create mode 100644 test/fixtures/ri/bashcompletion.rb create mode 100644 test/fixtures/ri/cache.ri create mode 100644 test/fixtures/ri/created.rid create mode 100644 test/fixtures/scp/config create mode 100644 test/fixtures/scp/known_hosts create mode 100644 test/fixtures/scp/spaced conf create mode 100644 test/fixtures/sftp/config create mode 100644 test/fixtures/sftp/known_hosts create mode 100644 test/fixtures/sftp/spaced conf create mode 100644 test/fixtures/shared/.ssh/known_hosts create mode 100755 test/fixtures/shared/bin/arp create mode 100755 test/fixtures/shared/bin/ifconfig create mode 100644 test/fixtures/shared/default/bar create mode 100644 test/fixtures/shared/default/bar bar.d/foo create mode 100644 test/fixtures/shared/default/foo create mode 100644 test/fixtures/shared/default/foo.d/foo create mode 100644 test/fixtures/shared/empty_dir/.nothing_here create mode 100644 test/fixtures/shared/ld.so.conf.d/foo.txt create mode 100644 test/fixtures/shared/ld.so.conf.d/libfoo.conf create mode 100644 test/fixtures/shared/ld.so.conf.d/libfoo.so create mode 100644 test/fixtures/shared/ld.so.conf.d/libfoo.so.1 create mode 100644 test/fixtures/slackware/home/abc-4-i686-1.txz create mode 100644 test/fixtures/slackware/home/opq-1.0-2.i386.rpm create mode 100644 test/fixtures/slackware/home/tcl.d/tcl.tgz create mode 100644 test/fixtures/slackware/usr/src/slapt-src/slackbuilds_data create mode 100644 test/fixtures/slackware/var/log/packages/radeontool-1.6.1-i486-1 create mode 100644 test/fixtures/slackware/var/log/packages/rzip-2.1-i486-1 create mode 100644 test/fixtures/slackware/var/slapt-get/package_data create mode 100644 test/fixtures/ssh-copy-id/.ssh/id_rsa create mode 100644 test/fixtures/ssh-copy-id/.ssh/id_rsa.pub create mode 100644 test/fixtures/ssh/config create mode 100644 test/fixtures/ssh/known_hosts create mode 100644 test/fixtures/ssh/spaced conf create mode 100644 test/fixtures/tar/archive.tar.xz create mode 100644 test/fixtures/tar/dir/fileA create mode 100644 test/fixtures/tar/dir/fileB create mode 100644 test/fixtures/tar/dir/fileC create mode 100644 test/fixtures/tar/dir/hello create mode 100644 test/fixtures/tar/dir2/.nothing_here create mode 100644 test/fixtures/tar/escape.tar create mode 100644 test/fixtures/tox/tox.ini create mode 100644 test/fixtures/xz/a/b create mode 100644 test/fixtures/xz/bashcomp.lzma create mode 100644 test/fixtures/xz/bashcomp.tar create mode 100644 test/fixtures/xz/bashcomp.tar.xz create mode 100644 test/fixtures/xz/bashcomp.tlz create mode 100644 test/fixtures/xz/bashcomp.xz create mode 100755 test/generate create mode 100644 test/requirements-dev.txt create mode 100644 test/requirements.txt create mode 100755 test/runLint create mode 100644 test/setup.cfg create mode 100644 test/t/Makefile.am create mode 100644 test/t/conftest.py create mode 100644 test/t/test_2to3.py create mode 100644 test/t/test_7z.py create mode 100644 test/t/test_a2ps.py create mode 100644 test/t/test_a2x.py create mode 100644 test/t/test_abook.py create mode 100644 test/t/test_aclocal.py create mode 100644 test/t/test_acpi.py create mode 100644 test/t/test_acroread.py create mode 100644 test/t/test_adb.py create mode 100644 test/t/test_add_members.py create mode 100644 test/t/test_alias.py create mode 100644 test/t/test_alpine.py create mode 100644 test/t/test_animate.py create mode 100644 test/t/test_ant.py create mode 100644 test/t/test_apache2ctl.py create mode 100644 test/t/test_appdata_validate.py create mode 100644 test/t/test_apt_build.py create mode 100644 test/t/test_apt_cache.py create mode 100644 test/t/test_apt_get.py create mode 100644 test/t/test_aptitude.py create mode 100644 test/t/test_arch.py create mode 100644 test/t/test_arp.py create mode 100644 test/t/test_arping.py create mode 100644 test/t/test_arpspoof.py create mode 100644 test/t/test_asciidoc.py create mode 100644 test/t/test_aspell.py create mode 100644 test/t/test_autoconf.py create mode 100644 test/t/test_autoheader.py create mode 100644 test/t/test_automake.py create mode 100644 test/t/test_autoreconf.py create mode 100644 test/t/test_autorpm.py create mode 100644 test/t/test_autoscan.py create mode 100644 test/t/test_autossh.py create mode 100644 test/t/test_autoupdate.py create mode 100644 test/t/test_avctrl.py create mode 100644 test/t/test_awk.py create mode 100644 test/t/test_badblocks.py create mode 100644 test/t/test_base64.py create mode 100644 test/t/test_bash.py create mode 100644 test/t/test_bc.py create mode 100644 test/t/test_bind.py create mode 100644 test/t/test_bison.py create mode 100644 test/t/test_bk.py create mode 100644 test/t/test_bmake.py create mode 100644 test/t/test_brctl.py create mode 100644 test/t/test_btdownloadcurses_py.py create mode 100644 test/t/test_btdownloadgui_py.py create mode 100644 test/t/test_btdownloadheadless_py.py create mode 100644 test/t/test_bts.py create mode 100644 test/t/test_bzip2.py create mode 100644 test/t/test_cal.py create mode 100644 test/t/test_cancel.py create mode 100644 test/t/test_cardctl.py create mode 100644 test/t/test_carton.py create mode 100644 test/t/test_cat.py create mode 100644 test/t/test_cc.py create mode 100644 test/t/test_ccache.py create mode 100644 test/t/test_ccze.py create mode 100644 test/t/test_cd.py create mode 100644 test/t/test_cdrecord.py create mode 100644 test/t/test_cfagent.py create mode 100644 test/t/test_cfrun.py create mode 100644 test/t/test_chage.py create mode 100644 test/t/test_change_pw.py create mode 100644 test/t/test_check_db.py create mode 100644 test/t/test_check_perms.py create mode 100644 test/t/test_checksec.py create mode 100644 test/t/test_chfn.py create mode 100644 test/t/test_chgrp.py create mode 100644 test/t/test_chkconfig.py create mode 100644 test/t/test_chmod.py create mode 100644 test/t/test_chown.py create mode 100644 test/t/test_chpasswd.py create mode 100644 test/t/test_chromium_browser.py create mode 100644 test/t/test_chronyc.py create mode 100644 test/t/test_chroot.py create mode 100644 test/t/test_chrpath.py create mode 100644 test/t/test_chsh.py create mode 100644 test/t/test_ci.py create mode 100644 test/t/test_ciptool.py create mode 100644 test/t/test_civclient.py create mode 100644 test/t/test_civserver.py create mode 100644 test/t/test_cksfv.py create mode 100644 test/t/test_cleanarch.py create mode 100644 test/t/test_clisp.py create mode 100644 test/t/test_clone_member.py create mode 100644 test/t/test_co.py create mode 100644 test/t/test_colordiff.py create mode 100644 test/t/test_compare.py create mode 100644 test/t/test_compgen.py create mode 100644 test/t/test_complete.py create mode 100644 test/t/test_composite.py create mode 100644 test/t/test_config_list.py create mode 100644 test/t/test_configure.py create mode 100644 test/t/test_conjure.py create mode 100644 test/t/test_convert.py create mode 100644 test/t/test_cowsay.py create mode 100644 test/t/test_cp.py create mode 100644 test/t/test_cpan2dist.py create mode 100644 test/t/test_cpio.py create mode 100644 test/t/test_cplusplus.py create mode 100644 test/t/test_cppcheck.py create mode 100644 test/t/test_createdb.py create mode 100644 test/t/test_createuser.py create mode 100644 test/t/test_crontab.py create mode 100644 test/t/test_cryptsetup.py create mode 100644 test/t/test_csplit.py create mode 100644 test/t/test_curl.py create mode 100644 test/t/test_cut.py create mode 100644 test/t/test_cvs.py create mode 100644 test/t/test_cvsps.py create mode 100644 test/t/test_date.py create mode 100644 test/t/test_dcop.py create mode 100644 test/t/test_dd.py create mode 100644 test/t/test_declare.py create mode 100644 test/t/test_deja_dup.py create mode 100644 test/t/test_desktop_file_validate.py create mode 100644 test/t/test_df.py create mode 100644 test/t/test_dfutool.py create mode 100644 test/t/test_dhclient.py create mode 100644 test/t/test_dict.py create mode 100644 test/t/test_diff.py create mode 100644 test/t/test_dir.py create mode 100644 test/t/test_display.py create mode 100644 test/t/test_dmesg.py create mode 100644 test/t/test_dmypy.py create mode 100644 test/t/test_dnssec_keygen.py create mode 100644 test/t/test_dnsspoof.py create mode 100644 test/t/test_dot.py create mode 100644 test/t/test_dpkg.py create mode 100644 test/t/test_dpkg_deb.py create mode 100644 test/t/test_dpkg_query.py create mode 100644 test/t/test_dpkg_reconfigure.py create mode 100644 test/t/test_dpkg_source.py create mode 100644 test/t/test_dropdb.py create mode 100644 test/t/test_dropuser.py create mode 100644 test/t/test_dselect.py create mode 100644 test/t/test_dsniff.py create mode 100644 test/t/test_du.py create mode 100644 test/t/test_dumpdb.py create mode 100644 test/t/test_dumpe2fs.py create mode 100644 test/t/test_e2freefrag.py create mode 100644 test/t/test_e2label.py create mode 100644 test/t/test_ebtables.py create mode 100644 test/t/test_ecryptfs_migrate_home.py create mode 100644 test/t/test_eject.py create mode 100644 test/t/test_enscript.py create mode 100644 test/t/test_env.py create mode 100644 test/t/test_eog.py create mode 100644 test/t/test_ether_wake.py create mode 100644 test/t/test_etherwake.py create mode 100644 test/t/test_evince.py create mode 100644 test/t/test_expand.py create mode 100644 test/t/test_explodepkg.py create mode 100644 test/t/test_export.py create mode 100644 test/t/test_faillog.py create mode 100644 test/t/test_fbgs.py create mode 100644 test/t/test_fbi.py create mode 100644 test/t/test_feh.py create mode 100644 test/t/test_file.py create mode 100644 test/t/test_file_roller.py create mode 100644 test/t/test_filefrag.py create mode 100644 test/t/test_filesnarf.py create mode 100644 test/t/test_find.py create mode 100644 test/t/test_find_member.py create mode 100644 test/t/test_finger.py create mode 100644 test/t/test_fio.py create mode 100644 test/t/test_firefox.py create mode 100644 test/t/test_flake8.py create mode 100644 test/t/test_fmt.py create mode 100644 test/t/test_fold.py create mode 100644 test/t/test_freebsd_update.py create mode 100644 test/t/test_freeciv.py create mode 100644 test/t/test_freeciv_server.py create mode 100644 test/t/test_function.py create mode 100644 test/t/test_fusermount.py create mode 100644 test/t/test_g4.py create mode 100644 test/t/test_g77.py create mode 100644 test/t/test_gcc.py create mode 100644 test/t/test_gcj.py create mode 100644 test/t/test_gcl.py create mode 100644 test/t/test_gdb.py create mode 100644 test/t/test_genaliases.py create mode 100644 test/t/test_gendiff.py create mode 100644 test/t/test_genisoimage.py create mode 100644 test/t/test_geoiplookup.py create mode 100644 test/t/test_getconf.py create mode 100644 test/t/test_getent.py create mode 100644 test/t/test_gkrellm.py create mode 100644 test/t/test_gm.py create mode 100644 test/t/test_gmplayer.py create mode 100644 test/t/test_gnatmake.py create mode 100644 test/t/test_gnokii.py create mode 100644 test/t/test_gnome_mplayer.py create mode 100644 test/t/test_gnome_screenshot.py create mode 100644 test/t/test_gpasswd.py create mode 100644 test/t/test_gpc.py create mode 100644 test/t/test_gperf.py create mode 100644 test/t/test_gpg.py create mode 100644 test/t/test_gpg2.py create mode 100644 test/t/test_gpgv.py create mode 100644 test/t/test_gphoto2.py create mode 100644 test/t/test_gplusplus.py create mode 100644 test/t/test_gprof.py create mode 100644 test/t/test_grep.py create mode 100644 test/t/test_groupadd.py create mode 100644 test/t/test_groupdel.py create mode 100644 test/t/test_groupmems.py create mode 100644 test/t/test_groupmod.py create mode 100644 test/t/test_growisofs.py create mode 100644 test/t/test_grpck.py create mode 100644 test/t/test_grub.py create mode 100644 test/t/test_gssdp_discover.py create mode 100644 test/t/test_gzip.py create mode 100644 test/t/test_hciattach.py create mode 100644 test/t/test_hciconfig.py create mode 100644 test/t/test_hcitool.py create mode 100644 test/t/test_hddtemp.py create mode 100644 test/t/test_head.py create mode 100644 test/t/test_hexdump.py create mode 100644 test/t/test_hid2hci.py create mode 100644 test/t/test_host.py create mode 100644 test/t/test_hostname.py create mode 100644 test/t/test_hping2.py create mode 100644 test/t/test_hping3.py create mode 100644 test/t/test_htop.py create mode 100644 test/t/test_htpasswd.py create mode 100644 test/t/test_hunspell.py create mode 100644 test/t/test_hwclock.py create mode 100644 test/t/test_iconv.py create mode 100644 test/t/test_id.py create mode 100644 test/t/test_identify.py create mode 100644 test/t/test_idn.py create mode 100644 test/t/test_ifdown.py create mode 100644 test/t/test_ifstat.py create mode 100644 test/t/test_iftop.py create mode 100644 test/t/test_ifup.py create mode 100644 test/t/test_import.py create mode 100644 test/t/test_influx.py create mode 100644 test/t/test_info.py create mode 100644 test/t/test_inject.py create mode 100644 test/t/test_inotifywait.py create mode 100644 test/t/test_inotifywatch.py create mode 100644 test/t/test_insmod.py create mode 100644 test/t/test_installpkg.py create mode 100644 test/t/test_interdiff.py create mode 100644 test/t/test_invoke_rc_d.py create mode 100644 test/t/test_ionice.py create mode 100644 test/t/test_ip.py create mode 100644 test/t/test_ipcalc.py create mode 100644 test/t/test_iperf.py create mode 100644 test/t/test_iperf3.py create mode 100644 test/t/test_ipmitool.py create mode 100644 test/t/test_ipsec.py create mode 100644 test/t/test_iptables.py create mode 100644 test/t/test_ipv6calc.py create mode 100644 test/t/test_irb.py create mode 100644 test/t/test_iscsiadm.py create mode 100644 test/t/test_isort.py create mode 100644 test/t/test_isql.py create mode 100644 test/t/test_iwconfig.py create mode 100644 test/t/test_iwlist.py create mode 100644 test/t/test_iwpriv.py create mode 100644 test/t/test_iwspy.py create mode 100644 test/t/test_jar.py create mode 100644 test/t/test_jarsigner.py create mode 100644 test/t/test_java.py create mode 100644 test/t/test_javac.py create mode 100644 test/t/test_javadoc.py create mode 100644 test/t/test_javaws.py create mode 100644 test/t/test_jpegoptim.py create mode 100644 test/t/test_jps.py create mode 100644 test/t/test_jq.py create mode 100644 test/t/test_jshint.py create mode 100644 test/t/test_json_xs.py create mode 100644 test/t/test_jsonschema.py create mode 100644 test/t/test_k3b.py create mode 100644 test/t/test_kcov.py create mode 100644 test/t/test_kdvi.py create mode 100644 test/t/test_kill.py create mode 100644 test/t/test_killall.py create mode 100644 test/t/test_kldload.py create mode 100644 test/t/test_kldunload.py create mode 100644 test/t/test_koji.py create mode 100644 test/t/test_kpdf.py create mode 100644 test/t/test_kplayer.py create mode 100644 test/t/test_ktutil.py create mode 100644 test/t/test_l2ping.py create mode 100644 test/t/test_larch.py create mode 100644 test/t/test_lastlog.py create mode 100644 test/t/test_ld.py create mode 100644 test/t/test_ldapadd.py create mode 100644 test/t/test_ldapcompare.py create mode 100644 test/t/test_ldapdelete.py create mode 100644 test/t/test_ldapmodrdn.py create mode 100644 test/t/test_ldappasswd.py create mode 100644 test/t/test_ldapsearch.py create mode 100644 test/t/test_ldapvi.py create mode 100644 test/t/test_ldapwhoami.py create mode 100644 test/t/test_ldd.py create mode 100644 test/t/test_less.py create mode 100644 test/t/test_lftp.py create mode 100644 test/t/test_lftpget.py create mode 100644 test/t/test_lilo.py create mode 100644 test/t/test_links.py create mode 100644 test/t/test_lintian.py create mode 100644 test/t/test_lintian_info.py create mode 100644 test/t/test_lisp.py create mode 100644 test/t/test_list_admins.py create mode 100644 test/t/test_list_lists.py create mode 100644 test/t/test_list_members.py create mode 100644 test/t/test_list_owners.py create mode 100644 test/t/test_ln.py create mode 100644 test/t/test_locale_gen.py create mode 100644 test/t/test_look.py create mode 100644 test/t/test_lpq.py create mode 100644 test/t/test_lpr.py create mode 100644 test/t/test_lrzip.py create mode 100644 test/t/test_ls.py create mode 100644 test/t/test_lsof.py create mode 100644 test/t/test_lspci.py create mode 100644 test/t/test_lsscsi.py create mode 100644 test/t/test_lsusb.py create mode 100644 test/t/test_lua.py create mode 100644 test/t/test_luac.py create mode 100644 test/t/test_luseradd.py create mode 100644 test/t/test_luserdel.py create mode 100644 test/t/test_lusermod.py create mode 100644 test/t/test_lvchange.py create mode 100644 test/t/test_lvcreate.py create mode 100644 test/t/test_lvdisplay.py create mode 100644 test/t/test_lvextend.py create mode 100644 test/t/test_lvm.py create mode 100644 test/t/test_lvmdiskscan.py create mode 100644 test/t/test_lvreduce.py create mode 100644 test/t/test_lvremove.py create mode 100644 test/t/test_lvrename.py create mode 100644 test/t/test_lvresize.py create mode 100644 test/t/test_lvs.py create mode 100644 test/t/test_lvscan.py create mode 100644 test/t/test_lz4.py create mode 100644 test/t/test_lzip.py create mode 100644 test/t/test_lzma.py create mode 100644 test/t/test_lzop.py create mode 100644 test/t/test_m4.py create mode 100644 test/t/test_macof.py create mode 100644 test/t/test_mailmanctl.py create mode 100644 test/t/test_mailsnarf.py create mode 100644 test/t/test_make.py create mode 100644 test/t/test_makepkg.py create mode 100644 test/t/test_man.py create mode 100644 test/t/test_mc.py create mode 100644 test/t/test_mcrypt.py create mode 100644 test/t/test_md5sum.py create mode 100644 test/t/test_mdadm.py create mode 100644 test/t/test_mdecrypt.py create mode 100644 test/t/test_mdtool.py create mode 100644 test/t/test_medusa.py create mode 100644 test/t/test_mencoder.py create mode 100644 test/t/test_mii_diag.py create mode 100644 test/t/test_mii_tool.py create mode 100644 test/t/test_minicom.py create mode 100644 test/t/test_mkdir.py create mode 100644 test/t/test_mkfifo.py create mode 100644 test/t/test_mkinitrd.py create mode 100644 test/t/test_mkisofs.py create mode 100644 test/t/test_mknod.py create mode 100644 test/t/test_mktemp.py create mode 100644 test/t/test_mmsitepass.py create mode 100644 test/t/test_mock.py create mode 100644 test/t/test_modinfo.py create mode 100644 test/t/test_modprobe.py create mode 100644 test/t/test_module.py create mode 100644 test/t/test_mogrify.py create mode 100644 test/t/test_monodevelop.py create mode 100644 test/t/test_montage.py create mode 100644 test/t/test_mount.py create mode 100644 test/t/test_mplayer.py create mode 100644 test/t/test_mr.py create mode 100644 test/t/test_msgsnarf.py create mode 100644 test/t/test_msynctool.py create mode 100644 test/t/test_mtx.py create mode 100644 test/t/test_munin_node_configure.py create mode 100644 test/t/test_munin_run.py create mode 100644 test/t/test_munindoc.py create mode 100644 test/t/test_mussh.py create mode 100644 test/t/test_mutt.py create mode 100644 test/t/test_muttng.py create mode 100644 test/t/test_mv.py create mode 100644 test/t/test_mypy.py create mode 100644 test/t/test_mysql.py create mode 100644 test/t/test_mysqladmin.py create mode 100644 test/t/test_nc.py create mode 100644 test/t/test_ncftp.py create mode 100644 test/t/test_nethogs.py create mode 100644 test/t/test_netstat.py create mode 100644 test/t/test_newgrp.py create mode 100644 test/t/test_newlist.py create mode 100644 test/t/test_newusers.py create mode 100644 test/t/test_ngrep.py create mode 100644 test/t/test_nl.py create mode 100644 test/t/test_nm.py create mode 100644 test/t/test_nmap.py create mode 100644 test/t/test_nmcli.py create mode 100644 test/t/test_nproc.py create mode 100644 test/t/test_nslookup.py create mode 100644 test/t/test_nsupdate.py create mode 100644 test/t/test_ntpdate.py create mode 100644 test/t/test_objcopy.py create mode 100644 test/t/test_objdump.py create mode 100644 test/t/test_od.py create mode 100644 test/t/test_oggdec.py create mode 100644 test/t/test_op.py create mode 100644 test/t/test_openssl.py create mode 100644 test/t/test_opera.py create mode 100644 test/t/test_optipng.py create mode 100644 test/t/test_p4.py create mode 100644 test/t/test_pack200.py create mode 100644 test/t/test_passwd.py create mode 100644 test/t/test_paste.py create mode 100644 test/t/test_patch.py create mode 100644 test/t/test_pdftotext.py create mode 100644 test/t/test_perl.py create mode 100644 test/t/test_perlcritic.py create mode 100644 test/t/test_perldoc.py create mode 100644 test/t/test_perltidy.py create mode 100644 test/t/test_pgrep.py create mode 100644 test/t/test_phing.py create mode 100644 test/t/test_pidof.py create mode 100644 test/t/test_pine.py create mode 100644 test/t/test_pinfo.py create mode 100644 test/t/test_ping.py create mode 100644 test/t/test_pkg_config.py create mode 100644 test/t/test_pkg_deinstall.py create mode 100644 test/t/test_pkg_delete.py create mode 100644 test/t/test_pkg_get.py create mode 100644 test/t/test_pkg_info.py create mode 100644 test/t/test_pkgadd.py create mode 100644 test/t/test_pkgrm.py create mode 100644 test/t/test_pkgtool.py create mode 100644 test/t/test_pkgutil.py create mode 100644 test/t/test_pkill.py create mode 100644 test/t/test_plague_client.py create mode 100644 test/t/test_pm_hibernate.py create mode 100644 test/t/test_pm_is_supported.py create mode 100644 test/t/test_pm_powersave.py create mode 100644 test/t/test_pngfix.py create mode 100644 test/t/test_portinstall.py create mode 100644 test/t/test_portsnap.py create mode 100644 test/t/test_portupgrade.py create mode 100644 test/t/test_postcat.py create mode 100644 test/t/test_postconf.py create mode 100644 test/t/test_postfix.py create mode 100644 test/t/test_postmap.py create mode 100644 test/t/test_postsuper.py create mode 100644 test/t/test_povray.py create mode 100644 test/t/test_pr.py create mode 100644 test/t/test_prelink.py create mode 100644 test/t/test_printenv.py create mode 100644 test/t/test_protoc.py create mode 100644 test/t/test_psql.py create mode 100644 test/t/test_ptx.py create mode 100644 test/t/test_puppet.py create mode 100644 test/t/test_pushd.py create mode 100644 test/t/test_pv.py create mode 100644 test/t/test_pvchange.py create mode 100644 test/t/test_pvcreate.py create mode 100644 test/t/test_pvdisplay.py create mode 100644 test/t/test_pvmove.py create mode 100644 test/t/test_pvremove.py create mode 100644 test/t/test_pvs.py create mode 100644 test/t/test_pvscan.py create mode 100644 test/t/test_pwck.py create mode 100644 test/t/test_pwd.py create mode 100644 test/t/test_pwdx.py create mode 100644 test/t/test_pwgen.py create mode 100644 test/t/test_pycodestyle.py create mode 100644 test/t/test_pydoc.py create mode 100644 test/t/test_pydocstyle.py create mode 100644 test/t/test_pyflakes.py create mode 100644 test/t/test_pylint.py create mode 100644 test/t/test_pylint_3.py create mode 100644 test/t/test_pytest.py create mode 100644 test/t/test_python.py create mode 100644 test/t/test_python3.py create mode 100644 test/t/test_pyvenv.py create mode 100644 test/t/test_qemu.py create mode 100644 test/t/test_qrunner.py create mode 100644 test/t/test_querybts.py create mode 100644 test/t/test_quota.py create mode 100644 test/t/test_quotacheck.py create mode 100644 test/t/test_quotaon.py create mode 100644 test/t/test_radvdump.py create mode 100644 test/t/test_rcs.py create mode 100644 test/t/test_rcsdiff.py create mode 100644 test/t/test_rdesktop.py create mode 100644 test/t/test_rdict.py create mode 100644 test/t/test_readelf.py create mode 100644 test/t/test_readonly.py create mode 100644 test/t/test_remove_members.py create mode 100644 test/t/test_removepkg.py create mode 100644 test/t/test_renice.py create mode 100644 test/t/test_repomanage.py create mode 100644 test/t/test_reportbug.py create mode 100644 test/t/test_reptyr.py create mode 100644 test/t/test_resolvconf.py create mode 100644 test/t/test_rfcomm.py create mode 100644 test/t/test_rfkill.py create mode 100644 test/t/test_ri.py create mode 100644 test/t/test_rlog.py create mode 100644 test/t/test_rm.py create mode 100644 test/t/test_rmdir.py create mode 100644 test/t/test_rmlist.py create mode 100644 test/t/test_rmmod.py create mode 100644 test/t/test_route.py create mode 100644 test/t/test_rpcdebug.py create mode 100644 test/t/test_rpm.py create mode 100644 test/t/test_rpm2tgz.py create mode 100644 test/t/test_rpmbuild.py create mode 100644 test/t/test_rrdtool.py create mode 100644 test/t/test_rsync.py create mode 100644 test/t/test_rtcwake.py create mode 100644 test/t/test_runuser.py create mode 100644 test/t/test_sbcl.py create mode 100644 test/t/test_sbcl_mt.py create mode 100644 test/t/test_sbopkg.py create mode 100644 test/t/test_scp.py create mode 100644 test/t/test_screen.py create mode 100644 test/t/test_scrub.py create mode 100644 test/t/test_sdptool.py create mode 100644 test/t/test_secret_tool.py create mode 100644 test/t/test_sed.py create mode 100644 test/t/test_seq.py create mode 100644 test/t/test_service.py create mode 100644 test/t/test_set.py create mode 100644 test/t/test_setquota.py create mode 100644 test/t/test_sftp.py create mode 100644 test/t/test_sh.py create mode 100644 test/t/test_sha1sum.py create mode 100644 test/t/test_shar.py create mode 100644 test/t/test_shellcheck.py create mode 100644 test/t/test_sitecopy.py create mode 100644 test/t/test_slackpkg.py create mode 100644 test/t/test_slapt_get.py create mode 100644 test/t/test_slapt_src.py create mode 100644 test/t/test_smartctl.py create mode 100644 test/t/test_smbcacls.py create mode 100644 test/t/test_smbclient.py create mode 100644 test/t/test_smbcquotas.py create mode 100644 test/t/test_smbget.py create mode 100644 test/t/test_smbpasswd.py create mode 100644 test/t/test_smbtar.py create mode 100644 test/t/test_smbtree.py create mode 100644 test/t/test_snownews.py create mode 100644 test/t/test_sort.py create mode 100644 test/t/test_split.py create mode 100644 test/t/test_spovray.py create mode 100644 test/t/test_sqlite3.py create mode 100644 test/t/test_ss.py create mode 100644 test/t/test_ssh.py create mode 100644 test/t/test_ssh_add.py create mode 100644 test/t/test_ssh_copy_id.py create mode 100644 test/t/test_ssh_keygen.py create mode 100644 test/t/test_sshfs.py create mode 100644 test/t/test_sshmitm.py create mode 100644 test/t/test_sshow.py create mode 100644 test/t/test_strace.py create mode 100644 test/t/test_stream.py create mode 100644 test/t/test_strings.py create mode 100644 test/t/test_strip.py create mode 100644 test/t/test_su.py create mode 100644 test/t/test_sudo.py create mode 100644 test/t/test_sum.py create mode 100644 test/t/test_svcadm.py create mode 100644 test/t/test_svk.py create mode 100644 test/t/test_svn.py create mode 100644 test/t/test_svnadmin.py create mode 100644 test/t/test_svnlook.py create mode 100644 test/t/test_sync_members.py create mode 100644 test/t/test_synclient.py create mode 100644 test/t/test_sysbench.py create mode 100644 test/t/test_sysctl.py create mode 100644 test/t/test_tac.py create mode 100644 test/t/test_tail.py create mode 100644 test/t/test_tar.py create mode 100644 test/t/test_tcpdump.py create mode 100644 test/t/test_tcpkill.py create mode 100644 test/t/test_tcpnice.py create mode 100644 test/t/test_tee.py create mode 100644 test/t/test_texindex.py create mode 100644 test/t/test_tightvncviewer.py create mode 100644 test/t/test_time.py create mode 100644 test/t/test_timeout.py create mode 100644 test/t/test_tipc.py create mode 100644 test/t/test_totem.py create mode 100644 test/t/test_touch.py create mode 100644 test/t/test_tox.py create mode 100644 test/t/test_tr.py create mode 100644 test/t/test_tracepath.py create mode 100644 test/t/test_tshark.py create mode 100644 test/t/test_tsig_keygen.py create mode 100644 test/t/test_tune2fs.py create mode 100644 test/t/test_udevadm.py create mode 100644 test/t/test_ulimit.py create mode 100644 test/t/test_umount.py create mode 100644 test/t/test_unace.py create mode 100644 test/t/test_uname.py create mode 100644 test/t/test_unexpand.py create mode 100644 test/t/test_uniq.py create mode 100644 test/t/test_units.py create mode 100644 test/t/test_unpack200.py create mode 100644 test/t/test_unrar.py create mode 100644 test/t/test_unset.py create mode 100644 test/t/test_unshunt.py create mode 100644 test/t/test_update_alternatives.py create mode 100644 test/t/test_update_rc_d.py create mode 100644 test/t/test_upgradepkg.py create mode 100644 test/t/test_urlsnarf.py create mode 100644 test/t/test_uscan.py create mode 100644 test/t/test_useradd.py create mode 100644 test/t/test_userdel.py create mode 100644 test/t/test_usermod.py create mode 100644 test/t/test_valgrind.py create mode 100644 test/t/test_vdir.py create mode 100644 test/t/test_vgcfgbackup.py create mode 100644 test/t/test_vgcfgrestore.py create mode 100644 test/t/test_vgchange.py create mode 100644 test/t/test_vgck.py create mode 100644 test/t/test_vgconvert.py create mode 100644 test/t/test_vgcreate.py create mode 100644 test/t/test_vgdisplay.py create mode 100644 test/t/test_vgexport.py create mode 100644 test/t/test_vgextend.py create mode 100644 test/t/test_vgimport.py create mode 100644 test/t/test_vgmerge.py create mode 100644 test/t/test_vgmknodes.py create mode 100644 test/t/test_vgreduce.py create mode 100644 test/t/test_vgremove.py create mode 100644 test/t/test_vgrename.py create mode 100644 test/t/test_vgs.py create mode 100644 test/t/test_vgscan.py create mode 100644 test/t/test_vgsplit.py create mode 100644 test/t/test_vi.py create mode 100644 test/t/test_vipw.py create mode 100644 test/t/test_vmstat.py create mode 100644 test/t/test_vncviewer.py create mode 100644 test/t/test_vpnc.py create mode 100644 test/t/test_watch.py create mode 100644 test/t/test_wc.py create mode 100644 test/t/test_webmitm.py create mode 100644 test/t/test_wget.py create mode 100644 test/t/test_who.py create mode 100644 test/t/test_wine.py create mode 100644 test/t/test_withlist.py create mode 100644 test/t/test_wodim.py create mode 100644 test/t/test_wol.py create mode 100644 test/t/test_write.py create mode 100644 test/t/test_wsimport.py create mode 100644 test/t/test_wtf.py create mode 100644 test/t/test_wvdial.py create mode 100644 test/t/test_xdg_mime.py create mode 100644 test/t/test_xdg_settings.py create mode 100644 test/t/test_xfreerdp.py create mode 100644 test/t/test_xgamma.py create mode 100644 test/t/test_xhost.py create mode 100644 test/t/test_xm.py create mode 100644 test/t/test_xmllint.py create mode 100644 test/t/test_xmlwf.py create mode 100644 test/t/test_xmms.py create mode 100644 test/t/test_xmodmap.py create mode 100644 test/t/test_xpovray.py create mode 100644 test/t/test_xrandr.py create mode 100644 test/t/test_xrdb.py create mode 100644 test/t/test_xsltproc.py create mode 100644 test/t/test_xvfb_run.py create mode 100644 test/t/test_xvnc4viewer.py create mode 100644 test/t/test_xxd.py create mode 100644 test/t/test_xz.py create mode 100644 test/t/test_xzdec.py create mode 100644 test/t/test_ypcat.py create mode 100644 test/t/test_ypmatch.py create mode 100644 test/t/test_yum.py create mode 100644 test/t/test_yum_arch.py create mode 100644 test/t/test_zopfli.py create mode 100644 test/t/test_zopflipng.py create mode 100644 test/t/unit/Makefile.am create mode 100644 test/t/unit/test_unit_count_args.py create mode 100644 test/t/unit/test_unit_expand.py create mode 100644 test/t/unit/test_unit_expand_tilde_by_ref.py create mode 100644 test/t/unit/test_unit_filedir.py create mode 100644 test/t/unit/test_unit_find_unique_completion_pair.py create mode 100644 test/t/unit/test_unit_get_comp_words_by_ref.py create mode 100644 test/t/unit/test_unit_get_cword.py create mode 100644 test/t/unit/test_unit_init_completion.py create mode 100644 test/t/unit/test_unit_ip_addresses.py create mode 100644 test/t/unit/test_unit_known_hosts_real.py create mode 100644 test/t/unit/test_unit_longopt.py create mode 100644 test/t/unit/test_unit_parse_help.py create mode 100644 test/t/unit/test_unit_parse_usage.py create mode 100644 test/t/unit/test_unit_quote.py create mode 100644 test/t/unit/test_unit_quote_readline.py create mode 100644 test/t/unit/test_unit_tilde.py create mode 100644 test/t/unit/test_unit_variables.py create mode 100644 test/t/unit/test_unit_xinetd_services.py create mode 100644 test/test-cmd-list.txt create mode 100755 test/update-test-cmd-list diff --git a/.dir-locals.el b/.dir-locals.el new file mode 100644 index 0000000..56279de --- /dev/null +++ b/.dir-locals.el @@ -0,0 +1,10 @@ +;;; Directory Local Variables +;;; For more information see (info "(emacs) Directory Variables") + +((python-mode + (eval add-hook 'before-save-hook 'blacken-buffer nil t)) + (sh-mode + (mode . shfmt-on-save) + (shfmt-arguments "-s") + (flycheck-sh-bash-args "-O" "extglob") + (sh-indent-comment . t))) diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..61f2dc9 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +**/__pycache__/ diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..85032d1 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +[*] +indent_style = space +indent_size = 4 +tab_width = 8 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 79 +# for shfmt +function_next_line = true +switch_case_indent = true + +[Makefile.am] +indent_style = tab + +[*.{yml,yaml}] +indent_size = 2 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ae29894 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +*.tar* +*.swp +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +config.log +config.status +configure +configure.lineno +install-sh +missing +doc/*.xml +*~ +doc/html* +bash_completion.sh +bash-completion.pc +bash-completion-config.cmake +bash-completion-config-version.cmake +__pycache__/ +.pytest_cache/ +.python-version +pytestdebug.log diff --git a/.markdownlint.yaml b/.markdownlint.yaml new file mode 100644 index 0000000..0204e77 --- /dev/null +++ b/.markdownlint.yaml @@ -0,0 +1,4 @@ +MD007: + false # for lists in FAQ/A +MD033: + allowed_elements: [kbd] diff --git a/.perltidyrc b/.perltidyrc new file mode 100644 index 0000000..9f681d2 --- /dev/null +++ b/.perltidyrc @@ -0,0 +1,6 @@ +--perl-best-practices +--maximum-line-length=79 +--paren-tightness=2 +--cuddled-else +--warning-output +--converge diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..57d1264 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,97 @@ +repos: + + - repo: local + hooks: + - id: shfmt + name: shfmt + language: golang + additional_dependencies: [mvdan.cc/sh/v3/cmd/shfmt@v3.1.2] + entry: shfmt + args: [-w, -s] + types: [text] + files: ^(bash_completion|completions/.+|test/(config/bashrc|update-test-cmd-list)|.+\.sh(\.in)?)$ + exclude: ^completions/(\.gitignore|Makefile.*)$ + + - repo: https://github.com/shellcheck-py/shellcheck-py + rev: v0.7.1.1 + hooks: + - id: shellcheck + args: [-f, gcc] + types: [text] + files: ^(bash_completion|completions/.+|test/(config/bashrc|update-test-cmd-list)|.+\.sh(\.in)?)$ + exclude: ^completions/(\.gitignore|Makefile.*)$ + require_serial: false # We disable SC1090 anyway, so parallel is ok + + - repo: local + hooks: + - id: update-test-cmd-list + name: update-test-cmd-list + language: script + entry: test/update-test-cmd-list + files: ^test/t/.+\.py$ + pass_filenames: false + + - repo: https://github.com/psf/black + rev: 19.10b0 + hooks: + - id: black + types: [text] + files: ^(helpers/python|.+\.py)$ + exclude: ^completions/ + + - repo: https://gitlab.com/pycqa/flake8 + rev: 3.8.3 + hooks: + - id: flake8 + args: [--config=test/setup.cfg] + additional_dependencies: [flake8-bugbear==20.1.4] + types: [text] + files: ^(helpers/python|.+\.py)$ + exclude: ^completions/ + + - repo: https://github.com/timothycrosley/isort + rev: 5.1.4 + hooks: + - id: isort + args: [--settings-path=test/setup.cfg] + types: [text] + files: ^(helpers/python|.+\.py)$ + exclude: ^completions/ + + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v0.782 + hooks: + - id: mypy + args: [--config-file=test/setup.cfg] + # Intentionally not run on helpers/python (support very old versions) + exclude: ^completions/|^test/fixtures/pytest/ + + - repo: https://github.com/asottile/pyupgrade + rev: v2.7.2 + hooks: + - id: pyupgrade + args: [--py3-plus, --keep-percent-format] + exclude: ^completions/ + + - repo: https://github.com/perltidy/perltidy + rev: "20200619" + hooks: + - id: perltidy + types: [text] + files: ^(helpers/perl|.+\.p[ml])$ + + - repo: local + hooks: + - id: perlcritic + name: perlcritic + language: perl + additional_dependencies: [PETDANCE/Perl-Critic-1.138.tar.gz] + entry: perlcritic + args: [--quiet, --verbose, "5"] + types: [text] + files: ^(helpers/perl|.+\.p[ml])$ + + - repo: https://github.com/igorshubovych/markdownlint-cli + rev: v0.23.2 + hooks: + - id: markdownlint diff --git a/.shellcheckrc b/.shellcheckrc new file mode 100644 index 0000000..cf5ed4b --- /dev/null +++ b/.shellcheckrc @@ -0,0 +1,16 @@ +shell=bash +disable=SC1090 # not really fixable usually (ever?) +disable=SC2034 # for localizing variables set in called functions +disable=SC2128 # intentional style choice +disable=SC2206 # suggested alternatives fail in posix mode or use temp files +disable=SC2207 # suggested alternatives fail in posix mode or use temp files + +# These disables are to be investigated and decided + +disable=SC1004 +disable=SC2015 +disable=SC2016 +disable=SC2086 +disable=SC2155 +disable=SC2162 +disable=SC2231 diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..1ab73f5 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,56 @@ +language: generic + +dist: bionic + +services: + - docker + +jobs: + include: + - stage: lint + language: go + go: "1.14" + services: [] + cache: + directories: + - $HOME/.cache/pip + - $HOME/.cache/pre-commit + before_install: [] + script: + - pyenv shell 3.8 + - pip3 install "$(grep ^pre-commit test/requirements-dev.txt)" + - pre-commit run --all-files --color=always + - stage: test + env: DIST=alpine + - env: DIST=centos7 + - env: DIST=debian10 + - env: DIST=fedoradev + - env: DIST=ubuntu14 + - env: DIST=ubuntu14 BSD=true NETWORK=none + +before_install: + - docker build + --build-arg DIST=$DIST -t bash-completion:$DIST -f test/docker/Dockerfile . + +script: + - docker run --name bash-completion + -e CI=true -e DIST=$DIST -e BSD=$BSD -e NETWORK=$NETWORK + ${NETWORK:+--network $NETWORK} + -t bash-completion:$DIST + +before_deploy: + - docker start bash-completion + - docker exec bash-completion + sh -c "tar c bash-completion-$TRAVIS_TAG.tar.*" | tar xv + - docker kill bash-completion + +deploy: + provider: releases + api_key: + secure: MoK9nzmS6CBzPPIrhC0Ch6hIB3zEzLqZE6k4axoCyz/wmJFLJgX9OCq5K8zS4Jv8NuaA2C1YTcr+m56IO9N0RTmIWrS4q40fLIhKlYv6255u+wXMkGfqXbiFAZG5yndhUo8NE6QXAtixd3nQ/3/MOt2PdsOn+OdxTDmcPSXaW/ltkd/fMHynWzupdyRJ1v46IofPBrjsC1pTzW0iVqVHz64Ix3kPVjjPR9BMHzgKMJ8sPWBGZtF2ovjwsTHYPSpEyytVRecqrmEjM6QBCgfhQDqH87jOw6Y81xh1fWDCoxaZw7HlEcQ+HeHOkDdA24AYaxVoYXrKdIDXUXWt8w674Po7UWB6kIUn3J59Xaw60Sp4VaN88Y2eX9UKRcoDRHLWc8HKt4f9AUDR9YpFF08N+gKRmJFt9mCxqeJ+pyYD/coHGkGb8XvewTKihCSuH/qCWjM8XqM493DLDlJ5aELgMEcJXPXX4TmjsriOeErTY1qxRTRHJPmfUJ/kHtmpE+DxNXpwZOnyG+VoO5aEaIKbzHxX9QzWyyEhTflupdatZ2JFt1pmVDpwH9zcEifBwE0cUwhXk+LJuxHd5ePIIpvepAAnXKaxlYwchj4cFaJp7S9GZoAQughgQQkyfz0qr3J6hBhg360QAq4yjPOWjGgGz4iAG8kWd3MVXLvL+TtfBeY= + file: bash-completion-$TRAVIS_TAG.tar.xz + skip_cleanup: true + on: + repo: scop/bash-completion + condition: $DIST = alpine + tags: true diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..ee2daef --- /dev/null +++ b/AUTHORS @@ -0,0 +1,7 @@ +David Paleino (Debian) +Freddy Vulto +Guillame Rousse (Mandriva) +Igor Murzov +Mike Kelly (Exherbo) +Santiago M. Mola (Exherbo) +Ville Skyttä diff --git a/CHANGES b/CHANGES new file mode 100644 index 0000000..7a26a1b --- /dev/null +++ b/CHANGES @@ -0,0 +1,3141 @@ +bash-completion (2.11) + + [ Alexander Meshcheryakov ] + * _known_hosts_real: check that ruptime is present before calling + (#390) + + [ Andrew Gaul ] + * totem: reuse kaffeine completions (#372) + + [ Damien Nadé ] + * __reassemble_comp_words_by_ref: avoid triggering nounset on + indirect references + + [ Felix Lechner ] + * lintian: complete paths for Ubuntu's .ddeb and Debian's buildinfo + files (#397) + + [ Felix Yan ] + * ip: complete route add table arg + * ip: style fixes similar to ip-netns + * ip: add more completions for ip-rule + * ip: add support for netns (#391) + * ip: improve completion of route subcommands (#326) + + [ Hans-Christoph Steiner ] + * unzip, zipinfo: complete *.aar (#428) + + [ Jakub Jelen ] + * ssh: add new -Q completions in OpenSSH 8.2p1 (#400) + + [ Kevin Locke ] + * python: support executables with minor version (#389) + + [ Michal Suchánek ] + * insmod, modinfo, modprobe: support xz compressed modules (#401) + + [ Phan Duc Nhat Minh ] + * tshark: complete -r arg with all filenames (#422) + + [ Sebastian Jakubiak ] + * openssl: update -starttls completions (#403) + * _filedir*: update link to bug-bash discussion on -X (#404) + * test/python: add testcase for submodule completion + + [ Ville Skyttä ] + * Release 2.11 + * extra/make-changelog: check and output usage message + * pre-commit: anchor exclude patterns + * pytest: rewrite in bash, support toplevel funcs, avoid nondef ones + and classes + * test/xfreerdp: skip --help failure cases + * test/tshark: fix multiple -O completion with no http2 support + * test/ant: avoid complete-ant-cmd.pl interference with ANT_ARGS + * _xinetd_services: avoid nounset error on bash 4.2 + * pre-commit: upgrade isort to 5.1.4 + * pre-commit: upgrade pyupgrade to 2.7.2 + * pre-commit: add pyupgrade, run it + * test/ant: gitignore all target cache files + * _known_hosts_real: exclude Host negations + * pre-commit: upgrade isort to 5.0.7 + * pre-commit: update shellcheck-py URL + * test/inputrc: do not set print-completions-horizontally + * test/inputrc: comment typo fix + * pytest: complete async test class methods + * __get_cword_at_cursor_by_ref: fix regression on bash 4.2 + * test: upgrade markdownlint-cli to 0.23.2 + * _known_hosts_real: avoid errors in nounset mode on Ubuntu 14 and + 16 + * _longopt: exclude too many dashes, allow underscores, require ends + with alnum + * _included_ssh_config_files: support globs + * _known_hosts_real: prevent unwanted pathname expansion on host + entries + * test/shfmt: upgrade to 3.1.2, reformat with it + * test/_known_hosts_real: add explicit no globbing test case + * test: upgrade mypy to 0.782 + * CONTRIBUTING.md: add posix and nounset mode item + * test: upgrade mypy to 0.781 + * test: upgrade perltidy to 20200619 + * _known_hosts_real: fix completion of Host entries after a wildcard + etc + * _known_hosts_real: fix # handling in ssh configs + * test: upgrade flake8 to 3.8.3 + * test/xhost: multiple expected result handling fixes + * test/slapt-src: single expected result handling fixes + * test: partial hostname completion fixes + * test: simplify completion parsing + * test/dpkg-query: mark as xfail on non-Debian based systems + * .gitignore: clean up some no longer needed ignores + * test/lspci: skip -A arg test if lspci fails -A help, e.g. busybox + lspci + * test: regex escape our magic mark for completeness + * test: upgrade mypy to 0.780 + * test/_known_hosts_real: don't modify class scoped base expected + list + * test/_known_hosts_real: reset COMP_KNOWN_HOSTS_WITH_HOSTFILE + between tests + * test/_known_hosts_real: tolerate duplicates + * bash_completion: trivial cleanups + * gcc: avoid errors in nounset mode + * pytest: fix test class method completion with BSD awk + * man, mutt: avoid errors in nounset mode on Ubuntu 14 and 16 + * java, make: avoid errors in nounset mode on Ubuntu 14 and 16 + * README: document GNU make build requirement + * pytest: add test class method completion + * _known_hosts: avoid errors in nounset mode and no arguments + * bash_completion: fix array set checks with empty elements in them + * *: avoid more errors in nounset mode + * cfrun: fix $hostfile leak + * _command_offset, route: cleanups + * *: avoid more errors in nounset mode + * qemu: add -machine arg completion + * qemu, sbopkg: avoid unintentional globbing on option arg + completions + * test: enable shellcheck SC2035 + * *: drop support for bash 4.1 + * _init_completion: fix unassigned redirect completion in nounset + mode + * ip: route shfmt, arithmetic evaluation + * _filedir: avoid unbound variable error on Ubuntu 14 and 16 + * _pids, _pgids, _pnames: improve shfmt formatting + * scp, sftp, ssh: fix completion on options bundled with -4/-6 + * modprobe, tshark, _included_ssh_config_files: use [[ ]] instead of + [ ] + * test/runLint: warn about [ ] instead of [[ ]] use + * test: skip various tests if we don't get a useful usage message + * *: mark nounset mode as supported, issues with it are bugs now + * *: avoid more errors in nounset mode + * *: avoid more errors in nounset mode + * *: avoid more errors in nounset mode + * test/inputrc: comment and whitespace tweaks + * *: avoid more errors in nounset mode + * test/unit: sort files included in dist + * test/unit: include test_unit_known_hosts_real.py in dist + * bash_completion: line wrapping tweaks, NFC + * 7z: fix -o/-w attached arg completion + * postfix: try to arrange a fake tty so we can tickle the usage + message out + * _bashcomp_try_faketty: new function to try running command with a + fake tty + * mr: avoid herestrings, simplify command parsing + * test/mr: handle missing "clean" with skipif + * test: mark known non-ASCII issues with test suite as xfail + * dpkg-deb: add --raw-extract and -X arg completions + * test: add some dpkg-query test cases + * dpkg-deb: fix --show/-W completion + * test: upgrade markdownlint-cli to 0.23.1 + * *: use more arithmetic evaluation + * test: try harder to restore environment and cwd on failures + * *: use $ifs for storing/restoring $IFS + * test/irb: xfail options test if --help is not available + * test: upgrade flake8 to 3.8.1 + * test: pre-commit config cleanups, ordering + * test: upgrade pre-commit to 2.4.0+, drop shfmt kludge + * test: sync shfmt and shellcheck configs + * test: shfmt bashrc + * test: remove unused run-shellcheck, shellcheck is in pre-commit + now + * test: remove old test suite code no longer used \o/ + * test/_known_hosts_real: port remaining test cases to + pytest+pexpect + * test: remove more no longer needed old test suite code + * test/_known_hosts_real: port more test cases to pytest+pexpect + * test/_get_cword: port remaining test case to pytest+pexpect + * test: replace some echos with printfs + * test/_filedir: fix shutil.rmtree on Python < 3.6 + * test/_expand: port remaining test cases to pytest+pexpect + * test: drop some no longer needed old test suite code + * test/_filedir: port remaining test cases to pytest+pexpect + * test: run all Travis jobs on dist: bionic + * test: drop not needed sudo on Travis + * test/_filedir: port more test cases to pytest+pexpect + * test/__expand_tilde_by_ref: port remaining test cases to + pytest+pexpect + * test/_get_comp_words_by_ref: convert remaining test cases to + pytest+pexpect + * test: run pytest --verbose in docker + * lftp: use "bookmark list" command to list bookmarks + * test: drop some no longer needed old test suite code + * test/slapt-src: convert remaining test case to pytest+pexpect + * _xfunc: simplify + * apt-cache: avoid nonzero exit code from _apt_cache_packages + * test/slapt-get: convert remaining test case to pytest+pexpect + * test/secret-tool: add to test command list + * test/scp: port remaining test case to pytest+pexpect + * test/umount: convert remaining test case to pytest+pexpect + * secret-tool: new completion + * apt-get: complete build-dep with dirs + * travis: use golang 1.14 for shfmt + * *: run all shell code through shfmt -s + * pre-commit etc: add shfmt + * test: fix incorrect fixtures/shared/default xfails/expectations + * test: upgrade markdownlint to 0.23.0 + * nmap: simplify help scraping a bit, don't try to emit unnecessary + newlines + * test: prefix fake test commands with underscore + * test: port most umount test cases to pytest+pexpect + * test: add note about unescaped assert_complete single return + values + * editorconfig: apply yaml settings to .yaml too + * pre-commit: use local perlcritic hook + * *: doc and comment link updates + * pre-commit, *.md: add markdownlint, address findings + * README: clarify loading automatically on demand + * ssh-keygen: -O arg updates and improvements + * ssh-keygen: add -b arg completions according to specified -t + * ssh-keygen: option and arg completion updates for new versions + * _command: improve commentary + * reportbug, scp, sftp, svn: use compgen -c instead of _command + * find: fix -exec etc argument and its completion + * extra: trigger docker builds only on test-cmd-list.txt changes + * test: add script to maintain list of executables for full test + coverage + * test: run lint tests on Travis in a quickish separate first stage + * test/make: mark more cases as requiring command + * make: add bmake alias + * test: run pre-commit on host instead of docker + * test: add perlcritic to pre-commit, run on all perl + * *: remove some unused variables, thanks to shellcheck SC2034 + * *: various loop iteration improvements + * crontab: fix loop over already given args + * apt-cache: fix command mode handling + * doc: add loop variable naming guideline + * test: make at-point completion tests easier + * ssh, xsltproc: address shellcheck SC2006 + * scp: work around shellcheck SC1003 + * mutt: address shellchec SC2236 + * wget: address shellcheck SC2116 + * pytest: address shellcheck SC2002 + * bash_completion, java, tipc: for loop whitespace consistency + tweaks + * *: more arithmetic evaluation cleanups, thanks to shellcheck + SC2004 + * __reassemble_comp_words_by_ref, java: address and work around + shellcheck SC2102 + * test: enable parallel pre-commit shellcheck + * test: remove shellcheck severity filter, add explicit disables + instead + * doc: recommend arithmetic evaluation + * *: array subscript cleanups + * ssh-keygen: -s and -n completion improvements + * *: enable and address shellcheck SC2053 + * bash_completion, invoke-rc.d, svcadm: trivial cleanups + * *: replace various conditional expressions with arithmetic + evaluation + * carton: fix command parsing with BSD sed + * nmap: fix option parsing with BSD sed + * test/alias: port remaining test case to pytest+pexpect + * test: generalize complete at point test + * test/cd: fix test_dir_at_point for setups that repeat "trailer" + * pytest: add some option arg (non-)completions + * pytest: complete test classes + * pgrep, pkill: add --ns and --nslist arg completions + * test: run skipif and xfail commands without caring if they output + or not + * test: make it possible to not care whether command did output or + not + * test/xfreerdp: skip xfreerdp kbd test if kbd-list returns empty + * test: tolerate duplicates from compgen actions + * test: bump shellcheck severity to warning + some disables + * *: address shellcheck SC2046 + * test/lib/library.sh: address shellcheck SC2125 + * java, pkgadd, sysbench: address shellchec SC2124 + * scp: address shellcheck SC2089 and SC2090 + * _filedir_xspec: address shellcheck SC2140 + * rpm, ssh, umount.linux: address shellcheck SC2120 + * cvs, modprobe, sh: address shellcheck SC2209 + * mutt: address shellcheck SC2088 + * _upvar, _upvars, _variables, rpm: address shellcheck SC1083 + * test/run: address shellcheck SC2164 + * renice: address shellcheck SC2254 + * tipc: comment grammar and spelling fixes + * man, perl, route, tipc: address shellcheck SC2053 + * info, java: address shellcheck SC2153 + * quote_readline: fix $ret leak + * test: upgrade shellcheck to 0.7.1 + * test/printenv: xfail if --help doesn't contain options (e.g. + busybox) + * test/aptitude: require command where necessary + * _known_hosts_real, op: address shellcheck SC2184 + * test: don't run shellcheck on completions/.gitignore + * protoc: complete all --*_out without more specific handling with + dirs + * sysbench: add --test= deprecation TODO + * pkgadd: indentation fix + * chronyc, wvdial: address shellcheck SC2178 + * java, pkgadd, sysbench: address shellcheck SC2124 + * mplayer: address shellcheck SC1078 false positive + * smartctl: hush shellcheck SC2054 false positives + * *: address shellcheck SC2221 and SC2222 + * bash_completion: address shellcheck SC2220 + * crontab, wodim: silence shellcheck SC2191 and SC2192 + * aptitude: add some option arg (non)completions + * aptitude: parse options list from --help, hardcode less + * test/aptitude: add some test cases + * *: argument interation improvements + * *: whitespace tweaks + * apt-get etc: use _apt_cache_packages from apt-cache + * pre-commit: run most python checks on helpers/python too + * test/ldd: xfail if --help is not implemented + * test/printenv: require command for arg completion test + * printenv: indentation fixes + * test: upgrade mypy to 0.770 + * test: split dependencies requiring Python 3.6.1+ to requirements- + dev.txt + * git: trigger docker rebuild on pre-commit config change + * test: require openssl command for option argument tests + * test: move perltidy to pre-commit, run with --converge + * test: move shellcheck to pre-commit + * test: ignore flake8 messages that are in black's domain + * _xinetd_services: look up from $BASHCOMP_XINETDDIR, add some unit + tests + * printenv: new completion + * copyright: add 2020 + * test: fix CompletionResult.__eq__ UnboundLocalError + * test: run pre-commit in tools container + * test: shellcheck tweaks + * test: add isort to pre-commit, run it + * test: add flake8-bugbear + * test: install black for Python 3.6 too + * pre-commit: add config with black, flake8, and mypy + * test: drop redundant black args from docker runs + * *: python type hint fixes and improvements + * extra/make-changelog: run through black + * test/totem: add basic test case + * test/cd: remove unused import + * openssl: complete -writerand with filenames + * openssl: parse available options from $command -help + * openssl: support getting digest list from more recent openssl + versions + * nmap: handle options split on equals sign + * nmap: parse options from -h output + * test/cd: make dir_at_point produce better debuggable failures + * test/cd: convert remaining test case to pytest+pexpect + * test: remove some no longer needed old test suite code + * test/chown,sudo: parametrize special case test, improve xfail + targeting + * test/tsig-keygen: require command for test_options + * test/upgradepkg: port remaining test case to pytest+pexpect + * tsig-keygen: new completion + * test: host helper lint and usage fixes + * test: port some _known_hosts_real unit tests to pytest+pexpect + * test: remove some no longer needed tcl/expect code + * test: fix spurious hosts fixture failure without avahi-browse + installed + * test: port some scp test cases to pytest+pexpect + * test: port remaining finger, sftp, ssh, and xhost cases to + pytest+pexpect + * lilo: work around shellcheck false positive + * test/ipcalc: fix tests with busybox ipcalc + * chromium-browser, firefox: complete on *.txt (#379) + * README.md: add introduction + * ipcalc: new completion + * *: complete commands when prefixed with a backslash + * test/wol: don't fail MAC test if test system has /etc/ethers + entries + * test/dnssec-keygen: allow more alternatives in algorithm + completion + * lilo: don't complete on commented out labels + * lilo: honor -C when completing labels + * lilo: add -B and -E completions + + [ beantaxi ] + * Source user completion only if it's a file (#409) + + [ hugoziviani ] + * jarsigner: complete on *.apk too (#386) + * cryptsetup: add luksChangeKey arg completion (#380) + + -- Ville Skyttä Sat, 25 Jul 2020 11:25:09 +0300 + +bash-completion (2.10) + + [ Felix Lechner ] + * perltidy: associate *.t (#338) + + [ Gabriel F. T. Gomes ] + * perl: fix completion with space between option and argument + + [ Grisha Levit ] + * _variables: add TERM and LC_* completion (#353) + + [ Iñigo Martínez ] + * autotools: Replace pkgdatadir with datadir + * pkg-config: Relative paths + * pkg-config: generate Name from autotools PACKAGE + + [ Jakub Jelen ] + * ssh: option and argument completion updates (#332) + + [ Michał Górny ] + * test_arp: Skip if ARP tables are empty + * test_chromium_browser: Skip test_2 if 'chromium-browser --help' + fails + * test_rpm2tgz: Fix expected output + + [ Sebastian ] + * cppcheck: Add new standards to --std option. (#356) + + [ Tomasz N ] + * apt-get: fix pkg version completion if it contains a colon (#351) + + [ Ville Skyttä ] + * test: bump black to >=19.10b0 + * ssh, scp, sftp, ssh-copy-id, curl: improve identity file + completion + * update-rc.d: indentation fix + * update-rc.d: remove dead code + * screen: add serial device basic arg (non)completion + * screen: add //telnet completion + * test: add some trivial perl -E/-e cases + * perl: indentation fixes + * curl: make @filename completion do the right thing with dirs + * _filedir: avoid duplicate dirs internally, and a compgen -d call + for files + * _filedir: remove unused $x + * bash_completion.sh: shellcheck SC2086 fixes + * test: shellcheck config cleanups + * shellcheck: add some option arg (non)completions + * test: fix cpio users test in presence of usernames with whitespace + * test: python typing fixes + * test: add minimal mypy config + * .gitignore: mypy cache + * makepkg: fix option completion + * test: mark dcop and mr testcases requiring the cmd as such + * CONTRIBUTING: disable e-mail bug gateway due to spam + * carton: new completion + * op: direct command parsing stderr to /dev/null + * test: adjust java expectations based on whether jars can be listed + * valgrind: look tool names from lib/*-linux-gnu dirs too + * test: xfail locale-gen option completion if --help is not + available + * _sysvdirs: always return 0 + * java: don't assume jar is installed + * travis: test with Debian 10 + * wine: install for wine-development and wine-stable too + * travis: generate dist tarball on alpine + * dmypy: new completion + * test: add require_longopt xfail helper, use it + * test: mark more tests that parse command output as requiring + command + * sysctl: invoke completed sysctl instead of one from path to get + variables + * screen, smartctl, update-alternatives: _parse_help, drop hardcoded + option list + * lintian-info: _parse_help, add more option arg (non)completions + * gprof: _parse_usage, drop hardcoded option list + * test: fix retrieving command to test from request + * travis: pass NETWORK as env var, so we can actually use it + * test: xfail MAC address completion without networking + * test: ignore _makepkg_bootstrap in makepkg test env + * test: hush flake8-bugbear B010 + * test: don't sort expected completion lists under the hood + * test: add bunch of basic option parsing test cases + * test: always run tests which don't require tested command + * test: explodepkg and upgradepkg test fixes + * test: mark sbcl-mt xfail due to whitespace split issues + * _terms: search directly from various terminfo dirs + * _terms: combine and simplify somewhat + * pkg-get: fix $i leak + * pkgutil: fix $i leak + * test: portinstall/upgrade test case and setup fixes + * lvm pv*, vg*: parse help instead of hardcoding option list + * ipv6calc: parse help instead of hardcoding option list + * test: avoid some sed -r/-E runLint false positives + * test: use sh +* as ccache command test case + * java: make jar/zip listing work with unzip + * test: installpkg test fixes + * test: fix acroread fixture dir + * test: remove unnecessary returns after pytest.skip + * test: avoid gnome-mplayer core dump on Ubuntu 14 + * xvfb-run: new completion + * test: skip gssdp-discover --message-type when option not available + * test: expect failures for bc without --help useful with _longopt + * test: don't expect a .tox dir in fixture + * test: drop sourcing our no longer existing profile.d script + * tox: include -- in option completions + * tox: complete defaults after a -- + * gssdp-discover: new completion + * test: register our pytest markers to hush warnings from 4.5+ + * test: fix required pytest version + * ip: invoke the tool as $1 + * README: drop distro badges, link to Repology instead + * chromium-browser: add --proxy-server arg completion + * test: source our profile.d test env script in docker + * influx: new completion + * README: badge title tweaks + * tox: do simple parse on tox.ini if --listenvs* yields nothing + * test: add basic tox fixture + * man: fall back to _parse_usage for _parse_help + * test_wsimport: xfail options test on unparseable -help + * test: don't try to install black on Python < 3.6 + * pgrep: fix fallback to _parse_usage + * test: xfail unparseable mock and munin-node-configure --help cases + * test_pwdx: xfail more unparseable help cases + * build: make pytest executable configurable, look for pytest-3 too + * test: enforce minimum pytest version + * test: zopflipng flake8 fix + * test: xfail getent and pwdx option completions with unparseable + --help + * test: add more basic _parse_help use test cases + * test: add bunch of basic _parse_help use test cases + * .gitignore: add configure.lineno + * badblocks: fix $i leak + * postfix: option completion is expected to fail at the moment + * cal: try _parse_help before _parse_usage + * test: add bunch of basic _parse_usage use test cases + * chsh, pwck: try _parse_help before _parse_usage + * test: add basic autossh test + * test: convert more _filedir unit tests to pytest+pexpect + * test: flake8 fix + * test: convert bunch of _filedir unit tests to pytest+pexpect + * test: convert finger partial test case to pytest+pexpect + * README: add some badges, tweak existing + * test: port _variables unit tests to pytest+pexpect + * test: port compgen and quote tests to pytest+pexpect + * iconv, lz4, tipc, xsltproc: replace some seds with compgen -X + * test: disallow Alpine failure on Travis + * _pnames: adapt for busybox ps, rewrite in pure bash + * test: run our docker script in test containers by default + * test: use one Dockerfile for all dists + * test_ifup: accept short option completions too + * timeout: fallback to _parse_usage from _parse_help + * test_wget: test --s instead of --h + * test_lsusb: xfail with unparseable --help + * test: expect failures for various completions without useful + --help + * test: support xfail in our markers like skipif, use it a lot + * test: add Alpine Linux container, allow failures for now + * iconv: weed out ... from encoding completions + * test_iconv: add basic file completion test + * test_iconv: skip option completion if --help fails + * test_getconf: skip if -a doesn't output any POSIX_V* + * test_feh, test_makepkg: invoke grep as "command grep" + * test: generalize check whether we're being run in a container + * tar: simplify locating tarball from command line + * pkg_delete: don't limit to FreeBSD + * test: reformat test_chromium_browser.py source + * test: set up BASH_COMPLETION_COMPAT_DIR in bashrc (only) + * test: more thorough system location interference avoidance + * test: bashrc comment and whitespace tweaks + * build: makefile whitespace tweaks + * build: really reset return value before completions check + * build: simplify symlink setup + * tar: add missing bsdtar, gtar, and star symlinks + * README: use light gray badges for unknown versions + * README: link to cygwin package + + [ Wolf ] + * ri: hush some warnings + + [ andreabravetti ] + * unrar: complete on *.exe (#337) + + [ ezr ] + * chromium-browser: Add support for .mhtml files + + [ jerkey ] + * screen: complete first arg with serial devices + + [ marxin ] + * gcc: support new --completion option (#222) + + [ pcc ] + * unzip, zipinfo: complete *.aab (#340) + + [ versat ] + * cppcheck: Remove deprecated option 'posix' for '--std=' + + -- Ville Skyttä Thu, 05 Dec 2019 17:04:26 +0200 + +bash-completion (2.9) + + [ Antonio Terceiro ] + * dpkg-source: Add --before-build --after-build --commit, and + --print-format + + [ Gabriel F. T. Gomes ] + * xm: Deprecate completion for obsolete command (#284) + * _filedir_xspec: Fallback to suggesting all files if requested + (#260) + * tar: Support completions for zstd compression extensions (#255) + * dpkg: List held packages (#250) + * cvs: Add completion for the log command + + [ Guillaume Mella ] + * unzip, zipinfo: Associate with *.xar (eXist-db application + package) (#257) + + [ Igor Susman ] + * mplayer: Associate with *.w64 + + [ Jaak Ristioja ] + * okular: Added support for xz-compressed files. + + [ John Swinbank ] + * _xspecs: Declare as global on bash >= 4.2 + + [ Kevin Locke ] + * test: Increase expect pty to 160 columns + * test: avoid interrupting magic mark output + + [ Per Lundberg ] + * 7z: add .msi support + + [ Peter Wu ] + * tshark: speed up tshark -O completion + * tshark: fix completion of -Xlua_script option + * tshark: Support preferences (-o) completion with memoization + * test: fix misinterpretation of completion output in tests + * test: fix flake8 complaints about unused imports + * conftest: fix RemovedInPytest4Warning due to use of + node.get_marker + * chromium-browser: consider chrome and chromium as aliases + * tshark: support .gz and .cap files for -r expansion + * tshark: prevent a single-character file from breaking -G + completion + * tshark: update -T and -t completions + + [ Russell Davis ] + * man: Fix completion when failglob option is enabled (#225) + + [ Timo Taipalus ] + * mplayer: Add common supported module music formats + + [ Tomasz N ] + * _longopt: pick first long option on a line, not last + + [ Ville Skyttä ] + * *: avoid shellcheck SC1007 and SC1010 + * 7z: add some TODO notes on parsing "i" output for extensions + * ssh: make -o protocol completion less hardcoded + * ssh: make option completion case insensitive + * ssh: fix suboption completion with combined -*o + * xvnc4viewer: code cleanups + * doc/testing: remove lots of legacy info, add some new + * CONTRIBUTING: add upstream vs bash-completion considerations + * CONTRIBUTING: note runLint and run-shellcheck + * __parse_options, 7z: avoid herestrings + * arp, ccze, ifstat, inotifywait, makepkg: invoke sed with "command" + * shellcheck: disable bunch of warnings when in "-S warning" mode + * test: move default shell option from run-shellcheck to + .shellcheckrc + * test: make runLint search for herestrings + * tar, valgrind: avoid some herestrings + * travis: run shellcheck on bash_completion.sh.in too + * travis: fail on shellcheck errors + * make: quote eval array definitions to work around shellcheck + SC1036 bug + * test: add make -C test case + * *: shellcheck error fixes + * _included_ssh_config_files: store found included files in an array + * _included_ssh_config_files: doc grammar fixes + * test: add invoke-rc.d test case for not repeating already given + options + * ebtables: improve existing table arg parsing + * test: add script to run shellcheck, run it in Travis, allowing + failure for now + * iptables: improve existing table arg parsing + * test: shorten long gdb test core file name so tar doesn't croak on + it + * AUTHORS: remove unrelated project association from my entry + * apt-get: protect source against regex specials + * mypy, mysql, xmms: don't complete unknown split long option args + * synclient: remove unused local variable "split" + * test: adjust _get_comp_words_by_ref test to changed error output + * apt-cache: protect showsrc against regex specials + * test: improve tshark -O arg completion test + * tshark: ignore stderr when parsing -G, -L, and -h output + * *: error output consistency, use bash_completion prefix + * _upvar: deprecate in favor of _upvars + * *: add missing "ex: filetype=sh" + * phing: fix getting just a tab for options on CentOS 6 + * phing: don't complete -l with files + * various: apply file vs dir special cases also when invoked with + full path + * *: whitespace tweaks + * ssh: don't offer protocol v1 specific options if it's not + supported + * test: add some gdb non-core files + * _parse_help: look for long options somewhat more eagerly + * gdb: relax core filename pattern + * test/tools: fix exit status incrementation + * *: arithmetic expression related cleanups + * test/tools: run all tools, don't stop at first failure + * test: check for perltidy errors and warnings + * *: format Perl code with perltidy + * *: format Python code with black + * .dir-locals.el: use flycheck-sh-bash-args + * valgrind: look up tools from libexec dirs too + * *: make _parse_usage fallbacks more concise + * svn, svk, wget: use _iconv_charsets + * *: spelling fixes + * msynctool: code cleanups + * *: remove whitespace after redirections + * *: remove spaces immediately within $() + * bzip2: recognize *.tbz2 as bzipped + * modprobe: module parameter boolean values + * ping, tracepath: parse options primarily with _parse_help + * ulimit: new completion + * shellcheck: new completion + * dnssec-keygen: new completion + * modprobe: append = to module parameter completions + * test: include test_unit_longopt.py in dist + * test: add some _longopt unit tests + * _longopt: simplify regex, use printf instead of echo, drop + unnecessary sort + * nsupdate: new completion + * _longopt: don't complete --no-* with file/dirname arg + * copyright: add 2019 + * pytest: complete --pythonwarnings/-W arg + * python: make warning action list reusable + * test: use pytest-xdist + * extra: add git pre-push hook for triggering Docker Hub builds + * post-commit: trigger on test/requirements.txt too + * pytest: complete pytest-xdist --dist, --numprocesses, and + --rsyncdir + * test: remove no longer needed completion/*.exp + * xfreerdp: reinstate support for old versions with dash option + syntax + * test: rewrite "generate" in Python, fix trailing backslash in + EXTRA_DIST + * test: sort t/Makefile.am EXTRA_DIST in C locale + * ssh: support RemoteCommand and SyslogFacility options + * test: Expect failure for chown all users test as non-root + * test: Fix declare test case with bash 5.0 + * adb: Deprecate in favor of one shipped with the Android SDK + * xfreerdp: Update for more modern xfreerdp + * jsonschema: New completion + * test: Remove unnecessary ri xfail + * test: Clean up man tmp dir + * .gitignore: Add .python-version (for pyenv) + * test: Remove unnecessary autouse=True from fixtures + * ifstat: Make work with iproute2 version + * iperf, iperf3: Add some option arg (non-)completions + * test: Fix test generation wrt results checking improvements + * ifstat: New completion + * __parse_options: Avoid non-zero exit status + * test: Refactor/improve completion results checking + * test: Match Python's default locale unaware sort in bash setup + * test: Rename completion.line to .output + * test: Add man failglob test case + * test: Add pre_cmds support for completion fixture + * inotifywatch: New completion, common with inotifywait + * inotifywait: Fix -e completion with BSD sed + * inotifywait: Avoid some false positive event names + * test: extend _ip_addresses unit tests some + * _ip_addresses: Avoid completing ipv4 ones with -6 + * inotifywait: New completion + * test: Mark some xfails based on if in docker instead of in CI + * test: Skip ifup options test if it doesn't grok --help, not in CI + * test: Clean up and docker-ignore __pycache__ dirs + * build: Include test/t in dist tarball + * test/t: Avoid trailing backslash in Makefile.am's to appease + automake + * test: Remove some no longer used old test suite code + * _xspecs: Simplify bash version check + * chmod: Fix "-" completion + * sysctl: Treat -f as alias for -p/--load + * .gitignore: Add pytestdebug.log + * chmod: Fix file completion after modes starting with a dash + * _count_args: Add 3rd arg for treating option-like things as args + * test: Fix _count_args test_7 to test intended case + * pydocstyle: New completion + * Travis: Remove unused PYTEST env var + * doc: Note email issues gateway + * tcpdump: Various option and their arg completion updates + * test: Fix arp CI (non)expectations, remove redundant test case + * test: Be more consistent with "CI" env var examination and xfails + * arp: New completion, somewhat incomplete + * test: Expect failure in gkrellm if there's no X display + * doc: Update docs on generating simple tests + * doc: Some test dependency doc updates + * test: Add requirements.txt for installing dependencies + * grpck: Parse options with _parse_help, falling back to + _parse_usage + * grpck: Add --root/-R arg completion + * test suite: Ignore _scp_path_esc in env for ssh-copy-id + * ssh-copy-id: Add -i and -o arg (non-)completions + * tar: Clean up some redundant code + * cancel: Split long line + * cancel: Add some option arg (non-)completions + * locale-gen: New completion + * makepkg: Don't apply to other than Slackware makepkg + * test: Allow unknowns options in makepkg option completion + * makepkg: Use _parse_help instead of hardcoding option list + * mypy: New completion + * op: New completion + * hunspell: New completion + * xmllint: Improve --encode, --pretty, and --xpath arg + (non-)completions + * test: Remove leftover completion/ls.exp + * gcc: Add g++, gcc, gccgo, and gfortran *-[568] aliases + * perlcritic: New completion + * gnome-screenshot: New completion + * isort: New completion + * freeciv: Option and arg completion updates + * freeciv-gtk2: Install for freeciv and freeciv-gtk3, rename to + freeciv + * mplayer etc: Complete on *.crdownload partial downloads in + addition to *.part + * chromium-browser, google-chrome*: New non-xspec completion + * firefox etc: New non-xspec completion + * Merge branch 'master' into wip-pexpect + * nc: Add some more option (non-)completions + * test: Mark MANPATH without leading/trailing colons test an xfail + on CI CentOS 6 + * test: Remove kill, killall remnants + * test: Make case specific env entries shell code, not escaped + * Merge branch 'master' into wip-pexpect + * unzip, zipinfo: Associate with *.whl + * __load_completion: Avoid unnecessary lookups from nonexistent dirs + * Merge branch 'master' into wip-pexpect + * gcc: Add g++, gcc, gccgo, and gfortran *-7 aliases + * test: Use test_unit_* prefix for unit tests, to avoid name clashes + * test: Support setting cmd=None to require no command, for unit + tests + * test: Misc test suite fixes + * test: Fix jq and scrub skipif commands + * test: Don't require complete marker on test methods + * test: Add support for per-test env modifications + * test: Use more conventional Python file names for tests + * test: Sort completion results in Python for ease of use in Python + tests + * test: Allow __load_completion to fail + * test: chdir to fixtures dir in Python as well + * test: Mark xfreerdp as expected failure for now + * test: Replace + with Plus in test class names + * test: Implement load_completion_for using assert_bash_exec + * test: Add ability to selectively ignore diffs in environment + * test: Fixture reorganization + * test: Pass through $HOME and $DISPLAY to test bash + * test: Log pexpect interaction to $BASHCOMP_TEST_LOGFILE if set + * test: Rename BASHCOMP_* test env variables to BASHCOMP_TEST_* + * test: Add python3 test case + * test: Add class level skipif based on bash exec result + * test: Include command name in test class name, use numbered test + method names + * test: Fix some regressions introduced in recent test conversions + * test: Add support for running test case in a specified dir + * test: Add support for skipping individual tests based on shell + command status + * test: Make test base work with Python 3.3+ + * test: Add some iperf, iperf3 and xmodmap test cases + * xmodmap: Use _parse_help instead of hardcoded option list + * iperf: Improve client/server specific option parsing + * iperf: Install for iperf3 too + * iperf: Add g/G to --format completions + * xmodmap: Use _parse_help instead of hardcoded option list + * iperf: Improve client/server specific option parsing + * iperf: Install for iperf3 too + * iperf: Add g/G to --format completions + * test: Use /root/.local/bin/pytest on ubuntu14 by default + * test: Add generated test files to t/Makefile.am automatically + * test: Add new test files to EXTRA_DIST + * test: Use /root/.local/bin/pytest on centos6 by default + * test: Use make pytest docker executable env-configurable, default + pytest-3 + * test: Update generate for pytest+pexpect + * test: Convert majority of test cases to pytest+pexpect + * tox: Fall back to --listenvs for env list if --listenvs-all fails + * git-post-commit: Avoid some error trash when HEAD is not a + symbolic ref + * test: Add pylint-3 test case + * test: Limit number of pylint option completions + * pydoc, pylint: Determine python2/3 based on command basename only + * pylint: Bring -f/--format arg completion up to date with pylint + 1.9.2 + * pylint: Implement comma separated --confidence arg completion + * test: Fix buffer size option listing in run --help + * test: Bump expect's match_max to 20000 by default + * test: Run docker tests with --verbose + * _services: Try systemctl list-unit-files if systemctl list-units + fails + * extra/git-post-commit.sh: Add git post-commit Docker Hub trigger + hook + * gpgv: New completion + * pydoc, pylint: Skip module completion if current looks like a path + * travis: Run ubuntu14/bsd with no network + * travis: Split long lines in script + * test: Limit number of wget option completions to avoid unresolved + result + * test: Mark flake8 untested if it seems broken + * pylint: Option arg completion improvements + * tshark: Get available interfaces from -D output + * ngrep: Add "any" to -d arg completions + * fio: New completion + * test: Fix iwspy test case + * uscan: Use _parse_help instead of hardcoded option list + * urlsnarf: Add -p arg completion + * tracepath: Add -m and -p arg non-completions + * tracepath: Actually use our separate completion instead of + _known_hosts + * test: Skip jq option completion test if its --help doesn't list + them + * xdg-settings: Make help parsing work on BSD + * test: Support running with local BSD binaries, do it w/ ubuntu14 + in CI + * jq, sqlite3: Protect against negative array subscripts + * sudo: Improve long option arg handling + * sysctl: Recognize --pattern/-r and --load options + * test: Add sysctl option parsing test case + * sudo: Parse options from help/usage output, add some long option + support + * strace: Use _parse_help instead of hardcoded option list + * sshow: Add -p arg completion + * sqlite3: Add some option arg (non-)completions + * tune2fs: Update -o/-O argument lists + * jq: New completion + * reportbug: Run _parse_help and apt-cache more selectively + * querybts: Use _parse_help, not hardcoded option list, misc + improvements + * pyvenv: Support versioned 3.6-3.8 executables + * passwd: Try _parse_help before _parse_usage to parse options + * profile.d: Avoid tested variable values being confused as [ ] + operators + * cryptsetup: Add some option arg (non-)completions + * cryptsetup, nc, sh: Skip option args when counting arguments + * modinfo: Fall back to _parse_usage if _parse_help yields no + results + * mysql, mysqladmin: Complete --ssl-{ca,cert,key} option arg + * mysqladmin: Reuse --default-character-set completion from mysql + * modinfo: Use _parse_help instead of hardcoded option list + * minicom: Use _parse_help instead of hardcoded option list + * mplayer: Associate with *.S[3T]M, *.med, *.MED + * completions/Makefile.am: Use install-data-hook, not install-data- + local + * ifup etc: Add option and option argument completion + * _count_args: Add support for not counting specified option args + * ifquery: New ifup alias completion + * ngrep, tshark: Complete on *.pcapng too + * rpm: Complete --licensefiles with -q + * pytest: Rename from py.test to follow upstream recommended name + * README: Add instructions for overriding completions system wide + * README: Note $BASH_COMPLETION_USER_DIR + * test: Mark psql etc test cases untested if --help doesn't work + * aclocal, automake: Support versioned 1.16 executables + * __load_completion: Avoid bad array subscript on "commands" ending + with slash + * lzma: Use _parse_help instead of hardcoded option list + * test: Run perlcritic and flake8 on perl and python helpers in + Travis + * build: Improve cleanup of test/log and test/tmp dirs + * pkg-config: Complete on *.pc files + * build: Use AC_PROG_SED to locate sed + * build: Do cmake, pc, and profile variable replacements in Makefile + * README: Add Q/A on overriding a completion, modernize local + install answer + * json_xs: New completion + * chmod: New completion + * iperf, nc: Include IPv6 addresses in bind address completions + * links: Major rework, parse options from --help, add option arg + completion + * _ip_addresses: Add option to complete all/v4/v6 addresses, add + unit test + * wget: Remove nonexistent arg to _ip_addresses + * _filedir: Drop unnecessary evals + * iconv: Split charset completion to _iconv_charsets, add test case + * links: Install completion for links2 too + * xgamma: Comment spelling fix + * lftp: handle -s + * test: Skip scrub -p test when its --help doesn't list available + patterns + * ecryptfs-migrate-home: New completion + * scrub: New completion + * ether-wake: Install for etherwake as well + * *: Support completing arg of last bundled short option + * dselect: Parse options with _parse_help + * dhclient: Add some option arg (non-)completions + * dhclient: Parse options with _parse_usage + * chage, chpasswd: Add -R/--root arg completion + * reportbug: Add bunch of option arg (non-)completions + * .dir-locals.el: Set -O extglob for flycheck bash checks + * mount, umount: Deprecate on Linux in favor of util-linux >= 2.28 + ones + * _known_hosts_real: Reimplement known hosts file parsing in pure + bash + * test: Add comment line to fixtures/_known_hosts_real/known_hosts + * ssh: Complete all *File option args with _filedir + * README: Point Debian and openSUSE badges towards unstable and + Tumbleweed + * README: Link to various distro packages + * apt-get: Add -h/-v/-o non-completions + * apt-get: Sync option list with apt 1.5.1 + * apt-get: Simplify -t and friends completion, support Ubuntu + * apt-get: Add indextargets to list of suggested commands + * apt-get: Complete install package=versions + * ssh: Sync config option lists with OpenSSH 7.5p1, add some value + completions + * ssh: Sync query type list with OpenSSH 7.5p1 + * ssh: Order various switch cases closer to alphabetical + * completions/Makefile: Fix check-local in VPATH builds + + [ dmerge ] + * _filedir: Refactor to remove heredoc-dependent loop + + [ marxin ] + * gccgo: Add as a GCC completion target (#227) + + [ ovf ] + * xrandr: match the output name exactly for --mode + + -- Ville Skyttä Sat, 27 Apr 2019 11:50:12 +0300 + +bash-completion (2.8) + + [ Andrea Dari ] + * dpkg: Add -V/--verify arg completion + + [ Ben Wiederhake ] + * Add support for .lz4 extension to file-roller (#158) + + [ Eric A. Zarko ] + * unzip, zipinfo: Associate *.gar (#165) + + [ Gabriel F. T. Gomes ] + * openssl: Add completion for the genpkey, pkey, pkeyparam, and + pkeyutl commands + + [ Gonzalo Tornaría ] + * test: run bash with --norc to avoid system bashrc + + [ Gábor Bernát ] + * tox: New completion (#163) + + [ Halt ] + * mplayer: Disable user config when parsing options + + [ Henry-Joseph Audéoud ] + * ebtables: new completion (#150) + + [ Jakub Jelen ] + * ssh,ssh-add,ssh-keygen: Complete pkcs11 options with *.so + + [ Kevin Pulo ] + * mkdir: Complete on files in addition to dirs + + [ Luca Capello ] + * dpkg-query: Fix -W/--show completion + + [ Mark Friedenbach ] + * Add support for .lzo extension (--lzop) to tar (#155) + + [ Martin d'Anjou ] + * java: Complete *.war + + [ Mateusz Piotrowski ] + * kldunload: Increase robustness of compgen filters (#185) + * kldunload: Show modules with digits + + [ Michał Górny ] + * lftp: Support ~/.local/... bookmark location (#144) + * test suite: Support overriding default match buffer size (#141) + + [ Pawel ] + * man: Don't use $MANPATH directly (#161) + + [ Uwe Storbeck ] + * dpkg: Complete --vextract on deb files + * dpkg: Fix man page section in comment + + [ Ville Skyttä ] + * make-changelog.py: Use python3 + * test: Fix getting username in non-login shells + * test/unit: Whitespace tweaks + * info, man, rsync: Defer _expand invocation + * _expand: Reuse __expand_tilde_by_ref and _tilde logic, clean up + * test: Add some _expand unit tests + * bzip2, gzip, and other compressors: Use _tilde instead of _expand + * test: Add assert_complete_homedir, use in dpkg and ls + * dd, find, gcc: Remove unnecessary tilde expansion + * dd: Omit space only when offering one completion ending with = + * __expand_tilde_by_ref: Eval tilde expansion only, simplify + * Bump copyright years to -2018 + * mkdir: Complete files without appending space + * __load_completion: Load "xspec" completions dynamically too + * __load_completion: Code cleanup + * _available_interfaces: Get rid of eval + * make: Pass script to sed as parameter instead of using process + substitution + * ccze: New completion + * *: Comma separated opt arg completion improvements + * test suite: Some more mplayer and mencoder coverage + * tox: Complete comma separated -e arguments + * xdg-mime,xdg-settings: Fix inclusion in tarball + * geoiplookup: New completion + * ping*,ssh,scp,sftp,tracepath6: Filter IPv4/IPv6 literal addresses + * _known_hosts_real: Add option to filter IPv4 and IPv6 addresses + * radvdump: New completion + * lsscsi: New completion + * python: Support completing dotted module hierarchies + * test/docker: Tweak work dir, add bash as default cmd + * test: Try to skip postconf variable test on broken postfix configs + altogether + * Revert "travis: Don't build local docker images, use vskytta/bash- + completion ones" + * test: Add "postconf -" test case + * test: Work around broken centos/fedora postfix config in non-IPv6 + setup + * travis: Don't build local docker images, use vskytta/bash- + completion ones + * pycodestyle: New completion + * flake8: Various option arg completion improvements + * perltidy: New completion + * lowriter,localc etc: Use corresponding oo* completions + * cryptsetup: Update option lists + * pv: New completion + * getconf: New completion + * nproc: New completion + * _known_hosts_real: Document -a better + * ssh: Add -J/ProxyJump completion + * ssh: Declare $prefix closer to use + * test: Ignore duplicates in find_unique_completion_pair list + * test: dpkg,ls,_tilde: Skip gracefully if no uniq user for + completion is found + * xdg-mime: New completion + * ssh-keygen: Add -E arg completion + * reportbug: Don't hardcode option lists, split option args at = + * reportbug: Add -A/--attach arg completion + * apt-get: Complete *.deb on install if argument contains a slash + * ri: Fix integrated ri 1.8 class completion + * test: Add files to test older ri with + * Whitespace + * test: Remove things moved to library.exp from bashrc + * test: Add some comments regarding bash init in library.exp + * xdg-settings: New completion + * tox: Remove spurious executable bits + * tox: Include ALL in -e completions + * tox: Avoid stderr spewage when -e invoked without tox.ini + * pylint: Invoke python3 to search for modules if command contains 3 + * pylint: Install for pylint-2 and pylint-3 too + * test suite: Add bunch of man and MANPATH test cases + * test suite: Make man test subject names less generic + * test suite: man cleanup + * rfkill: Rename to _rfkill to avoid conflict with util-linux >= + 2.31 + * test: Use prebuilt docker hub bash-completion images + * README.md: Whitespace cleanup + * iptables: Use invoked command instead of hardcoded "iptables" + * iptables: Avoid stderr trashing when invoked as non-root + * iptables: Parse options from --help output + * vpnc: Add some option argument (non)completions + * vpnc: Improve config completions + * test suite: Drop no longer needed fedoradev /usr/bin/which + workaround + * test suite: Skip fedoradev GPG checks at least for now + * lspci: New completion + * lsusb: New completion + * oggdec: New completion + * alias: Fix completion followed by = (#146) + * *: Protect shopt reset from non-default $IFS + * test suite: Limit amount of info and pinfo test output + * test suite: Add info and pinfo option test cases + * test suite: Add basic hid2hci and munin-node-configure test cases + * aptitude: Add keep to commands list (Debian: #867587) + * *: Protect _known_hosts_real from user input treated as options + * curl: Fix -x etc option argument hostname completion + * groupdel: Parse and handle long options + * aptitude-curses: Use aptitude completion + * test suite: Install aptitude in ubuntu14 container + * test suite: Enable wine in ubuntu14 + * xm: Don't leak args and commands environment variables + * uscan: Don't leak cword and words environment variables + * test suite: Add bunch of missing basic test cases + * ktutil: Don't leak i and command environment variables + * test suite: Limit amount of output from process name completion + * test suite: Limit number of screen -T completion matches + + [ j^ ] + * xine etc, ogg123, mplayer -audiofile: Associate with *.oga + + -- Ville Skyttä Sat, 17 Mar 2018 10:30:07 +0200 + +bash-completion (2.7) + + [ Eli Young ] + * Makefile: update default compatdir (#132) + + [ Ville Skyttä ] + * Make user completion file configurable, disable in tests + * test suite: Generalize xspec completion install check + * pyflakes: Remove redundant xspec completion + * test suite: Fix __expand_tilde_by_ref test expectation output + * pdfunite: New *.pdf completion + + -- Ville Skyttä Sat, 01 Jul 2017 14:08:43 +0300 + +bash-completion (2.6) + + [ Björn Kautler ] + * Add missing sidedoor to .gitignore (#114) + + [ Ville Skyttä ] + * test suite: Mark expected centos6 CI _filedir failures as such + * Expose version in BASH_COMPLETION_VERSINFO, use it in profile.d + script + * test suite: Skip an expected make test case failure in centos6 CI + * test suite: Fix ifdown and ifup CI test skipping + * test suite: Ignore env var pulled in by use of scp in tests + * test suite: If colon trim doesn't do anything, trim as usual + * tar: Comment spelling fixes + * test suite: Mark dpkg -L test case untested if no packages + installed + * test suite: Cosmetic tweaks + * dpkg: Fix dpkg -i home dir completion + * test suite: Improve ls home dir test descriptions + * python: Split module completion to separate helper + * micropython: New completion, aliased from python + * test suite: Add Python module completion test case + * python: Fix traceback avoidance on module completion error + * openssl: Parse available digests from dgst -h + * openssl: Add sha2 commands + * gm: New completion, commands only for now + * (test suite): Test screen -T completions + * (test suite): Set TERM to dumb, not dummy + * Revert "(test suite): Fix alias and cd cursor position tests" + * mplayer: Remove duplicate *.m4a and *.m4v associations + * mplayer, xine, etc: Associate *.mp4a and *.mp4v + * xine etc: Fix *.m4a association + * bind: Add option and argument (non-)completions + * _user_at_host: Set nospace only when completing username part + * _user_at_host: Append @ suffix to username part completions + * man: Don't check OSTYPE or GNU userland, just enable on all + systems + * (test suite): Set dcop result to untested if dcop server is not + running + * (test suite): Don't insist on loading all completions dynamically + * _configured_interfaces: Parse from /etc/network/interfaces.d/* on + Debian + * py.test: New completion + * oowriter: Associate with *.pdf + * Don't define BASH_COMPLETION_COMPAT_DIR + * ri: Add option and arg completions + * (test suite): Add our own dummy ri test fixture + * (test suite): Info test needs docs, don't exclude from CentOS + * (test suite): Fix CentOS 6 tcllib setup + * (test suite): Simplify renice test, fix with only one completion + * (test suite): Don't assume configured interfaces in CI setups + * Don't offer * as configured interface when there are none + * (test suite): Add basic CentOS 6 container for bash 4.1 coverage + * (test suite): Ignore runtime loaded env function changes + * (test suite): Add mailman bin dir to PATH for arch test + * arch: Parse options from --help + * (test suite): Load tested completions dynamically + * (test suite): Accept non-whitespace single word in + assert_complete_any + * (test suite): Avoid interference from user and system dirs (#87) + * (test suite): Install some things N/A in ubuntu14 to fedoradev + * (test suite): Add unrar to ubuntu14 container + * (test suite): Fix alias and cd cursor position tests + * (test suite): Add basic alpine test case + * alpine: Parse opts from -h output, add some opt arg completions + * (test suite): Install jshint globally in ubuntu14 + * (test suite): Add mailman bin dir to PATH for some mailman tools + * (test suite): Install jshint to ubuntu14 container with npm + * unshunt: Parse options from --help + * (test suite): Test lsof on ubuntu14 + * (test suite): Add basic hping3 test case + * (test suite): Add our ./configure to PATH to test it, test opts + * (test suite): Add bunch of packages to ubuntu14 container + * (test suite): Ensure /usr/(local/)games is in $PATH + * (test suite): Fix perl -d* test cases with no Devel::* installed + * (test suite): curl has lots of options, add more test prefix + * (test suite): Fix tar test case for ones having --owner-map + * (test suite): Unsupport various kill, renice cases if ps is N/A + * (test suite): Make chkconfig test behave better in container + * (test suite): Don't assume mounted filesystems in quota* tests + * newlist: Parse options from --help, add some arg non-completions + * (test suite): Delete trailing whitespace + * (test suite): Don't assume lists set up in newlist test cases + * (docker): Pull in missing fedoradev xvfb-run which dependency + * mr: Avoid stderr trash and test suite failure if man is N/A + * (test suite): Fix mmsitepass completion test + * tshark -G: Avoid stderr noise when running as superuser + * (docker): Run completion tests with xvfb-run, e.g. for gkrellm + * ssh-keygen: Make option parsing work with OpenSSH < 7 + * synclient, udevadm: Avoid use of posix char classes for awk + * test suite: Add WIP Fedora dev config + * Travis: Switch tests to docker, update to Ubuntu 14 + * xv: Associate with *.j2c, *.j2k, *.jp2, *.jpf, and *.jpg2 (Debian: + #859774) + * eog: Associate with *.j2c and *.jpg2 + * Bump copyright years + * xine etc: Associate uppercase *.WM[AV] + * mplayer: Associate *.weba (#112) + * xine etc: Associate *.webm and *.weba (#112) + + -- Ville Skyttä Tue, 27 Jun 2017 12:29:33 +0300 + +bash-completion (2.5) + + [ BartDeWaal ] + * Support for python gui source files (#91) + + [ Ben Webber ] + * mr: New completion + + [ Christian Kujau ] + * ssh-keygen: support ed25519 keys (#79) + + [ Dara Adib ] + * Add sidedoor to _ssh() completion (#106) + + [ George Kola ] + * .ipa is just a zip file and we should let unzip handle it (#71) + + [ Miroslav Šustek ] + * ant: parse targets in imported buildfiles (#84) + + [ Reuben Thomas ] + * Add more tests for ccache + * ccache: fix completing compiler's flags + + [ Ville Skyttä ] + * test suite: Add java/javac non-completion fixture + * javac: Complete -cp like -classpath + * travis: Skip bluez and nis for now due to post-install script + issues + * test/config/*: Delete trailing whitespace + * (test suite): Avoid loading user's ~/.bash_completion, fixes #87 + * ip: Recognize a as alias for address and l for link + * ip: Recognize address in addition to addr + * mr: Disable "clean" test case, command N/A before mr 1.20141023 + * ssh-keygen: Parse switches with _parse_usage, not _parse_help + * mplayer: Associate with *.mjpg, *.mjpeg (Debian: #837779) + * dd: Sync completions with coreutils 8.24 + * travis: Add mr + * perl: Remove full path to cat in PERLDOC_PAGER call + * deja-dup: New completion + * CONTRIBUTING: Reorder sections + * *: Move indentation settings to .editorconfig + * make: Declare _make_target_extract_script like other functions + * Travis: zopfli is AWOL? + * *: Whitespace fixes + + [ Zearin ] + * Minor edits to README.md (mostly formatting) (#110) + + [ l3nticular ] + * Fix bug in 'make' completion when using BSD sed (#108) + + [ osu ] + * Add support for Include in ssh config (#70) (#80) + + -- Ville Skyttä Sat, 04 Feb 2017 18:07:27 +0200 + +bash-completion (2.4) + + [ Arash Esbati ] + * xetex, xelatex, luatex, lualatex: Associate with tex files + + [ Gene Pavlovsky ] + * Use shell globbing instead of ls to source files in compat dir + + [ Grisha Levit ] + * Support completing array variables and expansions + * Add tests for declare/typeset + * Better handling of typeset/declare + + [ Kylie McClain ] + * tar: silence --version's stderr output + + [ Paul M. Lambert ] + * Support pod document files for perldoc (#39) + + [ Richard Alpe ] + * tipc: fix missing last char in link name completion + * tipc: handle complete words without trailing space + * tipc: suppress tipc error messages + * tipc: use double brackets in if conditions + * tipc: make loop variables local + * tipc: remove unnecessary return values + * tipc: readd call to complete command + * tipc: use cur variable for flag completion + * tipc: add command prefix to link sed + * tipc: remove unnecessary function _tipc_get_val() + * tipc: use bash here string instead of echo + * tipc: merge functions into main + * tipc: add test framework + * tipc: add tipc completions + + [ Ville Skyttä ] + * Release 2.4 + * rpm: Offer --filetriggers with -q + * javadoc: Add bunch of option arg (non)completions + * lrzip: Add -m arg noncompletion + * pkg-get: Don't use hyphens in function names + * jarsigner: Add some option arg (non)completions + * pkg-get,pkgrm: Drop unnecessary _have calls + * *: Trivial cleanups + * *: Remove redundant return 0's + * pypy*: Add basic --jit arg completion + * pypy3: Alias to python + * hcitool,svcadm,tar: Spelling fixes + * Travis: Install more packages for more test coverage + * (test suite): Pass assert_complete_any for exact/only given arg + completed + * tipc: Invoke ls with "command" + * tipc: Indentation fix + * (test suite): Fix fallout from + fec077d555f112b9f455c45860f90a3b47392fcf + * (test suite): Remove Bash::Completion.3pm.gz from git, create on + the fly + * (test suite): Remove test/fixtures/_filedir/a"b from git, create + on the fly + * CONTRIBUTING: Note patch preferences if not using GitHub pull + requests + * python: Support -Q and -W arg completion without space + * apache2ctl, aspell, make: Don't hardcode completion generator + command + * mysql: Avoid --default-character-set error with failglob, fixes + #46 + * test suite: Add perldoc module+pod completion test case + * perl: Remove some duplicated code + * pushd: Use _cd completion for CDPATH support, closes #38 + * test suite: Add basic pushd test case + * abook: Parse long options from command including full path + * pyvenv: New completion + * chroot: New (generic long options) completion, see #38 + * Travis: First steps toward testing with OS X + * test suite: Add bashcomp_bash env var for better control on tested + bash + * aptitude: List packages using _apt_cache_packages, fixes #33 + * vncviewer: Cleanup shopt use, drop an eval + * make: Avoid a grep + * rpm: Fix --whatenhances arg completion + * aspell, minicom, mysql: Replace use of ls with printf + * cppcheck: Complete filenames too for --platform + * man: Prioritize MANPATH, simplify, add fallback e.g. for busybox, + fixes #28 + * aclocal: Install completion for 1.14 and 1.15, fixes #25 + * mpv: Don't install symlink for it, fixes #24 + * test suite: Add function and declare test cases + * CONTRIBUTING: Highlight request for test cases + + [ Wayne Scott ] + * The BitKeeper completion used the wrong set of commands + + -- Ville Skyttä Fri, 12 Aug 2016 22:43:27 +0300 + +bash-completion (2.3) + + [ Daniel Milde ] + * Completion for python zip archives + + [ Liuhua Wang ] + * lvm: pvcreate should be able to use all block devcices + * lvm: fix all commands that should get all PVs + + [ Ville Skyttä ] + * Release 2.3 + * make-changelog: Don't output "Merge pull request" entries + * make: Use <<< instead of printf + pipe + * gnokii: Use <<< instead of echo + pipe + * *: Use [:blank:] instead of $'\t ' tricks where appropriate, fixes + #19 + * test suite: Fix abook test case + * test suite: Don't insist on property completions if synclient -l + fails + * test suite: Tolerate "See 'man feh'" feh --help output + * test suite: Fix tar failure caused by previous tar change + * tar: Detect GNU/other from --version only once per session + * tar: Remove unused variable + * tar: Fix GNU tar help output parsing regex, fixes #15 + * test suite: Add tar xvf filename test case + * tar: Don't write to /tmp/jetel + * python: Simplify code + * python: Complete all files also after -m + * python: Don't offer options after -c + * python: Complete all files only if -c is before current word + * test suite: Add some python test cases + * unzip, zipinfo: Complete on *.pyz + * travis: configure and run completions syntax check + * make check: Test syntax of all completion files + * CONTRIBUTING.md: Ask for test cases + + -- Ville Skyttä Mon, 28 Mar 2016 18:32:47 +0300 + +bash-completion (2.2) + + [ Barry Warsaw ] + * _init_completion: Handle cword < 0 (LP: #1289597) + + [ Damien Nadé ] + * (testsuite) Use 'set' command posix behaviour when saving env + (Alioth: #314720) + * Added test/site.{bak,exp} to .gitignore + * _parse_help: Fix failglob failures (Alioth: #314707) + * _lvm: using a single-pattern case and invoking function according + to words[1] + * lvm: _lvm_count_args parameter must be quoted in order to failglob + not to complain + * gendiff: Quoting suffix pattern to avoid triggering failglob + + [ Dams Nadé ] + * ssh-add, ssh-keygen: -? needs to be quoted under failglob (Alioth: + #314709) + * Quote unset array element to avoid globbing interference (Alioth: + #314708) + + [ David Paleino ] + * Refactor bts and uscan, since they use common functions + * uscan: New completion, thanks to Federico Ceratto + * bts: New completion, thanks to Federico Ceratto. + + [ Guillaume Rousse ] + * complete on freerdp-specific known hosts list + * nmcli completion was integrated upstream + + [ Igor Murzov ] + * isql: Fix failglob failure + * ssh-add, ssh-keygen: -? needs to be quoted under failglob (take 2) + (Alioth: #314709) + * (testsuite): move testing of _linux_fstab() to umount.exp + * umount: Fix mount points escaping/unescaping with Bash-4.3 + * slapt-src: Handle --config=FILE option properly + * sbopkg, slapt-{get,src}: expand tilde in config file name + * slapt-{get,src}: Fix issue with sed not being able to handle some + characters + * slapt-src: split options from their arguments + * Quote _filedir arguments when appropriate to prevent failglob + failures + * psql: Tell psql to not load .psqlrc as it may change output format + (Alioth: #314636) + * testsuite: Add basic tests for portsnap and freebsd-update + * mplayer: -dvd-devices takes dvd devices, dirs and .iso files as + argument + * 7z: Improve completion + * f77, f95: Use the same completion as for g77, g95 if they are + links to gfortran + * aptitude: safe-upgrade accepts package name as parameters (Alioth: + #313638, Debian: 673235) + * _longopt: Run commands in C locale. + * make: Use only posix basic regexps with sed (Alioth: #314345) + * cppcheck: Add new --enable option argument and --library argument + completion + * dpkg: Suppress unwanted error messages (Debian: #706502) + * perl: -d/-dt option argument is optional (Alioth: #314242) + * Add config for cmake to bash-completion. + * kcov: Add new sort types, complete --replace-src-path arguments + * feh: Add new sort type + + [ Mathieu Parent ] + * Puppet: describe: update options list, accordind to 'puppet help + describe' + * Puppet: cert: update options list, accordind to 'puppet help cert' + * Puppet: apply: update options list, accordind to 'puppet help + apply' + * Puppet: agent: update options list, accordind to 'puppet help + agent' + * Puppet: puppet parser support + * Puppet: puppet -* doesn't imply 'puppet apply' + * Puppet: use puppet terminology + + [ Matthew Gamble ] + * Modify all usages of 'sed' to be run with command bash builtin + * Use command built-in to run sed to avoid any custom aliases + + [ Matthieu Crapet ] + * man: Use -w instead of --path + + [ Michael Gold ] + * profile.d: Avoid some warnings from shells in "nounset" mode + (Debian: #776160) + + [ Miroslav Lichvar ] + * chronyc: Update help text parsing + * chronyc: Add missing subcommands + * chronyc: Add -6 option + + [ Nevo Hed ] + * minicom: Recognize user ~/.minirc.* as config files + + [ Ondrej Oprala ] + * __get_cword: avoid $index < 0 (Alioth: #315107) + + [ Patrick Monnerat ] + * rpmbuild: Complete *.spec on --clean (RedHat: #1132959) + + [ Pavel Raiskup ] + * tar: rework the completion completely + + [ Peter Cordes ] + * upstart support for service completion + + [ Peter Dave Hello ] + * freebsd-update: New completion. + * portsnap: New completion. + + [ Peter Wu ] + * modprobe: fix params with multi-line descriptions + * gdb: support --args style completion (Alioth: #314664) + + [ Rainer Müller ] + * make: Fix basic regex for portability (Alioth: #314345) + + [ Raphaël Droz ] + * gnokii: New completion + + [ Rune Schjellerup Philosof (Olberd) ] + * dpkg: Add support in dpkg completion for .ddeb (LP: #568404) + + [ Shaun McCance ] + * xmllint, xmlwf, xsltproc: Complete on Mallard *.page files + + [ Stefano Rivera ] + * pypy: New completion identical to python (Alioth: #314501) + + [ Thilo Six ] + * Use more straightforward way to check bash version + * _mac_addresses: Use explicit C locale for ifconfig (Debian: + #704832). + + [ Tristan Wibberley ] + * make: Don't pick up variables when makefile is reloaded + * make: Offer hidden targets when it is clear that the user is + trying to complete one of them + * make: Fix detection of intermediate targets where make has changed + its database whitespace + * make: Add __BASH_MAKE_COMPLETION__ variable + * make: completion shouldn't be confused by the output of $(info + confuse: make) + + [ Uwe Kleine-König ] + * Don't complete hostnames found after Hostname in ~/.ssh/config + + [ Ville Skyttä ] + * Release 2.2 + * README.md: Note autoreconf need only in unprepared tarball + * make-changelog.py: Set myself in footer + * make-changelog.py: Fix footer line output + * make-changelog.py: flake8 fixes + * make-changelog.py: Make work with Python 3 + * README.md: More markdown tweaks + * README.md: Markdown tweaks + * zopflipng: New completion + * README.md: Not need for autoreconf, fixes #11 + * README: Expand troubleshooting section somewhat + * Merge pull request #9 from shaunix/master + * ssh: Extract duplicate code to _ssh_configfile + * Remove various comments related to bash versions we don't support + * travis: Install more packages for [xyz]* test coverage + * travis: Install more packages for [stuvw]* test coverage + * travis: Install more packages for [qr]* test coverage + * travis: Install more packages for [op]* test coverage + * travis: Install more packages for m* test coverage + * travis: Install more packages for [jkl]* test coverage + * Merge pull request #7 from ukleinek/master + * indent: Remove generic long option completion + * Update copyright year + * travis: Install more packages for [hi]* test coverage + * travis: Install more packages for [fg]* test coverage + * mysql: Fix --default-character-set completion with mariadb + * mysql, puppet: sed portability fixes + * gnokii, minicom: Use grep through "command" + * lint: Check for sed without "command" + * Merge pull request #2 from djmattyg007/avoid_sed_alias + * travis: Install more packages for [de]* test coverage + * travis: Install more packages for c* test coverage + * travis: Add note about (currently) N/A packages + * test suite: Mark unsupported look test case as such, not + unresolved + * test suite: Use unsupported instead of xfail for modinfo/modprobe + cases + * travis: Install more packages for [0-9][ab]* test coverage + * travis: Run tests with --all to get some more useful output + * test suite: Fix ssh partial hostname completion test + * README: Split contributing to separate CONTRIBUTING doc + * README: Convert to markdown + * Drop references to bash-completion-devel@lists.alioth.debian.org + * build system: Switch to xz compressed tarball + * aclocal, automake: Install for versioned 1.14 and 1.15 executables + * Update URLs and various instructions to GitHub + * README: Update POSIX spec link + * travis: Avoid Travis default ri, use distro one instead + * test suite: Make apt-get test less sensitive to available commands + * test suite: Output tool log on failure in CI + * Set up Travis + * test suite: Expect failure in modinfo/modprobe if there are no + modules + * test suite: Fix ssh-copy-id test on old setups with no identities + * cppcheck: Add native to --platform completions + * ssh: Avoid completing commands before hostname + * chronyc: Parse command args from help output + * chronyc: Wrap long lines + * Load completions also from $XDG_DATA_DIRS (RedHat: #1264094) + * (testsuite) Ignore files generated by complete-ant-cmd.pl + * scp, sftp: Complete -S on commands + * scp, sftp: Fix querying ssh options + * sftp: Add -l arg non-completion + * ssh-copy-id: Offer only *.pub to -i + * mpv: Remove mplayer-aliased completion + * __load_completion: New function, use in _completion_loader and + _xfunc + * modplug*: Associate *.oct and *.okt + * rpm: Add --whatenhances/recommends/suggests/supplements and + --recommends/supplements completions + * pgrep, pidof, pkill, pwdx, vmstat: Add support for procps-ng + * pdftotext: New completion + * checksec: New completion + * ssh: Complete HostbasedKeyTypes,HostKeyAlgorithms,KexAlgorithms + values + * ssh: Query ciphers and macs from ssh before hardcoded fallback + * ssh: Add -Q argument completion + * sysctl: Return early on --help, --version + * sysctl: Try parsing options from help before usage + * Document how to avoid command_not_found_handler interference + * eog: Complete on *.ppm (RedHat: #1090481) + * tar: Plug $line var leak + * tar: Style tweaks + * (testsuite) Add required "empty" dir for tar + * bsdtar, tar: Remove symlinks from git, have make create them + * jshint: New completion + * gnokii: Include and install it + * gnokii: Fix completions of options that are prefixes for others + * gnokii: Drop dead code + * (testsuite): Add basic gnokii test case + * gnokii: Various minor and cosmetic fixes + * _filedir: Avoid some unnecessary work with -d + * _filedir: Remove unused variable + * _filedir: Fix overquoted argument to compgen -d (RedHat: #1171396) + * 2015 + * Load user completions from $BASH_COMPLETION_USER_DIR/completions + * Revert "README: Don't hardcode /etc in cmake fallback dir" + * README: Don't hardcode /etc in cmake fallback dir + * README: Add cmake usage example + * README: Add autotools and cmake tips + * Drop reference to no longer used sysconf_DATA + * synclient: New completion + * tune2fs: Add missing return in -M arg completion + * reptyr: Rename file to _reptyr to avoid conflict with upstreamed + completion + * cppcheck: Option argument (non-)completion update + * dropuser: New completion + * createuser: New completion + * createdb, dropdb: Drop -o default, it does not appear to do + anything good here + * tshark: Simplify cut usage + * mcrypt: Simplify -m arg completion + * (testsuite): Add mcrypt -a and -m argument completion tests + * strings: Fix -T/--target arg completion with non-English locale + * chrome, firefox etc: Complete on *.pdf + * ccache: Add -o/--set-config arg name completion + * gphoto2: Replace tail with awk + * *: Invoke command to be completed, not its basename + * gphoto2: Fix split argument handing, and colon treatment in --port + args + * _completion_loader: Protect compgen from -* leakage (Debian: + #769399) + * Actually install the lz4 completion + * _pnames: Add -s for producing (possibly) truncated names (RedHat: + #744406) + * (testsuite) Add cd in dir without subdirs or CDPATH test case + * Protect various compgen invocations from -* leakage (Debian: + #766163) + * pigz, unpigz: Handle *.zz + * _completion_loader: Set empty command to _EmptycmD_ for cross + version compat + * Comment update + * rpmbuild: Complete *.spec on --nobuild + * mplayer, *xine: Complete on *.mts (Debian: #759219) + * ant: Support buildfile set in $ANT_ARGS (Alioth: #314735) + * (testsuite) Add ant -f test case + * ant: Don't offer more completions after options that exit + * 7z, adb: Trivial cleanups + * python(3): Add -X argument non-completion + * xsltproc. TODO fix for previous commit + * xmllint, xmlwf, xsltproc: Complete on *.dbk and *.docbook (Alioth: + #314770) + * xz: Complete -T/--threads argument + * (testsuite) Save shell variables when saving env (Alioth: #314720) + * adb: New completion + * modprobe: Try parsing help before using hardcoding option list + * (testsuite) Add vgcreate test case for _lvm_count_args with + failglob on + * _filedir_xspec: Fix with failglob on + * Various mostly array element unsetting fixes under failglob + * __reassemble_comp_words_by_ref: Make work with failglob on + (Alioth: #312741) + * _services: README in sysv init dir is not a service + * mpv: New completion alias + adjustments for mplayer (Debian: + #749115) + * (testsuite) Add puppet subcommand option test case + * puppet: Recognize some short options + * puppet: Parse most subcommand options from "help subcommand" + output + * puppet: Exit early on -h|-V|--version in addition to --help + * hostname: New completion + * nslookup: complete on hosts (Alioth: #314673) + * eog: Complete on *.pgm (RedHat: #1090481) + * pngfix: New completion + * qemu: Fix -balloon arg completion + * qemu: Apply completion to qemu-kvm/-system-i386/-system-x86_64 too + * xrandr: Use the invoked command internally, not hardcoded "xrandr" + * xrandr: Add (some) --setprovider* arg completion support + * profile.d: Don't return from a sourced script (Debian: #741657) + * FAQ: Clarify that we mean the bash man page for M-/ + * (testsuite) Avoid complete-ant-cmd.pl errors with our build.xml + * ri: Fix class completion with ri >= 3. + * ri: Fix colon handling in class completion. + * flake8: New completion + * pyflakes: New completion + * cal,chfn,chsh,dmesg,eject,hexdump,look,newgrp,renice,runuser,su,wr + ite: Deprecate on Linux in favor of util-linux ones (Debian: + #737672) + * testsuite: Add basic newgrp test case + * testsuite: Add basic test cases for deprecated completions + * _*: Install our deprecated completions too, try loading them + secondarily + * hwclock,ionice,rtcwake: Deprecate in favor of util-linux ones + (Debian: #737672) + * ssh-keygen: New completion + * Bump copyright years to 2014. + * jpegoptim: New completion + * ip: Add some addr, addrlabel, and route arg completions + * aptitude, dpkg: Replace some grep+cuts with awk + * gcc, lintian, make, pkgadd, slackpkg: grep -> "command grep" + (Debian: #734095) + * lintian: Replace some grep+cuts with awk + * (testsuite) Check for grep and ls invoked without "command", see + README + * lz4: New completion. + * optipng: New completion. + * cppcheck: Include - in --file-list completions. + * (testsuite): Limit wtf completions to A* to keep expect happier. + * wtf: Look for acronym db from /usr/share/games/bsdgames/acronyms + too. + * wtf: Don't offer -f if it was already specified. + * wtf: Hush stderr when db file doesn't exist. + * appdata-validate: New completion. + * timeout: New completion. + * _known_hosts_real: Exclude %h HostName entries (RedHat: #1015935). + * cc, c++: Check path to binary when finding out if it's gcc + (Alioth: #314417). + * cc, c++: Install minimal completion for non-gcc ones (Alioth: + #314417). + * abook, kldunload: Pre-expand \t instead of relying on sed + supporting it. + * dict: Trivial regex cleanup. + * _known_hosts_real: Pre-expand \t instead of relying on sed + supporting it (Alioth: #314393). + * zopfli: New completion. + * bzip2, gzip, lzma: Cleanups. + * Cosmetics. + * export, _variables: Do TZ= completion (Redhat: #994646). + * 2to3: New completion. + * file-roller: Reuse unzip's xspec. + * 7z: New completion. + * hcitool, rfcomm, ciptool, hciconfig: Don't leak $args. + * perl: Fix -dt: completion. + * perl*: Fix handling of relative paths in @INC. + * wget: Add --accept-regex/--reject-regex/--regex-type arg + (non)completions. + * wget: Drop incorrect -nv arg completion. + * wget: Stop completing after --help/--version. + * Clean up/compact various globs. + * cvs: Fix checkout -j non-completion. + * sh: Complete script arguments with all filenames (Alioth: + #314226). + * nmcli: Deprecate our completion, upstream has one in 0.9.8.0. + * Revert "nmcli completion was integrated upstream" + * Use == instead of =. + * cvs rm: Don't filter existing files with -f (RedHat: #949479). + * aclocal, automake: Install for *-1.10, *-1.12, and *-1.13 too. + + -- Ville Skyttä Thu, 03 Mar 2016 17:22:50 +0200 + +bash-completion (2.1) + + [ AllKind ] + * Fix __ltrim_colon_completions() fail on parameter (\$1) containing + a glob. + + [ Andreas Müller ] + * completions/Makefile.am: symlinks depends on $(DATA) to avoid race + conditions + + [ Christian von Roques ] + * Fix __reassemble_comp_words_by_ref for $COMP_CWORD == ${#COMP_WORDS[@]} + + [ David Paleino ] + * Fix helper script to create changelogs + + [ Guillaume Rousse ] + * New completions: nmcli, gphoto2 + * Improved completions: + - dsniff: add -p option completion + - dsniff: fix interface completion + + + [ Igor Murzov ] + * _command_offset: Restore compopts properly (Alioth: #313890) + * _parse_help, _parse_usage: Run commands in C locale. + * New completions: wget, zathura + * Improved completions: + - cppcheck: Add new standards to --std option. + - evince: Evince supports opening .pdf.xz files (Alioth: #313739). + - feh: Add new options introduced in feh-2.7. + - feh: Fix list of background styles. + - fusermount: Complete curlftpfs-mounts for "fusermount -u" (Debian: + #685377) + - kcov: Add new sort types (introduced in kcov-9). + - kcov: Complete arguments of --limits option. + - lvm: Fix typo in option name: s/continguous/contiguous/. + - make: Do not append space if target is a filepath. + - mount: Fix parsing /etc/fstab on *BSD. + - mount.linux: Add some new mount options intoduced in Linux 3.5 and 3.7 + - mount.linux: Add options completion for nfs and davfs. + - mount.linux: Clean up mount options, remove duplicates. + - mplayer: Add opus to the list of supported formats. + - mplayer: Add -subcp argument completion. + - opera: Handle options. + - slackpkg, slapt-get: Update the list of package sets. + - tar: Fix detection if the $prev is a tar file. + - valgrind: Add --soname-synonyms option arguments completion. + * Testsuite: + - _filedir: Remove the cruft from the a\$b->h unit test (Alioth: #313480) + + [ Jeroen Hoek ] + * Improved completions: + - unzip: Add support for OpenDocument formats. + + [ Ken Sharp ] + * Improved completions: + - wine: add .msi completion + + [ Martin Ueding ] + * Stylistic cleanup + + [ Tristan Wibberley ] + * Improved completions: + - make: incremental completion for make with compact display + - make: convert make completion to use smarter parser + + [ Ville Skyttä ] + * Avoid sourcing dirs in completion loader to avoid fd leaks (RedHat: #903540) + * Ignore colormake symlink. + * Line continuation, whitespace, and compgen -W ... -- "$cur" + quoting cleanups. + * _available_interfaces: Try with "ip link" if ifconfig is not available. + * _ip_addresses: Try with "ip addr" if ifconfig is not available. + * _known_hosts_real: Filter ruptime stdout error spewage (Alioth: #313893). + * _mac_addresses: Try local interfaces with "ip link" if ifconfig not + available. + * _mac_addresses: Try ARP cache with "ip neigh" if arp is not available. + * _mac_addresses: Fix with net-tools' ifconfig that outputs ether, not HWaddr. + * New completions: chronyc, eject, eog, file-roller, hexdump, interdiff, lua, + luac, luseradd, luserdel, lusermod, mussh, nc, ngrep, patch, pydoc, + pyflakes, pylint, ss, strings, tshark, wsimport, xxd + * Improved completions: + - acpi, chpasswd, dmesg, gkrellm, groupmems, hwclock, lastlog, pwd, vipw: + Complete options even without "-" given. + - arpspoof, dsniff, ether-wake, nmap: Offer active interfaces only. + - clzip, pdlzip, plzip: New lzip alias completions. + - colormake: New make alias completion (LP: #743208, Debian: #682557) + - cpio: Recognize pass thru when -p is bundled w/other options + (RedHat: #912113). + - cppcheck: Add --language/-x argument completion. + - cppcheck: Complete --include= with filenames. + - dnsspoof, filesnarf, macof, sshow, tcpkill, tcpnice, urlsnarf: Fix -i + completion. + - genisoimage: Use _parse_help instead of hardcoding options, add basic test + case. + - groupmems: Add -R/--root arg completion. + - hexdump: Actually install for hd as well. + - host: Complete with known hosts. + - ip: Improve addr show and link show completions. + - ip: Remove some stale TODOs. + - jar: Reuse unzip's xspec (RedHat: #928253). + - koji: Complete on build targets when --target is given to wait-repo. + - lv{create,resize,extend}, vg{create,reduce,extend,split}: Fix variable + leaks. + - lvm: Add _lvm prefix to helper functions. + - lvm: Take option args into account when counting args (RedHat: #860510). + - lvm volumes: Complete on /dev/mapper/* (RedHat: #851787). + - lzip: Do not append space after equal sign in long options. + - make: Convert internal variable names to lowercase, indentation fix. + - make: Don't leak $mode. + - make: Make work in POSIX mode. + - man: Add support for .lz man pages (RedHat: #839310). + - man: Don't expand man page extensions too early. + - man: Fix -P/--pager full path arg completion. + - modinfo: Use ,, for lowercasing instead of tr in a subshell. + - modprobe: Don't suggest installing already installed modules. + - ncftp: Add option completion. + - pkg-config: Try to complete --variable= if package name is already given. + - pydoc: Complete on keywords and topics. + - python, pydoc: Add module completion. + - scp: Treat strings with slash before colon or starting with [.~] as local. + - ssh: Add some -o and related arg completions. + - ssh: Add -O argument completion (Debian: #680652). + - tar: Don't take -I to mean bzip2. + - tar: Fix completing files inside *.tlz when J is explicitly given. + - tar: Simplify bzip patterns. + - tar: Support *.tar.lz (Debian: #703599). + - tar: Recognize taz and tb2 as compressed tarballs. + - tcpdump: Fix -z full path arg completion. + - unzip/zipinfo: Associate with more StarOffice extensions. + - useradd, userdel, usermod: Add -R/--root arg completion. + - useradd, usermod: Support comma separated -G/--groups arg completion. + - useradd: Fix -k, -K, and --home-dir argument completions. + - userdel: Add -h/--help non-completion. + - valgrind: Fix full path arg completion. + - vgcreate: Add missing symlink. + - vipw: Add -R/--root arg completion. + - vpnc: Add bunch of option arg (non)completions. + - vpnc: Use _parse_help instead of hardcoding options, add basic test case. + - wget: Use == instead of =. + - wine: Fix extension glob to work on its own. + - wol: Try "ip addr" before ifconfig for finding out broadcast addresses. + - xrandr: Add bunch of option arg non-completions. + - xrandr: Use _parse_help. + - xrandr --mode: Clean up one awk call. + - xrandr: Avoid --mode completion error when --output is not given. + - xrandr: Don't leak $i when completing --mode. + * Deprecated completions: + - udevadm: one is shipped in systemd >= 196 (RedHat: #919246). + * Testsuite: + - Make pydoc test more likely to work with our limited expect buffer size. + - Fix pwd unit test + + [ Yann Rouillard ] + * New completions: pkgutil, pkgrm, pkgadd, pkg-get, svcadm. + + [ wonder.mice ] + * Fixed tilde expanding in _filedir_xspec + + -- David Paleino Fri, 05 Apr 2013 12:05:15 +0200 + +bash-completion (2.0) + + [ Anthony Ramine ] + * Properly declare 'symlinks' dependencies + + [ David Paleino ] + * apt-get: add 'changelog' to completed commands + + [ Guillaume Rousse ] + * Add xz compression extension for kernel modules + + [ Igor Murzov ] + * sudo: Handle options (Alioth: #311414). + * sudoedit: New completion. + * _command_offset: Properly quote arguments of eval (Alioth: + #313499). + * mount.linux: Add some new mount options intoduced in Linux 3.0-3.2 + * _modules: Ignore error messages. + * modprobe, modinfo, insmod: Move modprobe and modinfo completions + to their own files. + * sbopkg: Use _parse_help. + * sbopkg, slackpkg, slapt-{get,src}: Use shorter form of the check + if file exists. + * _filedir: Properly quote paths to avoid unexpected expansion. + * su: Add linux-specific completion + * insmod, modprobe: Don't hardcode path to modinfo (Alioth: #313569) + * man: --path option is supported on Darwin (Alioth: #313584) + * man: Move variable declaration to the right place. + * feh: Update option argument completions. + * fbi, feh: Complete more supported file formats. + * fbgs: Add new options introduced in fbida-2.09. + * cppcheck: Complete new --relative-paths option arguments + * _expand: Suppress unwanted bash error messages (Alioth: #313497) + + [ Itaï BEN YAACOV ] + * scp: Recognise symlinks to directories as directories (Debian: + #666055). + + [ Jonathan Nieder ] + * ri: Rename ri_get_methods helper to add leading underscore + + [ Ville Skyttä ] + * rmmod: Add option completions. + * testsuite/generate: Generate less linefeeds. + * insmod: Install for insmod.static too. + * mplayer: Add -monitoraspect arg completion. + * mplayer: Add generic handling of options that take arguments. + * testsuite: Fix spurious modinfo and modprobe test failures on + systems that have /lib and /lib64 dirs. + * pigz: Add -p/--processes arg completion. + * testsuite: Add basic su test case. + * su: Fix long option handling. + * su: Add --session-command arg completion. + * su: Complete -s/--shell with shells instead of all files. + * lyx: Remove simple completion, upstream has more complete one + (Debian: #662203) + * testsuite/generate: Tweak linefeeds. + * make: Add generic variable completion. + * man: Recognize 3gl as man page filename extension -- at least Mesa + uses it. + * _realcommand: Try greadlink before readlink (Alioth: #313659). + * Comment spelling fix. + * qiv: Add *.svg. + * xmllint: Add *.svgz. + * autotools: Use MKDIR_P instead of mkdir_p (Alioth: #313671). + * lbzip2: Add -n argument completion. + * *_tilde*: Escape tilde in [[ $1 == \~* ]] tests (RedHat: #817902). + * New completions: + - acpi, hwclock, pwd, ssh-add, vmstat + + [ Sung Pae ] + * Workaround bash bug that fails to complete <, > + + -- David Paleino Sun, 17 Jun 2012 20:01:36 +0200 + +bash-completion (1.99) + + * Hopefully the last 2.0 preview. + + [ David Paleino ] + * Correctly list purgeable packages for dpkg --listfiles and dpkg + --purge (Debian: #647684) + * Fix bash_completion paths in README (Debian: #647941) + + [ Florian Hubold ] + * xv: Add *.eps and *.ps to filename completions (Alioth: #313477) + + [ Igor Murzov ] + * Add and use _sysvdirs() function that sets correct SysV init + directory. + * cppcheck: Add new options introduced in cppcheck-1.52. + * cppcheck: Several ids separated by commas can be given for + --enable=. + * _known_hosts_real: Add some quotes (Alioth #313158) + * Merge completions/service into the bash_completion script. + * _modules: Follow symlinks in /lib/modules/$(uname -r) (Alioth: + #313461) + * mount, umount: Add linux-specific completions. + * mount: Don't suggest short options. + * pidof: Don't check OS type (Alioth #311403) + * removepkg: Make it possible to complete filenames. + * umount: Fix for completion of relative paths. + * upgradepkg: Support oldpackage%newpackage notation. + * wine: Complete all files after an .exe (Alioth #313131) + * New completions: + - htop, nethogs. + + [ Jan Kratochvil ] + * rpm: Treat -r as --root (RedHat: #759224). + + [ Raphaël Droz ] + * Added a word about compopt -o nospace in styleguide.txt. + * _ip_addresses: Make it locale agnostic. + + [ Ville Skyttä ] + * cc, c++: Install gcc completion if compiler looks like GCC + (Alioth: #311408). + * cppcheck: Offer header filename completions too. + * curl: Add bunch of new option argument completions. + * dequote: Use printf instead of echo (Alioth: #312163). + * dict: Speed up word completion with common use cases and large + word lists. + * dmesg: Adapt to versions returning long options. + * Document $split && return. + * _filedir, _tilde: Ignore compopt stderr for direct invocations in + unit tests. + * Include doc/ in dist tarball. + * _known_hosts_real: Handle more than two hostnames per known hosts + line (Debian: #647352). + * _known_hosts_real: Include hosts reported by ruptime (Alioth: + #313308). + * _known_hosts_real: Support > 1 files per *KnownHostsFile line + (Debian: #650514). + * lintian: Use <<< instead of echo and a pipe (Alioth: #312163). + * lrzip: -T no longer takes an argument since version 0.570. + * _mac_addresses: Grab addresses from FreeBSD's ifconfig -a output + too. + * make: Add -j/--jobs completion, complete up to number of CPUs * 2. + * _muttconffiles: Use printf instead of echo (Alioth: #312163). + * _parse_help, _parse_usage: If first arg is "-", read from stdin. + * rpm: Add --delsign completion, don't suggest --resign (identical + to --addsign). + * _variables: New function split from _init_completion. + * vi and friends: Fix /etc/ld.so.conf.d/* completion (Alioth: + #312409). + * New completions: + - plague-client, desktop-file-validate, valgrind, ccache, iperf, + koji, lzip, udevadm. + + -- David Paleino Sat, 07 Jan 2012 23:52:36 +0100 + +bash-completion (1.90) + + * bash-completion 2 preview: dynamic loading of completions. + + [ David Paleino ] + * If _filedir 'ext' returns nothing, just fallback to generic file + completion. It is optional, and off by default. Patch by Clint Byrum + (Debian: #619014, LP: #533985) + * Fix __get_cword_at_cursor_by_ref: check for $index when completing with a + cword+1 argument already present (Debian: #622383) + * Layout change: everything is now in /usr/share/bash-completion/, rather + than in /etc/. + * Get rid of BASH_COMPLETION_DIR, BASH_COMPLETION_HELPERS_DIR, BASH_COMPLETION + * Fix autotools to use pkgdatadir instead of redefining datadir, get rid of + helpersdir. + * Implemented a blacklist for unwanted third-parties completions + * New completions: + - epdfview, lpr and lpq (Raphaël Droz), mysql (Raphaël Droz) + * Improved completions: + - ant: handle "extension-point" the same as "target" tag (Petr Kozelka, + Alioth: #313105) + - apt: add 'download' to subcommands (Debian: #625234, Ubuntu: #720541) + - aptitude: add 'versions' command (Debian: #604393) + - dpkg-query: use the 'dpkg' completion (Debian: #642526) + - lintian: remove --unpack-level (Debian: #623680) + - {shadow,coreutils}: fix broken _allowed_groups usage + - rrdtool: complete filenames after commands (Debian: #577933) + - sitecopy: fixed a bug with grep and brackets: use sitecopy -v to fetch + sites (Raphaël Droz). + + [ Freddy Vulto ] + * Improve __reassemble_comp_words_by_ref() (Alioth #313057) + * Testsuite: + - add -unsorted option to _get_hosts() + + [ Guillaume Rousse ] + * Use $() for subshell, instead of backquotes + * Use simple quotes for constant strings + * Drop -o filenames, as suggested by Ville + * New completions: puppet + + [ Igor Murzov ] + * Abort completion file loading earlier if required commands are not + available. + * docs: Improve tester's manual + * Make completions that use _command also work with file names + * _command_offset: Restore compopts used by called command. + * New completions: + - pkgtool, makepkg, rmp2tgz, slapt-get, slapt-src, slackpkg, kcov, feh, + xgamma, fbi, fbgs + * Improved completions: + - file: ddd few missing --exclude arguments completions + - host, nslookup: Remove completions for bind utils from bash_completion. + - {install,upgrade,explode}pkg: use -o plusdirs instead of -o dirnames + - makepkg: should complete filenames + - removepkg, upgradepkg, installpkg: add option completion + - xrandr: Add more option completions. + - overall clean up of different slackware-specific completions + * Testsuite: + - add basic tests for pkgtools, rpm2tgz, slapt, sbopkg, slackpkg + - fix broken tests for finger and xhost + - remove unused -expect-cmd-full option from assert_complete* + + [ Sergey V ] + * New completions: sbopkg + + [ Ville Skyttä ] + * Load completions in separate files dynamically, get rid of have() + * Drop unnecessary $USERLAND checks + * Try /usr/sbin before /sbin in have() + * Try both full path and basename completions for sudo etc (Alioth: #313065) + * Add _init_completion() for common completion initialization and generic + redirection handling + * Replace actual sysconfdir in bash_completion on install (Alioth: #313081) + * Drop support for bash < 4.1 + * Drop no longer needed _compopt_o_filenames() + * Drop no longer needed "type compopt" checks + * docs: Update "simply sourcing" instructions to match new layout, check + $PS1. + * Get rid of bash_completion self-parsing from _filedir_xspec + (RedHat: #479936). + * Provide profile.d hook for per user disabling of bash_completion + (Debian: #593835) + * New completions: + - a2x, arping, asciidoc, base64, cal, chrpath, cppcheck, curl, dmesg, + dot, file, gnome-mplayer, gprof, hddtemp, host, htpasswd, idn, ionice, + jps, lbunzip2, lbzip2, lbzcat, prelink, protoc, pwdx, pwgen, reptyr, + sum (RedHat: #717341), watch + - phing: reuse ant completion (Elan Ruusamäe, Alioth: #312910) + - pinfo: reuse info completion + * Improved completions: + - bluez, e2fsprogs, grpck, java (Mattias Ulbrich), passwd, pwck, route, + rsync, smartctl + - ant: improve -lib, -find/-s, and -D argument completions; rewrite build + target parsing in plain bash, add build file test case + - aspell: add --add-filter|--rem-filter completions; get --mode completions + from 'aspell modes' output + - bzip2, gzip, python, sysbench: quote command argument to _parse_help() + - chsh: use _allowed_users instead of plain compgen -u + - cksfv: add -g argument completion + - cpan2dist: don't hang if no package list files exist + - crontab: use /sys/fs/selinux and /selinux instead of /etc/selinux to + find out if SELinux is around + - cvs: (diff) parse options from cvs diff instead of plain diff; drop -o + default to fix CVS root completions; (commit) complete on entries + instead of default if COMP_CVS_REMOTE is not set; improve CVS + controlled file completions; add CVS controlled file completions for + admin and update; list "primary" command names first in mode switch; + recognize some additional commands and synonyms; add editors/watchers + completion; sort mode completions alphabetically + - freeciv: complete freeciv-* in addition to civclient/civserver + - gdb: improve filename completion + - gendiff: do file completion after output redirection + - getent: add gshadow to known databases; allow multiple completions from + same db, add option completion + - info: add option completion support + - ipsec (Tobias Brunner): drop uname check, add strongSwan specific + completion with fallback, complete connection names for 'up', 'down' and + other commands + - jar: complete on *.sar (JBoss service archive) + - java, javac: add -X* completions + - javadoc: implement -linkoffline two argument completion + - killall: activate completion on Darwin (Alioth: #312350) + - (la)tex (Ted Pavlic): add *.dbj to filename completions (RedHat: #678122) + - man: add option parsing and completion + - modplug*: add more extensions for files supported by libmodplug + - mutt: support tildes when recursively sourcing muttrc files + (Debian: #615134); expand tilde in mutt query command (Alioth: #312759) + - ntpdate: add some option argument (non)completions + - oo{writer,impress,calc,draw} (Matej Cepl): complete on LibreOffice + FlatXML extensions (RedHat: #692548) + - perldoc (Scott Bronson): override MANPAGER when generating perldoc + completions (RedHat: #689180); don't parse man page when we know it'll + produce no completions; use perldoc itself instead of man + - pgrep: add option and option argument completions + - rpm: make rpm --queryformat use more consistent; drop rpm query support + for rpm < 4.1 + - rpmbuild: add --buildpolicy completion + - rpmcheck: drop reference to undefined $files variable (Alioth: #313270) + - screen: add _terms() and -T completion; add commands completion + (Alioth: #312164, RedHat: #547852) + - _services: avoid bogus completions when init or xinetd dirs exist but are + empty; include systemd services + - smartctl: fix short alternative for --tolerance + - ssh, scp, sftp, ssh-copy-id: add some option argument (non)completions + - strace: don't append space for -e *= completions; don't try to extract + syscall names if they're not going to be used; rewrite arch specific + syscall extraction in plain bash + - svn*: don't suggest short options + - tar: fix completion of files inside *.tar.bz2 archives when [Ijy] is not + given; added option completions; improve tar *[cr]*f completions + (Debian: #618734) + - unzip: complete on *.sar (JBoss service archive) + - xmllint, xmlwf: complete on *.tld (tag library descriptor) + - xmlwf: add -v non-completion + - xmms: add some option argument completions + - xz: apply xz completion to pxz too; non-complete + --memlimit{,-compress,-decompress} + * Testsuite: + - add basic tests for gendiff, mdadm, puppet, xzdec, mii-diag, mii-tool, + grpck, passwd, pwck, samba, rdesktop, fusermount, tcpdump, l2ping, + ssh-copy-id, postfix, qemu, ldap*, medusa, mdtool, monodevelop, + msynctool, cfagent, lpr, lpq, mysql, nslookup, compare, conjure, + import, stream + - fix tests for ri + - fix get_hosts option docs. + - add test case for Debian: #622383. + - add chown foo: and :foo test cases, should complete files + (RedHat: #710714) + + -- David Paleino Thu, 03 Nov 2011 09:53:55 +0000 + +bash-completion (1.3) + + [ Guillaume Rousse ] + * added pure-perl perldoc completion helper, using work from Aristotle + Pagaltzis (pagaltzis@gmx.de) + * added completions for xfreerdp and iscsiadm + * updated xm subcommands list + + [ David Paleino ] + * Fixed "service" completion, thanks to John Hedges (Debian: #586210) + * Complete on all files for mplayer's -dvd-device + * Fixed typo in openssl completion (Debian: #609552) + + [ Ville Skyttä ] + * Activate hping2 completion also for hping and hping3. + * Add badblocks, compgen, crontab, dumpe2fs, e2freefrag, e2label, ether-wake, + filefrag, gendiff, growisofs, iftop, ip (Debian: #600617), javaws, kid3, + lrzip, lsof, mktemp, portecle, POSIX sh, sha{,224,256,384,512}sum, + sysbench, tune2fs, xmodmap, and xrdb completions. + * Add *.gif (Alioth: #312512), *.m2t (Alioth: #312770), *.3gpp, *.3gpp2, + *.awb, and *.iso (Alioth: #311420) to mplayer filename completions. + * Add "short" tarball extensions to unxz, unlzma etc completions. + * Improve /etc/init.d/*, ipmitool, jar, java, javadoc, man, mencoder, mkdir, + mplayer, pack200, povray, python, rpmbuild, sqlite3, tar, wodim, and + general help parsing completions. + * Fix p4 and povray completions (Alioth: #312625). + * Add *.xsd, *.xsl, *.rng, *.wsdl, and *.jnlp to xmllint and xmlwf filename + completions, and *.gz versions of all of the supported ones for xmllint. + * Recognize rpm query mode based on the --file, --group, --package, and + --all long options (RedHat: #630328). + * Improve rpm query option completions. + * Drop bad kompare filename completion (Alioth: #312708). + * Make _filedir and _filedir_xspec complete uppercase versions of their + filename extension arguments in addition to exact case matches. + * IPv6 known hosts completion fixes (Alioth: #312695, RedHat: #630658). + * Fixes to completions for filenames containing tabs (RedHat: #629518). + * Add *.iso (Alioth: #311420), *.m2t and *.m2ts (Alioth: #312770) to + xine-based player filename completions. + * Add /etc/ethers to MAC address completion sources. + * Add *.gem and *.spkg to tar filename completions. + * Complete known hosts from avahi-browse only if $COMP_KNOWN_HOSTS_WITH_AVAHI + is non-empty (Alioth: #312691, RedHat: #630326). + * Improve relevance of many user/group completions, depending on context. + * Remove most "-o filenames" options to "complete", turn "-o filenames" on + dynamically when needed instead. + * Add/improve various autotools completions. + * Add *.apk to unzip and jar filename completions. + * Do not load bash_completion in profile.d script if progcomp is not enabled. + * Ignore muttrc source entries that are not files (Alioth: #312881). + * Re-enable postgresql database and user completion (Alioth: #312914, + Ubuntu: #164772). + * Add *.fdf to various PDF viewer completions. + + [ Freddy Vulto ] + * Added _tilde(), fix ~username completion (Alioth: #312613, Debian: #587095) + * Speed up `compopt' availability detection + * Fix _filedir `-o filenames' detection on bash-3 (Alioth: #312646) + * Fix __reassemble_comp_words_by_ref (Alioth #312740) + + [ Anton Khirnov ] + * Improve mplayer and mencoder completions. + + [ Paul Walmsley ] + * Add *.webm to mplayer file completions (Debian: #588079). + + [ Miklos Vajna ] + * Add *.amr to mplayer file completions (Alioth: #312634). + + [ Andrej Gelenberg ] + * Add *.part (partially downloaded) to mplayer and xine-based player + completions (Alioth: #312657). + + [ Stephen Gildea ] + * Fix false posives for non-option words in _parse_help (Alioth: #312750). + + [ Andrey G. Grozin ] + * Add *.fb2 to okular filename completions. + + -- David Paleino Sun, 06 Feb 2011 19:03:46 +0100 + +bash-completion (1.2) + + [ David Paleino ] + * Don't use pidof in _known_hosts_real() to detect whether Avahi is + available, since it's not available on MacOS X. Thanks to Rainer + Müller (bash-completion MacPorts maintainer) + * Fixed "freq" and "rate" completion for iwconfig + * contrib/munin-node fixed (Debian: #550943) + * contrib/dpkg fixed -W and --show completing on .?(u)deb's (Debian: #552109) + * contrib/aptitude: add @(add|remove)-user-tag + * Added munindoc completion to contrib/munin-node, thanks to Tom + Feiner (Debian: #553371) + * Added colordiff completion, same as diff + * contrib/cpio: added missing completions for -?, --help, --license, --usage, + --version and (-p) --to-stdout (Debian: #557436) + * Style policy: don't use fancy globbing in case labels + * Added .fdf completion to okular and evince + * Added .okular completion to okular (Debian: #545530) + * Added lintian completion + * Refreshed reportbug completion, added --from-buildd (Debian: #579471) + * Special-case "apt-get source" (Debian: #572000) + * Added lintian completion (Debian: #547361) + * contrib/dpkg: update completion to current API + * Styleguide: establish line wrapping and $() instead of `` + + [ Ville Skyttä ] + * Create bz2 dist tarball too. + * Include CHANGES in dist tarball. + * Include profile snippet in tarball, install it. + * Rename contrib/bluez-utils to contrib/bluez to follow bluez 4.x naming. + * Apply cardctl completion to pccardctl too. + * Apply pine completion to alpine too. + * Remove many unnecessary short option completions where long ones exist. + * Improve chsh, chgrp, chown, configure, curl, cvs, find, gkrellm, gzip, + iconv, lftp, look, lzma, make, man, mdadm, modprobe, mount, mplayer, + mysqladmin, perldoc, rsync, screen, service, scp, ssh, sshfs, unzip, + update-alternatives, vncviewer, wget, yp-tools, xine based players' and + general hostname completions. + * Add abook and wtf completion, based on work by Raphaël Droz. + * Add cvsps, dragon, fusermount, jarsigner, k3b, lftpget, modplug123, + pm-utils, rtcwake, pack200, unpack200, pbzip2, pbunzip2, pbzcat, pigz, + unpigz, and wol completions. + * Don't overwrite other host completions when completing from multiple + SSH known hosts files. + * Speed up installed rpm package completion on SUSE, based on work by + Marco Poletti (Alioth: #312021). + * Improve sourcing snippets from completion dirs. + * Drop support for bash < 3. The compatibility global variables $bashN, + $default, $dirnames, $filenames, $compopt, $nospace, $bashdefault, and + $plusdirs have been dropped too. 3rd party completions should switch + to using the complete/compgen features directly, and BASH_VERSINFO + for bash version checks. + * Protect various completions from unusual user input by not embedding the + input in external command arguments (Debian: #552631). + * Add /sbin to $PATH when invoking ifconfig and iwconfig. + * Combine dcop and qdbus completions into the latter. + * awk and sed usage portability fixes (Alioth: #311393, Debian: #501479). + * Fix leaking local variables from various completions. + * Turn on -o filenames in _filedir on bash >= 4. + * Deprecate modules completion, upstream modules >= 3.2.7 ships one. + * Protect grep invocations from user aliases (Alioth: #312143). + * Split sshfs completion from contrib/ssh into contrib/sshfs. + * Split mount and umount completion into contrib/mount. + * Split service completion into contrib/service. + * Split chown, chgrp, and id completions into contrib/coreutils. + * Split kill, look, and renice completions into contrib/util-linux. + * Split killall, pkill, pgrep and related completions into contrib/procps. + * Split ipsec completion into contrib/ipsec. + * Split ifup and ifdown completions into contrib/ifupdown. + * Do basic HTML file completion with Firefox and Chrome and friends, + and Epiphany. + * Do basic diff/patch completion with cdiff and kompare. + * Don't install mock completion by default, it's in upstream mock > 1.1.0. + * Do basic text editor completion with xemacs, sxemacs, kate, and kwrite. + * Do meta-command completion for aoss and padsp. + + [ Freddy Vulto ] + * Prevent root PATH expansion prolifering in _root_command (bash >= 4.1.4) + * Only complete xhost if (_)xhost is available. + * Added _get_comp_words_by_ref to replace both _get_cword & _get_pword. + Also additional variables `words' and `cword' can be returned. + * Added _upvar & _upvars helper functions to aid in passing variables + by reference. + * Make _filedir emulate `-o filenames' + * Fixed completion perl modules containing colons. + * Merged __get_cword3 & __get_cword4 to _get_cword. + * Added __expand_tilde_by_ref helper function. + * Added __ltrim_colon_completions to fix completions containing colons + * Improved mutt completion + * Added _get_pword helper function, thanks to Sung Pae (Alioth: #312030) + + [ Ted Stern ] + * Fix modules completion for "(default)" entries. + + [ Jeremie Lasalle Ratelle ] + * Fix rsync remote path completion (Alioth: #312173, Gentoo: #297818). + + [ Leonard Crestez ] + * Improve ssh -o suboption completion (Alioth: #312122). + * Fix NFS mounts completion (Alioth: #312285). + * Fix completion of usernames (Alioth: #311396, Debian: #511788). + * Fix chown test crashing on systems with no root group (Alioth: #312306). + * Fixed tests when BASH_COMPLETION or TESTDIR contain spaces. + * Fix mount handling of escapes (Alioth: #311410, Launchpad: #219971, + Debian: #511149). + * Cleanup scripts to run tests. Make runUnit and runCompletion use test/run. + Make it possible to run tests from any directory. + * Add a --debug-xtrace option to test/run using BASH_XTRACEFD from bash-4.1. + * Add a --timeout option to test/run to override the default expect timeout. + + [ Raphaël Droz ] + * Add xsltproc completion (Alioth: #311843). + + [ Adrian Friedli ] + * Add ipv6calc completion. + + [ Ildar Mulyukov ] + * Add showmount completion (Alioth: #312285). + + [ Neville Gao ] + * Fix mount completion error "bash: [: too many arguments" (Alioth #312381). + + [ Austin English ] + * Make lookup of wine file completions case insensitive. + + [ Igor Murzov ] + * Improve xz completion (Alioth: #312466). + + [ Mario Schwalbe ] + * Update find completion (Alioth: #312491, Launchpad: #570113). + + [ Mark van Rossum ] + * Add basic lyx completion. + + -- David Paleino Wed, 16 Jun 2010 17:44:59 +0200 + +bash-completion (1.1) + + [ David Paleino ] + * Permit .gz files concatenation (Debian: #514377) + * Fix svk completion using $filenames instead of $default (Debian: #524961) + * Really add build-dep to aptitude's completion (Debian: #495883) + * Fix checks for GNUish userland, thanks to Robert Millan (Debian: #529510) + * Fix typo in .ass subtitles completion for mplayer (Debian: #531337) + * Fix regression on man(1) completion: also complete on local .3pm files + (Debian: #531343) + * Split mutt completion to contrib/mutt + * Split iconv completion to contrib/iconv + * Split dict completion to contrib/dict + * Split {update,invoke}-rc.d completions to contrib/sysv-rc + * Don't install _subversion anymore, upstream completion is better than + ours. Added to EXTRA_DIST in Makefile.am + * Split autorpm completion to contrib/autorpm + * Split jar completion to contrib/jar + * Split chkconfig completion to contrib/chkconfig + * Split chsh completion to contrib/chsh + * Split apt_build completion to contrib/apt-build + * Split aptitude-related completions to contrib/aptitude + * Split apt-cache and apt-get completions to contrib/apt + * Split rpm-related completions to contrib/rpm + * Split cvs-related completions to contrib/cvs + * Split man completion to contrib/man + * Split bash builtins completions to contrib/bash-builtins + * Split dpkg-related completions to contrib/dpkg (and re-enable usage + of grep-status if available) + * Split gcc completion to contrib/gcc + * Split dselect completion to contrib/dselect + * Split cardctl completion to contrib/cardctl + * Split pineaddr completion to contrib/pine + * Added avahi-discovered hosts to _known_hosts_real() (Debian: #518561) + * Added m4v completion to mplayer (Debian: #504213) + * Improve qemu completion (Debian: #534901) + * Added sshfs completion (shares the same as scp) (Debian: #545978) + * Fixed obvious brokenness (typos) in contrib/mdadm + * Clean [1.2.3.4]:port format in known_hosts, thanks to + Xuefer (Gentoo: #284563) + * Added --no-generate to "apt-cache pkgnames" calls, make it faster + on certain configurations (Debian: #547550) + * Split okular from evince filename extension completion, needed to add + okular-specific completions: xps, epub, odt, fb, mobi, g3 and chm. + Also, okular can read any of its formats also in .gz/.bz2 compressed + format, so change the regular expression to match this. + * Remove --with-suggests and --without-suggests from aptitude completion + * Patches from PLD Linux (thanks to Elan Ruusamäe): + - avoid sed pipe as ps itself can omit the headers + - improve service(8) completion, also look for "msg_usage" + + [ Ville Skyttä ] + * Split yum completion to contrib/_yum (no longer installed by default, the + intent is to move it to yum upstream soon). + * Split yum-arch completion into contrib/yum-arch, load completion only if + yum-arch is installed. + * Update list of yum commands and options. + * Add yum repolist, --enable/disablerepo, --disableexcludes, -d, -e, --color, + and --enable/disableplugin completions. + * Add chkconfig --override and resetpriorities completions. + * Split mplayer and friends completions to contrib/mplayer. + * Parse top level mplayer and friends option completions from -list-options. + * Fix dir-only completion for make to include only dirs, not files. + * Remove unused variable RELEASE. + * Improve aspell dictionary completion: don't hardcode data-dir, get + canonical dicts from "aspell dicts". + * Always use /etc/shells for chsh -s completion, don't complete on comment + lines in it. + * Fix rpm --whatrequires/--whatprovides completions with spaces and other + unusual characters, add filename based --whatrequires completions. + * Add modplugplay filename completion. + * Add more mod-like audio file extensions for xine-based players and timidity. + * Complete on plain alternatives like update-alternatives. + * Rename installed_alternatives() to _installed_alternatives(). + * Add /etc/pki/tls/openssl.cnf to list of default openssl config files, + search for default ones only if -config is not given. + * Use POSIX compliant arguments to tail in mkisofs completion. + * Protect various completions from unusual user input by not embedding the + input in external command arguments. + * Add _split_longopt() helper for improved handling of long options that + take arguments in both "--foo bar" and "--foo=bar" formats. + * Use _split_longopt to improve and clean up aspell, bluez-utils, chgrp, + chown, chkconfig, cpio, dpkg, heimdal, iptables, mailman, make, mc, + mii-diag, mii-tool, mkinitrd, pkg-config, postgresql, quota, reportbug, + samba, smartctl, yum, and generic long option completion (Alioth: #311398). + * Add chown --from and --reference value completions. + * Add chgrp --reference value completion. + * Do not assume all --foo= options take filenames in generic long option + completion, assume only that --*file*= does, and that --*dir*= takes dirs. + * Add make --old/new-file, --assume-old/new, --what-if value completions. + * Add smartctl -n/--nocheck completion, add more other value completions. + * Fix leaking $prev from cpio, dsniff, freeciv, gkrellm, mkinitrd, service, + and tcpdump completions. + * Split ant completion to contrib/ant, improve the built in one. + * Improve postfix completion. + * Improve samba completion. + * Split lilo completion to contrib/lilo. + * Split reportbug and querybts completions to contrib/reportbug. + * Remove debug output noise from quotaon completion. + * Split Linux wireless tools completion to contrib/wireless-tools. + * Add mock completion. + * Split FreeBSD kld(un)load completion to contrib/kldload. + * Split FreeBSD pkg_* completion to contrib/pkg_install. + * Split FreeBSD portupgrade and friends completion to contrib/portupgrade. + * Split Slackware pkgtools completion to contrib/pkgtools. + * Improve rpm group completion (displayed completions are still wrong). + * Change many completions to load in memory only if the completed commands + are available. + * Invoke the actual mplayer/mencoder command being completed (with full path) + to get various completions instead of simply "mplayer" or "mencoder". + * Associate OOXML/MS Office 2007 extensions with OpenOffice applications. + * Associate .tsv with oocalc. + * Add xmlwf completion. + * Associate *.po with poedit, gtranslator, kbabel, and lokalize. + * Add xz, xzcat, xzdec, and unxz completion. + * Add lzcat, lz*grep, lzless, lzmore, and unlzma completion. + * Load "modules" completion if /etc/profile.d/modules.sh exists even if + the "module" alias has not been defined (yet). + * Add *.ogv to xine-based players (Debian: #540033). + * Add $compopt (":" i.e. no-op with bash < 4, "compopt" with >= 4). + * Complete bzcat and zcat only on compressed files. + * Do not require a dot in bzcmp, bzdiff, bz*grep, zcmp, zdiff, z*grep, zless, + and zmore filename completions. + * Add xz and compress support and more tarball filename extensions to + rpmbuild -t*/--tarbuild completion. + * Don't hardcode path to lsmod. + * Fix sbcl file/dirname completion (Debian: #545743). + * Add /sbin to $PATH when invoking lspci and lsusb. + * Support .xz suffix in info page completions. + * Prevent rpm --define/-D completions from falling through. + * Add more common options to rpm option completions. + + [ Todd Zullinger ] + * Make yum complete on filenames after install, deplist, update and upgrade + when the following argument contains a slash. + + [ Mike Kelly ] + * Fix _filedir on bash 4. + * Add support for xz to tar completion. + * Fix _quote_readline on bash 4 (Debian: #544024). + + [ Guillaume Rousse ] + * Split mkinitrd completion to contrib/mkinitrd, improve it. + * Split smartctl completion to contrib/smartctl. + * Better ssh and sftp completion + * Better xhost completion + * Split _known_hosts completion in two parts, to avoid parsing command line + twice + * Added strace completion + * Added xm completion + * Added rpcdebug completion + * Added msynctool completion + * Added openldap completion + * Added ldapvi completion + * Added heimdal completion + * Added vpnc completion + * Added rpmcheck completion + * Added munin-node completion + * Added bluez-utils completion + * Added samba completion + * Added cfengine completion + * Added xmllint completion, contributed by Ville + * Added shadow completion, contributed by Ville + * Added repomanage completion, contributed by Ville + * Splitted and enhanced openssl completion + * Added rfkill, mdadm and resolvconf completions + + [ Raphaël Droz ] + * Add mount -L and -U completion. + + [ Philipp Weis ] + * Add .dvi.{gz,bz2} completion for evince/okular (Debian: #522656) + + [ Freddy Vulto ] + * Patched _known_hosts() to support multiple {Global,User}KnownHosts in SSH + config files, thanks to Thomas Nilsson (Alioth: #311595) (Debian: #524190) + * Fix leaking $i from info, man and python completions. + * Added setting COMP_KNOWN_HOSTS_WITH_HOSTFILE. _known_hosts_real() will add + hosts from HOSTFILE, unless COMP_KNOWN_HOSTS_WITH_HOSTFILE is set to an + empty value (Alioth: #311821) + * Quoted $cur to prevent globbing - thanks to Eric Blake (Alioth #311614) + * Fix leaking $muttcmd from mutt completion + * Fix completing multiple hosts (Debian: #535585) + + [ Michele Ballabio ] + + * Add more extensions to pkgtools completion. + + -- David Paleino Sat, 03 Oct 2009 15:41:49 +0200 + +bash-completion (1.0) + + [ Guillaume Rousse ] + * Make bibtex complete on .aux files + * Add .xvid and .XVID to player completion + * Added cowsay/cowthink completion + * Added brctl completion + * Added cpan2dist completion + * Added qemu completion + * Added net-tools (mii-tool and mii-diag) completions + * Added minicom completion + * Added quota-tools completion + * Added rdesktop completion + * Added tightvncviewer completion + * Cleanup screen completion, and make it completes on options + + [ David Paleino ] + * Added .kar to Timidity completion. + * Fix killall completion, remove trailing ":" on certain process + names + * Fix man -l completing filenames (Debian: #497074) + * (Partly) fixed java classes completion (Debian: #496828). Look for + FIXME in source. + * Dump to /dev/null error message from look(1) with no arguments + (Debian: #495142) + * Set ssh as default for rsync (was rsh) (Debian: #492328) + * Added .oga, .ogv, .ogx to mplayer completion (Debian: #496162) + * Added .epub to unzip|zipinfo completion (Debian: #492476) + * Added ssh-copy-id completion (Debian: #491856) + * Moved ssh completion to separate file (Debian: #360628) + * Bogus completion when mounting subdirs fixed (Debian: #322238) + * Fix `apt-cache showsrc` completing only on source package names + (Debian: #361535) + * Fixed bugs with gdb completion: + - when an empty directory is in $PATH (thanks to Morita Sho) + (Debian: #497597) + - when a non-existing directory is in $PATH (Debian: #499780) + * Fix missing completion for "-n" and "-e" (we were using echo, now + using printf) (thanks to Morita Sho) (Debian: #498105) + * Fixed gpg completion: + - --@(export|@(?(l|nr|nrl)sign|edit)-key)) (Debian: #500316) + - -@(r|-recipient)) + * Fixed .cb[rz] completion for evince (Debian: #502885) + * Added gksudo, gksu, kdesudo completion + * Added apache2ctl completion + * Added gpg2 completion (Debian: #489927) + * Fixed mplayer -skin completion (Debian: #501473) + * Fixed errors with POSIX enabled (Debian: #502804) + * Fixed dpkg-source wrong exit() with return() (Debian: #) + * Added --schedule-only to aptitude's completion (Debian: #502664) + * Added build-dep to aptitude's completion (Debian: #495883) + * Added support for `-F configfile' to _known_hosts(), ssh, scp and + sftp, thanks to Freddy Vulto (Debian: #504141) + * Fixed sed quoting bug in _known_hosts(), thanks to Freddy Vulto + (Debian: #504650) + * Allow `Host(Name)' in ssh config file to be indented + * Allow `Host(Name)' in ssh config file to have trailing comment. + * Allow for comments in known_hosts files (Debian: #511789) + * Fixed perl -I/-x completion, thanks to Freddy Vulto + (Debian: #504547) + * README updated: explain how to use bash-completion correctly. + (Debian: #506560) + * TODO updated: the Alioth team is now upstream. + * Added qdbus completion, thanks to Terence Simpson (Ubuntu: #257903) + * Added monodevelop and mdtool completions. + * Split subversion-related completions to contrib/_subversion + (prefixed with _ to avoid file conflicts with upstream's one) + * Fixed completion of environment variables, thanks to Morita Sho + (Debian: #272660) + * Fix dpkg completion bug: it listed only non-Essential packages + (Debian: #511790) + * Fixed _dpkg_source completion (Debian: #503317) + * Added _parse_help() to try to parse options listed in $command + --help + * Fixed gzip completion to use _parse_help(), since the available + options vary with distributions + * Added to_review/ directory, where completions needing a review would + go. After it gets accepted, the completion would go into contrib/. + * Remove unused UNAME local variable in _info() (Debian: #501843) + * AUTHORS added + * Make _alias() use _get_cword + * Added .zip to jar completions (Debian: #521041) + * Merge from Gentoo: + - fix 'find' completion so that it properly completes on -?(i)whilename. + Patch by Ciaran McCreesh. + - use make -qp to parse the Makefile for us, so we get proper completion + on things like pattern rules. Patch by Mike Kelly . + - complete on gkrellm2 as well. Patch by Aaron Walker. + - fix CVS completion + * Merge from Ubuntu: + - consume error messages in configure completion (Ubuntu: #223882) + (Mika Fischer) + - quote $xspec in _filedir_xspec in case it is empty, which would + cause errors if there was no match under failglob. (Ubuntu: #194419) + (Mika Fischer) + * debian/links fixed (Debian: #494292) + * debian/control: + - fixed typo in the long description + - added Vcs-* fields + * debian/install: + - correctly install contrib/* under /etc/bash_completion.d/ + * debian/copyright updated + * extra/dh_bash-completion: + - updated to support a list of files in debian/.bash-completion + (Debian: #512917) + + [ Ville Skyttä ] + * Added JPEG 2000 files to display completion, thanks to Bastien Nocera + (RedHat: #304771) + * Improved rpm macro completion. + * Added -E to rpm completion. + * Improved rpm backup file avoidance. + * Improved /var/log/rpmpkgs based rpm installed package completion. + * Improved performance of rpm -qa based rpm installed package completion. + * Improved features and performance of yum completion. + * Added support for p (POSIX) and x (x.org) man sections. + * Improved filename based man page completion. + * Added minimal sqlite3 completion. + * Improved getent completion (Ville Skyttä, Guillaume Rousse). + * (Re)fix gzip and bzip2 options completion. + * Improved svn filename completion (RedHat: #430059). + * Add lzma completion (Per Øyvind Karlsen, Ville Skyttä). + * Add .mp2 and .vdr to mplayer completion (RedHat: #444467). + * Add .mkv, .mp2 and .vdr to *xine completion (RedHat: #444467). + * Added lzop completion. + * Fix scp metacharacter escaping. + * Remove duplicate cpio completion, thanks to Freddy Vulto (Debian: #512823) + * Fix awk error in "modprobe -r /" completion (Debian: #512556). + * Expand ~foo to dir name more eagerly to avoid quoting issues. + * Fix -sourcepath handling in javadoc packages completion. + * Extract process name completion from _killall to _pnames, make it work + for others than Linux and FreeBSD. + * Fix process name completion with relative paths (RedHat: #484578). + * Use improved process name completion in pgrep in addition to killall. + * Enable pgrep and pkill completion if the commands are available, not just + on Linux and FreeBSD. + * Drop hg completion, an improved version is shipped with Mercurial + (contrib/bash_completion in the tarball). + * Make okular complete on same files as evince, thanks to Mary Ellen Foster + (RedHat: #486998). + * Apply ps2pdf completion to ps2pdf{12,13,14,wr} too. + * Simplify bash_completion.sh, return earlier in non-applicable environments. + * Remove obsolete --buildarch and --buildos rpm(build) completions. + * Add rpmbuild --target completion. + * Use "-profile help" to get mplayer and friends -profile completions. + * Fix local array initialization under bash 3.0, prevents "()" occurring in + file and dir name completions. + + [ Freddy Vulto ] + * Restored `_display()' completion for `display' by removing + completion-by-extension for `display' (Alioth#311429) + * Removed duplicate completion option `-borderwidth' for `display' + * Prevent completion dir from being sourced twice if + BASH_COMPLETION_DIR and BASH_COMPLETION_COMPAT_DIR are equal (Alioth#311433) + * Make `_mii-tool()' and `_mii-diag()' POSIX-compliant + * Fix _isql completion waiting for grep input if $ODBCINI not set; handle + whitespace in $ODBCINI. + * Split vncviewer completion in _tightvncviewer() and _xvnc4viewer() + Added _realcommand() global function. + + [ Jakob Unterwurzacher ] + * ps2pdf can run on .pdf files as well. (Debian: #516614, Ubuntu: #316943) + + [ Santiago M. Mola ] + * Add .ape to mplayer supported extensions (Alioth#311510). + + -- David Paleino Wed, 25 Mar 2009 23:18:24 +0100 + +bash-completion (20080705) unstable; urgency=low + + [ David Paleino ] + * Added more completions to imagemagick (thanks to Nelson A. de + Oliveira) (Debian: #487786) + * Added xrandr completion (thanks to Anton Khirnov) (Debian: #487825) + * Improving _gdb completion: + - $filenames to $default (Debian: #463969) + - also show directory names (i.e. compgen -d) in COMPREPLY. + - added . to $PATH, to allow debugging "local" executables. + - do not complete Bash's builtins (thanks to Morita Sho) + + [ Luk Claes ] + * Remove use of ucf for /etc/bash-completion (Debian: #488171). + + -- Luk Claes Sat, 05 Jul 2008 16:14:15 +0200 + +bash-completion (20080617.5) unstable; urgency=medium + + * Revert way of setting environment variables (Debian: #487774). + * Add equals sign to _get_cword for mutt_aliases (Debian: #482635). + * Enhance mlayer completion (Debian: #487826, #487838). + + -- Luk Claes Tue, 24 Jun 2008 19:50:57 +0200 + +bash-completion (20080617.4) experimental; urgency=low + + [ David Paleino ] + * Merged Ubuntu changes: + - added quote(), quote_readline(), dequote() helper functions. + - added _remove_word() + - fixed _get_cword() + - refactored _filedir using quote_readline() + - refactored _filedir_xspec using quote_readline() + - fixed COMPREPLY's in _iwconfig + - fixed _cvs() + - _known_hosts(): use files from UserKnownHostsFile options in + addition to standard ones. + - fixed _command() to correctly prune the command line + - disabled completion of PostgreSQL users and databases (Ubuntu: #164772) + - fixed _java_packages() + - fixed _muttquery() + - added flv/FLV completion to mplayer + - added --installed to apt-cache + - only complete on filenames for aspell + - fixed code for exclusions compspecs + - added code to gracefully handle debug options (set +/-v) + + -- Luk Claes Mon, 23 Jun 2008 19:25:25 +0200 + +bash-completion (20080617.3) unstable; urgency=low + + [ David Paleino ] + * Fixed IFS for filedir_xspec - Thanks to Stefan Lippers-Hollmann + (Debian: #487571) + + [ Luk Claes ] + * Install dh-bash-completion to ease installation of completions. + + -- Luk Claes Mon, 23 Jun 2008 07:24:21 +0200 + +bash-completion (20080617.2) unstable; urgency=low + + [ David Paleino ] + * New upstream release + - provide a manpage for extra/dh_bash-completion + - fix semi-serious problem with _filedir() (Debian: #487449) + * debian/rules: + - added rule to generate dh_bash-completion's manpage + * debian/install, debian/dirs: + - installing dh_bash-completion into /usr/bin + * debian/control: + - new package dh-bash-completion + + [ Luk Claes ] + * Comment new package to make sure current fix gets in the archive first. + * Add compression completion for vi(m). + + -- Luk Claes Sun, 22 Jun 2008 19:47:23 +0200 + +bash-completion (20080617.1) unstable; urgency=medium + + [ David Paleino ] + * Urgency set to medium because the package is currently unusable. + * New upstream sub-release + - fixed some typos here and there which prevented bash completions + at all (Debian: #487441). + - really closing Debian bug #455510. + + -- Luk Claes Sun, 22 Jun 2008 00:22:53 +0200 + +bash-completion (20080617) unstable; urgency=low + + [ David Paleino ] + * New upstream release + - add more completions to aptitude (Debian: #432289) + - fixed UTF-8 problem with _get_cword(), thanks to + Andrei Paskevich (Debian: #472132) + - fixed autoremove completion, thanks to Flavio Visentin + (Debian: #474974) + - cmf and CMF added to playmidi completion (Debian: #365658) + - added rrdtool completion, thanks to Justin Pryzby (Debian: #428641) + - added OpenDocument completion for unzip/zipinfo (.od{f,g,p,s,t}) + (Debian: #472940) + - fixed escaping problems with job control (i.e. disown, jobs, bg, + fg): the argument is now surrounded by "" (Debian: #347316) + - make mkdir complete also on filenames (Debian: #376433) + - {bz,z}{cat,cmp,diff,egrep,fgrep,grep,less,more} now should complete + on all filenames, not just compressed archives (just commented out) + (Debian: #455510) + - fixes Perl completion (Debian: #470742) + - fixes get_cword -> _get_cword typo (Debian: #478596) + - fixes _get_cword() function to properly handle filenames with + whitespaces (Debian: #394636, #468254, #474094) + - added .pdf.bz2 completion to evince (Debian: #424736) + - added .svg completion to display (Debian: #441017) + - added .m2ts completion to mplayer (Debian: #480879) + - added extra/dh_bash-completion to ease future rewrite of bc. + * debian/copyright - now in a fancier machine-parsable format. + * debian/control: + - added myself to Uploaders + - debhelper Build-Depends updated to >= 6. + * debian/watch: + - improved current watch line regex + - added (commented out) probable future watch line + * debian/compat bumped to 6 + * debian/dirs, debian/install and debian/links added + * debian/rules: + - refactored to make use of debian/{dirs,install,links} + + [ Steve Kemp ] + * Applied patch to fix completion of umount command. + (Debian: #470539) + * Fixed the completion of Perl manpages. + (Debian: #404976) + * Added 'aif' to the filenames offed for completion for mplayer. + (Debian: #474517) + * Allow tsocks completion. + (Debian: #409423) + * Update mutt completion to handle local usernames. + (Debian: #416655) + * Update apt-get completion to include the flag "--no-install-recommends" + (Debian: #475242) + + -- Luk Claes Sat, 21 Jun 2008 21:59:43 +0200 + +bash-completion (20060301-4) unstable; urgency=low + + * Add some fixes from Ubuntu: + * Fix completion of filenames with spaces (Debian: #468254). + * Fix parsing of SSH config files (Debian: #435117). + * Change priority to standard (Debian: #471666). + * Add some more completions for xine (Debian: #452083, #471249). + * Fix completion of gzip (Debian: #351913). + * Also use $HOSTFILE in hostname completion (Debian: #400380). + + -- Luk Claes Sat, 22 Mar 2008 23:10:30 +0000 + +bash-completion (20060301-3) unstable; urgency=low + + * Fix kpdf completion (Debian: #468163, #413374). + * Fix completion of - or -- with _command (Debian: #415276). + * Add sux to the complete -u list (Debian: #466089). + * Add dvipdfm to the list of dvi programs (Debian: #396644). + * Add --purge-unused option completion for aptitude (Debian: #438471). + * Add divx extension completion for mplayer (Debian: #444294). + * Add pdf.gz completion for evince (Debian: #456887). + * Add --remove-all completion for update-alternatives (Debian: #269173). + + -- Luk Claes Wed, 05 Mar 2008 22:57:27 +0100 + +bash-completion (20060301-2) unstable; urgency=low + + * Take over the package. + + -- Luk Claes Wed, 27 Feb 2008 19:22:03 +0100 + +bash-completion (20060301-1) unstable; urgency=low + + * Upload to unstable. + + -- Matthias Klose Sat, 09 Feb 2008 23:18:20 +0100 + +bash-completion (20060301-0ubuntu2) hardy; urgency=low + + * Replace bash (<< 3.1dfsg-9), handle upgrade in preinst. + * Exclude hashed hostnames from ssh host completion results. Debian: #428085. + * Fix: ifup/down don't really complete. Debian: #463756. + * Allow perl completion to complete filenames, complete -I and -x arguments. + Debian: #443394. + * Add find -wholename completion. Debian: #431220. + * Handle whitespaces in $HOME for _known_hosts() completion. Debian: #414821. + * dpkg -L: complete for removed-but-not-purged packages. Debian: #372156. + * Complete for apt-get autoremove. Debian: #433542, #443816, #445332. + * Update completion for mplayer (mka/flac). Debian: #340452. + * Add ping6/fping6 completion. Debian: #413170. + * Handle whitespace in paths for mount/umount completion. Debian: #367957. + * apt-get: Support --auto-remove. Ubuntu: #60666. + + -- Matthias Klose Sat, 09 Feb 2008 23:11:32 +0100 + +bash-completion (20060301-0ubuntu1) hardy; urgency=low + + * Initial release, split out from the bash package. + The software currently is unsupported upstream. + * Don't try to set a readonly variable. Ubuntu: #149527. + * Support purge in apt-get auto completion (Mathias Gug). Ubuntu: #151677. + * evince: Autocomplete on cbr/cbz/djvu files. Ubuntu: #156200, #175220. + Debian: #400678. + * kdvi: complete .*\.dvi\.(gz|bz2). Ubuntu: #128234. + * kpdf: Complete postscript files. Ubuntu: #162319. + * Make completion working in the middle of a word (Adam Simpkins). + Ubuntu: #139666. + + -- Matthias Klose Fri, 08 Feb 2008 16:46:34 +0100 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..9c8292c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,191 @@ +# Contributing to bash-completion + +Contributions to the bash completion project are more than +welcome. Fixes, clean-ups and improvements of existing code are much +appreciated, as are completion functions for new commands. + +However, before submitting a completion to us, first consider submitting it to +the project that ships the commands your completion is for. Having the +completion shipped along with the command opens up some liberties we don't have +if the completion is included with bash-completion. For example, we generally +do not want to hardcode lists of available command options and their +completions, because they quite probably vary between versions of the completed +command, and therefore resort to scraping --help output and the like. While we +do fairly well there, depending on the command, this can be fragile or +expensive, or just not possible. If the completion is shipped alongside the +command, they can be kept in sync and use more hardcoding etc. They are also +more likely to be maintained and/or watched by people intimately familiar with +the completed commands. See instructions in README.md how to install completion +files from other projects so they are automatically enabled and dynamically +loaded by bash-completion. + +On the other hand, we do have a pretty nice test suite and a bunch of helper +functions that you may find useful. And a whole slew of completions in one +package. Our functions can be used from "external" completions as well, just +make sure you test for their existence and/or fail gracefully if you intend +your completion to be usable without having bash-completion installed. + +It's nowhere near clear cut always what is the best place for the completion, +upstream project or us. Even if it would seem to be upstream, not all upstreams +are interested in shipping completions, or their install systems might not +easily support installing completion files properly. But give it some thought, +and ask if unsure. + +If you wish to contribute code to us, volunteering for long term maintainership +of your code within bash-completion is welcome. When exactly you will be asked +to do that depends on the case; don't be disappointed if it does or doesn't +happen instantly. + +Also, please bare the following coding guidelines in mind: + +- Do not use Perl, Ruby, Python etc. to do text processing unless the + command for which you are writing the completion code implies the + presence of one of those languages. + + For example, if you were writing completion code for perldoc(1), the + use of Perl to achieve your goal would be acceptable. irb(1) + completion would similarly make the use of Ruby acceptable. + + Even so, please consider alternatives to these large and slow to + start interpreters. Use lightweight programs such as grep(1), awk(1) + and sed(1). + +- Use the full power of bash >= 4.2. We no longer support earlier bash + versions, so you may as well use all the features of that version of + bash to optimise your code. However, be careful when using features + added since bash 4.2, since not everyone will be able to use them. + + For example, extended globs often enable you to avoid the use of + external programs, which are expensive to fork and execute, so do + make full use of those: + + `?(pattern-list)` - match zero or one occurrences of patterns + `*(pattern-list)` - match zero or more occurrences of patterns + `+(pattern-list)` - match one or more occurrences of patterns + `@(pattern-list)` - match exactly one of the given patterns + `!(pattern-list)` - match anything except one of the given patterns + +- Following on from the last point, be sparing with the use of + external processes whenever you can. Completion functions need to be + fast, so sacrificing some code legibility for speed is acceptable. + + For example, judicious use of sed(1) can save you from having to + call grep(1) and pipe the output to cut(1), which saves a fork(2) + and exec(3). + + Sometimes you don't even need sed(1) or other external programs at + all, though. Use of constructs such as `${parameter#word}`, + `${parameter%word}` and `${parameter/pattern/string}` can provide + you a lot of power without having to leave the shell. + + For example, if `$foo` contains the path to an executable, + `${foo##*/}` will give you the basename of the program, without + having to call basename(1). Similarly, `${foo%/*}` will give you the + dirname, without having to call dirname(1). + + As another example, + + ```shell + bar=$(echo $foo | command sed -e 's/bar/baz/g') + ``` + + can be replaced by: + + ```shell + bar=${foo//bar/baz} + ``` + + These forms of parameter substitutions can also be used on arrays, + which makes them very powerful (if a little slow). + +- We want our completions to work in `posix` and `nounset` modes. + + Unfortunately due to a bash < 5.1 bug, toggling POSIX mode interferes + with keybindings and should not be done. This rules out use of + process substitution which causes syntax errors in POSIX mode. + + Instead of toggling `nounset` mode, make sure to test whether + variables are set (e.g. with `[[ -v varname ]]`) or use default + expansion (e.g. `${varname-}`). + +- Prefer `compgen -W '...' -- $cur` over embedding `$cur` in external + command arguments (often e.g. sed, grep etc) unless there's a good + reason to embed it. Embedding user input in command lines can result + in syntax errors and other undesired behavior, or messy quoting + requirements when the input contains unusual characters. Good + reasons for embedding include functionality (if the thing does not + sanely work otherwise) or performance (if it makes a big difference + in speed), but all embedding cases should be documented with + rationale in comments in the code. + +- When completing available options, offer only the most descriptive + ones as completion results if there are multiple options that do the + same thing. Usually this means that long options should be preferred + over the corresponding short ones. This way the user is more likely + to find what she's looking for and there's not too much noise to + choose from, and there are less situations where user choice would + be needed in the first place. Note that this concerns only display + of available completions; argument processing/completion for options + that take an argument should be made to work with all known variants + for the functionality at hand. For example if `-s`, `-S`, and + `--something` do the same thing and require an argument, offer only + `--something` as a completion when completing option names starting + with a dash, but do implement required argument processing for all + `-s`, `-S`, and `--something`. Note that GNU versions of various + standard commands tend to have long options while other userland + implementations of the same commands may not have them, and it would + be good to have the completions work for as many userlands as + possible so things aren't always that simple. + +- Do not write to the file-system under any circumstances. This can + create race conditions, is inefficient, violates the principle of + least surprise and lacks robustness. + +- Use printf(1) instead of echo(1) for portability reasons, and be + sure to invoke commands that are often found aliased (such as `ls` + or `grep` etc) using the `command` (or `builtin`) command as + appropriate. + +- Make small, incremental commits that do one thing. Don't cram + unrelated changes into a single commit. + +- If your code was written for a particular platform, try to make it + portable to other platforms, so that everyone may enjoy it. If your + code works only with the version of a binary on a particular + platform, ensure that it will not be loaded on other platforms that + have a command with the same name. + + In particular, do not use GNU extensions to commands like sed and + awk if you can write your code another way. If you really, REALLY must + use them, do so if there's no other sane way to do what you're doing. + The "Shell and Utilities" volume of the POSIX specification is a good + starting reference for portable use of various utilities, see + . + +- Use an editor that supports EditorConfig, see , + and format source code according to our settings. + +- Read the existing source code for examples of how to solve + particular problems. Read the bash man page for details of all the + programming tools available to you within the shell. + +- Please test your code thoroughly before sending it to us. We don't + have access to all the commands for which we are sent completion + functions, so we are unable to test them all personally. If your + code is accepted into the distribution, a lot of people will try it + out, so try to do a thorough job of eradicating all the bugs before + you send it to us. If at all practical, **add test cases** to our + test suite (in the test/ dir) that verify that the code does what it + is intended to do, fixes issues it intends to fix, etc. + +- In addition to running the test suite, there are a few scripts in the test/ + dir that catch some common issues, see and use for example runLint. + +- File bugs, enhancement, and pull requests at GitHub, + . + Sending them to the developers might work too, but is really strongly + discouraged as bits are more likely to fall through the cracks that + way compared to the tracker. Just use GitHub. If that's not an + option for some reason and you want to use email to send patches, + send them as attachments formatted by `git format-patch` or directly + with `git send-email`. diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..26f3c7c --- /dev/null +++ b/Makefile.am @@ -0,0 +1,41 @@ +SUBDIRS = completions doc helpers test + +pkgdata_DATA = bash_completion + +# Empty, but here just to get the compat dir created with install +compatdir = $(sysconfdir)/bash_completion.d +compat_DATA = + +profiledir = $(sysconfdir)/profile.d +profile_DATA = bash_completion.sh + +pkgconfigdir = $(datadir)/pkgconfig +pkgconfig_DATA = bash-completion.pc + +cmakeconfigdir = $(datadir)/cmake/$(PACKAGE)/ +cmakeconfig_DATA = bash-completion-config.cmake \ + bash-completion-config-version.cmake + +%: %.in Makefile + $(SED) \ + -e 's|@prefix[@]|$(prefix)|' \ + -e 's|@datadir[@]|$(datadir)|' \ + -e 's|@sysconfdir[@]|$(sysconfdir)|' \ + -e 's|@PACKAGE[@]|$(PACKAGE)|' \ + -e 's|@VERSION[@]|$(VERSION)|' \ + <$(srcdir)/$@.in >$@ + +CLEANFILES = bash_completion.sh bash-completion.pc \ + bash-completion-config.cmake bash-completion-config-version.cmake + +EXTRA_DIST = CHANGES $(pkgdata_DATA) bash_completion.sh.in .dir-locals.el \ + .editorconfig README.md CONTRIBUTING.md pyproject.toml .perltidyrc \ + .shellcheckrc bash-completion.pc.in bash-completion-config.cmake.in \ + bash-completion-config-version.cmake.in setup-symlinks.sh + +install-data-hook: + tmpfile=`mktemp $${TMPDIR:-/tmp}/bash_completion.XXXXXX` && \ + $(SED) -e 's|-/etc/bash_completion\.d|-$(compatdir)|' \ + $(DESTDIR)$(datadir)/$(PACKAGE)/bash_completion >$$tmpfile && \ + cat $$tmpfile >$(DESTDIR)$(datadir)/$(PACKAGE)/bash_completion && \ + rm $$tmpfile diff --git a/README.md b/README.md new file mode 100644 index 0000000..11d2940 --- /dev/null +++ b/README.md @@ -0,0 +1,347 @@ +# bash-completion + +[![Build Status](https://travis-ci.org/scop/bash-completion.svg?branch=master)](https://travis-ci.org/scop/bash-completion) + +## Introduction + +bash-completion is a collection of command line command completions for the +[Bash shell](https://www.gnu.org/software/bash/), collection of helper +functions to assist in creating new completions, and set of facilities for +loading completions automatically on demand, as well as installing them. + +## Installation + +The easiest way to install this software is to use a package; refer to +[Repology](https://repology.org/project/bash-completion) for a comprehensive +list of operating system distributions, package names, and available versions. + +Depending on the package, you may still +need to source it from either `/etc/bashrc` or `~/.bashrc` (or any +other file sourcing those). You can do this by simply using: + +```shell +# Use bash-completion, if available +[[ $PS1 && -f /usr/share/bash-completion/bash_completion ]] && \ + . /usr/share/bash-completion/bash_completion +``` + +(if you happen to have *only* bash >= 4.2 installed, see further if not) + +If you don't have the package readily available for your distribution, or +you simply don't want to use one, you can install bash completion using the +standard commands for GNU autotools packages: + +```shell +autoreconf -i # if not installing from prepared release tarball +./configure +make # GNU make required +make check # optional, requires python3 with pytest >= 3.6, pexpect +make install # as root +``` + +These commands install the completions and helpers, as well as a +`profile.d` script that loads `bash_completion` where appropriate. + +If your system does not use the `profile.d` directory (usually below +`/etc`) mechanism—i.e. does not automatically source shell scripts in +it—you can source the `$sysconfdir/profile.d/bash_completion.sh` +script in `/etc/bashrc` or `~/.bashrc`. + +The `profile.d` script provides a configuration file hook that can be +used to prevent loading `bash_completion` on per user basis when it's +installed system wide. To do this: + +1. Turn off programmable completion with `shopt -u progcomp` in + `$XDG_CONFIG_HOME/bash_completion` (or `~/.config/bash_completion` + if `$XDG_CONFIG_HOME` is not set) +2. Turn it back on (for example in `~/.bashrc`) if you want to use + programmable completion for other purposes. + +### macOS (OS X) + +If you're using macOS (formerly OS X), `/etc/bashrc` is apparently not sourced at +all. In that case, you can put the `bash_completion` file in `/sw/etc` +and add the following code to `~/.bash_profile`: + +```shell +if [ -f /sw/etc/bash_completion ]; then + . /sw/etc/bash_completion +fi +``` + +## Troubleshooting + +If you find that a given function is producing errors or does not work +as it should under certain circumstances when you attempt completion, +try running `set -v` or `set -x` prior to attempting the completion +again. This will produce useful debugging output that will aid us in +fixing the problem if you are unable to do so yourself. Turn off the +trace output by running either `set +v` or `set +x`. + +To debug dynamic loading of a completion, tracing needs to be turned +on before the debugged completion is attempted the first time. The +easiest way to do this is to start a new shell session, and to turn +tracing on in it before doing anything else there. + +## Known problems + +1. There seems to be some issue with using the bash built-in `cd` within + Makefiles. When invoked as `/bin/sh` within `Makefile`s, bash seems + to have a problem changing directory via the `cd` command. A + work-around for this is to define `SHELL=/bin/bash` within your + `Makefile`. This is believed to be a bug in bash. + +2. Many of the completion functions assume GNU versions of the various + text utilities that they call (e.g. `grep`, `sed`, and `awk`). Your + mileage may vary. + +## FAQ + +**Q. The bash completion code inhibits some commands from completing on + files with extensions that are legitimate in my environment. Do I + have to disable completion for that command in order to complete on + the files that I need to?** + +A. No. Use `M-/` to (in the words of the bash man page) attempt file + name completion on the text to the left of the cursor. This will + circumvent any file type restrictions put in place by the bash + completion code. + +**Q. How can I override a completion shipped by bash-completion?** + +A. Install a local completion of your own appropriately for the desired + command, and it will take precedence over the one shipped by us. See the + next answer for details where to install it, if you are doing it on per + user basis. If you want to do it system wide, you can install eagerly + loaded files in `compatdir` (see a couple of questions further down for + more info) and install a completion for the commands to override our + completion for in them. + + If you want to use bash's default completion instead of one of ours, + something like this should work (where `$cmd` is the command to override + completion for): `complete -o default -o bashdefault $cmd` + +**Q. Where should I install my own local completions?** + +A. Put them in the `completions` subdir of `$BASH_COMPLETION_USER_DIR` + (defaults to `$XDG_DATA_HOME/bash-completion` or + `~/.local/share/bash-completion` + if `$XDG_DATA_HOME` is not set) to have them loaded automatically + on demand when the respective command is being completed. + See also the next question's answer for considerations for these + files' names, they apply here as well. Alternatively, you can write + them directly in `~/.bash_completion` which is loaded eagerly by + our main script. + +**Q. I author/maintain package X and would like to maintain my own + completion code for this package. Where should I put it to be sure + that interactive bash shells will find it and source it?** + +A. Install it in one of the directories pointed to by + bash-completion's `pkgconfig` file variables. There are two + alternatives: + + - The recommended directory is `completionsdir`, which you can get with + `pkg-config --variable=completionsdir bash-completion`. From this + directory, completions are automatically loaded on demand based on invoked + commands' names, so be sure to name your completion file accordingly, and + to include (for example) symbolic links in case the file provides + completions for more than one command. + - The other directory (which only present for backwards compatibility) + is `compatdir` (get it with + `pkg-config --variable=compatdir bash-completion`) from which files + are loaded when `bash_completion` is loaded. + + For packages using GNU autotools the installation can be handled + for example like this in `configure.ac`: + + ```m4 + PKG_CHECK_VAR(bashcompdir, [bash-completion], [completionsdir], , + bashcompdir="${sysconfdir}/bash_completion.d") + AC_SUBST(bashcompdir) + ``` + + ...accompanied by this in `Makefile.am`: + + ```makefile + bashcompdir = @bashcompdir@ + dist_bashcomp_DATA = # completion files go here + ``` + + For cmake we ship the `bash-completion-config.cmake` and + `bash-completion-config-version.cmake` files. Example usage: + + ```cmake + find_package(bash-completion) + if(BASH_COMPLETION_FOUND) + message(STATUS + "Using bash completion dir ${BASH_COMPLETION_COMPLETIONSDIR}") + else() + set (BASH_COMPLETION_COMPLETIONSDIR "/etc/bash_completion.d") + message (STATUS + "Using fallback bash completion dir ${BASH_COMPLETION_COMPLETIONSDIR}") + endif() + + install(FILES your-completion-file DESTINATION + ${BASH_COMPLETION_COMPLETIONSDIR}) + ``` + +**Q. I use CVS in combination with passwordless SSH access to my remote + repository. How can I have the `cvs` command complete on remotely + checked-out files where relevant?** + +A. Define `$COMP_CVS_REMOTE`. Setting this to anything will result in + the behaviour you would like. + +**Q. When I'm running a `./configure` script and completion returns a list + of long options to me, some of these take a parameter, + e.g. `--this-option=DESCRIPTION`.** + + **Running `./configure --help` lists these descriptions, but + everything after the `=` is stripped when returning completions, so + I don't know what kind of data is expected as a given option's + parameter.** + + **Is there a way of getting `./configure` completion to return the + entire option string, so that I can see what kind of data is + required and then simply delete the descriptive text and add my own + data?** + +A. Define `$COMP_CONFIGURE_HINTS`. Setting this to anything will + result in the behaviour you would like. + +**Q. When doing tar completion on a file within a tar file like this:** + + ```shell + tar tzvf foo.tar.gz + ``` + + **the pathnames contained in the tar file are not displayed + correctly. The slashes are removed, and everything looks like it's + in a single directory. Why is this?** + +A. It's a choice we had to make. 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. + + If you would rather have correct path completion for tar file + contents, define `$COMP_TAR_INTERNAL_PATHS` *before* sourcing + `bash_completion`. + +**Q. When completing on a symlink to a directory, bash does not append + the trailing `/` and I have to hit <Tab> again. + I don't like this.** + +A. This has nothing to do with `bash_completion`. It's the default for + completing symlinks to directories since bash 2.05a, and was added + because sometimes you want to operate on the symlink itself, rather + than what it points to. + + You can get the pre-2.05a behaviour back by putting `set + mark-symlinked-directories on` in your `/etc/inputrc` or + `~/.inputrc` file. + +**Q. Completion goes awry when I try to complete on something that contains + a colon.** + +A. This is actually a 'feature' of bash. bash recognises a colon as + starting a new completion token, which is often what you want when + completing something like a `PATH` variable: + + ```shell + export PATH=/bin:/sbin:/usr + ``` + + Without the special treatment of the colon, the above wouldn't work + without programmable completion, so it has long been a feature of + the shell. + + Unfortunately, you don't want the colon to be treated as a special + case when doing something like: + + ```shell + man File::B + ``` + + Here, the colons make bash think that it's completing a new token + that begins with 'B'. + + Unfortunately, there's no way to turn this off. The only thing you + can do is escape the colons with a backslash. + +**Q. Why is `rpm` completion so slow with `-q`?** + +A. Probably because the database is being queried every time and this uses a + lot of memory. + + You can make this faster by pregenerating the list of installed + packages on the system. Make sure you have a readable file called + `/var/log/rpmpkgs`. It's generated by `/etc/cron.daily/rpm` on + some Red Hat and Mandrake and derivative Linux systems. + + If you don't have such a cron job, make one: + + ```shell + #!/bin/sh + + rpm -qa --qf '%{name}-%{version}-%{release}.%{arch}.rpm\n' 2>&1 \ + | sort >/var/log/rpmpkgs + ``` + + rpm completion will use this flat text file instead of the RPM database, + unless it detects that the database has changed since the file was created, + in which case it will still use the database to ensure accuracy. + +**Q. bash-completion interferes with my `command_not_found_handler` function!** + +A. If your `command_not_found_handler` function is not intended to + address (possibly missing) commands invoked during bash + programmable completion functions, you can account for this + by, for example, testing if the `$COMP_`\* variables are set and + taking appropriate bypass or other action. + +**Q. Can tab completion be made even easier?** + +A. The `readline(3)` library offers a few settings that can make tab + completion easier (or at least different) to use. + + For example, try putting the following in either `/etc/inputrc` or + `~/.inputrc`: + + ```inputrc + set show-all-if-ambiguous on + ``` + + This will allow single tab completion as opposed to requiring a + double tab. This makes things much more pleasant, in our opinion. + + ```inputrc + set visible-stats on + ``` + + This will suffix each returned file completion with a character + denoting its type, in a similar way to `ls(1)` with `-F` or `--classify`. + + ```inputrc + set page-completions off + ``` + + This turns off the use of the internal pager when returning long + completion lists. + +**Q. Is bash the be-all-and-end-all of completion as far as shells go?** + +A. Absolutely not. zsh has an extremely sophisticated completion system + that offers many features absent from the bash implementation. Its + users often cannot resist pointing this out. More information can + be found at . diff --git a/bash-completion-config-version.cmake.in b/bash-completion-config-version.cmake.in new file mode 100644 index 0000000..265e075 --- /dev/null +++ b/bash-completion-config-version.cmake.in @@ -0,0 +1,7 @@ +set (PACKAGE_VERSION "@VERSION@") +if (NOT ${PACKAGE_FIND_VERSION} VERSION_GREATER ${PACKAGE_VERSION}) + set (PACKAGE_VERSION_COMPATIBLE 1) + if (${PACKAGE_FIND_VERSION} VERSION_EQUAL ${PACKAGE_VERSION}) + set (PACKAGE_VERSION_EXACT 1) + endif () +endif () diff --git a/bash-completion-config.cmake.in b/bash-completion-config.cmake.in new file mode 100644 index 0000000..2b7de6c --- /dev/null +++ b/bash-completion-config.cmake.in @@ -0,0 +1,12 @@ +# config file for bash-completion +# https://github.com/scop/bash-completion + +set (BASH_COMPLETION_VERSION "@VERSION@") + +set (BASH_COMPLETION_PREFIX "@prefix@") + +set (BASH_COMPLETION_COMPATDIR "@sysconfdir@/bash_completion.d") +set (BASH_COMPLETION_COMPLETIONSDIR "@datadir@/@PACKAGE@/completions") +set (BASH_COMPLETION_HELPERSDIR "@datadir@/@PACKAGE@/helpers") + +set (BASH_COMPLETION_FOUND "TRUE") diff --git a/bash-completion.pc.in b/bash-completion.pc.in new file mode 100644 index 0000000..f0a3572 --- /dev/null +++ b/bash-completion.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +datadir=@datadir@ +sysconfdir=@sysconfdir@ + +compatdir=${sysconfdir}/bash_completion.d +completionsdir=${datadir}/@PACKAGE@/completions +helpersdir=${datadir}/@PACKAGE@/helpers + +Name: @PACKAGE@ +Description: programmable completion for the bash shell +URL: https://github.com/scop/bash-completion +Version: @VERSION@ diff --git a/bash_completion b/bash_completion new file mode 100644 index 0000000..1a7f563 --- /dev/null +++ b/bash_completion @@ -0,0 +1,2266 @@ +# -*- shell-script -*- +# +# bash_completion - programmable completion functions for bash 4.2+ +# +# Copyright © 2006-2008, Ian Macdonald +# © 2009-2020, Bash Completion Maintainers +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# The latest version of this software can be obtained here: +# +# https://github.com/scop/bash-completion + +BASH_COMPLETION_VERSINFO=(2 11) + +if [[ $- == *v* ]]; then + BASH_COMPLETION_ORIGINAL_V_VALUE="-v" +else + BASH_COMPLETION_ORIGINAL_V_VALUE="+v" +fi + +if [[ ${BASH_COMPLETION_DEBUG-} ]]; then + set -v +else + set +v +fi + +# Blacklisted completions, causing problems with our code. +# +_blacklist_glob='@(acroread.sh)' + +# Turn on extended globbing and programmable completion +shopt -s extglob progcomp + +# A lot of the following one-liners were taken directly from the +# completion examples provided with the bash 2.04 source distribution + +# start of section containing compspecs that can be handled within bash + +# user commands see only users +complete -u groups slay w sux + +# bg completes with stopped jobs +complete -A stopped -P '"%' -S '"' bg + +# other job commands +complete -j -P '"%' -S '"' fg jobs disown + +# readonly and unset complete with shell variables +complete -v readonly unset + +# set completes with set options +complete -A setopt set + +# shopt completes with shopt options +complete -A shopt shopt + +# helptopics +complete -A helptopic help + +# unalias completes with aliases +complete -a unalias + +# type and which complete on commands +complete -c command type which + +# builtin completes on builtins +complete -b builtin + +# start of section containing completion functions called by other functions + +# Check if we're running on the given userland +# @param $1 userland to check for +_userland() +{ + local userland=$(uname -s) + [[ $userland == @(Linux|GNU/*) ]] && userland=GNU + [[ $userland == "$1" ]] +} + +# This function sets correct SysV init directories +# +_sysvdirs() +{ + sysvdirs=() + [[ -d /etc/rc.d/init.d ]] && sysvdirs+=(/etc/rc.d/init.d) + [[ -d /etc/init.d ]] && sysvdirs+=(/etc/init.d) + # Slackware uses /etc/rc.d + [[ -f /etc/slackware-version ]] && sysvdirs=(/etc/rc.d) + return 0 +} + +# This function checks whether we have a given program on the system. +# +_have() +{ + # Completions for system administrator commands are installed as well in + # case completion is attempted via `sudo command ...'. + PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin type $1 &>/dev/null +} + +# Backwards compatibility for compat completions that use have(). +# @deprecated should no longer be used; generally not needed with dynamically +# loaded completions, and _have is suitable for runtime use. +have() +{ + unset -v have + _have $1 && have=yes +} + +# This function checks whether a given readline variable +# is `on'. +# +_rl_enabled() +{ + [[ "$(bind -v)" == *$1+([[:space:]])on* ]] +} + +# This function shell-quotes the argument +quote() +{ + local quoted=${1//\'/\'\\\'\'} + printf "'%s'" "$quoted" +} + +# @see _quote_readline_by_ref() +quote_readline() +{ + local ret + _quote_readline_by_ref "$1" ret + printf %s "$ret" +} # quote_readline() + +# This function shell-dequotes the argument +dequote() +{ + eval printf %s "$1" 2>/dev/null +} + +# Assign variable one scope above the caller +# Usage: local "$1" && _upvar $1 "value(s)" +# Param: $1 Variable name to assign value to +# Param: $* Value(s) to assign. If multiple values, an array is +# assigned, otherwise a single value is assigned. +# NOTE: For assigning multiple variables, use '_upvars'. Do NOT +# use multiple '_upvar' calls, since one '_upvar' call might +# reassign a variable to be used by another '_upvar' call. +# See: https://fvue.nl/wiki/Bash:_Passing_variables_by_reference +_upvar() +{ + echo "bash_completion: $FUNCNAME: deprecated function," \ + "use _upvars instead" >&2 + if unset -v "$1"; then # Unset & validate varname + if (($# == 2)); then + eval $1=\"\$2\" # Return single value + else + eval $1=\(\"\$"{@:2}"\"\) # Return array + fi + fi +} + +# Assign variables one scope above the caller +# Usage: local varname [varname ...] && +# _upvars [-v varname value] | [-aN varname [value ...]] ... +# Available OPTIONS: +# -aN Assign next N values to varname as array +# -v Assign single value to varname +# Return: 1 if error occurs +# See: https://fvue.nl/wiki/Bash:_Passing_variables_by_reference +_upvars() +{ + if ! (($#)); then + echo "bash_completion: $FUNCNAME: usage: $FUNCNAME" \ + "[-v varname value] | [-aN varname [value ...]] ..." >&2 + return 2 + fi + while (($#)); do + case $1 in + -a*) + # Error checking + [[ ${1#-a} ]] || { + echo "bash_completion: $FUNCNAME:" \ + "\`$1': missing number specifier" >&2 + return 1 + } + printf %d "${1#-a}" &>/dev/null || { + echo bash_completion: \ + "$FUNCNAME: \`$1': invalid number specifier" >&2 + return 1 + } + # Assign array of -aN elements + [[ "$2" ]] && unset -v "$2" && eval $2=\(\"\$"{@:3:${1#-a}}"\"\) && + shift $((${1#-a} + 2)) || { + echo bash_completion: \ + "$FUNCNAME: \`$1${2+ }$2': missing argument(s)" \ + >&2 + return 1 + } + ;; + -v) + # Assign single value + [[ "$2" ]] && unset -v "$2" && eval $2=\"\$3\" && + shift 3 || { + echo "bash_completion: $FUNCNAME: $1:" \ + "missing argument(s)" >&2 + return 1 + } + ;; + *) + echo "bash_completion: $FUNCNAME: $1: invalid option" >&2 + return 1 + ;; + esac + done +} + +# Reassemble command line words, excluding specified characters from the +# list of word completion separators (COMP_WORDBREAKS). +# @param $1 chars Characters out of $COMP_WORDBREAKS which should +# NOT be considered word breaks. This is useful for things like scp where +# we want to return host:path and not only path, so we would pass the +# colon (:) as $1 here. +# @param $2 words Name of variable to return words to +# @param $3 cword Name of variable to return cword to +# +__reassemble_comp_words_by_ref() +{ + local exclude i j line ref + # Exclude word separator characters? + if [[ $1 ]]; then + # Yes, exclude word separator characters; + # Exclude only those characters, which were really included + exclude="[${1//[^$COMP_WORDBREAKS]/}]" + fi + + # Default to cword unchanged + printf -v "$3" %s "$COMP_CWORD" + # Are characters excluded which were former included? + if [[ -v exclude ]]; then + # Yes, list of word completion separators has shrunk; + line=$COMP_LINE + # Re-assemble words to complete + for ((i = 0, j = 0; i < ${#COMP_WORDS[@]}; i++, j++)); do + # Is current word not word 0 (the command itself) and is word not + # empty and is word made up of just word separator characters to + # be excluded and is current word not preceded by whitespace in + # original line? + while [[ $i -gt 0 && ${COMP_WORDS[i]} == +($exclude) ]]; do + # Is word separator not preceded by whitespace in original line + # and are we not going to append to word 0 (the command + # itself), then append to current word. + [[ $line != [[:blank:]]* ]] && ((j >= 2)) && ((j--)) + # Append word separator to current or new word + ref="$2[$j]" + printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}" + # Indicate new cword + ((i == COMP_CWORD)) && printf -v "$3" %s "$j" + # Remove optional whitespace + word separator from line copy + line=${line#*"${COMP_WORDS[i]}"} + # Start new word if word separator in original line is + # followed by whitespace. + [[ $line == [[:blank:]]* ]] && ((j++)) + # Indicate next word if available, else end *both* while and + # for loop + ((i < ${#COMP_WORDS[@]} - 1)) && ((i++)) || break 2 + done + # Append word to current word + ref="$2[$j]" + printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}" + # Remove optional whitespace + word from line copy + line=${line#*"${COMP_WORDS[i]}"} + # Indicate new cword + ((i == COMP_CWORD)) && printf -v "$3" %s "$j" + done + ((i == COMP_CWORD)) && printf -v "$3" %s "$j" + else + # No, list of word completions separators hasn't changed; + for i in "${!COMP_WORDS[@]}"; do + printf -v "$2[i]" %s "${COMP_WORDS[i]}" + done + fi +} # __reassemble_comp_words_by_ref() + +# @param $1 exclude Characters out of $COMP_WORDBREAKS which should NOT be +# considered word breaks. This is useful for things like scp where +# we want to return host:path and not only path, so we would pass the +# colon (:) as $1 in this case. +# @param $2 words Name of variable to return words to +# @param $3 cword Name of variable to return cword to +# @param $4 cur Name of variable to return current word to complete to +# @see __reassemble_comp_words_by_ref() +__get_cword_at_cursor_by_ref() +{ + local cword words=() + __reassemble_comp_words_by_ref "$1" words cword + + local i cur="" index=$COMP_POINT lead=${COMP_LINE:0:COMP_POINT} + # Cursor not at position 0 and not leaded by just space(s)? + if [[ $index -gt 0 && ($lead && ${lead//[[:space:]]/}) ]]; then + cur=$COMP_LINE + for ((i = 0; i <= cword; ++i)); do + # Current word fits in $cur, and $cur doesn't match cword? + while [[ ${#cur} -ge ${#words[i]} && \ + ${cur:0:${#words[i]}} != "${words[i]-}" ]]; do + # Strip first character + cur="${cur:1}" + # Decrease cursor position, staying >= 0 + ((index > 0)) && ((index--)) + done + + # Does found word match cword? + if ((i < cword)); then + # No, cword lies further; + local old_size=${#cur} + cur="${cur#"${words[i]}"}" + local new_size=${#cur} + ((index -= old_size - new_size)) + fi + done + # Clear $cur if just space(s) + [[ $cur && ! ${cur//[[:space:]]/} ]] && cur= + # Zero $index if negative + ((index < 0)) && index=0 + fi + + local "$2" "$3" "$4" && _upvars -a${#words[@]} $2 ${words+"${words[@]}"} \ + -v $3 "$cword" -v $4 "${cur:0:index}" +} + +# Get the word to complete and optional previous words. +# This is nicer than ${COMP_WORDS[COMP_CWORD]}, since it handles cases +# where the user is completing in the middle of a word. +# (For example, if the line is "ls foobar", +# and the cursor is here --------> ^ +# Also one is able to cross over possible wordbreak characters. +# Usage: _get_comp_words_by_ref [OPTIONS] [VARNAMES] +# Available VARNAMES: +# cur Return cur via $cur +# prev Return prev via $prev +# words Return words via $words +# cword Return cword via $cword +# +# Available OPTIONS: +# -n EXCLUDE Characters out of $COMP_WORDBREAKS which should NOT be +# considered word breaks. This is useful for things like scp +# where we want to return host:path and not only path, so we +# would pass the colon (:) as -n option in this case. +# -c VARNAME Return cur via $VARNAME +# -p VARNAME Return prev via $VARNAME +# -w VARNAME Return words via $VARNAME +# -i VARNAME Return cword via $VARNAME +# +# Example usage: +# +# $ _get_comp_words_by_ref -n : cur prev +# +_get_comp_words_by_ref() +{ + local exclude flag i OPTIND=1 + local cur cword words=() + local upargs=() upvars=() vcur vcword vprev vwords + + while getopts "c:i:n:p:w:" flag "$@"; do + case $flag in + c) vcur=$OPTARG ;; + i) vcword=$OPTARG ;; + n) exclude=$OPTARG ;; + p) vprev=$OPTARG ;; + w) vwords=$OPTARG ;; + *) + echo "bash_completion: $FUNCNAME: usage error" >&2 + return 1 + ;; + esac + done + while [[ $# -ge $OPTIND ]]; do + case ${!OPTIND} in + cur) vcur=cur ;; + prev) vprev=prev ;; + cword) vcword=cword ;; + words) vwords=words ;; + *) + echo "bash_completion: $FUNCNAME: \`${!OPTIND}':" \ + "unknown argument" >&2 + return 1 + ;; + esac + ((OPTIND += 1)) + done + + __get_cword_at_cursor_by_ref "${exclude-}" words cword cur + + [[ -v vcur ]] && { + upvars+=("$vcur") + upargs+=(-v $vcur "$cur") + } + [[ -v vcword ]] && { + upvars+=("$vcword") + upargs+=(-v $vcword "$cword") + } + [[ -v vprev && $cword -ge 1 ]] && { + upvars+=("$vprev") + upargs+=(-v $vprev "${words[cword - 1]}") + } + [[ -v vwords ]] && { + upvars+=("$vwords") + upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"}) + } + + ((${#upvars[@]})) && local "${upvars[@]}" && _upvars "${upargs[@]}" +} + +# Get the word to complete. +# This is nicer than ${COMP_WORDS[COMP_CWORD]}, since it handles cases +# where the user is completing in the middle of a word. +# (For example, if the line is "ls foobar", +# and the cursor is here --------> ^ +# @param $1 string Characters out of $COMP_WORDBREAKS which should NOT be +# considered word breaks. This is useful for things like scp where +# we want to return host:path and not only path, so we would pass the +# colon (:) as $1 in this case. +# @param $2 integer Index number of word to return, negatively offset to the +# current word (default is 0, previous is 1), respecting the exclusions +# given at $1. For example, `_get_cword "=:" 1' returns the word left of +# the current word, respecting the exclusions "=:". +# @deprecated Use `_get_comp_words_by_ref cur' instead +# @see _get_comp_words_by_ref() +_get_cword() +{ + local LC_CTYPE=C + local cword words + __reassemble_comp_words_by_ref "${1-}" words cword + + # return previous word offset by $2 + if [[ ${2-} && ${2//[^0-9]/} ]]; then + printf "%s" "${words[cword - $2]}" + elif ((${#words[cword]} == 0 && COMP_POINT == ${#COMP_LINE})); then + : # nothing + else + local i + local cur="$COMP_LINE" + local index="$COMP_POINT" + for ((i = 0; i <= cword; ++i)); do + # Current word fits in $cur, and $cur doesn't match cword? + while [[ ${#cur} -ge ${#words[i]} && \ + ${cur:0:${#words[i]}} != "${words[i]}" ]]; do + # Strip first character + cur="${cur:1}" + # Decrease cursor position, staying >= 0 + ((index > 0)) && ((index--)) + done + + # Does found word match cword? + if ((i < cword)); then + # No, cword lies further; + local old_size="${#cur}" + cur="${cur#${words[i]}}" + local new_size="${#cur}" + ((index -= old_size - new_size)) + fi + done + + if [[ ${words[cword]:0:${#cur}} != "$cur" ]]; then + # We messed up! At least return the whole word so things + # keep working + printf "%s" "${words[cword]}" + else + printf "%s" "${cur:0:index}" + fi + fi +} # _get_cword() + +# Get word previous to the current word. +# This is a good alternative to `prev=${COMP_WORDS[COMP_CWORD-1]}' because bash4 +# will properly return the previous word with respect to any given exclusions to +# COMP_WORDBREAKS. +# @deprecated Use `_get_comp_words_by_ref cur prev' instead +# @see _get_comp_words_by_ref() +# +_get_pword() +{ + if ((COMP_CWORD >= 1)); then + _get_cword "${@:-}" 1 + fi +} + +# If the word-to-complete contains a colon (:), left-trim COMPREPLY items with +# word-to-complete. +# With a colon in COMP_WORDBREAKS, words containing +# colons are always completed as entire words if the word to complete contains +# a colon. This function fixes this, by removing the colon-containing-prefix +# from COMPREPLY items. +# The preferred solution is to remove the colon (:) from COMP_WORDBREAKS in +# your .bashrc: +# +# # Remove colon (:) from list of word completion separators +# COMP_WORDBREAKS=${COMP_WORDBREAKS//:} +# +# See also: Bash FAQ - E13) Why does filename completion misbehave if a colon +# appears in the filename? - https://tiswww.case.edu/php/chet/bash/FAQ +# @param $1 current word to complete (cur) +# @modifies global array $COMPREPLY +# +__ltrim_colon_completions() +{ + if [[ $1 == *:* && $COMP_WORDBREAKS == *:* ]]; then + # Remove colon-word prefix from COMPREPLY items + local colon_word=${1%"${1##*:}"} + local i=${#COMPREPLY[*]} + while ((i-- > 0)); do + COMPREPLY[i]=${COMPREPLY[i]#"$colon_word"} + done + fi +} # __ltrim_colon_completions() + +# This function quotes the argument in a way so that readline dequoting +# results in the original argument. This is necessary for at least +# `compgen' which requires its arguments quoted/escaped: +# +# $ ls "a'b/" +# c +# $ compgen -f "a'b/" # Wrong, doesn't return output +# $ compgen -f "a\'b/" # Good +# a\'b/c +# +# See also: +# - https://lists.gnu.org/archive/html/bug-bash/2009-03/msg00155.html +# - https://www.mail-archive.com/bash-completion-devel@lists.alioth.debian.org/msg01944.html +# @param $1 Argument to quote +# @param $2 Name of variable to return result to +_quote_readline_by_ref() +{ + if [[ $1 == \'* ]]; then + # Leave out first character + printf -v $2 %s "${1:1}" + else + printf -v $2 %q "$1" + fi + + # If result becomes quoted like this: $'string', re-evaluate in order to + # drop the additional quoting. See also: + # https://www.mail-archive.com/bash-completion-devel@lists.alioth.debian.org/msg01942.html + [[ ${!2} == \$* ]] && eval $2=${!2} +} # _quote_readline_by_ref() + +# This function performs file and directory completion. It's better than +# simply using 'compgen -f', because it honours spaces in filenames. +# @param $1 If `-d', complete only on directories. Otherwise filter/pick only +# completions with `.$1' and the uppercase version of it as file +# extension. +# +_filedir() +{ + local IFS=$'\n' + + _tilde "${cur-}" || return + + local -a toks + local reset arg=${1-} + + if [[ $arg == -d ]]; then + reset=$(shopt -po noglob) + set -o noglob + toks=($(compgen -d -- "${cur-}")) + IFS=' ' + $reset + IFS=$'\n' + else + local quoted + _quote_readline_by_ref "${cur-}" quoted + + # Munge xspec to contain uppercase version too + # https://lists.gnu.org/archive/html/bug-bash/2010-09/msg00036.html + # news://news.gmane.io/4C940E1C.1010304@case.edu + local xspec=${arg:+"!*.@($arg|${arg^^})"} plusdirs=() + + # Use plusdirs to get dir completions if we have a xspec; if we don't, + # there's no need, dirs come along with other completions. Don't use + # plusdirs quite yet if fallback is in use though, in order to not ruin + # the fallback condition with the "plus" dirs. + local opts=(-f -X "$xspec") + [[ $xspec ]] && plusdirs=(-o plusdirs) + [[ ${COMP_FILEDIR_FALLBACK-} || -z ${plusdirs-} ]] || + opts+=("${plusdirs[@]}") + + reset=$(shopt -po noglob) + set -o noglob + toks+=($(compgen "${opts[@]}" -- $quoted)) + IFS=' ' + $reset + IFS=$'\n' + + # Try without filter if it failed to produce anything and configured to + [[ -n ${COMP_FILEDIR_FALLBACK-} && -n $arg && ${#toks[@]} -lt 1 ]] && { + reset=$(shopt -po noglob) + set -o noglob + toks+=($(compgen -f ${plusdirs+"${plusdirs[@]}"} -- $quoted)) + IFS=' ' + $reset + IFS=$'\n' + } + fi + + if ((${#toks[@]} != 0)); then + # 2>/dev/null for direct invocation, e.g. in the _filedir unit test + compopt -o filenames 2>/dev/null + COMPREPLY+=("${toks[@]}") + fi +} # _filedir() + +# This function splits $cur=--foo=bar into $prev=--foo, $cur=bar, making it +# easier to support both "--foo bar" and "--foo=bar" style completions. +# `=' should have been removed from COMP_WORDBREAKS when setting $cur for +# this to be useful. +# Returns 0 if current option was split, 1 otherwise. +# +_split_longopt() +{ + if [[ $cur == --?*=* ]]; then + # Cut also backslash before '=' in case it ended up there + # for some reason. + prev="${cur%%?(\\)=*}" + cur="${cur#*=}" + return 0 + fi + + return 1 +} + +# Complete variables. +# @return True (0) if variables were completed, +# False (> 0) if not. +_variables() +{ + if [[ $cur =~ ^(\$(\{[!#]?)?)([A-Za-z0-9_]*)$ ]]; then + # Completing $var / ${var / ${!var / ${#var + if [[ $cur == '${'* ]]; then + local arrs vars + vars=($(compgen -A variable -P ${BASH_REMATCH[1]} -S '}' -- ${BASH_REMATCH[3]})) + arrs=($(compgen -A arrayvar -P ${BASH_REMATCH[1]} -S '[' -- ${BASH_REMATCH[3]})) + if ((${#vars[@]} == 1 && ${#arrs[@]} != 0)); then + # Complete ${arr with ${array[ if there is only one match, and that match is an array variable + compopt -o nospace + COMPREPLY+=(${arrs[*]}) + else + # Complete ${var with ${variable} + COMPREPLY+=(${vars[*]}) + fi + else + # Complete $var with $variable + COMPREPLY+=($(compgen -A variable -P '$' -- "${BASH_REMATCH[3]}")) + fi + return 0 + elif [[ $cur =~ ^(\$\{[#!]?)([A-Za-z0-9_]*)\[([^]]*)$ ]]; then + # Complete ${array[i with ${array[idx]} + local IFS=$'\n' + COMPREPLY+=($(compgen -W '$(printf %s\\n "${!'${BASH_REMATCH[2]}'[@]}")' \ + -P "${BASH_REMATCH[1]}${BASH_REMATCH[2]}[" -S ']}' -- "${BASH_REMATCH[3]}")) + # Complete ${arr[@ and ${arr[* + if [[ ${BASH_REMATCH[3]} == [@*] ]]; then + COMPREPLY+=("${BASH_REMATCH[1]}${BASH_REMATCH[2]}[${BASH_REMATCH[3]}]}") + fi + __ltrim_colon_completions "$cur" # array indexes may have colons + return 0 + elif [[ $cur =~ ^\$\{[#!]?[A-Za-z0-9_]*\[.*\]$ ]]; then + # Complete ${array[idx] with ${array[idx]} + COMPREPLY+=("$cur}") + __ltrim_colon_completions "$cur" + return 0 + else + case ${prev-} in + TZ) + cur=/usr/share/zoneinfo/$cur + _filedir + for i in "${!COMPREPLY[@]}"; do + if [[ ${COMPREPLY[i]} == *.tab ]]; then + unset 'COMPREPLY[i]' + continue + elif [[ -d ${COMPREPLY[i]} ]]; then + COMPREPLY[i]+=/ + compopt -o nospace + fi + COMPREPLY[i]=${COMPREPLY[i]#/usr/share/zoneinfo/} + done + return 0 + ;; + TERM) + _terms + return 0 + ;; + LANG | LC_*) + COMPREPLY=($(compgen -W '$(locale -a 2>/dev/null)' \ + -- "$cur")) + return 0 + ;; + esac + fi + return 1 +} + +# Initialize completion and deal with various general things: do file +# and variable completion where appropriate, and adjust prev, words, +# and cword as if no redirections exist so that completions do not +# need to deal with them. Before calling this function, make sure +# cur, prev, words, and cword are local, ditto split if you use -s. +# +# Options: +# -n EXCLUDE Passed to _get_comp_words_by_ref -n with redirection chars +# -e XSPEC Passed to _filedir as first arg for stderr redirections +# -o XSPEC Passed to _filedir as first arg for other output redirections +# -i XSPEC Passed to _filedir as first arg for stdin redirections +# -s Split long options with _split_longopt, implies -n = +# @return True (0) if completion needs further processing, +# False (> 0) no further processing is necessary. +# +_init_completion() +{ + local exclude="" flag outx errx inx OPTIND=1 + + while getopts "n:e:o:i:s" flag "$@"; do + case $flag in + n) exclude+=$OPTARG ;; + e) errx=$OPTARG ;; + o) outx=$OPTARG ;; + i) inx=$OPTARG ;; + s) + split=false + exclude+== + ;; + *) + echo "bash_completion: $FUNCNAME: usage error" >&2 + return 1 + ;; + esac + done + + COMPREPLY=() + local redir="@(?([0-9])<|?([0-9&])>?(>)|>&)" + _get_comp_words_by_ref -n "$exclude<>&" cur prev words cword + + # Complete variable names. + _variables && return 1 + + # Complete on files if current is a redirect possibly followed by a + # filename, e.g. ">foo", or previous is a "bare" redirect, e.g. ">". + # shellcheck disable=SC2053 + if [[ $cur == $redir* || ${prev-} == $redir ]]; then + local xspec + case $cur in + 2'>'*) xspec=${errx-} ;; + *'>'*) xspec=${outx-} ;; + *'<'*) xspec=${inx-} ;; + *) + case $prev in + 2'>'*) xspec=${errx-} ;; + *'>'*) xspec=${outx-} ;; + *'<'*) xspec=${inx-} ;; + esac + ;; + esac + cur="${cur##$redir}" + _filedir $xspec + return 1 + fi + + # Remove all redirections so completions don't have to deal with them. + local i skip + for ((i = 1; i < ${#words[@]}; )); do + if [[ ${words[i]} == $redir* ]]; then + # If "bare" redirect, remove also the next word (skip=2). + # shellcheck disable=SC2053 + [[ ${words[i]} == $redir ]] && skip=2 || skip=1 + words=("${words[@]:0:i}" "${words[@]:i+skip}") + ((i <= cword)) && ((cword -= skip)) + else + ((i++)) + fi + done + + ((cword <= 0)) && return 1 + prev=${words[cword - 1]} + + [[ ${split-} ]] && _split_longopt && split=true + + return 0 +} + +# Helper function for _parse_help and _parse_usage. +__parse_options() +{ + local option option2 i IFS=$' \t\n,/|' + + # Take first found long option, or first one (short) if not found. + option= + local -a array=($1) + for i in "${array[@]}"; do + case "$i" in + ---*) break ;; + --?*) + option=$i + break + ;; + -?*) [[ $option ]] || option=$i ;; + *) break ;; + esac + done + [[ $option ]] || return 0 + + IFS=$' \t\n' # affects parsing of the regexps below... + + # Expand --[no]foo to --foo and --nofoo etc + if [[ $option =~ (\[((no|dont)-?)\]). ]]; then + option2=${option/"${BASH_REMATCH[1]}"/} + option2=${option2%%[<{().[]*} + printf '%s\n' "${option2/=*/=}" + option=${option/"${BASH_REMATCH[1]}"/"${BASH_REMATCH[2]}"} + fi + + option=${option%%[<{().[]*} + printf '%s\n' "${option/=*/=}" +} + +# Parse GNU style help output of the given command. +# @param $1 command; if "-", read from stdin and ignore rest of args +# @param $2 command options (default: --help) +# +_parse_help() +{ + eval local cmd="$(quote "$1")" + local line + { + case $cmd in + -) cat ;; + *) LC_ALL=C "$(dequote "$cmd")" ${2:---help} 2>&1 ;; + esac + } | + while read -r line; do + + [[ $line == *([[:blank:]])-* ]] || continue + # transform "-f FOO, --foo=FOO" to "-f , --foo=FOO" etc + while [[ $line =~ \ + ((^|[^-])-[A-Za-z0-9?][[:space:]]+)\[?[A-Z0-9]+([,_-]+[A-Z0-9]+)?(\.\.+)?\]? ]]; do + line=${line/"${BASH_REMATCH[0]}"/"${BASH_REMATCH[1]}"} + done + __parse_options "${line// or /, }" + + done +} + +# Parse BSD style usage output (options in brackets) of the given command. +# @param $1 command; if "-", read from stdin and ignore rest of args +# @param $2 command options (default: --usage) +# +_parse_usage() +{ + eval local cmd="$(quote "$1")" + local line match option i char + { + case $cmd in + -) cat ;; + *) LC_ALL=C "$(dequote "$cmd")" ${2:---usage} 2>&1 ;; + esac + } | + while read -r line; do + + while [[ $line =~ \[[[:space:]]*(-[^]]+)[[:space:]]*\] ]]; do + match=${BASH_REMATCH[0]} + option=${BASH_REMATCH[1]} + case $option in + -?(\[)+([a-zA-Z0-9?])) + # Treat as bundled short options + for ((i = 1; i < ${#option}; i++)); do + char=${option:i:1} + [[ $char != '[' ]] && printf '%s\n' -$char + done + ;; + *) + __parse_options "$option" + ;; + esac + line=${line#*"$match"} + done + + done +} + +# This function completes on signal names (minus the SIG prefix) +# @param $1 prefix +_signals() +{ + local -a sigs=($(compgen -P "${1-}" -A signal "SIG${cur#${1-}}")) + COMPREPLY+=("${sigs[@]/#${1-}SIG/${1-}}") +} + +# This function completes on known mac addresses +# +_mac_addresses() +{ + local re='\([A-Fa-f0-9]\{2\}:\)\{5\}[A-Fa-f0-9]\{2\}' + local PATH="$PATH:/sbin:/usr/sbin" + + # Local interfaces + # - ifconfig on Linux: HWaddr or ether + # - ifconfig on FreeBSD: ether + # - ip link: link/ether + COMPREPLY+=($( + { + LC_ALL=C ifconfig -a || ip link show + } 2>/dev/null | command sed -ne \ + "s/.*[[:space:]]HWaddr[[:space:]]\{1,\}\($re\)[[:space:]].*/\1/p" -ne \ + "s/.*[[:space:]]HWaddr[[:space:]]\{1,\}\($re\)[[:space:]]*$/\1/p" -ne \ + "s|.*[[:space:]]\(link/\)\{0,1\}ether[[:space:]]\{1,\}\($re\)[[:space:]].*|\2|p" -ne \ + "s|.*[[:space:]]\(link/\)\{0,1\}ether[[:space:]]\{1,\}\($re\)[[:space:]]*$|\2|p" + )) + + # ARP cache + COMPREPLY+=($({ + arp -an || ip neigh show + } 2>/dev/null | command sed -ne \ + "s/.*[[:space:]]\($re\)[[:space:]].*/\1/p" -ne \ + "s/.*[[:space:]]\($re\)[[:space:]]*$/\1/p")) + + # /etc/ethers + COMPREPLY+=($(command sed -ne \ + "s/^[[:space:]]*\($re\)[[:space:]].*/\1/p" /etc/ethers 2>/dev/null)) + + COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur")) + __ltrim_colon_completions "$cur" +} + +# This function completes on configured network interfaces +# +_configured_interfaces() +{ + if [[ -f /etc/debian_version ]]; then + # Debian system + COMPREPLY=($(compgen -W "$(command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p' \ + /etc/network/interfaces /etc/network/interfaces.d/* 2>/dev/null)" \ + -- "$cur")) + elif [[ -f /etc/SuSE-release ]]; then + # SuSE system + COMPREPLY=($(compgen -W "$(printf '%s\n' \ + /etc/sysconfig/network/ifcfg-* | + command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur")) + elif [[ -f /etc/pld-release ]]; then + # PLD Linux + COMPREPLY=($(compgen -W "$(command ls -B \ + /etc/sysconfig/interfaces | + command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur")) + else + # Assume Red Hat + COMPREPLY=($(compgen -W "$(printf '%s\n' \ + /etc/sysconfig/network-scripts/ifcfg-* | + command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur")) + fi +} + +# Local IP addresses. +# -4: IPv4 addresses only (default) +# -6: IPv6 addresses only +# -a: All addresses +# +_ip_addresses() +{ + local n + case ${1-} in + -a) n='6\?' ;; + -6) n='6' ;; + *) n= ;; + esac + local PATH=$PATH:/sbin + local addrs=$({ + LC_ALL=C ifconfig -a || ip addr show + } 2>/dev/null | + command sed -e 's/[[:space:]]addr:/ /' -ne \ + "s|.*inet${n}[[:space:]]\{1,\}\([^[:space:]/]*\).*|\1|p") + COMPREPLY+=($(compgen -W "$addrs" -- "${cur-}")) +} + +# This function completes on available kernels +# +_kernel_versions() +{ + COMPREPLY=($(compgen -W '$(command ls /lib/modules)' -- "$cur")) +} + +# This function completes on all available network interfaces +# -a: restrict to active interfaces only +# -w: restrict to wireless interfaces only +# +_available_interfaces() +{ + local PATH=$PATH:/sbin + + COMPREPLY=($({ + if [[ ${1:-} == -w ]]; then + iwconfig + elif [[ ${1:-} == -a ]]; then + ifconfig || ip link show up + else + ifconfig -a || ip link show + fi + } 2>/dev/null | awk \ + '/^[^ \t]/ { if ($1 ~ /^[0-9]+:/) { print $2 } else { print $1 } }')) + + COMPREPLY=($(compgen -W '${COMPREPLY[@]/%[[:punct:]]/}' -- "$cur")) +} + +# Echo number of CPUs, falling back to 1 on failure. +_ncpus() +{ + local var=NPROCESSORS_ONLN + [[ $OSTYPE == *linux* ]] && var=_$var + local n=$(getconf $var 2>/dev/null) + printf %s ${n:-1} +} + +# Perform tilde (~) completion +# @return True (0) if completion needs further processing, +# False (> 0) if tilde is followed by a valid username, completions +# are put in COMPREPLY and no further processing is necessary. +_tilde() +{ + local result=0 + if [[ ${1-} == \~* && $1 != */* ]]; then + # Try generate ~username completions + COMPREPLY=($(compgen -P '~' -u -- "${1#\~}")) + result=${#COMPREPLY[@]} + # 2>/dev/null for direct invocation, e.g. in the _tilde unit test + ((result > 0)) && compopt -o filenames 2>/dev/null + fi + return $result +} + +# Expand variable starting with tilde (~) +# We want to expand ~foo/... to /home/foo/... to avoid problems when +# word-to-complete starting with a tilde is fed to commands and ending up +# quoted instead of expanded. +# Only the first portion of the variable from the tilde up to the first slash +# (~../) is expanded. The remainder of the variable, containing for example +# a dollar sign variable ($) or asterisk (*) is not expanded. +# Example usage: +# +# $ v="~"; __expand_tilde_by_ref v; echo "$v" +# +# Example output: +# +# v output +# -------- ---------------- +# ~ /home/user +# ~foo/bar /home/foo/bar +# ~foo/$HOME /home/foo/$HOME +# ~foo/a b /home/foo/a b +# ~foo/* /home/foo/* +# +# @param $1 Name of variable (not the value of the variable) to expand +__expand_tilde_by_ref() +{ + if [[ ${!1-} == \~* ]]; then + eval $1="$(printf ~%q "${!1#\~}")" + fi +} # __expand_tilde_by_ref() + +# This function expands tildes in pathnames +# +_expand() +{ + # Expand ~username type directory specifications. We want to expand + # ~foo/... to /home/foo/... to avoid problems when $cur starting with + # a tilde is fed to commands and ending up quoted instead of expanded. + + case ${cur-} in + ~*/*) + __expand_tilde_by_ref cur + ;; + ~*) + _tilde "$cur" || + eval COMPREPLY[0]="$(printf ~%q "${COMPREPLY[0]#\~}")" + return ${#COMPREPLY[@]} + ;; + esac +} + +# Process ID related functions. +# for AIX and Solaris we use X/Open syntax, BSD for others. +if [[ $OSTYPE == *@(solaris|aix)* ]]; then + # This function completes on process IDs. + _pids() + { + COMPREPLY=($(compgen -W '$(command ps -efo pid | command sed 1d)' -- "$cur")) + } + + _pgids() + { + COMPREPLY=($(compgen -W '$(command ps -efo pgid | command sed 1d)' -- "$cur")) + } + _pnames() + { + COMPREPLY=($(compgen -X '' -W '$(command ps -efo comm | \ + command sed -e 1d -e "s:.*/::" -e "s/^-//" | sort -u)' -- "$cur")) + } +else + _pids() + { + COMPREPLY=($(compgen -W '$(command ps axo pid=)' -- "$cur")) + } + _pgids() + { + COMPREPLY=($(compgen -W '$(command ps axo pgid=)' -- "$cur")) + } + # @param $1 if -s, don't try to avoid truncated command names + _pnames() + { + local -a procs + if [[ ${1-} == -s ]]; then + procs=($(command ps axo comm | command sed -e 1d)) + else + local line i=-1 ifs=$IFS + IFS=$'\n' + local -a psout=($(command ps axo command=)) + IFS=$ifs + for line in "${psout[@]}"; do + if ((i == -1)); then + # First line, see if it has COMMAND column header. For example + # the busybox ps does that, i.e. doesn't respect axo command= + if [[ $line =~ ^(.*[[:space:]])COMMAND([[:space:]]|$) ]]; then + # It does; store its index. + i=${#BASH_REMATCH[1]} + else + # Nope, fall through to "regular axo command=" parsing. + break + fi + else + # + line=${line:i} # take command starting from found index + line=${line%% *} # trim arguments + procs+=($line) + fi + done + if ((i == -1)); then + # Regular axo command= parsing + for line in "${psout[@]}"; do + if [[ $line =~ ^[[(](.+)[])]$ ]]; then + procs+=(${BASH_REMATCH[1]}) + else + line=${line%% *} # trim arguments + line=${line##@(*/|-)} # trim leading path and - + procs+=($line) + fi + done + fi + fi + COMPREPLY=($(compgen -X "" -W '${procs[@]}' -- "$cur")) + } +fi + +# This function completes on user IDs +# +_uids() +{ + if type getent &>/dev/null; then + COMPREPLY=($(compgen -W '$(getent passwd | cut -d: -f3)' -- "$cur")) + elif type perl &>/dev/null; then + COMPREPLY=($(compgen -W '$(perl -e '"'"'while (($uid) = (getpwent)[2]) { print $uid . "\n" }'"'"')' -- "$cur")) + else + # make do with /etc/passwd + COMPREPLY=($(compgen -W '$(cut -d: -f3 /etc/passwd)' -- "$cur")) + fi +} + +# This function completes on group IDs +# +_gids() +{ + if type getent &>/dev/null; then + COMPREPLY=($(compgen -W '$(getent group | cut -d: -f3)' -- "$cur")) + elif type perl &>/dev/null; then + COMPREPLY=($(compgen -W '$(perl -e '"'"'while (($gid) = (getgrent)[2]) { print $gid . "\n" }'"'"')' -- "$cur")) + else + # make do with /etc/group + COMPREPLY=($(compgen -W '$(cut -d: -f3 /etc/group)' -- "$cur")) + fi +} + +# Glob for matching various backup files. +# +_backup_glob='@(#*#|*@(~|.@(bak|orig|rej|swp|dpkg*|rpm@(orig|new|save))))' + +# Complete on xinetd services +# +_xinetd_services() +{ + local xinetddir=${BASHCOMP_XINETDDIR:-/etc/xinetd.d} + if [[ -d $xinetddir ]]; then + local IFS=$' \t\n' reset=$(shopt -p nullglob) + shopt -s nullglob + local -a svcs=($(printf '%s\n' $xinetddir/!($_backup_glob))) + $reset + ((!${#svcs[@]})) || + COMPREPLY+=($(compgen -W '${svcs[@]#$xinetddir/}' -- "${cur-}")) + fi +} + +# This function completes on services +# +_services() +{ + local sysvdirs + _sysvdirs + + local IFS=$' \t\n' reset=$(shopt -p nullglob) + shopt -s nullglob + COMPREPLY=( + $(printf '%s\n' ${sysvdirs[0]}/!($_backup_glob|functions|README))) + $reset + + COMPREPLY+=($({ + systemctl list-units --full --all || + systemctl list-unit-files + } 2>/dev/null | + awk '$1 ~ /\.service$/ { sub("\\.service$", "", $1); print $1 }')) + + if [[ -x /sbin/upstart-udev-bridge ]]; then + COMPREPLY+=($(initctl list 2>/dev/null | cut -d' ' -f1)) + fi + + COMPREPLY=($(compgen -W '${COMPREPLY[@]#${sysvdirs[0]}/}' -- "$cur")) +} + +# This completes on a list of all available service scripts for the +# 'service' command and/or the SysV init.d directory, followed by +# that script's available commands +# +_service() +{ + local cur prev words cword + _init_completion || return + + # don't complete past 2nd token + ((cword > 2)) && return + + if [[ $cword -eq 1 && $prev == ?(*/)service ]]; then + _services + [[ -e /etc/mandrake-release ]] && _xinetd_services + else + local sysvdirs + _sysvdirs + COMPREPLY=($(compgen -W '`command sed -e "y/|/ /" \ + -ne "s/^.*\(U\|msg_u\)sage.*{\(.*\)}.*$/\2/p" \ + ${sysvdirs[0]}/${prev##*/} 2>/dev/null` start stop' -- "$cur")) + fi +} && + complete -F _service service +_sysvdirs +for svcdir in "${sysvdirs[@]}"; do + for svc in $svcdir/!($_backup_glob); do + [[ -x $svc ]] && complete -F _service $svc + done +done +unset svc svcdir sysvdirs + +# This function completes on modules +# +_modules() +{ + local modpath + modpath=/lib/modules/$1 + COMPREPLY=($(compgen -W "$(command ls -RL $modpath 2>/dev/null | + command sed -ne 's/^\(.*\)\.k\{0,1\}o\(\.[gx]z\)\{0,1\}$/\1/p')" -- "$cur")) +} + +# This function completes on installed modules +# +_installed_modules() +{ + COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" lsmod | + awk '{if (NR != 1) print $1}')" -- "$1")) +} + +# This function completes on user or user:group format; as for chown and cpio. +# +# The : must be added manually; it will only complete usernames initially. +# The legacy user.group format is not supported. +# +# @param $1 If -u, only return users/groups the user has access to in +# context of current completion. +_usergroup() +{ + if [[ $cur == *\\\\* || $cur == *:*:* ]]; then + # Give up early on if something seems horribly wrong. + return + elif [[ $cur == *\\:* ]]; then + # Completing group after 'user\:gr'. + # Reply with a list of groups prefixed with 'user:', readline will + # escape to the colon. + local prefix + prefix=${cur%%*([^:])} + prefix=${prefix//\\/} + local mycur="${cur#*[:]}" + if [[ ${1-} == -u ]]; then + _allowed_groups "$mycur" + else + local IFS=$'\n' + COMPREPLY=($(compgen -g -- "$mycur")) + fi + COMPREPLY=($(compgen -P "$prefix" -W "${COMPREPLY[@]}")) + elif [[ $cur == *:* ]]; then + # Completing group after 'user:gr'. + # Reply with a list of unprefixed groups since readline with split on : + # and only replace the 'gr' part + local mycur="${cur#*:}" + if [[ ${1-} == -u ]]; then + _allowed_groups "$mycur" + else + local IFS=$'\n' + COMPREPLY=($(compgen -g -- "$mycur")) + fi + else + # Completing a partial 'usernam'. + # + # Don't suffix with a : because readline will escape it and add a + # slash. It's better to complete into 'chown username ' than 'chown + # username\:'. + if [[ ${1-} == -u ]]; then + _allowed_users "$cur" + else + local IFS=$'\n' + COMPREPLY=($(compgen -u -- "$cur")) + fi + fi +} + +_allowed_users() +{ + if _complete_as_root; then + local IFS=$'\n' + COMPREPLY=($(compgen -u -- "${1:-$cur}")) + else + local IFS=$'\n ' + COMPREPLY=($(compgen -W \ + "$(id -un 2>/dev/null || whoami 2>/dev/null)" -- "${1:-$cur}")) + fi +} + +_allowed_groups() +{ + if _complete_as_root; then + local IFS=$'\n' + COMPREPLY=($(compgen -g -- "$1")) + else + local IFS=$'\n ' + COMPREPLY=($(compgen -W \ + "$(id -Gn 2>/dev/null || groups 2>/dev/null)" -- "$1")) + fi +} + +# This function completes on valid shells +# +_shells() +{ + local shell rest + while read -r shell rest; do + [[ $shell == /* && $shell == "$cur"* ]] && COMPREPLY+=($shell) + done 2>/dev/null 0) if not. +_realcommand() +{ + type -P "$1" >/dev/null && { + if type -p realpath >/dev/null; then + realpath "$(type -P "$1")" + elif type -p greadlink >/dev/null; then + greadlink -f "$(type -P "$1")" + elif type -p readlink >/dev/null; then + readlink -f "$(type -P "$1")" + else + type -P "$1" + fi + } +} + +# This function returns the first argument, excluding options +# @param $1 chars Characters out of $COMP_WORDBREAKS which should +# NOT be considered word breaks. See __reassemble_comp_words_by_ref. +_get_first_arg() +{ + local i + + arg= + for ((i = 1; i < COMP_CWORD; i++)); do + if [[ ${COMP_WORDS[i]} != -* ]]; then + arg=${COMP_WORDS[i]} + break + fi + done +} + +# This function counts the number of args, excluding options +# @param $1 chars Characters out of $COMP_WORDBREAKS which should +# NOT be considered word breaks. See __reassemble_comp_words_by_ref. +# @param $2 glob Options whose following argument should not be counted +# @param $3 glob Options that should be counted as args +_count_args() +{ + local i cword words + __reassemble_comp_words_by_ref "${1-}" words cword + + args=1 + for ((i = 1; i < cword; i++)); do + # shellcheck disable=SC2053 + if [[ ${words[i]} != -* && ${words[i - 1]} != ${2-} || \ + ${words[i]} == ${3-} ]]; then + ((args++)) + fi + done +} + +# This function completes on PCI IDs +# +_pci_ids() +{ + COMPREPLY+=($(compgen -W \ + "$(PATH="$PATH:/sbin" lspci -n | awk '{print $3}')" -- "$cur")) +} + +# This function completes on USB IDs +# +_usb_ids() +{ + COMPREPLY+=($(compgen -W \ + "$(PATH="$PATH:/sbin" lsusb | awk '{print $6}')" -- "$cur")) +} + +# CD device names +_cd_devices() +{ + COMPREPLY+=($(compgen -f -d -X "!*/?([amrs])cd*" -- "${cur:-/dev/}")) +} + +# DVD device names +_dvd_devices() +{ + COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}")) +} + +# TERM environment variable values +_terms() +{ + COMPREPLY+=($(compgen -W "$({ + command sed -ne 's/^\([^[:space:]#|]\{2,\}\)|.*/\1/p' /etc/termcap + { + toe -a || toe + } | awk '{ print $1 }' + find /{etc,lib,usr/lib,usr/share}/terminfo/? -type f -maxdepth 1 | + awk -F/ '{ print $NF }' + } 2>/dev/null)" -- "$cur")) +} + +_bashcomp_try_faketty() +{ + if type unbuffer &>/dev/null; then + unbuffer -p "$@" + elif script --version 2>&1 | command grep -qF util-linux; then + # BSD and Solaris "script" do not seem to have required features + script -qaefc "$*" /dev/null + else + "$@" # no can do, fallback + fi +} + +# a little help for FreeBSD ports users +[[ $OSTYPE == *freebsd* ]] && complete -W 'index search fetch fetch-list + extract patch configure build install reinstall deinstall clean + clean-depends kernel buildworld' make + +# This function provides simple user@host completion +# +_user_at_host() +{ + local cur prev words cword + _init_completion -n : || return + + if [[ $cur == *@* ]]; then + _known_hosts_real "$cur" + else + COMPREPLY=($(compgen -u -S @ -- "$cur")) + compopt -o nospace + fi +} +shopt -u hostcomplete && complete -F _user_at_host talk ytalk finger + +# NOTE: Using this function as a helper function is deprecated. Use +# `_known_hosts_real' instead. +_known_hosts() +{ + local cur prev words cword + _init_completion -n : || return + + # NOTE: Using `_known_hosts' as a helper function and passing options + # to `_known_hosts' is deprecated: Use `_known_hosts_real' instead. + local options + [[ ${1-} == -a || ${2-} == -a ]] && options=-a + [[ ${1-} == -c || ${2-} == -c ]] && options+=" -c" + _known_hosts_real ${options-} -- "$cur" +} # _known_hosts() + +# Helper function to locate ssh included files in configs +# This function looks for the "Include" keyword in ssh config files and +# includes them recursively, adding each result to the config variable. +_included_ssh_config_files() +{ + (($# < 1)) && + echo "bash_completion: $FUNCNAME: missing mandatory argument CONFIG" >&2 + local configfile i f + configfile=$1 + + local reset=$(shopt -po noglob) + set -o noglob + local included=($(command sed -ne 's/^[[:blank:]]*[Ii][Nn][Cc][Ll][Uu][Dd][Ee][[:blank:]]\(.*\)$/\1/p' "${configfile}")) + $reset + + [[ ${included-} ]] || return + for i in "${included[@]}"; do + # Check the origin of $configfile to complete relative included paths on included + # files according to ssh_config(5): + # "[...] Files without absolute paths are assumed to be in ~/.ssh if included in a user + # configuration file or /etc/ssh if included from the system configuration file.[...]" + if ! [[ $i =~ ^\~.*|^\/.* ]]; then + if [[ $configfile =~ ^\/etc\/ssh.* ]]; then + i="/etc/ssh/$i" + else + i="$HOME/.ssh/$i" + fi + fi + __expand_tilde_by_ref i + # In case the expanded variable contains multiple paths + set +o noglob + for f in $i; do + if [[ -r $f ]]; then + config+=("$f") + # The Included file is processed to look for Included files in itself + _included_ssh_config_files $f + fi + done + $reset + done +} # _included_ssh_config_files() + +# Helper function for completing _known_hosts. +# This function performs host completion based on ssh's config and known_hosts +# files, as well as hostnames reported by avahi-browse if +# COMP_KNOWN_HOSTS_WITH_AVAHI is set to a non-empty value. Also hosts from +# HOSTFILE (compgen -A hostname) are added, unless +# COMP_KNOWN_HOSTS_WITH_HOSTFILE is set to an empty value. +# Usage: _known_hosts_real [OPTIONS] CWORD +# Options: -a Use aliases from ssh config files +# -c Use `:' suffix +# -F configfile Use `configfile' for configuration settings +# -p PREFIX Use PREFIX +# -4 Filter IPv6 addresses from results +# -6 Filter IPv4 addresses from results +# Return: Completions, starting with CWORD, are added to COMPREPLY[] +_known_hosts_real() +{ + local configfile flag prefix="" ifs=$IFS + local cur suffix="" aliases i host ipv4 ipv6 + local -a kh tmpkh=() khd=() config=() + + # TODO remove trailing %foo from entries + + local OPTIND=1 + while getopts "ac46F:p:" flag "$@"; do + case $flag in + a) aliases='yes' ;; + c) suffix=':' ;; + F) configfile=$OPTARG ;; + p) prefix=$OPTARG ;; + 4) ipv4=1 ;; + 6) ipv6=1 ;; + *) + echo "bash_completion: $FUNCNAME: usage error" >&2 + return 1 + ;; + esac + done + if (($# < OPTIND)); then + echo "bash_completion: $FUNCNAME: missing mandatory argument CWORD" >&2 + return 1 + fi + cur=${!OPTIND} + ((OPTIND += 1)) + if (($# >= OPTIND)); then + echo "bash_completion: $FUNCNAME($*): unprocessed arguments:" \ + "$(while (($# >= OPTIND)); do + printf '%s ' ${!OPTIND} + shift + done)" >&2 + return 1 + fi + + [[ $cur == *@* ]] && prefix=$prefix${cur%@*}@ && cur=${cur#*@} + kh=() + + # ssh config files + if [[ -v configfile ]]; then + [[ -r $configfile ]] && config+=("$configfile") + else + for i in /etc/ssh/ssh_config ~/.ssh/config ~/.ssh2/config; do + [[ -r $i ]] && config+=("$i") + done + fi + + local reset=$(shopt -po noglob) + set -o noglob + + # "Include" keyword in ssh config files + if ((${#config[@]} > 0)); then + for i in "${config[@]}"; do + _included_ssh_config_files "$i" + done + fi + + # Known hosts files from configs + if ((${#config[@]} > 0)); then + local IFS=$'\n' + # expand paths (if present) to global and user known hosts files + # TODO(?): try to make known hosts files with more than one consecutive + # spaces in their name work (watch out for ~ expansion + # breakage! Alioth#311595) + tmpkh=($(awk 'sub("^[ \t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \t]+", "") { print $0 }' "${config[@]}" | sort -u)) + IFS=$ifs + fi + if ((${#tmpkh[@]} != 0)); then + local j + for i in "${tmpkh[@]}"; do + # First deal with quoted entries... + while [[ $i =~ ^([^\"]*)\"([^\"]*)\"(.*)$ ]]; do + i=${BASH_REMATCH[1]}${BASH_REMATCH[3]} + j=${BASH_REMATCH[2]} + __expand_tilde_by_ref j # Eval/expand possible `~' or `~user' + [[ -r $j ]] && kh+=("$j") + done + # ...and then the rest. + for j in $i; do + __expand_tilde_by_ref j # Eval/expand possible `~' or `~user' + [[ -r $j ]] && kh+=("$j") + done + done + fi + + if [[ ! -v configfile ]]; then + # Global and user known_hosts files + for i in /etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2 \ + /etc/known_hosts /etc/known_hosts2 ~/.ssh/known_hosts \ + ~/.ssh/known_hosts2; do + [[ -r $i ]] && kh+=("$i") + done + for i in /etc/ssh2/knownhosts ~/.ssh2/hostkeys; do + [[ -d $i ]] && khd+=("$i"/*pub) + done + fi + + # If we have known_hosts files to use + if ((${#kh[@]} + ${#khd[@]} > 0)); then + if ((${#kh[@]} > 0)); then + # https://man.openbsd.org/sshd.8#SSH_KNOWN_HOSTS_FILE_FORMAT + for i in "${kh[@]}"; do + while read -ra tmpkh; do + ((${#tmpkh[@]} == 0)) && continue + set -- "${tmpkh[@]}" + # Skip entries starting with | (hashed) and # (comment) + [[ $1 == [\|\#]* ]] && continue + # Ignore leading @foo (markers) + [[ $1 == @* ]] && shift + # Split entry on commas + local IFS=, + for host in $1; do + # Skip hosts containing wildcards + [[ $host == *[*?]* ]] && continue + # Remove leading [ + host="${host#[}" + # Remove trailing ] + optional :port + host="${host%]?(:+([0-9]))}" + # Add host to candidates + COMPREPLY+=($host) + done + IFS=$ifs + done <"$i" + done + COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur")) + fi + if ((${#khd[@]} > 0)); then + # Needs to look for files called + # .../.ssh2/key_22_.pub + # dont fork any processes, because in a cluster environment, + # there can be hundreds of hostkeys + for i in "${khd[@]}"; do + if [[ $i == *key_22_$cur*.pub && -r $i ]]; then + host=${i/#*key_22_/} + host=${host/%.pub/} + COMPREPLY+=($host) + fi + done + fi + + # apply suffix and prefix + for i in ${!COMPREPLY[*]}; do + COMPREPLY[i]=$prefix${COMPREPLY[i]}$suffix + done + fi + + # append any available aliases from ssh config files + if [[ ${#config[@]} -gt 0 && -v aliases ]]; then + local -a hosts=($(command sed -ne 's/^[[:blank:]]*[Hh][Oo][Ss][Tt][[:blank:]]\(.*\)$/\1/p' "${config[@]}")) + if ((${#hosts[@]} != 0)); then + COMPREPLY+=($(compgen -P "$prefix" \ + -S "$suffix" -W '${hosts[@]%%[*?%]*}' -X '\!*' -- "$cur")) + fi + fi + + # Add hosts reported by avahi-browse, if desired and it's available. + if [[ ${COMP_KNOWN_HOSTS_WITH_AVAHI-} ]] && + type avahi-browse &>/dev/null; then + # The original call to avahi-browse also had "-k", to avoid lookups + # into avahi's services DB. We don't need the name of the service, and + # if it contains ";", it may mistify the result. But on Gentoo (at + # least), -k wasn't available (even if mentioned in the manpage) some + # time ago, so... + COMPREPLY+=($(compgen -P "$prefix" -S "$suffix" -W \ + "$(avahi-browse -cpr _workstation._tcp 2>/dev/null | + awk -F';' '/^=/ { print $7 }' | sort -u)" -- "$cur")) + fi + + # Add hosts reported by ruptime. + if type ruptime &>/dev/null; then + COMPREPLY+=($(compgen -W \ + "$(ruptime 2>/dev/null | awk '!/^ruptime:/ { print $1 }')" \ + -- "$cur")) + fi + + # Add results of normal hostname completion, unless + # `COMP_KNOWN_HOSTS_WITH_HOSTFILE' is set to an empty value. + if [[ -n ${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1} ]]; then + COMPREPLY+=( + $(compgen -A hostname -P "$prefix" -S "$suffix" -- "$cur")) + fi + + $reset + + if [[ -v ipv4 ]]; then + COMPREPLY=("${COMPREPLY[@]/*:*$suffix/}") + fi + if [[ -v ipv6 ]]; then + COMPREPLY=("${COMPREPLY[@]/+([0-9]).+([0-9]).+([0-9]).+([0-9])$suffix/}") + fi + if [[ -v ipv4 || -v ipv6 ]]; then + for i in "${!COMPREPLY[@]}"; do + [[ ${COMPREPLY[i]} ]] || unset -v "COMPREPLY[i]" + done + fi + + __ltrim_colon_completions "$prefix$cur" + +} # _known_hosts_real() +complete -F _known_hosts traceroute traceroute6 \ + fping fping6 telnet rsh rlogin ftp dig mtr ssh-installkeys showmount + +# This meta-cd function observes the CDPATH variable, so that cd additionally +# completes on directories under those specified in CDPATH. +# +_cd() +{ + local cur prev words cword + _init_completion || return + + local IFS=$'\n' i j k + + compopt -o filenames + + # Use standard dir completion if no CDPATH or parameter starts with /, + # ./ or ../ + if [[ -z ${CDPATH:-} || $cur == ?(.)?(.)/* ]]; then + _filedir -d + return + fi + + local -r mark_dirs=$(_rl_enabled mark-directories && echo y) + local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories && echo y) + + # we have a CDPATH, so loop on its contents + for i in ${CDPATH//:/$'\n'}; do + # create an array of matched subdirs + k="${#COMPREPLY[@]}" + for j in $(compgen -d -- $i/$cur); do + if [[ ($mark_symdirs && -L $j || $mark_dirs && ! -L $j) && ! -d ${j#$i/} ]]; then + j+="/" + fi + COMPREPLY[k++]=${j#$i/} + done + done + + _filedir -d + + if ((${#COMPREPLY[@]} == 1)); then + i=${COMPREPLY[0]} + if [[ $i == "$cur" && $i != "*/" ]]; then + COMPREPLY[0]="${i}/" + fi + fi + + return +} +if shopt -q cdable_vars; then + complete -v -F _cd -o nospace cd pushd +else + complete -F _cd -o nospace cd pushd +fi + +# A _command_offset wrapper function for use when the offset is unknown. +# Only intended to be used as a completion function directly associated +# with a command, not to be invoked from within other completion functions. +# +_command() +{ + local offset i + + # find actual offset, as position of the first non-option + offset=1 + for ((i = 1; i <= COMP_CWORD; i++)); do + if [[ ${COMP_WORDS[i]} != -* ]]; then + offset=$i + break + fi + done + _command_offset $offset +} + +# A meta-command completion function for commands like sudo(8), which need to +# first complete on a command, then complete according to that command's own +# completion definition. +# +_command_offset() +{ + # rewrite current completion context before invoking + # actual command completion + + # find new first word position, then + # rewrite COMP_LINE and adjust COMP_POINT + local word_offset=$1 i j + for ((i = 0; i < word_offset; i++)); do + for ((j = 0; j <= ${#COMP_LINE}; j++)); do + [[ $COMP_LINE == "${COMP_WORDS[i]}"* ]] && break + COMP_LINE=${COMP_LINE:1} + ((COMP_POINT--)) + done + COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"} + ((COMP_POINT -= ${#COMP_WORDS[i]})) + done + + # shift COMP_WORDS elements and adjust COMP_CWORD + for ((i = 0; i <= COMP_CWORD - word_offset; i++)); do + COMP_WORDS[i]=${COMP_WORDS[i + word_offset]} + done + for ((i; i <= COMP_CWORD; i++)); do + unset 'COMP_WORDS[i]' + done + ((COMP_CWORD -= word_offset)) + + COMPREPLY=() + local cur + _get_comp_words_by_ref cur + + if ((COMP_CWORD == 0)); then + local IFS=$'\n' + compopt -o filenames + COMPREPLY=($(compgen -d -c -- "$cur")) + else + local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]} + local cspec=$(complete -p $cmd 2>/dev/null) + + # If we have no completion for $cmd yet, see if we have for basename + if [[ ! $cspec && $cmd == */* ]]; then + cspec=$(complete -p ${cmd##*/} 2>/dev/null) + [[ $cspec ]] && compcmd=${cmd##*/} + fi + # If still nothing, just load it for the basename + if [[ ! $cspec ]]; then + compcmd=${cmd##*/} + _completion_loader $compcmd + cspec=$(complete -p $compcmd 2>/dev/null) + fi + + if [[ -n $cspec ]]; then + if [[ ${cspec#* -F } != "$cspec" ]]; then + # complete -F + + # get function name + local func=${cspec#*-F } + func=${func%% *} + + if ((${#COMP_WORDS[@]} >= 2)); then + $func $cmd "${COMP_WORDS[-1]}" "${COMP_WORDS[-2]}" + else + $func $cmd "${COMP_WORDS[-1]}" + fi + + # restore initial compopts + local opt + while [[ $cspec == *" -o "* ]]; do + # FIXME: should we take "+o opt" into account? + cspec=${cspec#*-o } + opt=${cspec%% *} + compopt -o $opt + cspec=${cspec#$opt} + done + else + cspec=${cspec#complete} + cspec=${cspec%%$compcmd} + COMPREPLY=($(eval compgen "$cspec" -- '$cur')) + fi + elif ((${#COMPREPLY[@]} == 0)); then + # XXX will probably never happen as long as completion loader loads + # *something* for every command thrown at it ($cspec != empty) + _minimal + fi + fi +} +complete -F _command aoss command "do" else eval exec ltrace nice nohup padsp \ + "then" time tsocks vsound xargs + +_root_command() +{ + local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin + local root_command=$1 + _command +} +complete -F _root_command fakeroot gksu gksudo kdesudo really + +# Return true if the completion should be treated as running as root +_complete_as_root() +{ + [[ $EUID -eq 0 || ${root_command:-} ]] +} + +_longopt() +{ + local cur prev words cword split + _init_completion -s || return + + case "${prev,,}" in + --help | --usage | --version) + return + ;; + --!(no-*)dir*) + _filedir -d + return + ;; + --!(no-*)@(file|path)*) + _filedir + return + ;; + --+([-a-z0-9_])) + local argtype=$(LC_ALL=C $1 --help 2>&1 | command sed -ne \ + "s|.*$prev\[\{0,1\}=[<[]\{0,1\}\([-A-Za-z0-9_]\{1,\}\).*|\1|p") + case ${argtype,,} in + *dir*) + _filedir -d + return + ;; + *file* | *path*) + _filedir + return + ;; + esac + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W "$(LC_ALL=C $1 --help 2>&1 | + while read -r line; do + [[ $line =~ --[A-Za-z0-9]+([-_][A-Za-z0-9]+)*=? ]] && + printf '%s\n' ${BASH_REMATCH[0]} + done)" -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + elif [[ $1 == *@(rmdir|chroot) ]]; then + _filedir -d + else + [[ $1 == *mkdir ]] && compopt -o nospace + _filedir + fi +} +# makeinfo and texi2dvi are defined elsewhere. +complete -F _longopt a2ps awk base64 bash bc bison cat chroot colordiff cp \ + csplit cut date df diff dir du enscript env expand fmt fold gperf \ + grep grub head irb ld ldd less ln ls m4 md5sum mkdir mkfifo mknod \ + mv netstat nl nm objcopy objdump od paste pr ptx readelf rm rmdir \ + sed seq sha{,1,224,256,384,512}sum shar sort split strip sum tac tail tee \ + texindex touch tr uname unexpand uniq units vdir wc who + +declare -Ag _xspecs + +_filedir_xspec() +{ + local cur prev words cword + _init_completion || return + + _tilde "$cur" || return + + local IFS=$'\n' xspec=${_xspecs[${1##*/}]} tmp + local -a toks + + toks=($( + compgen -d -- "$(quote_readline "$cur")" | { + while read -r tmp; do + printf '%s\n' $tmp + done + } + )) + + # Munge xspec to contain uppercase version too + # https://lists.gnu.org/archive/html/bug-bash/2010-09/msg00036.html + # news://news.gmane.io/4C940E1C.1010304@case.edu + eval xspec="${xspec}" + local matchop=! + if [[ $xspec == !* ]]; then + xspec=${xspec#!} + matchop=@ + fi + xspec="$matchop($xspec|${xspec^^})" + + toks+=($( + eval compgen -f -X "'!$xspec'" -- '$(quote_readline "$cur")' | { + while read -r tmp; do + [[ -n $tmp ]] && printf '%s\n' $tmp + done + } + )) + + # Try without filter if it failed to produce anything and configured to + [[ -n ${COMP_FILEDIR_FALLBACK:-} && ${#toks[@]} -lt 1 ]] && { + local reset=$(shopt -po noglob) + set -o noglob + toks+=($(compgen -f -- "$(quote_readline "$cur")")) + IFS=' ' + $reset + IFS=$'\n' + } + + if ((${#toks[@]} != 0)); then + compopt -o filenames + COMPREPLY=("${toks[@]}") + fi +} + +_install_xspec() +{ + local xspec=$1 cmd + shift + for cmd in "$@"; do + _xspecs[$cmd]=$xspec + done +} +# bzcmp, bzdiff, bz*grep, bzless, bzmore intentionally not here, see Debian: #455510 +_install_xspec '!*.?(t)bz?(2)' bunzip2 bzcat pbunzip2 pbzcat lbunzip2 lbzcat +_install_xspec '!*.@(zip|[aegjswx]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|aab|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz|whl)' unzip zipinfo +_install_xspec '*.Z' compress znew +# zcmp, zdiff, z*grep, zless, zmore intentionally not here, see Debian: #455510 +_install_xspec '!*.@(Z|[gGd]z|t[ag]z)' gunzip zcat +_install_xspec '!*.@(Z|[gGdz]z|t[ag]z)' unpigz +_install_xspec '!*.Z' uncompress +# lzcmp, lzdiff intentionally not here, see Debian: #455510 +_install_xspec '!*.@(tlz|lzma)' lzcat lzegrep lzfgrep lzgrep lzless lzmore unlzma +_install_xspec '!*.@(?(t)xz|tlz|lzma)' unxz xzcat +_install_xspec '!*.lrz' lrunzip +_install_xspec '!*.@(gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx)' ee +_install_xspec '!*.@(gif|jp?(e)g|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|svg)' qiv +_install_xspec '!*.@(gif|jp?(e)g?(2)|j2[ck]|jp[2f]|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|?(e)ps)' xv +_install_xspec '!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))' gv ggv kghostview +_install_xspec '!*.@(dvi|DVI)?(.@(gz|Z|bz2))' xdvi kdvi +_install_xspec '!*.dvi' dvips dviselect dvitype dvipdf advi dvipdfm dvipdfmx +_install_xspec '!*.[pf]df' acroread gpdf xpdf +_install_xspec '!*.@(?(e)ps|pdf)' kpdf +_install_xspec '!*.@(okular|@(?(e|x)ps|?(E|X)PS|[pf]df|[PF]DF|dvi|DVI|cb[rz]|CB[RZ]|djv?(u)|DJV?(U)|dvi|DVI|gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx|GIF|JP?(E)G|MIFF|TIF?(F)|PN[GM]|P[BGP]M|BMP|XPM|ICO|XWD|TGA|PCX|epub|EPUB|odt|ODT|fb?(2)|FB?(2)|mobi|MOBI|g3|G3|chm|CHM)?(.?(gz|GZ|bz2|BZ2|xz|XZ)))' okular +_install_xspec '!*.pdf' epdfview pdfunite +_install_xspec '!*.@(cb[rz7t]|djv?(u)|?(e)ps|pdf)' zathura +_install_xspec '!*.@(?(e)ps|pdf)' ps2pdf ps2pdf12 ps2pdf13 ps2pdf14 ps2pdfwr +_install_xspec '!*.texi*' makeinfo texi2html +_install_xspec '!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)' tex latex slitex jadetex pdfjadetex pdftex pdflatex texi2dvi xetex xelatex luatex lualatex +_install_xspec '!*.mp3' mpg123 mpg321 madplay +_install_xspec '!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmv]|OG[AGMV]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))' xine aaxine fbxine +_install_xspec '!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmv]|OG[AGMV]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))' kaffeine dragon totem +_install_xspec '!*.@(avi|asf|wmv)' aviplay +_install_xspec '!*.@(rm?(j)|ra?(m)|smi?(l))' realplay +_install_xspec '!*.@(mpg|mpeg|avi|mov|qt)' xanim +_install_xspec '!*.@(og[ag]|m3u|flac|spx)' ogg123 +_install_xspec '!*.@(mp3|ogg|pls|m3u)' gqmpeg freeamp +_install_xspec '!*.fig' xfig +_install_xspec '!*.@(mid?(i)|cmf)' playmidi +_install_xspec '!*.@(mid?(i)|rmi|rcp|[gr]36|g18|mod|xm|it|x3m|s[3t]m|kar)' timidity +_install_xspec '!*.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)' modplugplay modplug123 +_install_xspec '*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)' vi vim gvim rvim view rview rgvim rgview gview emacs xemacs sxemacs kate kwrite +_install_xspec '!*.@(zip|z|gz|tgz)' bzme +# konqueror not here on purpose, it's more than a web/html browser +_install_xspec '!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))' netscape mozilla lynx galeon dillo elinks amaya epiphany +_install_xspec '!*.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)' oowriter lowriter +_install_xspec '!*.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)' ooimpress loimpress +_install_xspec '!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)' oocalc localc +_install_xspec '!*.@(sxd|std|sda|sdd|?(f)odg|otg)' oodraw lodraw +_install_xspec '!*.@(sxm|smf|mml|odf)' oomath lomath +_install_xspec '!*.odb' oobase lobase +_install_xspec '!*.[rs]pm' rpm2cpio +_install_xspec '!*.aux' bibtex +_install_xspec '!*.po' poedit gtranslator kbabel lokalize +_install_xspec '!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])' harbour gharbour hbpp +_install_xspec '!*.[Hh][Rr][Bb]' hbrun +_install_xspec '!*.ly' lilypond ly2dvi +_install_xspec '!*.@(dif?(f)|?(d)patch)?(.@([gx]z|bz2|lzma))' cdiff +_install_xspec '!@(*.@(ks|jks|jceks|p12|pfx|bks|ubr|gkr|cer|crt|cert|p7b|pkipath|pem|p10|csr|crl)|cacerts)' portecle +_install_xspec '!*.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)' kid3 kid3-qt +unset -f _install_xspec + +# Minimal completion to use as fallback in _completion_loader. +_minimal() +{ + local cur prev words cword split + _init_completion -s || return + $split && return + _filedir +} +# Complete the empty string to allow completion of '>', '>>', and '<' on < 4.3 +# https://lists.gnu.org/archive/html/bug-bash/2012-01/msg00045.html +complete -F _minimal '' + +__load_completion() +{ + local -a dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions) + local ifs=$IFS IFS=: dir cmd="${1##*/}" compfile + [[ -n $cmd ]] || return 1 + for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share}; do + dirs+=($dir/bash-completion/completions) + done + IFS=$ifs + + if [[ $BASH_SOURCE == */* ]]; then + dirs+=("${BASH_SOURCE%/*}/completions") + else + dirs+=(./completions) + fi + + local backslash= + if [[ $cmd == \\* ]]; then + cmd="${cmd:1}" + # If we already have a completion for the "real" command, use it + $(complete -p "$cmd" 2>/dev/null || echo false) "\\$cmd" && return 0 + backslash=\\ + fi + + for dir in "${dirs[@]}"; do + [[ -d $dir ]] || continue + for compfile in "$cmd" "$cmd.bash" "_$cmd"; do + compfile="$dir/$compfile" + # Avoid trying to source dirs; https://bugzilla.redhat.com/903540 + if [[ -f $compfile ]] && . "$compfile" &>/dev/null; then + [[ $backslash ]] && $(complete -p "$cmd") "\\$cmd" + return 0 + fi + done + done + + # Look up simple "xspec" completions + [[ -v _xspecs[$cmd] ]] && + complete -F _filedir_xspec "$cmd" "$backslash$cmd" && return 0 + + return 1 +} + +# set up dynamic completion loading +_completion_loader() +{ + # $1=_EmptycmD_ already for empty cmds in bash 4.3, set to it for earlier + local cmd="${1:-_EmptycmD_}" + + __load_completion "$cmd" && return 124 + + # Need to define *something*, otherwise there will be no completion at all. + complete -F _minimal -- "$cmd" && return 124 +} && + complete -D -F _completion_loader + +# Function for loading and calling functions from dynamically loaded +# completion files that may not have been sourced yet. +# @param $1 completion file to load function from in case it is missing +# @param $2... function and its arguments +_xfunc() +{ + set -- "$@" + local srcfile=$1 + shift + declare -F $1 &>/dev/null || __load_completion "$srcfile" + "$@" +} + +# source compat completion directory definitions +compat_dir=${BASH_COMPLETION_COMPAT_DIR:-/etc/bash_completion.d} +if [[ -d $compat_dir && -r $compat_dir && -x $compat_dir ]]; then + for i in "$compat_dir"/*; do + [[ ${i##*/} != @($_backup_glob|Makefile*|$_blacklist_glob) && -f \ + $i && -r $i ]] && . "$i" + done +fi +unset compat_dir i _blacklist_glob + +# source user completion file +user_completion=${BASH_COMPLETION_USER_FILE:-~/.bash_completion} +[[ ${BASH_SOURCE[0]} != "$user_completion" && -r $user_completion && -f $user_completion ]] && + . $user_completion +unset user_completion + +unset -f have +unset have + +set $BASH_COMPLETION_ORIGINAL_V_VALUE +unset BASH_COMPLETION_ORIGINAL_V_VALUE + +# ex: filetype=sh diff --git a/bash_completion.sh.in b/bash_completion.sh.in new file mode 100644 index 0000000..b2a527e --- /dev/null +++ b/bash_completion.sh.in @@ -0,0 +1,16 @@ +# shellcheck shell=sh disable=SC1091,SC2039,SC2166 +# Check for interactive bash and that we haven't already been sourced. +if [ "x${BASH_VERSION-}" != x -a "x${PS1-}" != x -a "x${BASH_COMPLETION_VERSINFO-}" = x ]; then + + # Check for recent enough version of bash. + if [ "${BASH_VERSINFO[0]}" -gt 4 ] || + [ "${BASH_VERSINFO[0]}" -eq 4 -a "${BASH_VERSINFO[1]}" -ge 2 ]; then + [ -r "${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion" ] && + . "${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion" + if shopt -q progcomp && [ -r @datadir@/@PACKAGE@/bash_completion ]; then + # Source completion code. + . @datadir@/@PACKAGE@/bash_completion + fi + fi + +fi diff --git a/completions/.gitignore b/completions/.gitignore new file mode 100644 index 0000000..5edc172 --- /dev/null +++ b/completions/.gitignore @@ -0,0 +1,235 @@ +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 diff --git a/completions/2to3 b/completions/2to3 new file mode 100644 index 0000000..7c5b330 --- /dev/null +++ b/completions/2to3 @@ -0,0 +1,39 @@ +# bash completion for 2to3 -*- shell-script -*- + +_2to3() +{ + local cur prev words cword split + _init_completion -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")) + return + ;; + -j | --processes) + COMPREPLY=($(compgen -W "{1..$(_ncpus)}" -- "$cur")) + return + ;; + -o | --output-dir) + _filedir -d + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _filedir py +} && + complete -F _2to3 2to3 + +# ex: filetype=sh diff --git a/completions/7z b/completions/7z new file mode 100644 index 0000000..a8acbc5 --- /dev/null +++ b/completions/7z @@ -0,0 +1,128 @@ +# 7z(1) completion -*- shell-script -*- + +_7z() +{ + local cur prev words cword + _init_completion -n = || return + + if ((cword == 1)); then + COMPREPLY=($(compgen -W 'a b d e l t u x' -- "$cur")) + return + fi + + local mode + [[ ${words[1]} == [adu] ]] && mode=w || mode=r + + case $cur in + -ao*) + COMPREPLY=($(compgen -P${cur:0:3} -W 'a s t u' -- "${cur:3}")) + return + ;; + -?(a)[ix]*) + local opt + if [[ $cur == -a[ix]* ]]; then + opt=${cur:0:3} cur=${cur:3} + else + opt=${cur:0:2} cur=${cur:2} + fi + if [[ $cur != *[@\!]* ]]; then + COMPREPLY=($(compgen -P$opt -W '@ ! r@ r-@ r0@ r! r-! r0!' \ + -- "$cur")) + elif [[ $cur == ?(r@(-|0|))@* ]]; then + local IFS=$' \t\n' reset=$(shopt -po noglob) + set -o noglob + COMPREPLY=($(compgen -P"${opt}${cur%%@*}@" -f -- "${cur#*@}")) + $reset + compopt -o filenames + fi + return + ;; + -mhe=* | -mhc=* | -ms=* | -mt=*) + COMPREPLY=($(compgen -W 'on off' -- "${cur#*=}")) + return + ;; + -mx=*) + COMPREPLY=($(compgen -W '0 1 3 5 7 9' -- "${cur#*=}")) + 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 + compopt -o nospace + return + ;; + -r?*) + COMPREPLY=($(compgen -P${cur:0:2} -W '- 0' -- "${cur:2}")) + return + ;; + -scs*) + COMPREPLY=($(compgen -P${cur:0:4} -W 'UTF-8 WIN DOS' \ + -- "${cur:4}")) + return + ;; + -ssc?*) + COMPREPLY=($(compgen -P${cur:0:4} -W '-' -- "${cur:4}")) + return + ;; + -t*) + if [[ $mode == w ]]; then + COMPREPLY=($(compgen -P${cur:0:2} -W '7z bzip2 gzip swfc + tar wim xz zip' -- "${cur:2}")) + 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}")) + fi + return + ;; + -m*=* | -p* | -u* | -v*) + return + ;; + 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")) + [[ ${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 + # TODO: parsing 7z i output? + # - how to figure out if the format is input or output? + # - find string Formats:, read until next empty line + # - extensions start from column 26 + # - ignore everything in parens + # - terminate on two spaces + # - 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)' + 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")) + compopt -o filenames + else + _filedir + fi + fi +} && + complete -F _7z 7z 7za + +# ex: filetype=sh diff --git a/completions/Makefile.am b/completions/Makefile.am new file mode 100644 index 0000000..723b42f --- /dev/null +++ b/completions/Makefile.am @@ -0,0 +1,950 @@ +bashcompdir = $(datadir)/$(PACKAGE)/completions +bashcomp_DATA = 2to3 \ + 7z \ + a2x \ + abook \ + aclocal \ + acpi \ + _adb \ + add_members \ + alias \ + ant \ + apache2ctl \ + appdata-validate \ + apt-build \ + apt-cache \ + apt-get \ + aptitude \ + arch \ + arp \ + arping \ + arpspoof \ + asciidoc \ + aspell \ + autoconf \ + automake \ + autoreconf \ + autorpm \ + autoscan \ + avctrl \ + badblocks \ + bind \ + bk \ + brctl \ + btdownloadheadless.py \ + bts \ + bzip2 \ + _cal \ + cancel \ + cardctl \ + carton \ + ccache \ + ccze \ + cfagent \ + cfrun \ + chage \ + change_pw \ + check_db \ + check_perms \ + checksec \ + _chfn \ + chgrp \ + chkconfig \ + chmod \ + chown \ + chpasswd \ + chromium-browser \ + chronyc \ + chrpath \ + _chsh \ + cksfv \ + cleanarch \ + clisp \ + clone_member \ + complete \ + config_list \ + configure \ + convert \ + cowsay \ + cpan2dist \ + cpio \ + cppcheck \ + crontab \ + cryptsetup \ + curl \ + cvs \ + cvsps \ + dd \ + deja-dup \ + desktop-file-validate \ + dhclient \ + dict \ + _dmesg \ + dmypy \ + dnssec-keygen \ + dnsspoof \ + dot \ + dpkg \ + dpkg-source \ + dselect \ + dsniff \ + dumpdb \ + dumpe2fs \ + e2freefrag \ + e2label \ + ebtables \ + ecryptfs-migrate-home \ + _eject \ + eog \ + ether-wake \ + evince \ + explodepkg \ + export \ + faillog \ + fbgs \ + fbi \ + feh \ + file \ + file-roller \ + filefrag \ + filesnarf \ + find \ + find_member \ + fio \ + firefox \ + flake8 \ + freebsd-update \ + freeciv \ + freeciv-server \ + function \ + fusermount \ + gcc \ + gcl \ + gdb \ + genaliases \ + gendiff \ + genisoimage \ + geoiplookup \ + getconf \ + getent \ + gkrellm \ + gm \ + gnatmake \ + gnokii \ + gnome-mplayer \ + gnome-screenshot \ + gpasswd \ + gpg \ + gpg2 \ + gpgv \ + gphoto2 \ + gprof \ + groupadd \ + groupdel \ + groupmems \ + groupmod \ + growisofs \ + grpck \ + gssdp-discover \ + gzip \ + hcitool \ + hddtemp \ + _hexdump \ + hid2hci \ + hostname \ + hping2 \ + htop \ + htpasswd \ + hunspell \ + _hwclock \ + iconv \ + id \ + idn \ + ifstat \ + iftop \ + ifup \ + influx \ + info \ + inject \ + inotifywait \ + insmod \ + installpkg \ + interdiff \ + invoke-rc.d \ + _ionice \ + ip \ + ipcalc \ + iperf \ + ipmitool \ + ipsec \ + iptables \ + ipv6calc \ + iscsiadm \ + isort \ + isql \ + iwconfig \ + iwlist \ + iwpriv \ + iwspy \ + jar \ + jarsigner \ + java \ + javaws \ + jq \ + jpegoptim \ + jps \ + jshint \ + json_xs \ + jsonschema \ + k3b \ + kcov \ + kill \ + killall \ + kldload \ + kldunload \ + koji \ + ktutil \ + larch \ + lastlog \ + ldapsearch \ + ldapvi \ + lftp \ + lftpget \ + lilo \ + links \ + lintian \ + lisp \ + list_admins \ + list_lists \ + list_members \ + list_owners \ + _look \ + locale-gen \ + lpq \ + lpr \ + lrzip \ + lsof \ + lsscsi \ + lsusb \ + lua \ + luac \ + luseradd \ + luserdel \ + lvm \ + lz4 \ + lzip \ + lzma \ + lzop \ + macof \ + mailmanctl \ + make \ + makepkg \ + man \ + mc \ + mcrypt \ + mdadm \ + mdtool \ + medusa \ + mii-diag \ + mii-tool \ + minicom \ + mkinitrd \ + mktemp \ + mmsitepass \ + _mock \ + modinfo \ + modprobe \ + _modules \ + monodevelop \ + _mount \ + _mount.linux \ + mplayer \ + mr \ + msynctool \ + mtx \ + munindoc \ + munin-node-configure \ + munin-run \ + munin-update \ + mussh \ + mutt \ + mypy \ + mysql \ + mysqladmin \ + nc \ + ncftp \ + nethogs \ + _newgrp \ + newlist \ + newusers \ + ngrep \ + nmap \ + _nmcli \ + nproc \ + nslookup \ + nsupdate \ + ntpdate \ + oggdec \ + op \ + openssl \ + opera \ + optipng \ + p4 \ + pack200 \ + passwd \ + patch \ + pdftotext \ + perl \ + perlcritic \ + perltidy \ + pgrep \ + pidof \ + pine \ + ping \ + pkg-config \ + pkg-get \ + pkg_delete \ + pkgadd \ + pkgrm \ + pkgtool \ + pkgutil \ + plague-client \ + pm-hibernate \ + pm-is-supported \ + pm-powersave \ + pngfix \ + portinstall \ + portsnap \ + portupgrade \ + postcat \ + postconf \ + postfix \ + postmap \ + postsuper \ + povray \ + prelink \ + printenv \ + protoc \ + psql \ + puppet \ + pv \ + pwck \ + pwd \ + pwdx \ + pwgen \ + pycodestyle \ + pydoc \ + pydocstyle \ + pyflakes \ + pylint \ + pytest \ + python \ + pyvenv \ + qdbus \ + qemu \ + qrunner \ + querybts \ + quota \ + radvdump \ + rcs \ + rdesktop \ + remove_members \ + removepkg \ + _renice \ + _repomanage \ + reportbug \ + _reptyr \ + resolvconf \ + _rfkill \ + ri \ + rmlist \ + rmmod \ + route \ + rpcdebug \ + rpm \ + rpm2tgz \ + rpmcheck \ + rrdtool \ + rsync \ + _rtcwake \ + _runuser \ + sbcl \ + sbopkg \ + screen \ + scrub \ + secret-tool \ + sh \ + shellcheck \ + sitecopy \ + slackpkg \ + slapt-get \ + slapt-src \ + smartctl \ + smbclient \ + snownews \ + sqlite3 \ + ss \ + ssh \ + ssh-add \ + ssh-copy-id \ + ssh-keygen \ + sshfs \ + sshmitm \ + sshow \ + strace \ + strings \ + _su \ + sudo \ + svcadm \ + svk \ + _svn \ + _svnadmin \ + _svnlook \ + sync_members \ + synclient \ + sysbench \ + sysctl \ + tar \ + tcpdump \ + tcpkill \ + tcpnice \ + timeout \ + tipc \ + tox \ + tracepath \ + tshark \ + tsig-keygen \ + tune2fs \ + _udevadm \ + ulimit \ + _umount \ + _umount.linux \ + unace \ + unpack200 \ + unrar \ + unshunt \ + update-alternatives \ + update-rc.d \ + upgradepkg \ + urlsnarf \ + useradd \ + userdel \ + usermod \ + valgrind \ + vipw \ + vmstat \ + vncviewer \ + vpnc \ + watch \ + webmitm \ + wget \ + wine \ + withlist \ + wodim \ + wol \ + _write \ + wsimport \ + wtf \ + wvdial \ + xdg-mime \ + xdg-settings \ + xfreerdp \ + xgamma \ + xhost \ + _xm \ + xmllint \ + xmlwf \ + xmms \ + xmodmap \ + xrandr \ + xrdb \ + xsltproc \ + xvfb-run \ + xxd \ + xz \ + xzdec \ + ypmatch \ + _yum \ + yum-arch \ + zopfli \ + zopflipng + +EXTRA_DIST = $(bashcomp_DATA) + +CLEANFILES = \ + 7za \ + aclocal-1.10 \ + aclocal-1.11 \ + aclocal-1.12 \ + aclocal-1.13 \ + aclocal-1.14 \ + aclocal-1.15 \ + aclocal-1.16 \ + alpine \ + alternatives \ + animate \ + apropos \ + aptitude-curses \ + arm-koji \ + asciidoc.py \ + autoheader \ + automake-1.10 \ + automake-1.11 \ + automake-1.12 \ + automake-1.13 \ + automake-1.14 \ + automake-1.15 \ + automake-1.16 \ + 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++-5 \ + g++-6 \ + g++-7 \ + g++-8 \ + g4 \ + g77 \ + g95 \ + gcc-5 \ + gcc-6 \ + gcc-7 \ + gcc-8 \ + gccgo \ + gccgo-5 \ + gccgo-6 \ + gccgo-7 \ + gccgo-8 \ + gcj \ + geoiplookup6 \ + gfortran \ + gfortran-5 \ + gfortran-6 \ + gfortran-7 \ + gfortran-8 \ + 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-2 \ + py.test-3 \ + pydoc3 \ + pylint-2 \ + pylint-3 \ + pypy \ + pypy3 \ + pytest-2 \ + pytest-3 \ + python2 \ + python2.7 \ + python3 \ + python3.3 \ + python3.4 \ + python3.5 \ + python3.6 \ + python3.7 \ + python3.8 \ + pyvenv-3.4 \ + pyvenv-3.5 \ + pyvenv-3.6 \ + pyvenv-3.7 \ + pyvenv-3.8 \ + 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 \ + xpovray \ + xvnc4viewer \ + ypcat + +symlinks: $(DATA) + $(ss) 7z \ + 7za + $(ss) aclocal \ + aclocal-1.10 aclocal-1.11 aclocal-1.12 aclocal-1.13 \ + aclocal-1.14 aclocal-1.15 aclocal-1.16 + $(ss) ant \ + phing + $(ss) aptitude \ + aptitude-curses + $(ss) asciidoc \ + asciidoc.py + $(ss) automake \ + automake-1.10 automake-1.11 automake-1.12 automake-1.13 \ + automake-1.14 automake-1.15 automake-1.16 + $(ss) autoreconf \ + autoheader + $(ss) autoscan \ + autoupdate + $(ss) btdownloadheadless.py \ + btdownloadcurses.py btdownloadgui.py + $(ss) bzip2 \ + lbzip2 pbzip2 + $(ss) _cal \ + ncal + $(ss) cardctl \ + pccardctl + $(ss) chromium-browser \ + chrome chromium google-chrome google-chrome-stable + $(ss) complete \ + compgen + $(ss) convert \ + animate compare composite conjure display identify import \ + mogrify montage stream + $(ss) cowsay \ + cowthink + $(ss) dict \ + rdict + $(ss) dpkg \ + dpkg-deb dpkg-query dpkg-reconfigure + $(ss) ether-wake \ + etherwake + $(ss) filesnarf \ + mailsnarf msgsnarf + $(ss) firefox \ + iceweasel mozilla-firefox + $(ss) freeciv \ + civclient freeciv-gtk2 freeciv-gtk3 freeciv-sdl freeciv-xaw + $(ss) freeciv-server \ + civserver + $(ss) function \ + declare typeset + $(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 \ + gfortran gfortran-5 gfortran-6 gfortran-7 gfortran-8 gpc + $(ss) genisoimage \ + mkisofs + $(ss) geoiplookup \ + geoiplookup6 + $(ss) gkrellm \ + gkrellm2 + $(ss) gpgv \ + gpgv2 + $(ss) gzip \ + pigz + $(ss) hcitool \ + ciptool dfutool hciattach hciconfig l2ping rfcomm sdptool + $(ss) _hexdump \ + hd + $(ss) hping2 \ + hping hping3 + $(ss) ifup \ + ifdown ifquery ifstatus + $(ss) info \ + pinfo + $(ss) inotifywait \ + inotifywatch + $(ss) insmod \ + insmod.static + $(ss) iperf \ + iperf3 + $(ss) java \ + javac javadoc + $(ss) koji \ + arm-koji ppc-koji s390-koji sparc-koji + $(ss) ldapsearch \ + ldapadd ldapcompare ldapdelete ldapmodify ldapmodrdn \ + ldappasswd ldapwhoami + $(ss) links \ + links2 + $(ss) lintian \ + lintian-info + $(ss) luseradd \ + lusermod + $(ss) lvm \ + lvchange lvcreate lvdisplay lvextend lvmdiskscan lvreduce \ + lvremove lvrename lvresize lvs lvscan pvchange pvcreate \ + pvdisplay pvmove pvremove pvs pvscan vgcfgbackup vgcfgrestore \ + vgchange vgck vgconvert vgcreate vgdisplay vgexport vgextend \ + vgimport vgmerge vgmknodes vgreduce vgremove vgrename vgs \ + vgscan vgsplit + $(ss) lz4 \ + lz4c + $(ss) lzip \ + clzip pdlzip plzip + $(ss) make \ + bmake colormake gmake gnumake pmake + $(ss) man \ + apropos whatis + $(ss) mcrypt \ + mdecrypt + $(ss) mplayer \ + gmplayer kplayer mencoder mplayer2 + $(ss) mutt \ + muttng + $(ss) nslookup \ + host + $(ss) p4 \ + g4 + $(ss) perl \ + perldoc + $(ss) pine \ + alpine + $(ss) ping \ + ping6 + $(ss) pkg_delete \ + pkg_deinstall pkg_info + $(ss) pgrep \ + pkill + $(ss) pm-hibernate \ + pm-suspend pm-suspend-hybrid + $(ss) psql \ + createdb createuser dropdb dropuser + $(ss) postmap \ + postalias + $(ss) povray \ + spovray xpovray + $(ss) puppet \ + filebucket puppetca puppetd puppetdoc puppetmasterd puppetqd \ + puppetrun ralsh + $(ss) pytest \ + py.test py.test-2 py.test-3 pytest-2 pytest-3 + $(ss) pydoc \ + pydoc3 + $(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 + $(ss) pyvenv \ + pyvenv-3.4 pyvenv-3.5 pyvenv-3.6 pyvenv-3.7 pyvenv-3.8 + $(ss) qdbus \ + dcop + $(ss) qemu \ + qemu-kvm qemu-system-i386 qemu-system-x86_64 + $(ss) quota \ + edquota quotacheck quotaoff quotaon repquota setquota + $(ss) rcs \ + ci co rcsdiff rlog + $(ss) rpm \ + rpmbuild rpmbuild-md5 + $(ss) rpm2tgz \ + rpm2targz rpm2txz + $(ss) smbclient \ + smbcacls smbcquotas smbget smbpasswd smbtar smbtree + $(ss) sbcl \ + sbcl-mt + $(ss) ssh \ + autossh scp sftp sidedoor slogin + $(ss) sudo \ + sudoedit + $(ss) tar \ + bsdtar gtar star + $(ss) tracepath \ + tracepath6 + $(ss) update-alternatives \ + alternatives + $(ss) vipw \ + vigr + $(ss) vncviewer \ + tightvncviewer xvnc4viewer + $(ss) wine \ + wine-development wine-stable + $(ss) wodim \ + cdrecord + $(ss) xz \ + pxz + $(ss) ypmatch \ + ypcat +.PHONY: symlinks + +SETUP_SYMLINKS = $(srcdir)/../setup-symlinks.sh + +all-local: ss = $(SETUP_SYMLINKS) . +all-local: symlinks + +install-data-hook: ss = $(SETUP_SYMLINKS) $(DESTDIR)$(bashcompdir) +install-data-hook: symlinks + +check-local: + ret=0; \ + for file in $(bashcomp_DATA); do \ + $${bashcomp_bash:-$${BASH:-bash}} \ + -O extglob -n $(srcdir)/$$file || ret=$$?; \ + done; \ + exit $$ret diff --git a/completions/_adb b/completions/_adb new file mode 100644 index 0000000..e8ebab1 --- /dev/null +++ b/completions/_adb @@ -0,0 +1,69 @@ +# adb completion -*- shell-script -*- + +# Use of this file is deprecated. Upstream completion is available in +# the Android SDK, use that instead. + +_adb_command_usage() +{ + COMPREPLY=($(compgen -W \ + '$("$1" help 2>&1 | command grep "^ *\(adb \)\? *$2 " \ + | command sed -e "s/[]|[]/\n/g" | _parse_help -)' -- "$cur")) +} + +_adb() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -s | -p | --algo | --key | --iv) + return + ;; + -f) + _filedir + return + ;; + esac + + local cmd i + for ((i = 1; i < cword; i++)); do + if [[ ${words[i]} != -* && ${words[i - 1]} != -[sp] ]]; then + cmd="${words[i]}" + break + fi + done + + if [[ ! -v cmd ]]; then + local tmp=() + if [[ ! $cur || $cur == -* ]]; then + tmp+=($(compgen -W '$(_parse_help "$1" help)' -- "$cur")) + fi + if [[ ! $cur || $cur != -* ]]; then + tmp+=($($1 help 2>&1 | awk '$1 == "adb" { print $2 }')) + tmp+=(devices connect disconnect sideload) + fi + COMPREPLY=($(compgen -W '${tmp[@]}' -- "$cur")) + return + fi + + # TODO: more and better command completions + + _adb_command_usage "$1" $cmd + + case $cmd in + push | restore | sideload) + _filedir + ;; + forward) + COMPREPLY=($(compgen -W \ + '$("$1" help 2>&1 | command sed -ne "s/^ *adb *forward *-/-/p" | \ + _parse_help -)' -- "$cur")) + ;; + reboot) + COMPREPLY=($(compgen -W 'bootloader recovery' -- "$cur")) + ;; + esac +} && + complete -F _adb adb + +# ex: filetype=sh diff --git a/completions/_cal b/completions/_cal new file mode 100644 index 0000000..1eec267 --- /dev/null +++ b/completions/_cal @@ -0,0 +1,38 @@ +# cal(1) completion -*- shell-script -*- + +# Use of this file is deprecated on Linux. Upstream completion is +# available in util-linux >= 2.23, use that instead. + +_cal() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -m) + if [[ $OSTYPE == *bsd* ]]; then + COMPREPLY=($(compgen -W '{1..12}' -- "$cur")) + return + fi + ;; + -s) + [[ $OSTYPE == *bsd* ]] && return + ;; + -A | -B | -d | -H) + return + ;; + esac + + if [[ $cur == -* ]]; then + local opts=$(_parse_help "$1") + COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + return + fi + + local args + _count_args + ((args == 1)) && COMPREPLY=($(compgen -W '{1..12}' -- "$cur")) +} && + complete -F _cal cal ncal + +# ex: filetype=sh diff --git a/completions/_chfn b/completions/_chfn new file mode 100644 index 0000000..334967f --- /dev/null +++ b/completions/_chfn @@ -0,0 +1,8 @@ +# chfn(1) completion -*- shell-script -*- + +# Use of this file is deprecated on Linux. Upstream completion is +# available in util-linux >= 2.23, use that instead. + +complete -u chfn + +# ex: filetype=sh diff --git a/completions/_chsh b/completions/_chsh new file mode 100644 index 0000000..8f8a807 --- /dev/null +++ b/completions/_chsh @@ -0,0 +1,31 @@ +# 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. + +_chsh() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --list-shells | --help | -v | --version) + return + ;; + -s | --shell) + _shells + return + ;; + esac + + if [[ $cur == -* ]]; then + local opts=$(_parse_help "$1") + COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + else + _allowed_users + fi + +} && + complete -F _chsh chsh + +# ex: filetype=sh diff --git a/completions/_dmesg b/completions/_dmesg new file mode 100644 index 0000000..8306654 --- /dev/null +++ b/completions/_dmesg @@ -0,0 +1,33 @@ +# dmesg(1) completion -*- shell-script -*- + +# Use of this file is deprecated on Linux. Upstream completion is +# available in util-linux >= 2.23, use that instead. + +_dmesg() +{ + [[ $OSTYPE == *solaris* ]] && return # no args there + + local cur prev words cword + _init_completion || 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")) + return + ;; + -l | --level | -n | --console-level) + COMPREPLY=($(compgen -W '{1..8}' -- "$cur")) + return + ;; + esac + + local opts=$(_parse_help "$1") + COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) +} && + complete -F _dmesg dmesg + +# ex: filetype=sh diff --git a/completions/_eject b/completions/_eject new file mode 100644 index 0000000..52168f7 --- /dev/null +++ b/completions/_eject @@ -0,0 +1,33 @@ +# bash completion for eject(1) -*- shell-script -*- + +# Use of this file is deprecated on Linux. Upstream completion is +# available in util-linux >= 2.23, use that instead. + +_eject() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -h | --help | -V | --version | -c | --changerslot | -x | --cdspeed) + return + ;; + -a | --auto | -i | --manualeject) + COMPREPLY=($(compgen -W 'on off' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + elif [[ $prev == @(-d|--default) ]]; then + return + fi + + _cd_devices + _dvd_devices +} && + complete -F _eject eject + +# ex: filetype=sh diff --git a/completions/_hexdump b/completions/_hexdump new file mode 100644 index 0000000..785f597 --- /dev/null +++ b/completions/_hexdump @@ -0,0 +1,31 @@ +# hexdump(1) completion -*- shell-script -*- + +# Use of this file is deprecated on Linux. Upstream completion is +# available in util-linux >= 2.23, use that instead. + +_hexdump() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -V | -e | -n | -s) + return + ;; + -f) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + local opts="$(_parse_help "$1")" + COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + return + fi + + _filedir +} && + complete -F _hexdump hexdump hd + +# ex: filetype=sh diff --git a/completions/_hwclock b/completions/_hwclock new file mode 100644 index 0000000..ef437a2 --- /dev/null +++ b/completions/_hwclock @@ -0,0 +1,26 @@ +# hwclock(8) completion -*- shell-script -*- + +# Use of this file is deprecated. Upstream completion is available in +# util-linux >= 2.23, use that instead. + +_hwclock() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -h | --help | -V | --version | --date | --epoch) + return + ;; + -f | --rtc | --adjfile) + _filedir + return + ;; + esac + + COMPREPLY=( + $(PATH="$PATH:/sbin" compgen -W '$(_parse_help "$1")' -- "$cur")) +} && + complete -F _hwclock hwclock + +# ex: filetype=sh diff --git a/completions/_ionice b/completions/_ionice new file mode 100644 index 0000000..b0d96a1 --- /dev/null +++ b/completions/_ionice @@ -0,0 +1,60 @@ +# ionice(1) completion -*- shell-script -*- + +# Use of this file is deprecated. Upstream completion is available in +# util-linux >= 2.23, use that instead. + +_ionice() +{ + local cur prev words cword + _init_completion || return + + local offset=0 i + for ((i = 1; i <= cword; i++)); do + case ${words[i]} in + -h) + return + ;; + -p) + offset=0 + break + ;; + -c | -n) + ((i++)) + continue + ;; + -*) + continue + ;; + esac + offset=$i + break + done + + if ((offset > 0)); then + _command_offset $offset + return + fi + + case $prev in + -c) + COMPREPLY=($(compgen -W '{0..3}' -- "$cur")) + return + ;; + -n) + COMPREPLY=($(compgen -W '{0..7}' -- "$cur")) + return + ;; + -p) + _pids + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + return + fi +} && + complete -F _ionice ionice + +# ex: filetype=sh diff --git a/completions/_look b/completions/_look new file mode 100644 index 0000000..9788dec --- /dev/null +++ b/completions/_look @@ -0,0 +1,17 @@ +# look(1) completion -*- shell-script -*- + +# Use of this file is deprecated on Linux. Upstream completion is +# available in util-linux >= 2.23, use that instead. + +_look() +{ + local cur prev words cword + _init_completion || return + + if ((cword == 1)); then + COMPREPLY=($(compgen -W '$(look "$cur" 2>/dev/null)' -- "$cur")) + fi +} && + complete -F _look -o default look + +# ex: filetype=sh diff --git a/completions/_mock b/completions/_mock new file mode 100644 index 0000000..b468148 --- /dev/null +++ b/completions/_mock @@ -0,0 +1,69 @@ +# bash completion for mock -*- shell-script -*- + +# Use of this file is deprecated. Upstream completion is available in +# mock > 1.1.0, use that instead. + +_mock() +{ + local cur prev words cword split + _init_completion -s || return + + local plugins='tmpfs root_cache yum_cache bind_mount ccache' + local cfgdir=/etc/mock count=0 i + + for i in "${words[@]}"; do + ((count == cword)) && break + if [[ $i == --configdir ]]; then + cfgdir="${words[count + 1]}" + elif [[ $i == --configdir=* ]]; then + cfgdir=${i/*=/} + fi + ((count++)) + done + + case $prev in + -h | --help | --copyin | --copyout | --arch | -D | --define | --with | --without | \ + --uniqueext | --rpmbuild_timeout | --sources | --cwd) + return + ;; + -r | --root) + COMPREPLY=($(compgen -W "$(command ls $cfgdir)" -- "$cur")) + COMPREPLY=(${COMPREPLY[@]/%.cfg/}) + return + ;; + --configdir | --resultdir) + _filedir -d + return + ;; + --spec) + _filedir spec + return + ;; + --target) + # 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")) + return + ;; + --enable-plugin | --disable-plugin) + COMPREPLY=($(compgen -W "$plugins" -- "$cur")) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + else + _filedir '@(?(no)src.r|s)pm' + fi +} && + complete -F _mock mock + +# ex: filetype=sh diff --git a/completions/_modules b/completions/_modules new file mode 100644 index 0000000..4f7c4d4 --- /dev/null +++ b/completions/_modules @@ -0,0 +1,85 @@ +# module completion by Ted Stern -*- shell-script -*- +# +# Use of this file is deprecated, upstream completion is available in +# modules >= 3.2.7, use that instead. +# +# Completion for Environment Modules `module' alias. +# +# See https://sourceforge.net/projects/modules/ +# https://modules.sourceforge.net/ +# +# There are several versions of modules that are commonly used. Older +# Cray UNICOS systems and many other sites use 2.2.2b. The latest GPL'd +# version is 3.1.6. But the module alias is somewhat self-documenting +# via the `module help' command, so use that to print the options. +# +# Programmable completion might be more difficult under tcsh since the +# module command is an alias, and the `module avail' command returns +# its output as stderr. + +# 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 + +_module_list() +{ + local modules="$(command sed 's/:/ /g' <<<$LOADEDMODULES | sort)" + compgen -W "$modules" -- $1 +} + +_module_path() +{ + local modules="$(command sed 's/:/ /g' <<<$MODULEPATH | sort)" + compgen -W "$modules" -- $1 +} + +_module_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 +} + +# A completion function for the module alias +_module() +{ + local cur prev words cword + _init_completion || 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)" + + COMPREPLY=($(compgen -W "$options" -- "$cur")) + + elif ((cword == 2)); then + case $prev in + add | display | help | load | show | whatis) + COMPREPLY=($(_module_avail "$cur")) + ;; + rm | switch | swap | unload | update) + COMPREPLY=($(_module_list "$cur")) + ;; + unuse) + COMPREPLY=($(_module_path "$cur")) + ;; + esac + elif ((cword == 3)); then + case ${words[1]} in + swap | switch) + COMPREPLY=($(_module_avail "$cur")) + ;; + esac + fi + +} && + complete -F _module -o default module + +# ex: filetype=sh diff --git a/completions/_mount b/completions/_mount new file mode 100644 index 0000000..85f5490 --- /dev/null +++ b/completions/_mount @@ -0,0 +1,65 @@ +# mount(8) completion -*- shell-script -*- + +# Use of this file is deprecated on Linux. Upstream completion is +# available in util-linux >= 2.28, use that instead. + +if [[ $OSTYPE == *linux* ]]; then + . "$BASH_SOURCE.linux" + return +fi + +# This will pull a list of possible mounts out of +# /etc/{,v}fstab, unless the word being completed contains a ':', which +# would indicate the specification of an NFS server. In that case, we +# query the server for a list of all available exports and complete on +# that instead. +# +_mount() +{ + local cur prev words cword + _init_completion -n : || return + + local sm host + + case $prev in + -t | --types) + _fstypes + return + ;; + esac + + [[ $cur == \\ ]] && cur="/" + + 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#*:}")) + return + done + fi + + if [[ $cur == //* ]]; then + host=${cur#//} + host=${host%%/*} + if [[ -n $host ]]; then + COMPREPLY=($(compgen -P "//$host" -W \ + "$(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}")) + fi + elif [[ -r /etc/vfstab ]]; then + # Solaris + COMPREPLY=($(compgen -W "$(awk '! /^[ \t]*#/ {if ($3 ~ /\//) print $3}' /etc/vfstab)" -- "$cur")) + elif [[ ! -e /etc/fstab ]]; then + # probably Cygwin + COMPREPLY=($(compgen -W "$($1 | awk '! /^[ \t]*#/ {if ($3 ~ /\//) print $3}')" -- "$cur")) + else + # probably BSD + COMPREPLY=($(compgen -W "$(awk '! /^[ \t]*#/ {if ($2 ~ /\//) print $2}' /etc/fstab)" -- "$cur")) + fi +} && + complete -F _mount -o default -o dirnames mount + +# ex: filetype=sh diff --git a/completions/_mount.linux b/completions/_mount.linux new file mode 100644 index 0000000..f40865e --- /dev/null +++ b/completions/_mount.linux @@ -0,0 +1,252 @@ +# mount(8) completion -*- shell-script -*- + +# Use of this file is deprecated on Linux. Upstream completion is +# available in util-linux >= 2.28, use that instead. + +_mount() +{ + local cur prev words cword + _init_completion -n =: || return + + local split=false + case "$prev" in + -t | --types) + # find /lib/modules/$(uname -r)/ -type f -path '*/fs/*.ko' -printf '%f\n' | cut -d. -f1 + # FIXME: no + if [[ $cur == ?*,* ]]; then + prev="${cur%,*}" + cur="${cur##*,}" + split=true + 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,}) + return + ;; + --bind | -B | --rbind | -R) + _filedir -d + return + ;; + -p | --pass-fd) + COMPREPLY=($(compgen -W '{0..9}')) + compopt -o nospace + return + ;; + -L) + COMPREPLY=($( + cd "/dev/disk/by-label/" 2>/dev/null || return + compgen -f -- "$cur" + )) + return + ;; + -U) + COMPREPLY=($( + cd "/dev/disk/by-uuid/" 2>/dev/null || return + compgen -f -- "$cur" + )) + return + ;; + -O | --test-opts) + # argument required but no completions available + return + ;; + -o | --options) + local fstype=auto # default fstype + for ((i = ${#words[@]} - 1; i > 0; i--)); do + if [[ ${words[i]} == -@(t|-types)* ]]; then + if [[ ${words[i]} == *=* ]]; then + [[ ${words[i]} == ?*,* ]] && break + fstype="${words[i]#-*=}" + else + [[ ${words[i + 1]} == ?*,* ]] && break + fstype="${words[i + 1]}" + fi + break + fi + done + # no is not a real fstype, reset to "auto" + [[ $fstype == no?* ]] && fstype=auto + # split options list + if [[ $cur == ?*,* ]]; then + prev="${cur%,*}" + cur="${cur##*,}" + split=true + fi + # no completion if $cur is opt=smth + [[ $cur == *=* ]] && return + # mount options + COMPREPLY=($(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")) + case "$fstype" in + adfs | auto) + COMPREPLY+=($(compgen -W '{u,g}id= {own,oth}mask=' -- "$cur")) + ;;& + 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")) + ;;& + 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")) + ;;& + 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")) + ;;& + davfs | auto) + COMPREPLY+=($(compgen -W 'conf= {file,dir}_mode= {u,g}id= + username=' -- "$cur")) + ;;& + 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")) + ;;& + ext[34] | auto) + COMPREPLY+=($(compgen -W 'journal= journal_dev= norecovery + noload data= barrier= commit=' -- "$cur")) + ;;& + 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")) + ;;& + 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")) + ;;& + vfat | auto) + COMPREPLY+=($(compgen -W 'uni_xlate posix nonumtail utf8 + shortname=' -- "$cur")) + ;;& + iso9660 | auto) + COMPREPLY+=($(compgen -W 'norock nojoliet check= {u,g}id= map= + mode= unhide block= conv= cruft session= sbsector= + iocharset= utf8' -- "$cur")) + ;;& + jffs2 | auto) + COMPREPLY+=($(compgen -W 'compr= rp_size=' -- "$cur")) + ;;& + jfs | auto) + COMPREPLY+=($(compgen -W 'iocharset= resize= {,no}integrity + errors= {,no,usr,grp}quota' -- "$cur")) + ;;& + 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")) + ;;& + nfs | auto) + COMPREPLY+=($(compgen -W 'udp tcp rdma mount{port,proto,host}= + mountvers= namlen={,no}lock {,no}acl {,no}rdirplus + {,no}fsc' -- "$cur")) + ;;& + nfs4 | auto) + COMPREPLY+=($(compgen -W 'clientaddr= {,no}migration' \ + -- "$cur")) + ;;& + 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")) + ;;& + proc | auto) + COMPREPLY+=($(compgen -W '{u,g}id=' -- "$cur")) + ;;& + reiserfs | auto) + COMPREPLY+=($(compgen -W 'conv hash= {,no_un}hashed_relocation + noborder nolog notail replayonly resize= user_xattr acl + barrier=' -- "$cur")) + ;;& + tmpfs | auto) + COMPREPLY+=($(compgen -W 'size= nr_blocks= nr_inodes= mode= + {u,g}id= mpol=' -- "$cur")) + ;;& + udf | auto) + COMPREPLY+=($(compgen -W '{u,g}id= umask= unhide undelete + nostrict iocharset bs= novrs session= anchor= volume= + partition= lastblock= fileset= rootdir=' -- "$cur")) + ;;& + usbfs | auto) + COMPREPLY+=($(compgen -W 'dev{u,g}id= devmode= bus{u,g}id= + busmode= list{u,g}id= listmode=' -- "$cur")) + ;;& + 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")) + ;;& + esac + # COMP_WORDBREAKS is a real pain in the ass + prev="${prev##*[$COMP_WORDBREAKS]}" + $split && COMPREPLY=(${COMPREPLY[@]/#/"$prev,"}) + [[ ${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 + --read-only --rw -L -U --types --test-opts --options --bind --rbind + --move' -- "$cur")) + [[ ${COMPREPLY-} ]] && return + fi + + [[ $cur == \\ ]] && cur="/" + + local sm host + + 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#*:}")) + return + done + fi + + if [[ $cur == //* ]]; then + host=${cur#//} + host=${host%%/*} + if [[ -n $host ]]; then + COMPREPLY=($(compgen -P "//$host" -W \ + "$(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}")) + fi + fi + + _filedir +} && + complete -F _mount mount + +# ex: filetype=sh diff --git a/completions/_newgrp b/completions/_newgrp new file mode 100644 index 0000000..a2dc3ed --- /dev/null +++ b/completions/_newgrp @@ -0,0 +1,19 @@ +# newgrp(1) completion -*- shell-script -*- + +# Use of this file is deprecated on Linux. Upstream completion is +# available in util-linux >= 2.23, use that instead. + +_newgrp() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == "-" ]]; then + COMPREPLY=(-) + else + _allowed_groups "$cur" + fi +} && + complete -F _newgrp newgrp + +# ex: filetype=sh diff --git a/completions/_nmcli b/completions/_nmcli new file mode 100644 index 0000000..eac285b --- /dev/null +++ b/completions/_nmcli @@ -0,0 +1,201 @@ +# nmcli completion -*- shell-script -*- + +# Use of this file is deprecated. Upstream completion is available in +# NetworkManager >= 0.9.8.0, use that instead. + +_nmcli_list() +{ + COMPREPLY=($(compgen -W '$1' -- "$cur")) +} + +_nmcli_con_id() +{ + local IFS=$'\n' + COMPREPLY=($(compgen -W "$(nmcli con list 2>/dev/null | + tail -n +2 | awk -F ' {2,}' '{print $1 }')" -- "$cur")) +} + +_nmcli_con_uuid() +{ + COMPREPLY=($(compgen -W "$(nmcli con list 2>/dev/null | + tail -n +2 | awk -F ' {2,}' '{print $2}')" -- "$cur")) +} + +_nmcli_ap_ssid() +{ + local IFS=$'\n' + COMPREPLY=($(compgen -W "$(nmcli dev wifi list 2>/dev/null | + tail -n +2 | awk -F ' {2,}' '{print $1}')" -- "$cur")) +} + +_nmcli_ab_bssid() +{ + 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 + + case $prev in + -m | --mode) + COMPREPLY=($(compgen -W 'tabular multiline' -- "$cur")) + return + ;; + -f | --fields) + COMPREPLY=($(compgen -W 'all common' -- "$cur")) + return + ;; + -e | --escape) + _nmcli_list "yes no" + return + ;; + id) + _nmcli_con_id + return + ;; + uuid) + _nmcli_con_uuid + return + ;; + iface) + _available_interfaces + return + ;; + bssid) + _nmcli_ab_bssid + return + ;; + wep-key-type) + _nmcli_list "key phrase" + return + ;; + esac + + if ((cword == 1)); then + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--terse --pretty --mode --fields + --escape --version --help' -- "$cur")) + else + COMPREPLY=($(compgen -W "nm con dev" -- "$cur")) + fi + else + local object=${words[1]} + local command=${words[2]} + + case $object in + nm) + case $command in + enable) + _nmcli_list "true false" + return + ;; + sleep) + _nmcli_list "true false" + return + ;; + wifi) + _nmcli_list "on off" + return + ;; + wwan) + _nmcli_list "on off" + return + ;; + wimax) + _nmcli_list "on off" + return + ;; + esac + + COMPREPLY=($(compgen -W 'status permissions enable sleep + wifi wwan wimax' -- "$cur")) + ;; + con) + case $command in + list) + COMPREPLY=($(compgen -W 'id uuid' -- "$cur")) + return + ;; + up) + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--nowait --timeout' \ + -- "$cur")) + else + COMPREPLY=($(compgen -W 'id uuid iface ap nsp' \ + -- "$cur")) + fi + return + ;; + down) + COMPREPLY=($(compgen -W 'id uuid' -- "$cur")) + return + ;; + delete) + COMPREPLY=($(compgen -W 'id uuid' -- "$cur")) + return + ;; + esac + + COMPREPLY=($(compgen -W 'list status up down delete' \ + -- "$cur")) + ;; + dev) + case $command in + list) + COMPREPLY=($(compgen -W 'iface' -- "$cur")) + return + ;; + disconnect) + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--nowait --timeout' \ + -- "$cur")) + else + COMPREPLY=($(compgen -W 'iface' -- "$cur")) + fi + return + ;; + wifi) + local subcommand=${words[3]} + + case $subcommand in + list) + COMPREPLY=($(compgen -W 'iface bssid' \ + -- "$cur")) + return + ;; + connect) + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--private + --nowait --timeout' -- "$cur")) + else + if [[ $prev == "connect" ]]; then + _nmcli_ap_ssid + else + COMPREPLY=($(compgen -W 'password + wep-key-type iface bssid name' \ + -- "$cur")) + fi + fi + return + ;; + esac + + COMPREPLY=($(compgen -W 'list connect' -- "$cur")) + return + ;; + esac + + COMPREPLY=($(compgen -W 'status list disconnect wifi' \ + -- "$cur")) + ;; + esac + + fi + +} && + complete -F _nmcli nmcli + +# ex: filetype=sh diff --git a/completions/_renice b/completions/_renice new file mode 100644 index 0000000..a416744 --- /dev/null +++ b/completions/_renice @@ -0,0 +1,32 @@ +# renice(8) completion -*- shell-script -*- + +# Use of this file is deprecated on Linux. Upstream completion is +# available in util-linux >= 2.23, use that instead. + +_renice() +{ + local cur prev words cword + _init_completion || return + + local command=$1 curopt i=0 + + # walk back through command line and find last option + while ((i <= cword && ${#COMPREPLY[@]} == 0)); do + curopt=${words[cword - i]} + case "$curopt" in + -u) + _allowed_users + ;; + -g) + _pgids + ;; + -p | "$command") + _pids + ;; + esac + ((i++)) + done +} && + complete -F _renice renice + +# ex: filetype=sh diff --git a/completions/_repomanage b/completions/_repomanage new file mode 100644 index 0000000..ba0787e --- /dev/null +++ b/completions/_repomanage @@ -0,0 +1,24 @@ +# bash completion for repomanage -*- shell-script -*- + +# Use of this file is deprecated. Upstream completion is available in +# yum-utils >= 1.1.24, use that instead. + +_repomanage() +{ + local cur prev words cword split + _init_completion -s || return + + [[ $prev == -@([hk]|-help|-keep) ]] && return + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + else + _filedir -d + fi +} && + complete -F _repomanage repomanage + +# ex: filetype=sh diff --git a/completions/_reptyr b/completions/_reptyr new file mode 100644 index 0000000..01d61b2 --- /dev/null +++ b/completions/_reptyr @@ -0,0 +1,26 @@ +# bash completion for reptyr(1) -*- shell-script -*- + +# Use of this file is deprecated. Upstream completion is available in +# reptyr > 0.6.2, use that instead. + +_reptyr() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -l) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + [[ $prev != +([0-9]) ]] && _pids +} && + complete -F _reptyr reptyr + +# ex: filetype=sh diff --git a/completions/_rfkill b/completions/_rfkill new file mode 100644 index 0000000..96a6c09 --- /dev/null +++ b/completions/_rfkill @@ -0,0 +1,31 @@ +# bash completion for rfkill -*- shell-script -*- + +# Use of this file is deprecated on systems with util-linux >= 2.31, which +# ships completion for the rfkill included with it. + +_rfkill() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--version' -- "$cur")) + else + case $cword in + 1) + COMPREPLY=($(compgen -W "help event list block unblock" \ + -- "$cur")) + ;; + 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")) + fi + ;; + esac + fi +} && + complete -F _rfkill rfkill + +# ex: filetype=sh diff --git a/completions/_rtcwake b/completions/_rtcwake new file mode 100644 index 0000000..4ca452d --- /dev/null +++ b/completions/_rtcwake @@ -0,0 +1,32 @@ +# bash completion for rtcwake -*- shell-script -*- + +# Use of this file is deprecated. Upstream completion is available in +# util-linux >= 2.23, use that instead. + +_rtcwake() +{ + local cur prev words cword split + _init_completion -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")) + return + ;; + --device | -d) + COMPREPLY=($(command ls -d /dev/rtc?* 2>/dev/null)) + COMPREPLY=($(compgen -W '${COMPREPLY[@]#/dev/}' -- "$cur")) + return + ;; + esac + + $split && return + + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) +} && + complete -F _rtcwake rtcwake + +# ex: filetype=sh diff --git a/completions/_runuser b/completions/_runuser new file mode 100644 index 0000000..95cf930 --- /dev/null +++ b/completions/_runuser @@ -0,0 +1,8 @@ +# runuser(1) completion -*- shell-script -*- + +# Use of this file is deprecated on Linux. Upstream completion is +# available in util-linux >= 2.23, use that instead. + +complete -u runuser + +# ex: filetype=sh diff --git a/completions/_su b/completions/_su new file mode 100644 index 0000000..1a03c8f --- /dev/null +++ b/completions/_su @@ -0,0 +1,41 @@ +# bash completion for su(1) -*- shell-script -*- + +# Use of this file is deprecated on Linux. Upstream completion is +# available in util-linux >= 2.23, use that instead. + +if [[ $OSTYPE != *linux* ]]; then + complete -u su # default completion + return +fi + +_su() +{ # linux-specific completion + local cur prev words cword split + _init_completion -s || return + + case "$prev" in + -s | --shell) + _shells + return + ;; + -c | --command | --session-command) + local IFS=$'\n' + compopt -o filenames + COMPREPLY=($(compgen -d -c -- "$cur")) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" --help)' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + COMPREPLY=($(compgen -u -- "$cur")) +} && + complete -F _su su + +# ex: filetype=sh diff --git a/completions/_svn b/completions/_svn new file mode 100644 index 0000000..5d85c2b --- /dev/null +++ b/completions/_svn @@ -0,0 +1,210 @@ +# svn completion -*- shell-script -*- + +# Use of this file is deprecated. Upstream completion is available in +# subversion >= 0.12.0, use that instead. + +_svn() +{ + local cur prev words cword + _init_completion || return + + local commands + commands='add blame praise annotate ann cat checkout co cleanup commit \ + ci copy cp delete del remove rm diff di export help ? h import \ + info list ls lock log merge mkdir move mv rename ren \ + propdel pdel pd propedit pedit pe propget pget pg \ + proplist plist pl propset pset ps resolved revert \ + status stat st switch sw unlock update up' + + if ((cword == 1)); then + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--version' -- "$cur")) + else + COMPREPLY=($(compgen -W "$commands" -- "$cur")) + fi + else + + case $prev in + --config-dir) + _filedir -d + return + ;; + -F | --file | --targets) + _filedir + return + ;; + --encoding) + _xfunc iconv _iconv_charsets + return + ;; + --editor-cmd | --diff-cmd | --diff3-cmd) + compopt -o filenames + COMPREPLY=($(compgen -c -- "$cur")) + return + ;; + esac + + local command=${words[1]} + + if [[ $cur == -* ]]; then + # possible options for the command + local options + case $command in + add) + options='--auto-props --no-auto-props --force --targets + --no-ignore --non-recursive --quiet' + ;; + blame | annotate | ann | praise) + options='--revision --username --password --no-auth-cache + --non-interactive --verbose --incremental --xml' + ;; + cat) + options='--revision --username --password --no-auth-cache + --non-interactive' + ;; + checkout | co) + options='--revision --quiet --non-recursive --username + --password --no-auth-cache --non-interactive + --ignore-externals' + ;; + cleanup) + options='--diff3-cmd' + ;; + commit | ci) + options='--message --file --encoding --force-log --quiet + --non-recursive --targets --editor-cmd --username + --password --no-auth-cache --non-interactive + --no-unlock' + ;; + copy | cp) + options='--message --file --encoding --force-log --revision + --quiet --editor-cmd -username --password + --no-auth-cache --non-interactive' + ;; + delete | del | remove | rm) + options='--force --message --file --encoding --force-log + --quiet --targets --editor-cmd --username + --password --no-auth-cache --non-interactive' + ;; + diff | di) + options='--revision --extensions --diff-cmd + --no-diff-deleted --non-recursive --username + --password --no-auth-cache --non-interactive + --force --old --new --notice-ancestry' + ;; + export) + options='--revision --quiet --username --password + --no-auth-cache --non-interactive --non-recursive + --force --native-eol --ignore-externals' + ;; + import) + options='--auto-props --no-auto-props --message --file + --encoding --force-log --quiet --non-recursive + --no-ignore --editor-cmd --username --password + --no-auth-cache --non-interactive' + ;; + info) + options='--username --password --no-auth-cache + --non-interactive --revision --xml --targets + --recursive --incremental' + ;; + list | ls) + options='--revision --verbose --recursive --username + --password --no-auth-cache --non-interactive + --incremental --xml' + ;; + lock) + options='--message --file --encoding --force-log --targets + --force --username --password --no-auth-cache + --non-interactive' + ;; + log) + options='--revision --verbose --targets --username + --password --no-auth-cache --non-interactive + --stop-on-copy --incremental --xml --quiet + --limit' + ;; + merge) + options='--revision --non-recursive --quiet --force + --dry-run --diff3-cmd --username --password + --no-auth-cache --non-interactive + --ignore-ancestry' + ;; + mkdir) + options='--message --file --encoding --force-log --quiet + --editor-cmd --username --password --no-auth-cache + --non-interactive' + ;; + move | mv | rename | ren) + options='--message --file --encoding --force-log --revision + --quiet --force --editor-cmd --username --password + --no-auth-cache --non-interactive' + ;; + propdel | pdel | pd) + options='--quiet --recursive --revision --revprop + --username --password --no-auth-cache + --non-interactive' + ;; + propedit | pedit | pe) + options='--revision --revprop --encoding --editor-cmd + --username --password --no-auth-cache + --non-interactive --force' + ;; + propget | pget | pg) + options='--recursive --revision --revprop --strict + --username --password --no-auth-cache + --non-interactive' + ;; + proplist | plist | pl) + options='--verbose --recursive --revision --revprop --quiet + --username --password --no-auth-cache + --non-interactive' + ;; + propset | pset | ps) + options='--file --quiet --targets --recursive --revprop + --encoding --username --password --no-auth-cache + --non-interactive --revision --force' + ;; + resolved) + options='--targets --recursive --quiet' + ;; + revert) + options='--targets --recursive --quiet' + ;; + status | stat | st) + options='--show-updates --verbose --non-recursive --quiet + --username --password --no-auth-cache + --non-interactive --no-ignore --ignore-externals + --incremental --xml' + ;; + switch | sw) + options='--relocate --revision --non-recursive --quiet + --username --password --no-auth-cache + --non-interactive --diff3-cmd' + ;; + unlock) + options='--targets --force --username --password + --no-auth-cache --non-interactive' + ;; + update | up) + options='--revision --non-recursive --quiet --username + --password --no-auth-cache --non-interactive + --diff3-cmd --ignore-externals' + ;; + esac + options+=" --help --config-dir" + + COMPREPLY=($(compgen -W "$options" -- "$cur")) + else + if [[ $command == @(help|[h?]) ]]; then + COMPREPLY=($(compgen -W "$commands" -- "$cur")) + else + _filedir + fi + fi + fi + +} && + complete -F _svn svn + +# ex: filetype=sh diff --git a/completions/_svnadmin b/completions/_svnadmin new file mode 100644 index 0000000..654fd3e --- /dev/null +++ b/completions/_svnadmin @@ -0,0 +1,78 @@ +# svnadmin completion -*- shell-script -*- + +# Use of this file is deprecated. Upstream completion is available in +# subversion >= 0.12.0, use that instead. + +_svnadmin() +{ + local cur prev words cword + _init_completion || return + + local commands + commands='create deltify dump help ? hotcopy list-dblogs list-unused-dblogs + load lslocks lstxns recover rmlocks rmtxns setlog verify' + + if ((cword == 1)); then + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--version' -- "$cur")) + else + COMPREPLY=($(compgen -W "$commands" -- "$cur")) + fi + else + case $prev in + --config-dir) + _filedir -d + return + ;; + --fs-type) + COMPREPLY=($(compgen -W 'fsfs bdb' -- "$cur")) + return + ;; + esac + + local command=${words[1]} + + if [[ $cur == -* ]]; then + # possible options for the command + local options + case $command in + create) + options='--bdb-txn-nosync --bdb-log-keep --config-dir + --fs-type' + ;; + deltify) + options='--revision --quiet' + ;; + dump) + options='--revision --incremental --quiet --deltas' + ;; + hotcopy) + options='--clean-logs' + ;; + load) + options='--ignore-uuid --force-uuid --parent-dir --quiet + --use-pre-commit-hook --use-post-commit-hook' + ;; + rmtxns) + options='--quiet' + ;; + setlog) + options='--revision --bypass-hooks' + ;; + esac + + options+=" --help" + COMPREPLY=($(compgen -W "$options" -- "$cur")) + else + if [[ $command == @(help|[h?]) ]]; then + COMPREPLY=($(compgen -W "$commands" -- "$cur")) + else + _filedir + fi + fi + fi + +} && + complete -F _svnadmin -o default svnadmin + +# ex: filetype=sh diff --git a/completions/_svnlook b/completions/_svnlook new file mode 100644 index 0000000..36188a5 --- /dev/null +++ b/completions/_svnlook @@ -0,0 +1,63 @@ +# svnlook completion -*- shell-script -*- + +# Use of this file is deprecated. Upstream completion is available in +# subversion >= 0.12.0, use that instead. + +_svnlook() +{ + local cur prev words cword + _init_completion || return + + local commands + commands='author cat changed date diff dirs-changed help ? h history info + lock log propget pget pg proplist plist pl tree uuid youngest' + + if ((cword == 1)); then + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--version' -- "$cur")) + else + COMPREPLY=($(compgen -W "$commands" -- "$cur")) + fi + else + local command=${words[1]} + + if [[ $cur == -* ]]; then + # possible options for the command + local options + case $command in + author | cat | date | dirs-changed | info | log) + options='--revision --transaction' + ;; + changed) + options='--revision --transaction --copy-info' + ;; + diff) + options='--revision --transaction --no-diff-deleted + --no-diff-added --diff-copy-from' + ;; + history) + options='--revision --show-ids' + ;; + propget | proplist) + options='--revision --transaction --revprop' + ;; + tree) + options='--revision --transaction --show-ids --full-paths' + ;; + esac + + options+=" --help" + COMPREPLY=($(compgen -W "$options" -- "$cur")) + else + if [[ $command == @(help|[h?]) ]]; then + COMPREPLY=($(compgen -W "$commands" -- "$cur")) + else + _filedir + fi + fi + fi + +} && + complete -F _svnlook -o default svnlook + +# ex: filetype=sh diff --git a/completions/_udevadm b/completions/_udevadm new file mode 100644 index 0000000..19624be --- /dev/null +++ b/completions/_udevadm @@ -0,0 +1,77 @@ +# udevadm(8) completion -*- shell-script -*- + +# Use of this file is deprecated. Upstream completion is available in +# systemd >= 196, use that instead. + +_udevadm() +{ + local cur prev words cword split + _init_completion -s || return + + local i udevcmd + for ((i = 1; i < cword; i++)); do + if [[ ${words[i]} != -* ]]; then + udevcmd=${words[i]} + 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) + return + ;; + --log-priority) + COMPREPLY=($(compgen -W 'err info debug' -- "$cur")) + return + ;; + --query) + COMPREPLY=($(compgen -W 'name symlink path property all' \ + -- "$cur")) + return + ;; + --name) + cur=${cur:=/dev/} + _filedir + return + ;; + --device-id-of-file | --exit-if-exists) + _filedir + return + ;; + --action) + COMPREPLY=($(compgen -W 'add change remove' -- "$cur")) + return + ;; + --type) + COMPREPLY=($(compgen -W 'devices subsystems failed' -- "$cur")) + return + ;; + esac + + $split && return + + if [[ ! -v udevcmd ]]; then + case $cur in + -*) + COMPREPLY=($(compgen -W '--help --version --debug' -- "$cur")) + ;; + *) + COMPREPLY=($(compgen -W "$("$1" --help 2>/dev/null | + awk '/^[ \t]/ { print $1 }')" -- "$cur")) + ;; + esac + return + fi + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W \ + '$("$1" ${udevcmd-} --help 2>/dev/null | _parse_help -)' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + fi +} && + complete -F _udevadm udevadm + +# ex: filetype=sh diff --git a/completions/_umount b/completions/_umount new file mode 100644 index 0000000..36d5703 --- /dev/null +++ b/completions/_umount @@ -0,0 +1,24 @@ +# umount(8) completion -*- shell-script -*- + +# Use of this file is deprecated on Linux. Upstream completion is +# available in util-linux >= 2.28, use that instead. + +if [[ $OSTYPE == *linux* ]]; then + . "$BASH_SOURCE.linux" + return +fi + +# umount(8) completion. This relies on the mount point being the third +# space-delimited field in the output of mount(8) +# +_umount() +{ + local cur prev words cword + _init_completion || return + + local IFS=$'\n' + COMPREPLY=($(compgen -W '$(mount | cut -d" " -f 3)' -- "$cur")) +} && + complete -F _umount -o dirnames umount + +# ex: filetype=sh diff --git a/completions/_umount.linux b/completions/_umount.linux new file mode 100644 index 0000000..cf8a259 --- /dev/null +++ b/completions/_umount.linux @@ -0,0 +1,145 @@ +# umount(8) completion -*- shell-script -*- + +# Use of this file is deprecated on Linux. Upstream completion is +# available in util-linux >= 2.28, use that instead. + +# Just like COMPREPLY=(`compgen -W "${COMPREPLY[*]}" -- "$cur"`), only better! +# +# This will correctly escape special characters in COMPREPLY. +_reply_compgen_array() +{ + # Create the argument for compgen -W by escaping twice. + # + # One round of escape is because we want to reply with escaped arguments. A + # second round is required because compgen -W will helpfully expand it's + # argument. + local i wlist + for i in ${!COMPREPLY[*]}; do + local q=$(quote "$(printf %q "${COMPREPLY[i]}")") + wlist+=$q$'\n' + done + + # We also have to add another round of escaping to $cur. + local ecur="$cur" + ecur=${ecur//\\/\\\\} + ecur=${ecur//\'/\\\'} + + # Actually generate completions. + local ifs=$IFS + IFS=$'\n' eval 'COMPREPLY=(`compgen -W "$wlist" -- "${ecur}"`)' + IFS=$ifs +} + +# Unescape strings in the linux fstab(5) format (with octal escapes). +__linux_fstab_unescape() +{ + eval $1="'${!1//\'/\\047}'" + eval $1="'${!1/%\\/\\\\}'" + eval "$1=$'${!1}'" +} + +# Complete linux fstab entries. +# +# 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() +{ + 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' + COMPREPLY+=("$fs_label") + IFS=$ifs + fi + else + __linux_fstab_unescape fs_spec + __linux_fstab_unescape fs_file + IFS=$'\0' + [[ $fs_spec == */* ]] && COMPREPLY+=("$fs_spec") + [[ $fs_file == */* ]] && COMPREPLY+=("$fs_file") + IFS=$ifs + fi + done + + # Add relative paths to COMPREPLY + if [[ $cur && $cur != /* ]]; then + local realcur + [[ $cur == */ ]] && # don't let readlink drop last / from path + realcur="$(readlink -f "$cur." 2>/dev/null)/" || + realcur=$(readlink -f "$cur" 2>/dev/null) + if [[ $realcur ]]; then + local dirrealcur="" dircur="" basecur + if [[ $cur == */* ]]; then + dirrealcur="${realcur%/*}/" + dircur="${cur%/*}/" + fi + basecur=${cur#"$dircur"} + 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")) + done + fi + fi + + _reply_compgen_array +} + +_umount() +{ + local cur prev words cword + _init_completion || return + + case "$prev" in + -t) + # FIXME: no + local split=false + if [[ $cur == ?*,* ]]; then + prev="${cur%,*}" + cur="${cur##*,}" + split=true + 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,}) + return + ;; + -O) + # argument required but no completions available + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '-V -h -v -n -r -d -i -a -t -O -f -l + --no-canonicalize --fake' -- "$cur")) + [[ ${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 = 2.23, use that instead. + +complete -u write + +# ex: filetype=sh diff --git a/completions/_xm b/completions/_xm new file mode 100644 index 0000000..06b25d3 --- /dev/null +++ b/completions/_xm @@ -0,0 +1,224 @@ +# bash completion for xm -*- shell-script -*- + +# Use of this file is deprecated. The 'xm' command itself is no longer +# provided by upstream. It has been replaced with the 'xl' command, for +# which upstream provides completion, use that instead. + +_xen_domain_names() +{ + COMPREPLY=($(compgen -W "$(xm list 2>/dev/null | + awk '!/Name|Domain-0/ { print $1 }')" -- "$cur")) +} + +_xen_domain_ids() +{ + COMPREPLY=($(compgen -W "$(xm list 2>/dev/null | + awk '!/Name|Domain-0/ { print $2 }')" -- "$cur")) +} + +_xm() +{ + local cur prev words cword + _init_completion || return + + # TODO: _split_longopt + + local args command commands options + + commands='console vncviewer create new delete destroy domid domname + dump-core list mem-max mem-set migrate pause reboot rename reset + restore resume save shutdown start suspend sysrq trigger top unpause + uptime usb-add usb-del vcpu-list vcpu-pin vcpu-set debug-keys dmesg + info log serve sched-credit sched-sedf block-attach block-detach + block-list block-configure network-attach network-detach network-list + vtpm-list pci-attach pci-detach pci-list pci-list-assignable-devices + scsi-attach scsi-detach scsi-list vnet-list vnet-create vnet-delete + labels addlabel rmlabel getlabel dry-run resources dumppolicy setpolicy + resetpolicy getpolicy shell help' + + if ((cword == 1)); then + COMPREPLY=($(compgen -W "$commands" -- "$cur")) + else + if [[ $cur == *=* ]]; then + prev=${cur/=*/} + cur=${cur/*=/} + fi + + command=${words[1]} + if [[ $cur == -* ]]; then + # possible options for the command + case $command in + create) + options='-c' + ;; + dmesg) + options='--clear' + ;; + list) + options='--long' + ;; + reboot) + options='-w -a' + ;; + shutdown) + options='-w -a -R -H' + ;; + sched-credit) + options='-d -w -c' + ;; + block-list | network-list | vtpm-list | vnet-list) + options='-l --long' + ;; + getpolicy) + options='--dumpxml' + ;; + new) + options='-h --help --help_config -q --quiet --path= -f= + --defconfig= -F= --config= -b --dryrun -x --xmldryrun + -s --skipdtd -p --paused -c --console_autoconnect' + ;; + esac + COMPREPLY=($(compgen -W "$options" -- "$cur")) + 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 + 2) + _xen_domain_names + ;; + esac + ;; + migrate) + _count_args + case $args in + 2) + _xen_domain_names + ;; + 3) + _known_hosts_real -- "$cur" + ;; + esac + ;; + restore | dry-run | vnet-create) + _filedir + ;; + save) + _count_args + case $args in + 2) + _xen_domain_names + ;; + 3) + _filedir + ;; + esac + ;; + sysrq) + _count_args + case $args in + 2) + _xen_domain_names + ;; + 3) + COMPREPLY=($(compgen -W "r s e i u b" -- "$cur")) + ;; + esac + ;; + block-attach) + _count_args + case $args in + 2) + _xen_domain_names + ;; + 3) + COMPREPLY=($(compgen -W "phy: file:" -- "$cur")) + ;; + 5) + COMPREPLY=($(compgen -W "w r" -- "$cur")) + ;; + 6) + _xen_domain_names + ;; + esac + ;; + block-detach) + _count_args + case $args in + 2) + _xen_domain_names + ;; + 3) + COMPREPLY=($(compgen -W "$(xm block-list $prev \ + 2>/dev/null | awk '!/Vdev/ { print $1 }')" \ + -- "$cur")) + ;; + esac + ;; + network-attach) + _count_args + case $args in + 2) + _xen_domain_names + ;; + *) + COMPREPLY=($(compgen -W "script= ip= mac= bridge= + backend=" -- "$cur")) + ;; + esac + ;; + network-detach) + _count_args + case $args in + 2) + _xen_domain_names + ;; + 3) + COMPREPLY=($(compgen -W "$(xm network-list $prev \ + 2>/dev/null | awk '!/Idx/ { print $1 }')" \ + -- "$cur")) + ;; + esac + ;; + sched-credit) + case $prev in + -d) + _xen_domain_names + return + ;; + esac + ;; + create) + _filedir + COMPREPLY+=( + $(compgen -W '$(command ls /etc/xen 2>/dev/null)' \ + -- "$cur")) + ;; + new) + case $prev in + -f | -F | --defconfig | --config) + _filedir + return + ;; + --path) + _filedir -d + return + ;; + esac + + _count_args + case $args in + 2) + _xen_domain_names + ;; + esac + ;; + esac + fi + fi +} && + complete -F _xm xm + +# ex: filetype=sh diff --git a/completions/_yum b/completions/_yum new file mode 100644 index 0000000..224ea25 --- /dev/null +++ b/completions/_yum @@ -0,0 +1,144 @@ +# yum(8) completion -*- shell-script -*- + +# Use of this file is deprecated. Upstream completion is available in +# yum > 3.2.25, use that instead. + +_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')) + 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')) + fi +} + +_yum_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' +} + +_yum_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 +} + +_yum() +{ + local cur prev words cword split + _init_completion -s || return + + local special i + for ((i = 1; i < ${#words[@]} - 1; i++)); do + if [[ ${words[i]} == @(install|update|upgrade|remove|erase|deplist|info) ]]; then + special=${words[i]} + break + fi + done + + if [[ -v special ]]; then + # TODO: install|update|upgrade should not match *src.rpm + if [[ $cur == @(*/|[.~])* && \ + $special == @(deplist|install|update|upgrade) ]]; then + _filedir rpm + return + fi + case $special in + install) + _yum_list available + return + ;; + deplist | info) + _yum_list all + return + ;; + upgrade | update) + _yum_list updates + return + ;; + remove | erase) + # _rpm_installed_packages is not arch-qualified + _yum_list installed + return + ;; + esac + fi + + case $prev in + list) + COMPREPLY=($(compgen -W 'all available updates installed extras + obsoletes recent' -- "$cur")) + ;; + clean) + COMPREPLY=($(compgen -W 'packages headers metadata cache dbcache + all' -- "$cur")) + ;; + repolist) + COMPREPLY=($(compgen -W 'all enabled disabled' -- "$cur")) + ;; + localinstall | localupdate) + # TODO: should not match *src.rpm + _filedir rpm + ;; + -d | -e) + COMPREPLY=($(compgen -W '{0..10}' -- "$cur")) + ;; + -c) + _filedir + ;; + --installroot) + _filedir -d + ;; + --enablerepo) + COMPREPLY=($(compgen -W '$(_yum_repolist disabled)' -- "$cur")) + ;; + --disablerepo) + COMPREPLY=($(compgen -W '$(_yum_repolist enabled)' -- "$cur")) + ;; + --disableexcludes) + COMPREPLY=($(compgen -W '$(_yum_repolist all) all main' \ + -- "$cur")) + ;; + --enableplugin | --disableplugin) + COMPREPLY=($(compgen -W '$(_yum_plugins)' -- "$cur")) + ;; + --color) + COMPREPLY=($(compgen -W 'always auto never' -- "$cur")) + ;; + -R | -x | --exclude) + # argument required but no completions available + return + ;; + -h | --help | --version) + # no other options useful with these + 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")) + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + fi +} && + complete -F _yum yum + +# ex: filetype=sh diff --git a/completions/a2x b/completions/a2x new file mode 100644 index 0000000..b59c786 --- /dev/null +++ b/completions/a2x @@ -0,0 +1,39 @@ +# a2x(1) completion -*- shell-script -*- + +_a2x() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --attribute | --asciidoc-opts | --dblatex-opts | --fop-opts | --help | \ + --version | --xsltproc-opts | -!(-*)[ah]) + return + ;; + --destination-dir | --icons-dir | -!(-*)D) + _filedir -d + return + ;; + --doctype | -!(-*)d) + _xfunc asciidoc _asciidoc_doctype + return + ;; + --stylesheet) + _filedir css + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" --help)' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _filedir +} && + complete -F _a2x a2x + +# ex: filetype=sh diff --git a/completions/abook b/completions/abook new file mode 100644 index 0000000..42197d1 --- /dev/null +++ b/completions/abook @@ -0,0 +1,49 @@ +# abook(1) completion -*- shell-script -*- + +_abook() +{ + local cur prev words cword + _init_completion || return + + # abook only takes options, tabbing after command name adds a single dash + [[ $cword -eq 1 && -z $cur ]] && + { + compopt -o nospace + COMPREPLY=("-") + return + } + + case $cur in + -*) + _longopt "$1" + return + ;; + esac + + case $prev in + --informat) + COMPREPLY=($(compgen -W "$($1 --formats | + command sed -n -e 's/^'$'\t''\([a-z]*\).*/\1/p' -e '/^$/q')" \ + -- "$cur")) + ;; + --outformat) + COMPREPLY=($(compgen -W "$($1 --formats | + command sed -n -e '/^$/,$s/^'$'\t''\([a-z]*\).*/\1/p')" \ + -- "$cur")) + ;; + --infile) + COMPREPLY=($(compgen -W stdin -- "$cur")) + _filedir + ;; + --outfile) + COMPREPLY=($(compgen -W stdout -- "$cur")) + _filedir + ;; + --config | --datafile) + _filedir + ;; + esac +} && + complete -F _abook abook + +# ex: filetype=sh diff --git a/completions/aclocal b/completions/aclocal new file mode 100644 index 0000000..010862f --- /dev/null +++ b/completions/aclocal @@ -0,0 +1,35 @@ +# aclocal(1) completion -*- shell-script -*- + +_aclocal() +{ + local cur prev words cword split + _init_completion -s || return + + case "$prev" in + --help | --print-ac-dir | --version) + return + ;; + --acdir | -I) + _filedir -d + return + ;; + --output) + _filedir + return + ;; + --warnings | -W) + local cats=(syntax unsupported) + COMPREPLY=($(compgen -W \ + '${cats[@]} ${cats[@]/#/no-} all none error' -- "$cur")) + return + ;; + esac + + $split && return + + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace +} && + complete -F _aclocal aclocal aclocal-1.1{0..6} + +# ex: filetype=sh diff --git a/completions/acpi b/completions/acpi new file mode 100644 index 0000000..f2c38b2 --- /dev/null +++ b/completions/acpi @@ -0,0 +1,22 @@ +# acpi(1) completion -*- shell-script -*- + +_acpi() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help | --version | -!(-*)[hv]) + return + ;; + --directory | -!(-*)d) + _filedir -d + return + ;; + esac + + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) +} && + complete -F _acpi acpi + +# ex: filetype=sh diff --git a/completions/add_members b/completions/add_members new file mode 100644 index 0000000..efa4f1e --- /dev/null +++ b/completions/add_members @@ -0,0 +1,31 @@ +# mailman add_members completion -*- shell-script -*- + +_add_members() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + -r | -d | --regular-members-file | --digest-members-file) + _filedir + return + ;; + -w | -a | --welcome-msg | --admin-notify) + COMPREPLY=($(compgen -W 'y n' -- "$cur")) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--regular-members-file --digest-members-file + --welcome-msg --admin-notify --help' -- "$cur")) + else + _xfunc list_lists _mailman_lists + fi + +} && + complete -F _add_members add_members + +# ex: filetype=sh diff --git a/completions/alias b/completions/alias new file mode 100644 index 0000000..92211d8 --- /dev/null +++ b/completions/alias @@ -0,0 +1,20 @@ +# bash alias completion -*- shell-script -*- + +_alias() +{ + local cur prev words cword + _init_completion -n = || return + + case ${words[@]} in + *[^=]) + COMPREPLY=($(compgen -A alias -- "$cur")) + ;; + *=) + COMPREPLY=("$(alias ${cur%=} 2>/dev/null | command sed \ + -e 's|^alias '"$cur"'\(.*\)$|\1|')") + ;; + esac +} && + complete -F _alias -o nospace alias + +# ex: filetype=sh diff --git a/completions/ant b/completions/ant new file mode 100644 index 0000000..197c0e9 --- /dev/null +++ b/completions/ant @@ -0,0 +1,102 @@ +# bash completion for ant and phing -*- shell-script -*- + +_ant_parse_targets() +{ + local line basedir + + [[ $1 == */* ]] && basedir=${1%/*} || basedir=. + + # parse buildfile for targets + while read -rd '>' line; do + if [[ $line =~ \<(target|extension-point)[[:space:]].*name=[\"\']([^\"\']+) ]]; then + targets+=" ${BASH_REMATCH[2]}" + fi + done <$1 + + # parse imports + while read -rd '>' line; do + if [[ $line =~ \/dev/null && + complete -C complete-ant-cmd.pl -F _ant ant || : + +# ex: filetype=sh diff --git a/completions/apache2ctl b/completions/apache2ctl new file mode 100644 index 0000000..980b3c5 --- /dev/null +++ b/completions/apache2ctl @@ -0,0 +1,16 @@ +# apache2ctl(1) completion -*- shell-script -*- + +_apache2ctl() +{ + local cur prev words cword + _init_completion || return + + local APWORDS + APWORDS=$($1 2>&1 >/dev/null | awk 'NR<2 { print $3; exit }' | + tr "|" " ") + + COMPREPLY=($(compgen -W "$APWORDS" -- "$cur")) +} && + complete -F _apache2ctl apache2ctl + +# ex: filetype=sh diff --git a/completions/appdata-validate b/completions/appdata-validate new file mode 100644 index 0000000..03d8cc9 --- /dev/null +++ b/completions/appdata-validate @@ -0,0 +1,32 @@ +# appdata-validate(1) completion -*- shell-script -*- + +_appdata_validate() +{ + local cur prev words cword split + _init_completion -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")) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _filedir appdata.xml +} && + complete -F _appdata_validate appdata-validate + +# ex: filetype=sh diff --git a/completions/apt-build b/completions/apt-build new file mode 100644 index 0000000..713f4c3 --- /dev/null +++ b/completions/apt-build @@ -0,0 +1,54 @@ +# Debian apt-build(1) completion -*- shell-script -*- + +_apt_build() +{ + local cur prev words cword + _init_completion || return + + local special i + for ((i = 1; i < ${#words[@]} - 1; i++)); do + if [[ ${words[i]} == @(install|remove|source|info|clean) ]]; then + special=${words[i]} + break + fi + done + + if [[ -v special ]]; then + case $special in + install | source | info) + COMPREPLY=($(_xfunc apt-cache _apt_cache_packages)) + ;; + remove) + COMPREPLY=( + $(_xfunc dpkg _comp_dpkg_installed_packages "$cur")) + ;; + esac + return + fi + + case $prev in + --patch | --build-dir | --repository-dir) + _filedir + return + ;; + -h | --help) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(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")) + + else + COMPREPLY=($(compgen -W 'update upgrade install remove source + dist-upgrade world clean info clean-build update-repository' \ + -- "$cur")) + fi + +} && + complete -F _apt_build apt-build + +# ex: filetype=sh diff --git a/completions/apt-cache b/completions/apt-cache new file mode 100644 index 0000000..61aa07b --- /dev/null +++ b/completions/apt-cache @@ -0,0 +1,85 @@ +# Debian apt-cache(8) completion -*- shell-script -*- + +# List APT binary packages +_apt_cache_packages() +{ + apt-cache --no-generate pkgnames "$cur" 2>/dev/null || : +} + +# List APT source packages +_apt_cache_sources() +{ + compgen -W "$(apt-cache dumpavail | + awk '$1 == "Source:" { print $2 }' | sort -u)" -- "$1" +} + +# List APT source packages +_apt_cache_src_packages() +{ + compgen -W '$(_apt_cache_sources "$cur")' -- "$cur" +} + +_apt_cache() +{ + local cur prev words cword + _init_completion || return + + local special ispecial + if [[ $cur != show ]]; then + for ((ispecial = 1; ispecial < ${#words[@]} - 1; ispecial++)); do + if [[ ${words[ispecial]} == @(add|depends|dotty|madison|policy|rdepends|show?(pkg|src|)) ]]; then + special=${words[ispecial]} + break + fi + done + fi + + if [[ -v special && $ispecial -lt $cword ]]; then + case $special in + add) + _filedir + ;; + + showsrc) + COMPREPLY=($(_apt_cache_sources "$cur")) + ;; + + *) + COMPREPLY=($(_apt_cache_packages)) + ;; + + esac + return + fi + + case $prev in + --config-file | --pkg-cache | --src-cache | -!(-*)[cps]) + _filedir + return + ;; + search) + if [[ $cur != -* ]]; then + return + fi + ;; + 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")) + + fi + +} && + complete -F _apt_cache apt-cache + +# ex: filetype=sh diff --git a/completions/apt-get b/completions/apt-get new file mode 100644 index 0000000..4aee263 --- /dev/null +++ b/completions/apt-get @@ -0,0 +1,104 @@ +# Debian apt-get(8) completion -*- shell-script -*- + +_apt_get() +{ + local cur prev words cword package + _init_completion -n ':=' || return + + local special i + for ((i = 1; i < ${#words[@]} - 1; i++)); do + if [[ ${words[i]} == @(install|remove|autoremove|purge|source|build-dep|download|changelog) ]]; then + special=${words[i]} + break + fi + done + + if [[ -v 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 + ;; + source) + COMPREPLY=($(_xfunc apt-cache _apt_cache_packages) + $(compgen -W "$(apt-cache dumpavail | + awk '$1 == "Source:" { print $2 }' | sort -u)" -- "$cur")) + ;; + install) + if [[ $cur == */* ]]; then + _filedir deb + return + elif [[ $cur == *=* ]]; then + package="${cur%%=*}" + cur="${cur#*=}" + COMPREPLY=($(IFS=$'\n' compgen -W "$( + apt-cache --no-generate madison "$package" 2>/dev/null | + while IFS=' |' read -r _ version _; do + echo "$version" + done + )" \ + -- "$cur")) + __ltrim_colon_completions "$cur" + return + fi + ;;& + build-dep) + _filedir -d + [[ $cur != */* ]] || return + ;;& + *) + COMPREPLY+=($(_xfunc apt-cache _apt_cache_packages)) + ;; + esac + return + fi + + case $prev in + --help | --version | --option | -!(-*)[hvo]) + return + ;; + --config-file | -!(-*)c) + _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")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(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 + --verbose-versions --host-architecture --build-profiles --compile + --build --ignore-hold --with-new-pkgs --no-upgrade --only-upgrade + --allow-downgrades --allow-remove-essential + --allow-change-held-packages --force-yes --print-uris --purge + --reinstall --list-cleanup --target-release --default-release + --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")) + else + COMPREPLY=($(compgen -W 'update upgrade dist-upgrade + dselect-upgrade install remove purge source build-dep check + download clean autoclean autoremove changelog indextargets' \ + -- "$cur")) + fi + +} && + complete -F _apt_get apt-get + +# ex: filetype=sh diff --git a/completions/aptitude b/completions/aptitude new file mode 100644 index 0000000..e5ea163 --- /dev/null +++ b/completions/aptitude @@ -0,0 +1,119 @@ +# 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() +{ + local cur prev words cword + _init_completion || return + + 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]} + break + fi + done + + if [[ -v 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)) + return + ;; + purge | remove | reinstall | forbid-version) + COMPREPLY=( + $(_xfunc dpkg _comp_dpkg_installed_packages "$cur")) + return + ;; + unhold) + COMPREPLY=($(_comp_dpkg_hold_packages "$cur")) + return + ;; + esac + fi + + case $prev in + # don't complete anything if these options are found + autoclean | clean | forget-new | search | upgrade | update | keep-all) + return + ;; + -!(-*)S) + _filedir + return + ;; + --display-format | --width | -!(-*)[wFo]) + return + ;; + --sort | -!(-*)O) + COMPREPLY=($(compgen -W 'installsize installsizechange debsize + name priority version' -- "$cur")) + 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)) + 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' ' ') " + + # Exclude some mutually exclusive options + for i in "${words[@]}"; do + [[ $i == -u ]] && opts=${opts/ -i / } + [[ $i == -i ]] && opts=${opts/ -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 ;; + -s) COMPREPLY[i]=--simulate ;; + -d) COMPREPLY[i]=--download-only ;; + -P) COMPREPLY[i]=--prompt ;; + -y) COMPREPLY[i]=--assume-yes ;; + -F) COMPREPLY[i]=--display-format ;; + -O) COMPREPLY[i]=--sort ;; + -W) COMPREPLY[i]=--show-why ;; + -w) COMPREPLY[i]=--width ;; + -V) COMPREPLY[i]=--show-versions ;; + -D) COMPREPLY[i]=--show-deps ;; + -v) COMPREPLY[i]=--verbose ;; + -t) COMPREPLY[i]=--target-release ;; + -q) COMPREPLY[i]=--quiet ;; + esac + done + + COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur")) + else + COMPREPLY=($(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")) + fi + +} && + complete -F _aptitude -o default aptitude aptitude-curses + +# ex: filetype=sh diff --git a/completions/arch b/completions/arch new file mode 100644 index 0000000..afeed05 --- /dev/null +++ b/completions/arch @@ -0,0 +1,46 @@ +# mailman arch completion -*- shell-script -*- + +# Try to detect whether this is the mailman "arch" to avoid installing +# it for the coreutils/util-linux-ng one. +_have mailmanctl && + _arch() + { + local cur prev words cword split + _init_completion -s || return + + case $prev in + -w | -g | -d | --welcome-msg | --goodbye-msg | --digest) + COMPREPLY=($(compgen -W 'y n' -- "$cur")) + return + ;; + --file) + _filedir + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + else + local args=$cword + for ((i = 1; i < cword; i++)); do + if [[ ${words[i]} == -* ]]; then + ((args--)) + fi + done + case $args in + 1) + _xfunc list_lists _mailman_lists + ;; + 2) + _filedir + ;; + esac + fi + + } && + complete -F _arch arch + +# ex: filetype=sh diff --git a/completions/arp b/completions/arp new file mode 100644 index 0000000..922e800 --- /dev/null +++ b/completions/arp @@ -0,0 +1,59 @@ +# arp(8) completion -*- shell-script -*- + +_arp() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --device | -!(-*)i) + _available_interfaces -a + return + ;; + --protocol | -!(-*)[Ap]) + # TODO protocol/address family + return + ;; + --file | -!(-*)f) + _filedir + return + ;; + --hw-type | -!(-*)[Ht]) + # TODO: parse from --help output? + COMPREPLY=($(compgen -W 'ash ether ax25 netrom rose arcnet \ + dlci fddi hippi irda x25 eui64' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + local args + _count_args "" "@(--device|--protocol|--file|--hw-type|-!(-*)[iApfHt])" + case $args 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")) + ;; + 2) + # TODO if -d mode: "pub"; if not -f mode: hw_addr + # TODO hw_addr is a configured interface with --use-device/-*D* + ;; + 3) + # TODO netmask|pub|temp if -s mode + ;; + 4) + # TODO netmask value if previous was "netmask" + ;; + 5) + # TODO "pub" if 3rd was "netmask" + ;; + esac +} && + complete -F _arp arp + +# ex: filetype=sh diff --git a/completions/arping b/completions/arping new file mode 100644 index 0000000..57e1e19 --- /dev/null +++ b/completions/arping @@ -0,0 +1,31 @@ +# arping(8) completion -*- shell-script -*- + +_arping() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -*c | -*w) + return + ;; + -*I) + _available_interfaces -a + return + ;; + -*s) + _ip_addresses + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + return + fi + + _known_hosts_real -- "$cur" +} && + complete -F _arping arping + +# ex: filetype=sh diff --git a/completions/arpspoof b/completions/arpspoof new file mode 100644 index 0000000..d1a1373 --- /dev/null +++ b/completions/arpspoof @@ -0,0 +1,28 @@ +# arpspoof completion -*- shell-script -*- + +_arpspoof() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -i) + _available_interfaces -a + return + ;; + -t) + _known_hosts_real -- "$cur" + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + else + _known_hosts_real -- "$cur" + fi + +} && + complete -F _arpspoof arpspoof + +# ex: filetype=sh diff --git a/completions/asciidoc b/completions/asciidoc new file mode 100644 index 0000000..1ea4abf --- /dev/null +++ b/completions/asciidoc @@ -0,0 +1,52 @@ +# asciidoc(1) completion -*- shell-script -*- + +_asciidoc_doctype() +{ + COMPREPLY+=($(compgen -W 'article book manpage' -- "$cur")) +} + +_asciidoc() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --attribute | -!(-*)a) + return + ;; + --backend | -!(-*)b) + COMPREPLY=($(compgen -W 'docbook html4 xhtml11' -- "$cur")) + return + ;; + --conf-file | -!(-*)f) + _filedir conf + return + ;; + --doctype | -!(-*)d) + _asciidoc_doctype + return + ;; + --help | -!(-*)h) + COMPREPLY=($(compgen -W 'manpage syntax topics' -- "$cur")) + return + ;; + --out-file | -!(-*)o) + _filedir + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" "--help manpage")' \ + -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _filedir +} && + complete -F _asciidoc asciidoc asciidoc.py + +# ex: filetype=sh diff --git a/completions/aspell b/completions/aspell new file mode 100644 index 0000000..e080a07 --- /dev/null +++ b/completions/aspell @@ -0,0 +1,88 @@ +# bash completion for aspell -*- shell-script -*- + +_aspell_dictionary() +{ + local datadir aspell=${1:-aspell} + 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/}") + # Then, add the canonical dicts + COMPREPLY+=($($aspell dicts 2>/dev/null)) + COMPREPLY=($(compgen -X '\*' -W '${COMPREPLY[@]}' -- "$cur")) +} + +_aspell() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + -c | -p | check | --conf | --personal | --repl | --per-conf) + _filedir + return + ;; + --conf-dir | --data-dir | --dict-dir | --home-dir | --local-data-dir | --prefix) + _filedir -d + return + ;; + dump | create | merge) + COMPREPLY=($(compgen -W 'master personal repl' -- "$cur")) + return + ;; + --mode) + COMPREPLY=($(compgen -W "$($1 modes 2>/dev/null | + awk '{ print $1 }')" -- "$cur")) + return + ;; + --sug-mode) + COMPREPLY=($(compgen -W 'ultra fast normal bad-speller' \ + -- "$cur")) + return + ;; + --keymapping) + COMPREPLY=($(compgen -W 'aspell ispell' -- "$cur")) + return + ;; + -d | --master) + _aspell_dictionary "$1" + return + ;; + --add-filter | --rem-filter) + COMPREPLY=($(compgen -W "$($1 filters 2>/dev/null | + awk '{ print $1 }')" -- "$cur")) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(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 + --ignore-repl --dont-ignore-repl --jargon --keyboard= --lang= + --language-tag --local-data-dir= --master= --module + --add-module-search-order --rem-module-search-order --per-conf= + --personal= --prefix= --repl= --run-together --dont-run-together + --run-together-limit= --run-together-min= --save-repl + --dont-save-repl --set-prefix --dont-set-prefix --size= --spelling + --strip-accents --dont-strip-accents --sug-mode= + --add-word-list-path --rem-word-list-path --backup --dont-backup + --reverse --dont-reverse --time --dont-time --keymapping= + --add-email-quote= --rem-email-quote= --email-margin= + --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")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + else + COMPREPLY=($(compgen -W 'usage help check pipe list config soundslike + filter version dump create merge' -- "$cur")) + fi +} && + complete -F _aspell aspell + +# ex: filetype=sh diff --git a/completions/autoconf b/completions/autoconf new file mode 100644 index 0000000..b51e797 --- /dev/null +++ b/completions/autoconf @@ -0,0 +1,40 @@ +# autoconf(1) completion -*- shell-script -*- + +_autoconf() +{ + local cur prev words cword split + _init_completion -s || return + + case "$prev" in + --help | -h | --version | -V | --trace | -t) + return + ;; + --output | -o) + _filedir + return + ;; + --warnings | -W) + local cats=(cross obsolete syntax) + COMPREPLY=($(compgen -W \ + '${cats[@]} ${cats[@]/#/no-} all none error' -- "$cur")) + return + ;; + --prepend-include | -B | --include | -I) + _filedir -d + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _filedir '@(ac|in)' +} && + complete -F _autoconf autoconf + +# ex: filetype=sh diff --git a/completions/automake b/completions/automake new file mode 100644 index 0000000..5fe5f4f --- /dev/null +++ b/completions/automake @@ -0,0 +1,36 @@ +# automake(1) completion -*- shell-script -*- + +_automake() +{ + local cur prev words cword split + _init_completion -s || return + + case "$prev" in + --help | --version) + return + ;; + --warnings | -W) + local cats=(gnu obsolete override portability syntax unsupported) + COMPREPLY=($(compgen -W \ + '${cats[@]} ${cats[@]/#/no-} all none error' -- "$cur")) + return + ;; + --libdir) + _filedir -d + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _filedir +} && + complete -F _automake automake automake-1.1{0..6} + +# ex: filetype=sh diff --git a/completions/autoreconf b/completions/autoreconf new file mode 100644 index 0000000..9b0f0dc --- /dev/null +++ b/completions/autoreconf @@ -0,0 +1,41 @@ +# autoreconf(1) completion -*- shell-script -*- + +_autoreconf() +{ + local cur prev words cword split + _init_completion -s || return + + case "$prev" in + --help | -h | --version | -V) + return + ;; + --warnings | -W) + local cats=(cross gnu obsolete override portability syntax + unsupported) + COMPREPLY=($(compgen -W \ + '${cats[@]} ${cats[@]/#/no-} all none error' -- "$cur")) + return + ;; + --prepend-include | -B | --include | -I) + _filedir -d + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + if [[ $1 == *autoheader ]]; then + _filedir '@(ac|in)' + else + _filedir -d + fi +} && + complete -F _autoreconf autoreconf autoheader + +# ex: filetype=sh diff --git a/completions/autorpm b/completions/autorpm new file mode 100644 index 0000000..d55322a --- /dev/null +++ b/completions/autorpm @@ -0,0 +1,14 @@ +# autorpm(8) completion -*- shell-script -*- + +_autorpm() +{ + local cur prev words cword + _init_completion || return + + COMPREPLY=($(compgen -W '--notty --debug --help --version auto add + fullinfo info help install list remove set' -- "$cur")) + +} && + complete -F _autorpm autorpm + +# ex: filetype=sh diff --git a/completions/autoscan b/completions/autoscan new file mode 100644 index 0000000..e007143 --- /dev/null +++ b/completions/autoscan @@ -0,0 +1,34 @@ +# autoscan(1) completion -*- shell-script -*- + +_autoscan() +{ + local cur prev words cword split + _init_completion -s || return + + case "$prev" in + --help | --version | -!(-*)[hV]) + return + ;; + --prepend-include | --include | -!(-*)[BI]) + _filedir -d + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + if [[ $1 == *autoupdate ]]; then + _filedir '@(ac|in)' + else + _filedir -d + fi +} && + complete -F _autoscan autoscan autoupdate + +# ex: filetype=sh diff --git a/completions/avctrl b/completions/avctrl new file mode 100644 index 0000000..89c24e4 --- /dev/null +++ b/completions/avctrl @@ -0,0 +1,20 @@ +# avctrl completion -*- shell-script -*- + +_avctrl() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--help --quiet' -- "$cur")) + else + local args + _count_args + if ((args == 1)); then + COMPREPLY=($(compgen -W 'discover switch' -- "$cur")) + fi + fi +} && + complete -F _avctrl avctrl + +# ex: filetype=sh diff --git a/completions/badblocks b/completions/badblocks new file mode 100644 index 0000000..29c4e00 --- /dev/null +++ b/completions/badblocks @@ -0,0 +1,29 @@ +# badblocks(8) completion -*- shell-script -*- + +_badblocks() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -*[bcedpt]) + return + ;; + -*[io]) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + # Filter out -w (dangerous) and -X (internal use) + COMPREPLY=($(compgen -X -[wX] -W '$(_parse_usage "$1")' -- "$cur")) + return + fi + + cur=${cur:=/dev/} + _filedir +} && + complete -F _badblocks badblocks + +# ex: filetype=sh diff --git a/completions/bind b/completions/bind new file mode 100644 index 0000000..2ee428b --- /dev/null +++ b/completions/bind @@ -0,0 +1,36 @@ +# bash bind completion -*- shell-script -*- + +_bind() +{ + local cur prev words cword + _init_completion || 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")) + return + ;; + -*f) + _filedir + return + ;; + -*[qu]) + COMPREPLY=($(compgen -W '$("$1" -l)' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + return + fi + + COMPREPLY=($(compgen -A binding -- "$cur")) +} && + complete -F _bind bind + +# ex: filetype=sh diff --git a/completions/bk b/completions/bk new file mode 100644 index 0000000..4e4d140 --- /dev/null +++ b/completions/bk @@ -0,0 +1,18 @@ +# BitKeeper completion -*- shell-script -*- +# adapted from code by Bart Trojanowski + +_bk() +{ + local cur prev words cword + _init_completion || return + + local BKCMDS="$(bk help topics 2>/dev/null | + awk '/^ bk/ { print $2 }' | xargs printf '%s ')" + + COMPREPLY=($(compgen -W "$BKCMDS" -- "$cur")) + _filedir + +} && + complete -F _bk bk + +# ex: filetype=sh diff --git a/completions/brctl b/completions/brctl new file mode 100644 index 0000000..14569b6 --- /dev/null +++ b/completions/brctl @@ -0,0 +1,40 @@ +# bash completion for brctl -*- shell-script -*- + +_brctl() +{ + local cur prev words cword + _init_completion || return + + local command=${words[1]} + + case $cword in + 1) + COMPREPLY=($(compgen -W "addbr delbr addif delif setageing + setbridgeprio setfd sethello setmaxage setpathcost setportprio + show showmacs showstp stp" -- "$cur")) + ;; + 2) + case $command in + show) ;; + + *) + COMPREPLY=($(compgen -W "$($1 show | + awk 'NR>1 {print $1}')" -- "$cur")) + ;; + esac + ;; + 3) + case $command in + addif | delif) + _configured_interfaces + ;; + stp) + COMPREPLY=($(compgen -W 'on off' -- "$cur")) + ;; + esac + ;; + esac +} && + complete -F _brctl -o default brctl + +# ex: filetype=sh diff --git a/completions/btdownloadheadless.py b/completions/btdownloadheadless.py new file mode 100644 index 0000000..a470e53 --- /dev/null +++ b/completions/btdownloadheadless.py @@ -0,0 +1,32 @@ +# btdownloadheadless(1) completion -*- shell-script -*- + +_btdownload() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --responsefile | --saveas) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(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")) + else + _filedir + fi +} && + complete -F _btdownload btdownloadheadless.py btdownloadcurses.py \ + btdownloadgui.py + +# ex: filetype=sh diff --git a/completions/bts b/completions/bts new file mode 100644 index 0000000..d535d13 --- /dev/null +++ b/completions/bts @@ -0,0 +1,112 @@ +# bts completion -*- shell-script -*- + +# List bug numbers from bugs cache in ~/.devscripts_cache/bts +_cached_bugs() +{ + [[ -d $HOME/.devscripts_cache/bts ]] && + find $HOME/.devscripts_cache/bts -maxdepth 1 -name "${cur}[0-9]*.html" \ + -printf "%f\n" | cut -d'.' -f1 +} + +# List APT source packages prefixed with "src:" +_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" +} + +_bts() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + show | bugs) + COMPREPLY=($(compgen -W 'release-critical RC from: tag: + usertag:' -- "$cur") $(_cached_bugs) + $(_src_packages_with_prefix)) + return + ;; + select) + COMPREPLY=($(compgen -W 'package: source: maintainer: submitter: + severity: status: tag: owner: correspondent: affects: bugs: + users: archive:' -- "$cur")) + return + ;; + status) + COMPREPLY=($(compgen -W 'file: fields: verbose' -- "$cur") + $(_cached_bugs)) + return + ;; + block | unblock) + COMPREPLY=($(compgen -W 'by with' -- "$cur")) + return + ;; + severity) + COMPREPLY=($(compgen -W 'wishlist minor normal important serious + grave critical' -- "$cur")) + return + ;; + limit) + COMPREPLY=($(compgen -W 'submitter date subject msgid package + source tag severity owner affects archive' -- "$cur")) + 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)) + return + ;; + package) + COMPREPLY=($(_xfunc apt-cache _apt_cache_packages)) + return + ;; + cache) + COMPREPLY=($(_xfunc apt-cache _apt_cache_packages) + $(_src_packages_with_prefix) + $(compgen -W 'from: release-critical RC' -- "$cur")) + return + ;; + cleancache) + COMPREPLY=($(_xfunc apt-cache _apt_cache_packages) + $(_src_packages_with_prefix) + $(compgen -W 'from: tag: usertag: ALL' -- "$cur")) + return + ;; + user) + # non-predicible arguments + COMPREPLY=() + return + ;; + :) + # Chances are that "src:" is being completed + # COMP_WORDS would be: "bts cleancache src : " + pos=$((COMP_CWORD - 2)) + if [[ $pos -gt 0 && ${COMP_WORDS[pos]} == "src" ]]; then + COMPREPLY=($(_xfunc apt-cache _apt_cache_src_packages)) + return + fi + ;; + esac + + $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 + 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")) + +} && + complete -F _bts bts + +# ex: filetype=sh diff --git a/completions/bzip2 b/completions/bzip2 new file mode 100644 index 0000000..40e50fe --- /dev/null +++ b/completions/bzip2 @@ -0,0 +1,42 @@ +# bash completion for bzip2 -*- shell-script -*- + +_bzip2() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help | -!(-*)[bhp]) + return + ;; + -!(-*)n) + COMPREPLY=($(compgen -W "{1..$(_ncpus)}" -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + local helpopts=$(_parse_help "$1") + COMPREPLY=($(compgen -W "${helpopts//#/} -2 -3 -4 -5 -6 -7 -8 -9" \ + -- "$cur")) + return + fi + + local IFS=$'\n' xspec="*.?(t)bz2" + + if [[ $prev == --* ]]; then + [[ $prev == --@(decompress|list|test) ]] && xspec="!"$xspec + [[ $prev == --compress ]] && xspec= + elif [[ $prev == -* ]]; then + [[ $prev == -*[dt]* ]] && xspec="!"$xspec + [[ $prev == -*z* ]] && xspec= + fi + + _tilde "$cur" || return + + compopt -o filenames + COMPREPLY=($(compgen -f -X "$xspec" -- "$cur") $(compgen -d -- "$cur")) +} && + complete -F _bzip2 bzip2 pbzip2 lbzip2 + +# ex: filetype=sh diff --git a/completions/cancel b/completions/cancel new file mode 100644 index 0000000..3e0c1d5 --- /dev/null +++ b/completions/cancel @@ -0,0 +1,27 @@ +# cancel(1) completion -*- shell-script -*- + +_cancel() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -h) + _known_hosts_real -- "$cur" + return + ;; + -U) + return + ;; + -u) + COMPREPLY=($(compgen -u -- "$cur")) + return + ;; + esac + + COMPREPLY=($(compgen -W \ + "$(lpstat 2>/dev/null | cut -d' ' -f1)" -- "$cur")) +} && + complete -F _cancel cancel + +# ex: filetype=sh diff --git a/completions/cardctl b/completions/cardctl new file mode 100644 index 0000000..bb3a0db --- /dev/null +++ b/completions/cardctl @@ -0,0 +1,15 @@ +# Linux cardctl(8) completion -*- shell-script -*- + +_cardctl() +{ + local cur prev words cword + _init_completion || return + + if ((cword == 1)); then + COMPREPLY=($(compgen -W 'status config ident suspend resume reset + eject insert scheme' -- "$cur")) + fi +} && + complete -F _cardctl cardctl pccardctl + +# ex: filetype=sh diff --git a/completions/carton b/completions/carton new file mode 100644 index 0000000..5d700c8 --- /dev/null +++ b/completions/carton @@ -0,0 +1,81 @@ +# carton(3pm) completion -*- shell-script -*- + +_carton_commands() +{ + local cmds=$("${1:-carton}" usage 2>&1 | + command sed -ne '/.*command.* is one of/{n;p;q;}') + COMPREPLY+=($(IFS="$IFS," compgen -W "$cmds" -- "$cur")) +} + +_carton_command_help() +{ + local help=$(PERLDOC_PAGER=cat PERLDOC=-otext "${1:-carton}" -h $2 2>&1) + COMPREPLY+=($(compgen -W '$help' -- "$cur")) +} + +_carton() +{ + local cur prev words cword split + _init_completion -s || return + + local i command + for ((i = 1; i < cword; i++)); do + case ${words[i]} in + -*) ;; + *) + command=${words[i]} + break + ;; + esac + done + + if [[ ! -v command ]]; then + _carton_commands "$1" + return + fi + + case $prev in + --version | -v) + return + ;; + --help | -h) + [[ -n $command ]] || _carton_commands "$1" + return + ;; + --cpanfile) + if [[ $command == install ]]; then + _filedir + return + fi + ;; + --path) + if [[ $command == install ]]; then + _filedir -d + return + fi + ;; + --without) + if [[ $command == install ]]; then + local phases="configure build test runtime develop" + COMPREPLY+=($(compgen -W '$phases' -- "$cur")) + return + fi + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + [[ $command == @(help|usage) ]] || COMPREPLY=(--help) + _carton_command_help "$1" $command + fi + + case $command in + show | update) + : # TODO modules completion + ;; + esac +} && + complete -F _carton carton + +# ex: filetype=sh diff --git a/completions/ccache b/completions/ccache new file mode 100644 index 0000000..80c39de --- /dev/null +++ b/completions/ccache @@ -0,0 +1,38 @@ +# ccache(1) completion -*- shell-script -*- + +_ccache() +{ + local cur prev words cword split + _init_completion -s || return + + local i + for ((i = 1; i <= COMP_CWORD; i++)); do + if [[ ${COMP_WORDS[i]} != -* ]]; then + _command_offset $i + return + fi + [[ ${COMP_WORDS[i]} == -*[oFM] ]] && ((i++)) + done + + case $prev in + --help | --version | --max-files | --max-size | -!(-*)[hVFM]) + return + ;; + --set-config | -!(-*)o) + if [[ $cur != *=* ]]; then + COMPREPLY=($(compgen -S = -W "$($1 -p 2>/dev/null | + awk '$3 = "=" { print $2 }')" -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + fi + return + ;; + esac + + $split && return + + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace +} && + complete -F _ccache ccache + +# ex: filetype=sh diff --git a/completions/ccze b/completions/ccze new file mode 100644 index 0000000..35f4c3f --- /dev/null +++ b/completions/ccze @@ -0,0 +1,44 @@ +# ccze(1) completion -*- shell-script -*- + +_ccze() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + -'?' | --help | --usage | -V | --version) + return + ;; + --argument | --color | -!(-*)[ac]) + # TODO? + return + ;; + --rcfile | -!(-*)F) + _filedir + return + ;; + --mode | -!(-*)m) + COMPREPLY=($(compgen -W "curses ansi html" -- "$cur")) + return + ;; + --option | -!(-*)o) + local -a opts=(scroll wordcolor lookups transparent cssfile) + COMPREPLY=($(compgen -W '${opts[@]} ${opts[@]/#/no}' -- "$cur")) + return + ;; + --plugin | -!(-*)p) + COMPREPLY=($(compgen -W '$("$1" --list-plugins | command \ + sed -ne "s/^\([a-z0-9]\{1,\}\)[[:space:]]\{1,\}|.*/\1/p")' \ + -- "$cur")) + return + ;; + esac + + $split && return + + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace +} && + complete -F _ccze ccze + +# ex: filetype=sh diff --git a/completions/cfagent b/completions/cfagent new file mode 100644 index 0000000..e7ba04d --- /dev/null +++ b/completions/cfagent @@ -0,0 +1,21 @@ +# cfagent completion -*- shell-script -*- + +_cfagent() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -f | --file) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + fi +} && + complete -F _cfagent cfagent + +# ex: filetype=sh diff --git a/completions/cfrun b/completions/cfrun new file mode 100644 index 0000000..72b6138 --- /dev/null +++ b/completions/cfrun @@ -0,0 +1,47 @@ +# cfrun completion -*- shell-script -*- + +_cfrun() +{ + local cur prev words cword + _init_completion || return + + local i section=1 + for ((i = 1; i < cword; i++)); do + if [[ ${words[i]} == -- ]]; then + ((section++)) + fi + done + + case $section in + 1) + case $prev in + -f) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '-f -h -d -S -T -v' -- "$cur")) + else + local hostfile=${CFINPUTS:-/var/lib/cfengine/inputs}/cfrun.hosts + for ((i = 1; i < cword; i++)); do + if [[ ${words[i]} == -f ]]; then + hostfile=${words[i + 1]} + break + fi + done + [[ ! -f $hostfile ]] && return + + COMPREPLY=($(compgen -W "$(command grep -v \ + -E '(=|^$|^#)' $hostfile)" -- "$cur")) + fi + ;; + 2) + COMPREPLY=($(compgen -W '$(_parse_help cfagent)' -- "$cur")) + ;; + esac +} && + complete -F _cfrun cfrun + +# ex: filetype=sh diff --git a/completions/chage b/completions/chage new file mode 100644 index 0000000..fcf87cd --- /dev/null +++ b/completions/chage @@ -0,0 +1,30 @@ +# chage(1) completion -*- shell-script -*- + +_chage() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --lastday | --expiredate | --help | --inactive | --mindays | --maxdays | \ + --warndays | -!(-*)[dEhImMW]) + return + ;; + --root | -!(-*)R) + _filedir -d + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + COMPREPLY=($(compgen -u -- "$cur")) +} && + complete -F _chage chage + +# ex: filetype=sh diff --git a/completions/change_pw b/completions/change_pw new file mode 100644 index 0000000..04837ea --- /dev/null +++ b/completions/change_pw @@ -0,0 +1,25 @@ +# mailman change_pw completion -*- shell-script -*- + +_change_pw() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + -l | --listname) + _xfunc list_lists _mailman_lists + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--all --domain --listname --password --quiet + --help' -- "$cur")) + fi + +} && + complete -F _change_pw change_pw + +# ex: filetype=sh diff --git a/completions/check_db b/completions/check_db new file mode 100644 index 0000000..aaec99f --- /dev/null +++ b/completions/check_db @@ -0,0 +1,17 @@ +# mailman check_db completion -*- shell-script -*- + +_check_db() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--all --verbose --help' -- "$cur")) + else + _xfunc list_lists _mailman_lists + fi + +} && + complete -F _check_db check_db + +# ex: filetype=sh diff --git a/completions/check_perms b/completions/check_perms new file mode 100644 index 0000000..8ff276e --- /dev/null +++ b/completions/check_perms @@ -0,0 +1,15 @@ +# mailman check_perms completion -*- shell-script -*- + +_check_perms() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '-f -v -h' -- "$cur")) + fi + +} && + complete -F _check_perms check_perms + +# ex: filetype=sh diff --git a/completions/checksec b/completions/checksec new file mode 100644 index 0000000..fc2fef7 --- /dev/null +++ b/completions/checksec @@ -0,0 +1,37 @@ +# bash completion for checksec -*- shell-script -*- + +_checksec() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --version | --help) + return + ;; + --file | --fortify-file) + _filedir + return + ;; + --dir) + _filedir -d + return + ;; + --proc) + _pnames + return + ;; + --proc-libs | --fortify-proc) + _pids + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi +} && + complete -F _checksec checksec + +# ex: filetype=sh diff --git a/completions/chgrp b/completions/chgrp new file mode 100644 index 0000000..4793a45 --- /dev/null +++ b/completions/chgrp @@ -0,0 +1,39 @@ +# chgrp(1) completion -*- shell-script -*- + +_chgrp() +{ + local cur prev words cword split + _init_completion -s || return + + cur=${cur//\\\\/} + + if [[ $prev == --reference ]]; then + _filedir + return + fi + + $split && return + + # options completion + if [[ $cur == -* ]]; then + 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 + --no-dereference --silent --quiet --reference --recursive --verbose + --help --version $opts' -- "$cur")) + return + fi + + # first parameter on line or first since an option? + if [[ $cword -eq 1 && $cur != -* || $prev == -* ]]; then + _allowed_groups "$cur" + else + _filedir + fi + +} && + complete -F _chgrp chgrp + +# ex: filetype=sh diff --git a/completions/chkconfig b/completions/chkconfig new file mode 100644 index 0000000..8ff6637 --- /dev/null +++ b/completions/chkconfig @@ -0,0 +1,37 @@ +# chkconfig(8) completion -*- shell-script -*- + +_chkconfig() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --level=[1-6] | [1-6] | --list | --add | --del | --override) + _services + _xinetd_services + return + ;; + --level) + COMPREPLY=($(compgen -W '{1..6}' -- "$cur")) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--list --add --del --override --level' \ + -- "$cur")) + else + if ((cword == 2 || cword == 4)); then + COMPREPLY=($(compgen -W 'on off reset resetpriorities' \ + -- "$cur")) + else + _services + _xinetd_services + fi + fi +} && + complete -F _chkconfig chkconfig + +# ex: filetype=sh diff --git a/completions/chmod b/completions/chmod new file mode 100644 index 0000000..d3fc349 --- /dev/null +++ b/completions/chmod @@ -0,0 +1,41 @@ +# chmod(1) completion -*- shell-script -*- + +_chmod() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --help | --version) + return + ;; + --reference) + _filedir + return + ;; + esac + + $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")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + local args + _count_args "" "" "$modearg" + + case $args in + 1) ;; # mode + *) _filedir ;; + esac +} && + complete -F _chmod chmod + +# ex: filetype=sh diff --git a/completions/chown b/completions/chown new file mode 100644 index 0000000..1d746b7 --- /dev/null +++ b/completions/chown @@ -0,0 +1,46 @@ +# chown(1) completion -*- shell-script -*- + +_chown() +{ + local cur prev words cword split + # Don't treat user:group as separate words. + _init_completion -s -n : || return + + case "$prev" in + --from) + _usergroup + return + ;; + --reference) + _filedir + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + # Complete -options + 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 + --no-dereference --from --silent --quiet --reference --recursive + --verbose --help --version $opts' -- "$cur")) + else + local args + + # The first argument is an usergroup; the rest are filedir. + _count_args : + + if ((args == 1)); then + _usergroup -u + else + _filedir + fi + fi +} && + complete -F _chown chown + +# ex: filetype=sh diff --git a/completions/chpasswd b/completions/chpasswd new file mode 100644 index 0000000..3abea99 --- /dev/null +++ b/completions/chpasswd @@ -0,0 +1,30 @@ +# chpasswd(8) completion -*- shell-script -*- + +_chpasswd() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --crypt | -!(-*)c) + COMPREPLY=($(compgen -W 'DES MD5 NONE SHA256 SHA512' \ + -- "$cur")) + return + ;; + --sha-rounds | -!(-*)s) + return + ;; + --root | -!(-*)R) + _filedir -d + return + ;; + esac + + $split && return + + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace +} && + complete -F _chpasswd chpasswd + +# ex: filetype=sh diff --git a/completions/chromium-browser b/completions/chromium-browser new file mode 100644 index 0000000..9ee9896 --- /dev/null +++ b/completions/chromium-browser @@ -0,0 +1,50 @@ +# chromium-browser completion -*- shell-script -*- + +_chromium_browser() +{ + local cur prev words cword split + _init_completion -s -n : || return + + case $prev in + --help | --app | --proxy-pac-url | -h) + return + ;; + --user-data-dir) + _filedir -d + return + ;; + --proxy-server) + case $cur in + *://*) + local prefix="${cur%%://*}://" + _known_hosts_real -- "${cur#*://}" + COMPREPLY=("${COMPREPLY[@]/#/$prefix}") + __ltrim_colon_completions "$cur" + ;; + *) + compopt -o nospace + COMPREPLY=($(compgen -S :// -W 'http socks socks4 socks5' -- "$cur")) + ;; + esac + return + ;; + --password-store) + COMPREPLY=($(compgen -W 'basic gnome kwallet' -- "$cur")) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _filedir "@(?([mxs])htm?(l)|pdf|txt)" +} && + complete -F _chromium_browser chromium-browser google-chrome \ + google-chrome-stable chromium chrome + +# ex: filetype=sh diff --git a/completions/chronyc b/completions/chronyc new file mode 100644 index 0000000..e6bb8e9 --- /dev/null +++ b/completions/chronyc @@ -0,0 +1,61 @@ +# chronyc(1) completion -*- shell-script -*- + +_chronyc_command_args() +{ + local -a args + args=($(compgen -W "$($1 help 2>/dev/null | + awk '/^'$prev'\s[^ []/ { gsub("\\|", " ", $2); print $2 }')")) + case $args in + \) _known_hosts_real -- "$cur" ;; + \<*) ;; + *) COMPREPLY+=($(compgen -W '${args[@]}' -- "$cur")) ;; + esac +} + +_chronyc() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help | -*p) + return + ;; + -*h) + _known_hosts_real -- "$cur" + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1") -6' -- "$cur")) + return + fi + + local i args + args=0 + for ((i = 1; i < cword; i++)); do + [[ ${words[i]} != -* && ${words[i - 1]} != @(-p|-h) ]] && ((args++)) + done + + case $args in + 0) + COMPREPLY=($(compgen -W "$($1 help 2>/dev/null | + awk '!/(^ |: *$)/ { sub("\\|", " ", $1); print $1 }')" \ + -- "$cur")) + ;; + 1) + _chronyc_command_args "$1" + if [[ ! ${COMPREPLY-} && $prev == sources?(tats) ]]; then + # [-v] not handled by _chronyc_command_args yet + COMPREPLY=($(compgen -W '-v' -- "$cur")) + fi + ;; + 2) + [[ $prev == @(peer|server) ]] && _known_hosts_real -- "$cur" + ;; + esac +} && + complete -F _chronyc chronyc + +# ex: filetype=sh diff --git a/completions/chrpath b/completions/chrpath new file mode 100644 index 0000000..2883967 --- /dev/null +++ b/completions/chrpath @@ -0,0 +1,27 @@ +# chrpath(1) completion -*- shell-script -*- + +_chrpath() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --version | --help | -!(-*)[vh]) + return + ;; + --replace | -!(-*)r) + _filedir -d + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + _filedir +} && + complete -F _chrpath chrpath + +# ex: filetype=sh diff --git a/completions/cksfv b/completions/cksfv new file mode 100644 index 0000000..da404dd --- /dev/null +++ b/completions/cksfv @@ -0,0 +1,29 @@ +# cksfv completion by Chris -*- shell-script -*- + +_cksfv() +{ + local cur prev words cword + _init_completion || return + + if ((cword == 1)); then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + case "$prev" in + -*C | -*g) + _filedir -d + return + ;; + -*f) + _filedir 'sfv' + return + ;; + esac + + _filedir + +} && + complete -F _cksfv cksfv + +# ex: filetype=sh diff --git a/completions/cleanarch b/completions/cleanarch new file mode 100644 index 0000000..0f7d5f5 --- /dev/null +++ b/completions/cleanarch @@ -0,0 +1,16 @@ +# mailman cleanarch completion -*- shell-script -*- + +_cleanarch() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--status --dry-run --quiet --help' \ + -- "$cur")) + fi + +} && + complete -F _cleanarch cleanarch + +# ex: filetype=sh diff --git a/completions/clisp b/completions/clisp new file mode 100644 index 0000000..c4259a0 --- /dev/null +++ b/completions/clisp @@ -0,0 +1,22 @@ +# -*- shell-script -*- +# bash brogrammable completion for various Common Lisp implementations by +# Nikodemus Siivola + +_clisp() +{ + local cur prev words cword + _init_completion || 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")) + else + _filedir + fi + +} && + complete -F _clisp -o default clisp + +# ex: filetype=sh diff --git a/completions/clone_member b/completions/clone_member new file mode 100644 index 0000000..a3ca2b3 --- /dev/null +++ b/completions/clone_member @@ -0,0 +1,25 @@ +# mailman clone_member completion -*- shell-script -*- + +_clone_member() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + -l | --listname) + _xfunc list_lists _mailman_lists + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--listname --remove --admin --quiet + --nomodify --help' -- "$cur")) + fi + +} && + complete -F _clone_member clone_member + +# ex: filetype=sh diff --git a/completions/complete b/completions/complete new file mode 100644 index 0000000..a57f366 --- /dev/null +++ b/completions/complete @@ -0,0 +1,49 @@ +# bash complete completion -*- shell-script -*- + +_complete() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -*o) + COMPREPLY=($(compgen -W 'bashdefault default dirnames filenames + nospace plusdirs' -- "$cur")) + return + ;; + + -*A) + COMPREPLY=($(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")) + return + ;; + + -*C) + COMPREPLY=($(compgen -A command -- "$cur")) + return + ;; + -*F) + COMPREPLY=($(compgen -A function -- "$cur")) + return + ;; + -*p | -*r) + COMPREPLY=($(complete -p | command sed -e 's|.* ||')) + COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur")) + 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")) + else + COMPREPLY=($(compgen -A command -- "$cur")) + fi +} && + complete -F _complete compgen complete + +# ex: filetype=sh diff --git a/completions/config_list b/completions/config_list new file mode 100644 index 0000000..1807e33 --- /dev/null +++ b/completions/config_list @@ -0,0 +1,27 @@ +# mailman config_list completion -*- shell-script -*- + +_config_list() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + -i | -o | --inputfile | --outputfile) + _filedir + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--inputfile --outputfile --checkonly + --verbose --help' -- "$cur")) + else + _xfunc list_lists _mailman_lists + fi + +} && + complete -F _config_list config_list + +# ex: filetype=sh diff --git a/completions/configure b/completions/configure new file mode 100644 index 0000000..3f59a01 --- /dev/null +++ b/completions/configure @@ -0,0 +1,42 @@ +# bash completion for configure -*- shell-script -*- + +_configure() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + -h | --help | -V | --version | --program-prefix | --program-suffix | \ + --program-transform-name) + return + ;; + --*file) + _filedir + return + ;; + --*prefix | --*dir) + _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 [[ ${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")) + [[ ${COMPREPLY-} == *=* ]] && compopt -o nospace + else + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + fi +} && + complete -F _configure configure + +# ex: filetype=sh diff --git a/completions/convert b/completions/convert new file mode 100644 index 0000000..ef7baea --- /dev/null +++ b/completions/convert @@ -0,0 +1,324 @@ +# bash completion for ImageMagick -*- shell-script -*- + +_ImageMagick() +{ + case $prev in + -channel) + COMPREPLY=($(compgen -W 'Red Green Blue Opacity Matte Cyan + Magenta Yellow Black' -- "$cur")) + return + ;; + -colormap) + COMPREPLY=($(compgen -W 'shared private' -- "$cur")) + return + ;; + -colorspace) + COMPREPLY=($(compgen -W 'GRAY OHTA RGB Transparent XYZ YCbCr YIQ + YPbPr YUV CMYK' -- "$cur")) + return + ;; + -compose) + COMPREPLY=($(compgen -W 'Over In Out Atop Xor Plus Minus Add + Subtract Difference Multiply Bumpmap Copy CopyRed CopyGreen + CopyBlue CopyOpacity' -- "$cur")) + return + ;; + -compress) + COMPREPLY=($(compgen -W 'None BZip Fax Group4 JPEG Lossless LZW + RLE Zip' -- "$cur")) + return + ;; + -dispose) + COMPREPLY=($(compgen -W 'Undefined None Background Previous' \ + -- "$cur")) + return + ;; + -encoding) + COMPREPLY=($(compgen -W 'AdobeCustom AdobeExpert AdobeStandard + AppleRoman BIG5 GB2312 Latin2 None SJIScode Symbol Unicode + Wansung' -- "$cur")) + return + ;; + -endian) + COMPREPLY=($(compgen -W 'MSB LSB' -- "$cur")) + return + ;; + -filter) + COMPREPLY=($(compgen -W 'Point Box Triangle Hermite Hanning + Hamming Blackman Gaussian Quadratic Cubic Catrom Mitchell + Lanczos Bessel Sinc' -- "$cur")) + return + ;; + -format) + COMPREPLY=($(compgen -W "$(convert -list format | awk \ + '/ [r-][w-][+-] / { sub("[*]$","",$1); print tolower($1) }')" \ + -- "$cur")) + return + ;; + -gravity) + COMPREPLY=($(compgen -W 'Northwest North NorthEast West Center + East SouthWest South SouthEast' -- "$cur")) + return + ;; + -intent) + COMPREPLY=($(compgen -W 'Absolute Perceptual Relative + Saturation' -- "$cur")) + return + ;; + -interlace) + COMPREPLY=($(compgen -W 'None Line Plane Partition' -- "$cur")) + return + ;; + -limit) + COMPREPLY=($(compgen -W 'Disk File Map Memory' -- "$cur")) + return + ;; + -list) + COMPREPLY=($(compgen -W 'Delegate Format Magic Module Resource + Type' -- "$cur")) + return + ;; + -map) + COMPREPLY=($(compgen -W 'best default gray red green blue' \ + -- "$cur")) + _filedir + return + ;; + -noise) + COMPREPLY=($(compgen -W 'Uniform Gaussian Multiplicative + Impulse Laplacian Poisson' -- "$cur")) + 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")) + return + ;; + -mask | -profile | -texture | -tile | -write) + _filedir + return + ;; + -type) + COMPREPLY=($(compgen -W 'Bilevel Grayscale Palette PaletteMatte + TrueColor TrueColorMatte ColorSeparation ColorSeparationlMatte + Optimize' -- "$cur")) + return + ;; + -units) + COMPREPLY=($(compgen -W 'Undefined PixelsPerInch + PixelsPerCentimeter' -- "$cur")) + return + ;; + -virtual-pixel) + COMPREPLY=($(compgen -W 'Constant Edge mirror tile' -- "$cur")) + return + ;; + -visual) + COMPREPLY=($(compgen -W 'StaticGray GrayScale StaticColor + PseudoColor TrueColor DirectColor defaut visualid' \ + -- "$cur")) + return + ;; + esac + + return 1 +} + +_convert() +{ + local cur prev words cword + _init_completion || return + + _ImageMagick && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + 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")) + else + _filedir + fi +} && + complete -F _convert convert + +_mogrify() +{ + local cur prev words cword + _init_completion || return + + _ImageMagick && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + elif [[ $cur == +* ]]; then + COMPREPLY=($(compgen -W '+compress +contrast +debug +dither +endian + +gamma +label +map +mask +matte +negate +page +raise' -- "$cur")) + else + _filedir + fi +} && + complete -F _mogrify mogrify + +_display() +{ + local cur prev words cword + _init_completion || return + + _ImageMagick && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + elif [[ $cur == +* ]]; then + COMPREPLY=($(compgen -W '+compress +contrast +debug +dither +endian + +gamma +label +map +matte +negate +page +raise +write' -- "$cur")) + else + _filedir + fi +} && + complete -F _display display + +_animate() +{ + local cur prev words cword + _init_completion || return + + _ImageMagick && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + elif [[ $cur == +* ]]; then + COMPREPLY=($(compgen -W '+debug +dither +gamma +map +matte' \ + -- "$cur")) + else + _filedir + fi +} && + complete -F _animate animate + +_identify() +{ + local cur prev words cword + _init_completion || return + + _ImageMagick && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + elif [[ $cur == +* ]]; then + COMPREPLY=($(compgen -W '+debug' -- "$cur")) + else + _filedir + fi +} && + complete -F _identify identify + +_montage() +{ + local cur prev words cword + _init_completion || return + + _ImageMagick && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + elif [[ $cur == +* ]]; then + COMPREPLY=($(compgen -W '+adjoin +compress +debug +dither +endian + +gamma +label +matte +page' -- "$cur")) + else + _filedir + fi +} && + complete -F _montage montage + +_composite() +{ + local cur prev words cword + _init_completion || return + + _ImageMagick && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + elif [[ $cur == +* ]]; then + COMPREPLY=($(compgen -W '+compress +debug +dither +endian +label + +matte +negate +page +write' -- "$cur")) + else + _filedir + fi +} && + complete -F _composite composite + +_compare() +{ + local cur prev words cword + _init_completion || return + + _ImageMagick && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + elif [[ $cur == +* ]]; then + COMPREPLY=($(compgen -W '+debug' -- "$cur")) + else + _filedir + fi +} && + complete -F _compare compare + +_conjure() +{ + local cur prev words cword + _init_completion || return + + _ImageMagick && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + elif [[ $cur == +* ]]; then + COMPREPLY=($(compgen -W '+debug' -- "$cur")) + else + _filedir + fi +} && + complete -F _conjure conjure + +_import() +{ + local cur prev words cword + _init_completion || return + + _ImageMagick && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + elif [[ $cur == +* ]]; then + COMPREPLY=($(compgen -W '+debug' -- "$cur")) + else + _filedir + fi +} && + complete -F _import import + +_stream() +{ + local cur prev words cword + _init_completion || return + + _ImageMagick && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + elif [[ $cur == +* ]]; then + COMPREPLY=($(compgen -W '+debug' -- "$cur")) + else + _filedir + fi +} && + complete -F _stream stream + +# ex: filetype=sh diff --git a/completions/cowsay b/completions/cowsay new file mode 100644 index 0000000..6ba1d0f --- /dev/null +++ b/completions/cowsay @@ -0,0 +1,23 @@ +# bash completion for cowsay -*- shell-script -*- + +_cowsay() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -f) + COMPREPLY=($(compgen -W \ + '$(cowsay -l 2>/dev/null | tail -n +2)' -- "$cur")) + return + ;; + esac + + # relevant options completion + COMPREPLY=($(compgen -W '-b -d -g -p -s -t -w -y -e -f -h -l -n -T -W' \ + -- "$cur")) + +} && + complete -F _cowsay -o default cowsay cowthink + +# ex: filetype=sh diff --git a/completions/cpan2dist b/completions/cpan2dist new file mode 100644 index 0000000..b5e59da --- /dev/null +++ b/completions/cpan2dist @@ -0,0 +1,37 @@ +# bash completion for cpan2dist -*- shell-script -*- + +_cpan2dist() +{ + local cur prev words cword + _init_completion || 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")) + return + ;; + --banlist | --ignorelist | --modulelist | --logfile) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + else + local cpandirs=("$HOME/.cpanplus/" "$HOME/.cpan/source/modules/") + local 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')) + fi +} && + complete -F _cpan2dist -o default cpan2dist + +# ex: filetype=sh diff --git a/completions/cpio b/completions/cpio new file mode 100644 index 0000000..d6fde0c --- /dev/null +++ b/completions/cpio @@ -0,0 +1,78 @@ +# bash completion for cpio -*- shell-script -*- + +_cpio() +{ + local cur prev words cword split + _init_completion -s -n : || return + + # --name value style option + case $prev in + --format | -!(-*)H) + COMPREPLY=($(compgen -W \ + 'bin odc newc crc tar ustar hpbin hpodc' -- "$cur")) + return + ;; + --file | --pattern-file | -!(-*)[EFI]) + _filedir + return + ;; + --owner | -!(-*)R) + _usergroup + return + ;; + --rsh-command) + compopt -o filenames + COMPREPLY=($(compgen -c -- "$cur")) + return + ;; + esac + + $split && return + + if ((cword == 1)); then + COMPREPLY=($(compgen -W '-o --create -i --extract -p --pass-through + -? --help --license --usage --version' -- "$cur")) + 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")) + 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 + --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")) + 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")) + else + _filedir -d + fi + ;; + esac + fi +} && + complete -F _cpio cpio + +# ex: filetype=sh diff --git a/completions/cppcheck b/completions/cppcheck new file mode 100644 index 0000000..8ea9571 --- /dev/null +++ b/completions/cppcheck @@ -0,0 +1,91 @@ +# bash completion for cppcheck(1) -*- shell-script -*- + +_cppcheck() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --append | --exitcode-suppressions | --rule-file | --config-excludes-file | \ + --suppressions-list | --includes-file | --include | -i) + _filedir + return + ;; + -D | -U | --rule | --suppress | --template | --max-configs | -h | --help | --version | \ + --errorlist | --config-exclude | -l) + return + ;; + --enable) + # split comma-separated list + split=false + if [[ $cur == ?*,* ]]; then + prev="${cur%,*}" + cur="${cur##*,}" + split=true + fi + COMPREPLY=($(compgen -W 'all warning style performance + portability information unusedFunction missingInclude' \ + -- "$cur")) + $split && COMPREPLY=(${COMPREPLY[@]/#/"$prev,"}) + return + ;; + --error-exitcode) + COMPREPLY=($(compgen -W '{0..255}' -- "$cur")) + return + ;; + --file-list) + _filedir + [[ -z $cur || $cur == - ]] && COMPREPLY+=(-) + return + ;; + -I) + _filedir -d + return + ;; + -j) + COMPREPLY=($(compgen -W "{2..$(_ncpus)}" -- "$cur")) + return + ;; + --language | -x) + COMPREPLY=($(compgen -W 'c c++' -- "$cur")) + return + ;; + --std) + COMPREPLY=($(compgen -W 'c89 c99 c11 c++03 c++11 c++14 c++17 + c++20' -- "$cur")) + return + ;; + --platform) + _filedir + COMPREPLY+=($(compgen -W 'unix32 unix64 win32A win32W win64 + native' -- "$cur")) + return + ;; + -rp | --relative-paths) + if $split; then # -rp without argument is allowed + _filedir -d + return + fi + ;; + --library) + _filedir cfg + return + ;; + --xml-version) + COMPREPLY=($(compgen -W '1 2' -- "$cur")) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + else + _filedir '@([cht]pp|[cht]xx|cc|[ch]++|[ch])' + fi +} && + complete -F _cppcheck cppcheck + +# ex: filetype=sh diff --git a/completions/crontab b/completions/crontab new file mode 100644 index 0000000..cac7853 --- /dev/null +++ b/completions/crontab @@ -0,0 +1,48 @@ +# crontab(1) completion -*- shell-script -*- + +_crontab() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -*u) + _allowed_users + return + ;; + esac + + local -A opts=([-u]="" [-l]="" [-r]="" [-e]="") + [[ $OSTYPE == *linux* ]] && opts[-i]= + [[ -d /sys/fs/selinux || -d /selinux ]] && opts[-s]= + + local i + for i in "${!words[@]}"; do + [[ ${words[i]} && $i -ne $cword ]] && unset "opts[${words[i]}]" + case "${words[i]}" in + -l) + unset 'opts[-r]' 'opts[-e]' 'opts[-i]' 'opts[-s]' + ;; + -e) + unset 'opts[-l]' 'opts[-r]' 'opts[-i]' + ;; + -r) + unset 'opts[-l]' 'opts[-e]' + ;; + -u) + unset 'opts[-i]' + ;; + esac + done + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '${!opts[@]}' -- "$cur")) + return + fi + + # do filenames only if we did not have -l, -r, or -e + [[ ${words[*]} == *\ -[lre]* ]] || _filedir +} && + complete -F _crontab crontab + +# ex: filetype=sh diff --git a/completions/cryptsetup b/completions/cryptsetup new file mode 100644 index 0000000..e73e165 --- /dev/null +++ b/completions/cryptsetup @@ -0,0 +1,103 @@ +# bash completion for cryptsetup -*- shell-script -*- + +_cryptsetup_name() +{ + COMPREPLY=($(compgen -X control -W '$(command ls /dev/mapper)' -- "$cur")) +} + +_cryptsetup_device() +{ + cur=${cur:=/dev/} + _filedir +} + +_cryptsetup() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --help | --version | --cipher | --hash | --*-size | --key-slot | --size | --offset | \ + --skip | --iter-time | --timeout | --tries | -!(-*)[chslSbopitT]) + return + ;; + --key-file | --master-key-file | --header-backup-file | -!(-*)d) + _filedir + return + ;; + --type | -!(-*)M) + COMPREPLY=($(compgen -W "luks plain loopaes tcrypt" -- "$cur")) + return + ;; + esac + + $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]" + case $arg in + open | create | luksOpen | loopaesOpen | tcryptOpen) + case $args in + 2) + _cryptsetup_device + ;; + 3) + _cryptsetup_name + ;; + esac + ;; + close | remove | luksClose | loopaesClose | tcryptClose | status | resize | \ + luksSuspend | luksResume) + case $args in + 2) + _cryptsetup_name + ;; + esac + ;; + luksFormat | luksAddKey | luksRemoveKey | luksChangeKey) + case $args in + 2) + _cryptsetup_device + ;; + 3) + _filedir + ;; + esac + ;; + luksKillSlot | luksDelKey | luksUUID | isLuks | luksDump) + case $args in + 2) + _cryptsetup_device + ;; + esac + ;; + luksHeaderBackup | luksHeaderRestore) + case $args in + 2) + _cryptsetup_device + ;; + 3) + COMPREPLY=('--header-backup-file') + ;; + esac + ;; + esac + fi + +} && + complete -F _cryptsetup cryptsetup + +# ex: filetype=sh diff --git a/completions/curl b/completions/curl new file mode 100644 index 0000000..6e84269 --- /dev/null +++ b/completions/curl @@ -0,0 +1,99 @@ +# curl(1) completion -*- shell-script -*- + +_curl() +{ + local cur prev words cword + _init_completion || return + + 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]) + return + ;; + --config | --cookie | --cookie-jar | --dump-header | --egd-file | \ + --key | --libcurl | --output | --random-file | --upload-file | --trace | \ + --trace-ascii | --netrc-file | -!(-*)[KbcDoT]) + _filedir + return + ;; + --cacert | --cert | -!(-*)E) + _filedir '@(c?(e)rt|cer|pem|der)' + return + ;; + --capath) + _filedir -d + return + ;; + --cert-type | --key-type) + COMPREPLY=($(compgen -W 'DER PEM ENG' -- "$cur")) + return + ;; + --crlfile) + _filedir crl + return + ;; + --data | --data-ascii | --data-binary | --data-urlencode | -!(-*)d) + if [[ $cur == \@* ]]; then + cur=${cur:1} + _filedir + if [[ ${#COMPREPLY[@]} -eq 1 && -d ${COMPREPLY[0]} ]]; then + COMPREPLY[0]+=/ + compopt -o nospace + fi + COMPREPLY=("${COMPREPLY[@]/#/@}") + fi + return + ;; + --delegation) + COMPREPLY=($(compgen -W 'none policy always' -- "$cur")) + return + ;; + --engine) + COMPREPLY=($(compgen -W 'list' -- "$cur")) + return + ;; + --ftp-method) + COMPREPLY=($(compgen -W 'multicwd nocwd singlecwd' -- "$cur")) + return + ;; + --ftp-ssl-ccc-mode) + COMPREPLY=($(compgen -W 'active passive' -- "$cur")) + return + ;; + --interface) + _available_interfaces -a + return + ;; + --proxy | --socks4 | --socks4a | --socks5 | --socks5-hostname | -!(-*)x) + _known_hosts_real -- "$cur" + return + ;; + --pubkey) + _xfunc ssh _ssh_identityfile pub + return + ;; + --stderr) + COMPREPLY=($(compgen -W '-' -- "$cur")) + _filedir + return + ;; + --tlsauthtype) + COMPREPLY=($(compgen -W 'SRP' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + fi +} && + complete -F _curl curl + +# ex: filetype=sh diff --git a/completions/cvs b/completions/cvs new file mode 100644 index 0000000..ba1f062 --- /dev/null +++ b/completions/cvs @@ -0,0 +1,398 @@ +# cvs(1) completion -*- shell-script -*- + +_cvs_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:-}}") + compopt -o filenames + fi +} + +_cvs_modules() +{ + if [[ -n $prefix ]]; then + COMPREPLY=($(command ls -d ${cvsroot}/${prefix}/!(CVSROOT))) + else + COMPREPLY=($(command ls -d ${cvsroot}/!(CVSROOT))) + fi +} + +_cvs_commands() +{ + cvs --help-commands 2>&1 | awk '/^( *|\t)/ { print $1 }' +} + +_cvs_command_options() +{ + COMPREPLY=($(compgen -W '$(_parse_help "$1" "--help $2")' -- "$cur")) +} + +_cvs_kflags() +{ + COMPREPLY=($(compgen -W 'kv kvl k o b v' -- "$cur")) +} + +_cvs_roots() +{ + local -a cvsroots + [[ -v CVSROOT ]] && cvsroots=("$CVSROOT") + [[ -r ~/.cvspass ]] && cvsroots+=($(awk '{ print $2 }' ~/.cvspass)) + [[ -r CVS/Root ]] && mapfile -tO ${#cvsroots[@]} cvsroots /dev/null)) + local f + for i in "${!files[@]}"; do + if [[ ${files[i]} == ?(*/)CVS ]]; then + unset 'files[i]' + else + for f in "${entries[@]}"; do + if [[ ${files[i]} == "$f" && ! -d $f ]]; then + unset 'files[i]' + break + fi + done + fi + done + COMPREPLY=($(compgen -X "$_backup_glob" -W '${files[@]}' \ + -- "$cur")) + else + _cvs_command_options "$1" $mode + fi + ;; + admin) + case $prev in + --*) ;; + -*@([aAbcelmnNosu]|t-)) + return + ;; + -*t) + _filedir + return + ;; + -*k) + _cvs_kflags + return + ;; + esac + + if [[ $cur == -* ]]; then + _cvs_command_options "$1" $mode + else + _cvs_entries + COMPREPLY=($(compgen -W '${entries[@]}' -- "$cur")) + fi + ;; + annotate) + [[ $prev == -[rD] ]] && return + + if [[ $cur == -* ]]; then + _cvs_command_options "$1" $mode + else + _cvs_entries + COMPREPLY=($(compgen -W '${entries[@]}' -- "$cur")) + fi + ;; + checkout) + case $prev in + --*) ;; + -*[rDj]) + return + ;; + -*d) + _filedir -d + return + ;; + -*k) + _cvs_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")) + else + _cvs_command_options "$1" $mode + fi + ;; + commit) + case $prev in + --*) ;; + -*[mr]) + return + ;; + -*F) + _filedir + return + ;; + esac + + if [[ $cur != -* ]]; then + # if $COMP_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 + # 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")) + else + _cvs_entries + COMPREPLY=($(compgen -W '${entries[@]}' -- "$cur")) + fi + else + _cvs_command_options "$1" $mode + fi + ;; + cvsroot) + _cvs_roots + ;; + diff | log) + if [[ $cur == -* ]]; then + _cvs_command_options "$1" $mode + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + else + _cvs_entries + COMPREPLY=($(compgen -W '${entries[@]:-}' -- "$cur")) + fi + ;; + editors | watchers) + if [[ $cur == -* ]]; then + _cvs_command_options "$1" $mode + else + _cvs_entries + COMPREPLY=($(compgen -W '${entries[@]}' -- "$cur")) + fi + ;; + export) + case $prev in + --*) ;; + -*[rD]) + return + ;; + -*d) + _filedir -d + return + ;; + -*k) + _cvs_kflags + return + ;; + esac + + if [[ $cur != -* ]]; then + [[ ! -v cvsroot ]] && cvsroot=${CVSROOT-} + COMPREPLY=($(cvs -d "$cvsroot" co -c | awk '{print $1}')) + COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur")) + else + _cvs_command_options "$1" $mode + fi + ;; + import) + case $prev in + --*) ;; + -*[IbmW]) + return + ;; + -*k) + _cvs_kflags + return + ;; + esac + + if [[ $cur != -* ]]; then + # starts with same algorithm as checkout + [[ ! -v cvsroot ]] && cvsroot=${CVSROOT-} + local prefix=${cur%/*} + if [[ -r ${cvsroot}/${prefix} ]]; then + _cvs_modules + COMPREPLY=(${COMPREPLY[@]#$cvsroot}) + COMPREPLY=(${COMPREPLY[@]#\/}) + fi + pwd=$(pwd) + pwd=${pwd##*/} + COMPREPLY=($(compgen -W '${COMPREPLY[@]} $pwd' -- "$cur")) + else + _cvs_command_options "$1" $mode + fi + ;; + remove) + if [[ $cur != -* ]]; then + _cvs_entries + if [[ $prev != -f ]]; then + # find out what files are missing + for i in "${!entries[@]}"; do + [[ -r ${entries[i]} ]] && unset 'entries[i]' + done + fi + COMPREPLY=($(compgen -W '${entries[@]:-}' -- "$cur")) + else + _cvs_command_options "$1" $mode + fi + ;; + update) + case $prev in + --*) ;; + -*[rDjIW]) + return + ;; + -*k) + _cvs_kflags + return + ;; + esac + + if [[ $cur == -* ]]; then + _cvs_command_options "$1" $mode + else + _cvs_entries + COMPREPLY=($(compgen -W '${entries[@]}' -- "$cur")) + fi + ;; + "") + case $prev in + --*) ;; + -*T) + _filedir -d + return + ;; + -*[es]) + return + ;; + -*z) + COMPREPLY=($(compgen -W '{1..9}' -- "$cur")) + return + ;; + esac + + COMPREPLY=($(compgen -W '$(_cvs_commands) + $(_parse_help "$1" --help-options) --help --help-commands + --help-options --version' -- "$cur")) + ;; + esac + +} && + complete -F _cvs cvs + +# ex: filetype=sh diff --git a/completions/cvsps b/completions/cvsps new file mode 100644 index 0000000..4fdfefc --- /dev/null +++ b/completions/cvsps @@ -0,0 +1,58 @@ +# bash completion for cvsps -*- shell-script -*- + +_cvsps() +{ + local cur prev words cword + _init_completion -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")) + return + ;; + -a) + COMPREPLY=($(compgen -W "$($1 2>/dev/null | + awk '/^Author:[ \t]/ { print $2 }')" -- "$cur")) + return + ;; + -b) + COMPREPLY=($(compgen -W "$($1 2>/dev/null | + awk '/^Branch:[ \t]/ { print $2 }')" -- "$cur")) + return + ;; + -r) + COMPREPLY=($(compgen -W "$($1 2>/dev/null | + awk '/^Tag:[ \t]+[^(]/ { print $2 }')" -- "$cur")) + return + ;; + -p) + _filedir -d + return + ;; + --test-log) + _filedir + return + ;; + -Z) + COMPREPLY=($(compgen -W '{1..9}' -- "$cur")) + return + ;; + --root) + _xfunc cvs _cvs_roots + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + else + _xfunc cvs _cvs_roots + fi +} && + complete -F _cvsps cvsps + +# ex: filetype=sh diff --git a/completions/dd b/completions/dd new file mode 100644 index 0000000..04d876a --- /dev/null +++ b/completions/dd @@ -0,0 +1,42 @@ +# bash completion for dd -*- shell-script -*- + +_dd() +{ + local cur prev words cword + _init_completion -n = || return + + case $cur in + if=* | of=*) + cur=${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")) + 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")) + return + ;; + status=*) + cur=${cur#*=} + COMPREPLY=($(compgen -W 'none noxfer progress' -- "$cur")) + 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")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace +} && + complete -F _dd dd + +# ex: filetype=sh diff --git a/completions/deja-dup b/completions/deja-dup new file mode 100644 index 0000000..1854d6a --- /dev/null +++ b/completions/deja-dup @@ -0,0 +1,32 @@ +# bash completion for deja-dup(1) -*- shell-script -*- + +_deja_dup() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + -'?' | --help | --help-*) + return + ;; + --restore) + _filedir + return + ;; + --restore-missing) + _filedir -d + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" --help-all)' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi +} && + complete -F _deja_dup deja-dup + +# ex: filetype=sh diff --git a/completions/desktop-file-validate b/completions/desktop-file-validate new file mode 100644 index 0000000..8f4e139 --- /dev/null +++ b/completions/desktop-file-validate @@ -0,0 +1,23 @@ +# desktop-file-validate completion -*- shell-script -*- + +_desktop_file_validate() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + _filedir desktop +} && + complete -F _desktop_file_validate desktop-file-validate + +# ex: filetype=sh diff --git a/completions/dhclient b/completions/dhclient new file mode 100644 index 0000000..ce4b745 --- /dev/null +++ b/completions/dhclient @@ -0,0 +1,34 @@ +# bash completion for dhclient -*- shell-script -*- + +_dhclient() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -p | -e) + return + ;; + -D) + COMPREPLY=($(compgen -W 'LL LLT' -- "$cur")) + return + ;; + -*f) + _filedir + return + ;; + -s) + _known_hosts_real -- "$cur" + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + else + _available_interfaces + fi +} && + complete -F _dhclient dhclient + +# ex: filetype=sh diff --git a/completions/dict b/completions/dict new file mode 100644 index 0000000..f3426ff --- /dev/null +++ b/completions/dict @@ -0,0 +1,64 @@ +# dict(1) completion -*- shell-script -*- + +_dictdata() +{ + dict $host $port $1 2>/dev/null | command sed -ne \ + 's/^[[:blank:]]\{1,\}\([^[:blank:]]*\).*$/\1/p' +} + +_dict() +{ + local cur prev words cword + _init_completion || return + + local host port db i + + for ((i = 1; i < cword; i++)); do + case ${words[i]} in + --host | -!(-*)h) + host=${words[++i]} + [[ -n $host ]] && host="-h $host" + ;; + --port | -!(-*)p) + port=${words[++i]} + [[ -n $port ]] && port="-p $port" + ;; + --database | -!(-*)d) + db=${words[++i]} + [[ -n $db ]] && host="-d $db" + ;; + esac + done + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + case $prev in + --database | -info | -!(-*)[di]) + COMPREPLY=($(compgen -W '$(_dictdata -D)' -- "$cur")) + return + ;; + --strategy | -!(-*)s) + COMPREPLY=($(compgen -W '$(_dictdata -S)' -- "$cur")) + return + ;; + esac + + local dictfile=/usr/share/dict/words + if [[ -r $dictfile ]]; then + # Dictfile may be too large for practical compgen -W usage, so narrow + # 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")) + else + COMPREPLY=($(compgen -W '$(cat $dictfile)' -- "$cur")) + fi + fi +} && + complete -F _dict -o default dict rdict + +# ex: filetype=sh diff --git a/completions/dmypy b/completions/dmypy new file mode 100644 index 0000000..5abe37d --- /dev/null +++ b/completions/dmypy @@ -0,0 +1,48 @@ +# dmypy completion -*- shell-script -*- + +_dmypy() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help | --version | -[hV]) + return + ;; + --status-file) + _filedir + return + ;; + esac + + local cmd i + for ((i = 1; i < cword; i++)); do + if [[ ${words[i]} != -* && ${words[i - 1]} != --status-file ]]; then + cmd=${words[i]} + break + fi + done + + case ${cmd-} in + check | run) + _filedir '@(py|pyi)' + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + if [[ ! -v 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")) + return + fi +} && + complete -F _dmypy dmypy + +# ex: filetype=sh diff --git a/completions/dnssec-keygen b/completions/dnssec-keygen new file mode 100644 index 0000000..3f68a68 --- /dev/null +++ b/completions/dnssec-keygen @@ -0,0 +1,48 @@ +# bash completion for dnssec-keygen(8) -*- shell-script -*- + +_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")) +} + +_dnssec_keygen() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -[hbEgLpsPARIDSi]) + return + ;; + -K) + _filedir -d + return + ;; + -[ancdfTtm]) + _dnssec_keygen_optarg "$1" $prev + return + ;; + -r) + cur=${cur:=/dev/} + _filedir + return + ;; + -v) + COMPREPLY=($(compgen -W '{0..10}' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" | \ + command sed -e "s/:\$//")' -- "$cur")) + return + fi +} && + complete -F _dnssec_keygen dnssec-keygen + +# ex: filetype=sh diff --git a/completions/dnsspoof b/completions/dnsspoof new file mode 100644 index 0000000..86ade91 --- /dev/null +++ b/completions/dnsspoof @@ -0,0 +1,26 @@ +# dnsspoof completion -*- shell-script -*- + +_dnsspoof() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -i) + _available_interfaces -a + return + ;; + -f) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + fi + +} && + complete -F _dnsspoof dnsspoof + +# ex: filetype=sh diff --git a/completions/dot b/completions/dot new file mode 100644 index 0000000..8122229 --- /dev/null +++ b/completions/dot @@ -0,0 +1,45 @@ +# dot(1) completion -*- shell-script -*- + +_dot() +{ + local cur prev words cword + _init_completion -n := || return + + [[ $prev == -[V?] ]] && return + + case $cur in + -G* | -N* | -E* | -l?* | -q?* | -s?* | -Ln* | -LU* | -LC* | -LT*) + return + ;; + -T*) + local langs=($("$1" -TNON_EXISTENT 2>&1 | + command sed -ne 's/.*one of://p')) + COMPREPLY=($(compgen -P -T -W '${langs[@]}' -- "${cur#-T}")) + return + ;; + -K*) + local layouts=($("$1" -KNON_EXISTENT 2>&1 | + command sed -ne 's/.*one of://p')) + COMPREPLY=($(compgen -P -K -W '${layouts[@]}' -- "${cur#-K}")) + return + ;; + -o*) + cur=${cur#-o} + _filedir + COMPREPLY=($(compgen -P -o -W '${COMPREPLY[@]}' -- "$cur")) + 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")) + [[ ${COMPREPLY-} == -@([GNETKo]|L[nUCT]) ]] && compopt -o nospace + return + fi + + _filedir dot +} && + complete -F _dot dot + +# ex: filetype=sh diff --git a/completions/dpkg b/completions/dpkg new file mode 100644 index 0000000..0b90b14 --- /dev/null +++ b/completions/dpkg @@ -0,0 +1,126 @@ +# This function is required by _dpkg and _dpkg-reconfigure -*- 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 + } +} + +_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 + } +} + +# Debian dpkg(1) completion +# +_dpkg() +{ + local cur prev words cword split + _init_completion -s || return + + local i=$cword + + # find the last option flag + if [[ $cur != -* ]]; then + while [[ $prev != -* && $i -ne 1 ]]; do + prev=${words[--i - 1]} + done + fi + + case $prev in + --install | --unpack | --record-avail | --contents | --info | --fsys-tarfile | \ + --field | --control | --extract | --vextract | --raw-extract | -!(-*)[ciAIfexX]) + _filedir '?(u|d)deb' + return + ;; + --build | -!(-*)b) + _filedir -d + return + ;; + --status | --print-avail | --list | -!(-*)[spl]) + COMPREPLY=($(_xfunc apt-cache _apt_cache_packages)) + return + ;; + --show | -!(-*)W) + if [[ $1 == *dpkg-query ]]; then + COMPREPLY=($(_xfunc apt-cache _apt_cache_packages)) + else + _filedir '?(u|d)deb' + fi + return + ;; + --search | -!(-*)S) + _filedir + return + ;; + --remove | --verify | -!(-*)[rV]) + COMPREPLY=($(_comp_dpkg_installed_packages "$cur")) + return + ;; + --listfiles | --purge | -!(-*)[LP]) + COMPREPLY=($(_comp_dpkg_purgeable_packages "$cur")) + return + ;; + esac + + $split && return + + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace +} && + complete -F _dpkg dpkg dpkg-deb dpkg-query + +# Debian GNU dpkg-reconfigure(8) completion +# +_dpkg_reconfigure() +{ + local cur prev words cword + _init_completion || return + + local opt + + case $prev in + --frontend | -!(-*)f) + opt=($(printf '%s\n' /usr/share/perl5/Debconf/FrontEnd/*)) + opt=(${opt[@]##*/}) + opt=(${opt[@]%.pm}) + COMPREPLY=($(compgen -W '${opt[@]}' -- "$cur")) + return + ;; + --priority | -!(-*)p) + COMPREPLY=($(compgen -W 'low medium high critical' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--frontend --priority --all --unseen-only + --help --showold --force --terse' -- "$cur")) + else + COMPREPLY=($(_comp_dpkg_installed_packages "$cur")) + fi +} && + complete -F _dpkg_reconfigure -o default dpkg-reconfigure + +# ex: filetype=sh diff --git a/completions/dpkg-source b/completions/dpkg-source new file mode 100644 index 0000000..05fa3a1 --- /dev/null +++ b/completions/dpkg-source @@ -0,0 +1,98 @@ +# Debian dpkg-source completion -*- shell-script -*- + +_dpkg_source() +{ + local cur prev words cword + _init_completion || return + + local options word action packopts unpackopts fields + + packopts="-c -l -F -V -T -D -U -W -E -sa -i -I -sk -sr -ss -sA -sK -sP \ + -sU -sR" + unpackopts="-sp -sn -su" + options="-x -b --print-format --before-build --after-build --commit $packopts $unpackopts" + fields="Format Source Version Binary Maintainer Uploader Architecture \ + Standards-Version Build-Depends Files" + + action=options + for word in "${words[@]:1}"; do + if [[ $word == -x ]]; then + action=unpack + elif [[ $word == -b ]]; then + action=pack + elif [[ $word == -h ]]; then + action=help + fi + done + + case $action in + unpack) + case $prev in + -x) + _filedir -d + _filedir 'dsc' + ;; + *) + COMPREPLY=($(compgen -W "$unpackopts" -- "$cur")) + _filedir -d + _filedir + ;; + esac + return + ;; + pack) + case $prev in + -b) + _filedir -d + ;; + -c | -l | -T | -i | -I) + # -c: get controlfile + # -l: get per-version info from this file + # -T: read variables here, not debian/substvars + # -i: filter out files to ignore diffs of. + # -I: filter out files when building tarballs. + # return directory names and file names + _filedir -d + _filedir + ;; + -F) + # -F: force change log format + COMPREPLY=($(command ls /usr/lib/dpkg/parsechangelog)) + ;; + -V) + # -V: set a substitution variable + # we don't know anything about possible variables or values + # so we don't try to suggest any completion. + COMPREPLY=() + ;; + -D) + # -D: override or add a .dsc field and value + # if $cur doesn't contain a = yet, suggest variable names + if [[ $cur == *=* ]]; then + # $cur contains a "=" + COMPREPLY=() + else + COMPREPLY=($(compgen -W "$fields" -- "$cur")) + fi + ;; + -U) + # -U: remove a field + # Suggest possible fieldnames + COMPREPLY=($(compgen -W "$fields" -- "$cur")) + ;; + *) + COMPREPLY=($(compgen -W "$packopts $unpackopts" \ + -- "$cur")) + ;; + esac + return + ;; + *) + COMPREPLY=($(compgen -W "$options" -- "$cur")) + return + ;; + esac +} && + complete -F _dpkg_source dpkg-source + +# ex: filetype=sh diff --git a/completions/dselect b/completions/dselect new file mode 100644 index 0000000..4c18026 --- /dev/null +++ b/completions/dselect @@ -0,0 +1,29 @@ +# Debian Linux dselect(8) completion -*- shell-script -*- + +_dselect() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --admindir) + _filedir -d + return + ;; + -D | -debug) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + else + COMPREPLY=($(compgen -W 'access update select install config remove + quit' -- "$cur")) + fi + +} && + complete -F _dselect dselect + +# ex: filetype=sh diff --git a/completions/dsniff b/completions/dsniff new file mode 100644 index 0000000..749c533 --- /dev/null +++ b/completions/dsniff @@ -0,0 +1,26 @@ +# dsniff completion -*- shell-script -*- + +_dsniff() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -r | -w | -f | -p) + _filedir + return + ;; + -i) + _available_interfaces -a + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1") -r -w -p' -- "$cur")) + fi + +} && + complete -F _dsniff dsniff + +# ex: filetype=sh diff --git a/completions/dumpdb b/completions/dumpdb new file mode 100644 index 0000000..eb1927f --- /dev/null +++ b/completions/dumpdb @@ -0,0 +1,18 @@ +# mailman dumpdb completion -*- shell-script -*- + +_dumpdb() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--marshal --pickle --noprint --help' \ + -- "$cur")) + else + _filedir + fi + +} && + complete -F _dumpdb dumpdb + +# ex: filetype=sh diff --git a/completions/dumpe2fs b/completions/dumpe2fs new file mode 100644 index 0000000..413a5bf --- /dev/null +++ b/completions/dumpe2fs @@ -0,0 +1,28 @@ +# dumpe2fs(8) completion -*- shell-script -*- + +_dumpe2fs() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -*[oV]) + return + ;; + -*i) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + return + fi + + cur=${cur:=/dev/} + _filedir +} && + complete -F _dumpe2fs dumpe2fs + +# ex: filetype=sh diff --git a/completions/e2freefrag b/completions/e2freefrag new file mode 100644 index 0000000..c89dc9c --- /dev/null +++ b/completions/e2freefrag @@ -0,0 +1,24 @@ +# e2freefrag(8) completion -*- shell-script -*- + +_e2freefrag() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -c | -h) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" -h)' -- "$cur")) + return + fi + + cur=${cur:=/dev/} + _filedir +} && + complete -F _e2freefrag e2freefrag + +# ex: filetype=sh diff --git a/completions/e2label b/completions/e2label new file mode 100644 index 0000000..ac8e4b5 --- /dev/null +++ b/completions/e2label @@ -0,0 +1,15 @@ +# e2label(8) completion -*- shell-script -*- + +_e2label() +{ + local cur prev words cword + _init_completion || return + + if ((cword == 1)); then + cur=${cur:=/dev/} + _filedir + fi +} && + complete -F _e2label e2label + +# ex: filetype=sh diff --git a/completions/ebtables b/completions/ebtables new file mode 100644 index 0000000..de6bc54 --- /dev/null +++ b/completions/ebtables @@ -0,0 +1,78 @@ +# bash completion for ebtables -*- shell-script -*- + +_ebtables() +{ + local cur prev words cword split + _init_completion -s || return + + local table chain='s/^Bridge chain: \([^ ,]\{1,\}\).*$/\1/p' \ + targets='ACCEPT DROP CONTINUE RETURN' + + [[ ${words[*]} =~ [[:space:]]-(t|-table=?)[[:space:]]*([^[:space:]]+) ]] && + table="-t ${BASH_REMATCH[2]}" + + case $prev in + -!(-*)[AIDPFXLZ]) + COMPREPLY=($(compgen -W '`"$1" $table -L 2>/dev/null | \ + command sed -ne "$chain"`' -- "$cur")) + ;; + -!(-*)t) + COMPREPLY=($(compgen -W 'nat filter broute' -- "$cur")) + ;; + -!(-*)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")) + fi + ;; + *) + if [[ $cur == -* ]]; then + COMPREPLY=($(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 + --arpreply-target --atomic-commit --atomic-file --atomic-init + --atomic-save --change-counters --concurrent --delete + --delete-chain --destination --dnat-target --dst --flush --help + --in-if --in-interface --init-table --insert --ip6-destination + --ip6-destination-port --ip6-dport --ip6-dst --ip6-icmp-type + --ip6-prococol --ip6-proto --ip6-protocol --ip6-source + --ip6-source-port --ip6-sport --ip6-src --ip6-tclass + --ip-destination --ip-destination-port --ip-dport --ip-dst + --ip-proto --ip-protocol --ip-source --ip-source-port --ip-sport + --ip-src --ip-tos --jump --Lc --limit --limit-burst --list --Lmac2 + --Ln --log --log-arp --logical-in --logical-out --log-ip --log-ip6 + --log-level --log-prefix --Lx --mark --mark-and --mark-or + --mark-set --mark-target --mark-xor --modprobe --new-chain --nflog + --nflog-group --nflog-prefix --nflog-range --nflog-threshold + --out-if --out-interface --pkttype-type --policy --proto --protocol + --redirect-target --rename-chain --set-counter --snat-arp + --snat-target --source --src --stp-flags --stp-forward-delay + --stp-hello-time --stp-max-age --stp-msg-age --stp-port + --stp-root-addr --stp-root-cost --stp-root-prio --stp-sender-addr + --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")) + fi + ;; + esac + +} && + complete -F _ebtables ebtables + +# ex: filetype=sh diff --git a/completions/ecryptfs-migrate-home b/completions/ecryptfs-migrate-home new file mode 100644 index 0000000..d2eeb38 --- /dev/null +++ b/completions/ecryptfs-migrate-home @@ -0,0 +1,22 @@ +# ecryptfs-migrate-home(8) completion -*- shell-script -*- + +_ecryptfs_migrate_home() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help) + return + ;; + --user | -u) + COMPREPLY=($(compgen -u -- "$cur")) + return + ;; + esac + + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) +} && + complete -F _ecryptfs_migrate_home ecryptfs-migrate-home + +# ex: filetype=sh diff --git a/completions/eog b/completions/eog new file mode 100644 index 0000000..2330e1a --- /dev/null +++ b/completions/eog @@ -0,0 +1,26 @@ +# eog(1) completion -*- shell-script -*- + +_eog() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + -'?' | --help | --help-all | --help-gtk) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" --help-all)' -- "$cur")) + [[ ${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)' +} && + complete -F _eog eog + +# ex: filetype=sh diff --git a/completions/ether-wake b/completions/ether-wake new file mode 100644 index 0000000..d952673 --- /dev/null +++ b/completions/ether-wake @@ -0,0 +1,27 @@ +# ether-wake(8) completion -*- shell-script -*- + +_ether_wake() +{ + local cur prev words cword + _init_completion -n : || return + + case $prev in + -i) + _available_interfaces -a + return + ;; + -p) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -u) -V' -- "$cur")) + return + fi + + _mac_addresses +} && + complete -F _ether_wake ether-wake etherwake + +# ex: filetype=sh diff --git a/completions/evince b/completions/evince new file mode 100644 index 0000000..1c97dd9 --- /dev/null +++ b/completions/evince @@ -0,0 +1,32 @@ +# evince(1) completion -*- shell-script -*- + +_evince() +{ + local cur prev words cword split + _init_completion -s || return + + 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]) + return + ;; + --sm-client-state-file) + _filedir + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" --help-all)' -- "$cur")) + [[ ${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)' +} && + complete -F _evince evince + +# ex: filetype=sh diff --git a/completions/explodepkg b/completions/explodepkg new file mode 100644 index 0000000..a281f81 --- /dev/null +++ b/completions/explodepkg @@ -0,0 +1,5 @@ +# Slackware Linux explodepkg completion -*- shell-script -*- + +complete -o plusdirs -f -X '!*.t[bglx]z' explodepkg + +# ex: filetype=sh diff --git a/completions/export b/completions/export new file mode 100644 index 0000000..8d82361 --- /dev/null +++ b/completions/export @@ -0,0 +1,65 @@ +# bash export completion -*- shell-script -*- + +_export() +{ + local cur prev words cword + _init_completion -n = || return + + local i action=variable remove=false + for ((i = 1; i < cword; i++)); do + case ${words[i]} in + -p) + return + ;; + -*f*) + action=function + ;;& + -*n*) + remove=true + ;; + -*) + continue + ;; + esac + break + done + + if [[ $cur == *=* ]]; then + local ocur=$cur oprev=$prev + prev=${cur%%=*} cur=${cur#*=} + _variables && return + cur=$ocur prev=$oprev + fi + + case $cur in + *=) + local pval=$(quote "$(eval printf %s \"\$\{${cur%=}-\}\")") + # Complete previous value if it's not empty. + if [[ $pval != \'\' ]]; then + COMPREPLY=("$pval") + else + cur=${cur#*=} + _filedir + fi + ;; + *=*) + cur=${cur#*=} + _filedir + ;; + *) + if [[ $cword -eq 1 && $cur == -* ]]; then + COMPREPLY=($(compgen -W '-p $(_parse_usage "$1")' -- "$cur")) + return + fi + local suffix="" + if ! $remove; then + suffix="=" + compopt -o nospace + fi + COMPREPLY=($(compgen -A $action -S "$suffix" -- "$cur")) + ;; + esac +} && + complete -F _export export + +# ex: filetype=sh diff --git a/completions/faillog b/completions/faillog new file mode 100644 index 0000000..c8b81bd --- /dev/null +++ b/completions/faillog @@ -0,0 +1,27 @@ +# faillog(8) completion -*- shell-script -*- + +_faillog() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --help | --lock-time | --maximum | --time | -!(-*)[hlmt]) + return + ;; + --user | -!(-*)u) + COMPREPLY=($(compgen -u -- "$cur")) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + fi +} && + complete -F _faillog faillog + +# ex: filetype=sh diff --git a/completions/fbgs b/completions/fbgs new file mode 100644 index 0000000..1947b87 --- /dev/null +++ b/completions/fbgs @@ -0,0 +1,50 @@ +# bash completion for fbgs(1) -*- shell-script -*- + +_fbgs() +{ + local cur prev words cword + _init_completion || return + + case "$prev" in + -f | --font) + local IFS=$'\n' + COMPREPLY=($(compgen -W '$(fc-list 2>/dev/null)' -- "$cur")) + return + ;; + -m | --mode) + COMPREPLY=($(compgen -W '$(command sed \ + -n "/^mode/{s/^mode \{1,\}\"\([^\"]\{1,\}\)\"/\1/g;p}" \ + /etc/fb.modes 2>/dev/null)' -- "$cur")) + return + ;; + -d | --device) + COMPREPLY=($(compgen -f -d -- "${cur:-/dev/}")) + return + ;; + -fp | --firstpage | -lp | --lastpage | -r | --resolution | -s | --scroll | -t | \ + --timeout) + # expect integer value + COMPREPLY+=($(compgen -W '{0..9}')) + compopt -o nospace + return + ;; + -T | --vt | -p | --password | -g | --gamma) + # argument required but no completions available + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(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")) + [[ ${COMPREPLY-} ]] && return + fi + + _filedir '?(e)ps|pdf' +} && + complete -F _fbgs fbgs + +# ex: filetype=sh diff --git a/completions/fbi b/completions/fbi new file mode 100644 index 0000000..455887a --- /dev/null +++ b/completions/fbi @@ -0,0 +1,54 @@ +# bash completion for fbi(1) -*- shell-script -*- + +_fbi() +{ + local cur prev words cword + _init_completion || return + + case "$prev" in + -l | --list) + _filedir + return + ;; + -r | --resolution) + COMPREPLY+=($(compgen -W '{1..5}')) + return + ;; + -f | --font) + local IFS=$'\n' + COMPREPLY=($(compgen -W '$(fc-list 2>/dev/null)' -- "$cur")) + return + ;; + -m | --mode) + COMPREPLY=($(compgen -W '$(command sed \ + -n "/^mode/{s/^mode \{1,\}\"\([^\"]\{1,\}\)\"/\1/g;p}" \ + /etc/fb.modes 2>/dev/null)' -- "$cur")) + return + ;; + -d | --device) + COMPREPLY=($(compgen -f -d -- "${cur:-/dev/}")) + return + ;; + --cachemem | --blend | -T | --vt | -s | --scroll | -t | --timeout | -g | --gamma) + # argument required but no completions available + return + ;; + 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")) + [[ ${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' +} && + complete -F _fbi fbi + +# ex: filetype=sh diff --git a/completions/feh b/completions/feh new file mode 100644 index 0000000..f1d4b18 --- /dev/null +++ b/completions/feh @@ -0,0 +1,120 @@ +# bash completion for feh(1) -*- shell-script -*- + +_feh() +{ + local cur prev words cword split + _init_completion -s || return + + case "$prev" in + --image-bg | -B) + COMPREPLY=($(compgen -W 'checks white black' -- "$cur")) + return + ;; + --filelist | --output | --output-only | --start-at | -!(-*)[foO\|]) + _filedir + return + ;; + --caption-path | --fontpath | --output-dir | -!(-*)[KCj]) + _filedir -d + return + ;; + --font | --menu-font | --title-font | -!(-*)[eM@]) + # expect string like "dejavu.ttf/12" + if [[ $cur == */* ]]; then # expect integer value + COMPREPLY=($(compgen -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") ) + 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" + )) + fi + done + compopt -o nospace + return + ;; + --theme | -!(-*)T) + local conf_path=~/.config/feh/themes + local theme_name theme_opts + [[ -r $conf_path ]] || return + while read theme_name theme_opts; do + if [[ $theme_name == '#'* || $theme_name == "" ]]; then + continue + fi + COMPREPLY+=($(compgen -W "$theme_name" -- "$cur")) + done <"$conf_path" + return + ;; + --sort | -!(-*)S) + COMPREPLY=($(compgen -W 'name filename mtime width height + pixels size format' -- "$cur")) + return + ;; + --reload | --limit-height | --limit-width | --thumb-height | --thumb-width | \ + --thumb-redraw | --magick-timeout | -!(-*)[RHWEyJ]) + # expect integer value + COMPREPLY+=($(compgen -W '{0..9}')) + compopt -o nospace + return + ;; + --zoom) + # expect integer value or "max", "fill" + COMPREPLY=($(compgen -W 'max fill' -- "$cur")) + if [[ ! $cur || ! ${COMPREPLY-} ]]; then + COMPREPLY+=($(compgen -W '{0..9}')) + compopt -o nospace + fi + return + ;; + --alpha | -!(-*)a) + COMPREPLY=($(compgen -W '{0..255}' -- "$cur")) + return + ;; + --bg | -!(-*)b) + _filedir + COMPREPLY+=($(compgen -W 'trans' -- "$cur")) + return + ;; + --geometry | --max-dimension | --min-dimension | -!(-*)g) + # expect string like 640x480 + if [[ $cur && $cur != *x* ]]; then + COMPREPLY=(x) + fi + COMPREPLY+=($(compgen -W "{0..9}")) + compopt -o nospace + return + ;; + --customlist | --index-info | --info | --slideshow-delay | --thumb-title | \ + --title | -!(-*)[LD~^]) + # argument required but no completions available + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + # Some versions of feh just output "See 'man feh'" for --help :( + COMPREPLY=($(compgen -W '$(_parse_help "$1" --help)' -- "$cur")) + if [[ ${COMPREPLY-} ]]; then + [[ $COMPREPLY == *= ]] && compopt -o nospace + return + fi + fi + + # 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' +} && + complete -F _feh feh + +# ex: filetype=sh diff --git a/completions/file b/completions/file new file mode 100644 index 0000000..21fbd16 --- /dev/null +++ b/completions/file @@ -0,0 +1,32 @@ +# file(1) completion -*- shell-script -*- + +_file() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help | --version | --separator | -!(-*)[vF]) + return + ;; + --magic-file | --files-from | -!(-*)[mf]) + _filedir + return + ;; + --exclude | -!(-*)e) + COMPREPLY=($(compgen -W 'apptype ascii cdf compress elf encoding + soft tar text tokens troff' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + _filedir +} && + complete -F _file file + +# ex: filetype=sh diff --git a/completions/file-roller b/completions/file-roller new file mode 100644 index 0000000..1d223fd --- /dev/null +++ b/completions/file-roller @@ -0,0 +1,42 @@ +# file-roller(1) completion -*- shell-script -*- + +_file_roller() +{ + local cur prev words cword split + _init_completion -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)' + + case $prev in + --help | --help-all | --help-gtk | --help-sm-client | -!(-*)'?') + return + ;; + --sm-client-state-file) + _filedir + return + ;; + --add-to | -!(-*)a) + _filedir_xspec unzip + _filedir "$exts" + return + ;; + --extract-to | --default-dir | -!(-*)e) + _filedir -d + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" --help-all)' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _filedir_xspec unzip + _filedir "$exts" +} && + complete -F _file_roller file-roller + +# ex: filetype=sh diff --git a/completions/filefrag b/completions/filefrag new file mode 100644 index 0000000..d26e8c8 --- /dev/null +++ b/completions/filefrag @@ -0,0 +1,17 @@ +# filefrag(8) completion -*- shell-script -*- + +_filefrag() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + return + fi + + _filedir +} && + complete -F _filefrag filefrag + +# ex: filetype=sh diff --git a/completions/filesnarf b/completions/filesnarf new file mode 100644 index 0000000..f959d80 --- /dev/null +++ b/completions/filesnarf @@ -0,0 +1,22 @@ +# filesnarf etc completion -*- shell-script -*- + +_snarf() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -i) + _available_interfaces -a + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + fi + +} && + complete -F _snarf filesnarf mailsnarf msgsnarf + +# ex: filetype=sh diff --git a/completions/find b/completions/find new file mode 100644 index 0000000..64121ed --- /dev/null +++ b/completions/find @@ -0,0 +1,113 @@ +# bash completion for GNU find -*- shell-script -*- +# This makes heavy use of ksh style extended globs and contains Linux specific +# code for completing the parameter to the -fstype option. + +_find() +{ + local cur prev words cword + _init_completion || return + + local i + for i in ${!words[*]}; do + if [[ ${words[i]} == -@(exec|ok)?(dir) ]]; then + _command_offset $((i + 1)) + return + fi + done + + case $prev in + -maxdepth | -mindepth) + COMPREPLY=($(compgen -W '{0..9}' -- "$cur")) + return + ;; + -newer | -anewer | -cnewer | -fls | -fprint | -fprint0 | -fprintf | -name | -[il]name | \ + -ilname | -wholename | -[il]wholename | -samefile) + _filedir + return + ;; + -fstype) + _fstypes + [[ $OSTYPE == *bsd* ]] && + COMPREPLY+=($(compgen -W 'local rdonly' -- "$cur")) + return + ;; + -gid) + _gids + return + ;; + -group) + COMPREPLY=($(compgen -g -- "$cur" 2>/dev/null)) + return + ;; + -xtype | -type) + COMPREPLY=($(compgen -W 'b c d p f l s' -- "$cur")) + return + ;; + -uid) + _uids + return + ;; + -user) + COMPREPLY=($(compgen -u -- "$cur")) + return + ;; + -[acm]min | -[acm]time | -inum | -path | -ipath | -regex | -iregex | -links | -perm | \ + -size | -used | -printf | -context) + # do nothing, just wait for a parameter to be given + return + ;; + -regextype) + COMPREPLY=($(compgen -W 'emacs posix-awk posix-basic posix-egrep + posix-extended' -- "$cur")) + return + ;; + esac + + local i exprfound=false + # set exprfound to true if there is already an expression present + for i in "${words[@]}"; do + [[ $i == [-\(\),\!]* ]] && exprfound=true && break + done + + # handle case where first parameter is not a dash option + if ! $exprfound && [[ $cur != [-\(\),\!]* ]]; then + _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")) + + if ((${#COMPREPLY[@]} != 0)); then + # this removes any options from the list of completions that have + # already been specified somewhere on the command line, as long as + # these options can only be used once (in a word, "options", in + # opposition to "tests" and "actions", as in the find(1) manpage). + local -A onlyonce=([-daystart]=1 [-depth]=1 [-follow]=1 [-help]=1 + [-ignore_readdir_race]=1 [-maxdepth]=1 [-mindepth]=1 [-mount]=1 + [-noignore_readdir_race]=1 [-noleaf]=1 [-nowarn]=1 [-regextype]=1 + [-version]=1 [-warn]=1 [-xdev]=1) + local j + for i in "${words[@]}"; do + [[ $i && -v onlyonce["$i"] ]] || continue + for j in "${!COMPREPLY[@]}"; do + [[ ${COMPREPLY[j]} == "$i" ]] && unset 'COMPREPLY[j]' + done + done + fi + + _filedir + +} && + complete -F _find find + +# ex: filetype=sh diff --git a/completions/find_member b/completions/find_member new file mode 100644 index 0000000..cf30c70 --- /dev/null +++ b/completions/find_member @@ -0,0 +1,25 @@ +# mailman find_member completion -*- shell-script -*- + +_find_member() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + -l | -x | --listname | --exclude) + _xfunc list_lists _mailman_lists + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--listname --exclude --owners --help' \ + -- "$cur")) + fi + +} && + complete -F _find_member find_member + +# ex: filetype=sh diff --git a/completions/fio b/completions/fio new file mode 100644 index 0000000..f81a4da --- /dev/null +++ b/completions/fio @@ -0,0 +1,90 @@ +# fio(1) completion -*- shell-script -*- + +_fio() +{ + local cur prev words cword split + _init_completion -s || return + + 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}) + return + ;; + --output-format) + COMPREPLY=($(compgen -W "terse json json+ normal" -- "$cur")) + return + ;; + --terse-version) + COMPREPLY=($(compgen -W "2 3" -- "$cur")) + return + ;; + --cmdhelp) + # TODO more commands? + COMPREPLY=($(compgen -W "all" -- "$cur")) + return + ;; + --enghelp) + # TODO print ioengine help, or list available ioengines + # TODO engine,help arg + return + ;; + --eta) + COMPREPLY=($(compgen -W "always never auto" -- "$cur")) + return + ;; + --daemonize) + _filedir pid + return + ;; + --client) + _known_hosts_real -- "$cur" + return + ;; + --remote-config) + _filedir job + return + ;; + --idle-prof) + COMPREPLY=($(compgen -W "system percpu calibrate" -- "$cur")) + return + ;; + --inflate-log) + _filedir log + return + ;; + --trigger-file) + _filedir + return + ;; + --trigger | --trigger-remote) + compopt -o filenames + COMPREPLY=($(compgen -c -- "$cur")) + return + ;; + --aux-path) + _filedir -d + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _filedir job +} && + complete -F _fio fio + +# ex: filetype=sh diff --git a/completions/firefox b/completions/firefox new file mode 100644 index 0000000..4656f8d --- /dev/null +++ b/completions/firefox @@ -0,0 +1,46 @@ +# firefox completion -*- shell-script -*- + +_firefox() +{ + local cur prev words cword split + _init_completion -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]) + return + ;; + --profile | --screenshot) + _filedir -d + return + ;; + -MOZ_LOG_FILE) + _filedir log + return + ;; + --recording-file) + _filedir + return + ;; + --debugger | -d) + COMPREPLY=($(compgen -c -- "$cur")) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _filedir "@(?([xs])htm?(l)|pdf|txt)" +} && + complete -F _firefox firefox mozilla-firefox iceweasel + +# ex: filetype=sh diff --git a/completions/flake8 b/completions/flake8 new file mode 100644 index 0000000..045c409 --- /dev/null +++ b/completions/flake8 @@ -0,0 +1,42 @@ +# flake8 completion -*- shell-script -*- + +_flake8() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --help | --version | -!(-*)h) + return + ;; + --format) + COMPREPLY=($(compgen -W 'default pylint' -- "$cur")) + return + ;; + --jobs | -!(-*)j) + COMPREPLY=($(compgen -W "auto {1..$(_ncpus)}" -- "$cur")) + return + ;; + --output-file | --append-config | --config) + _filedir + return + ;; + --include-in-doctest | --exclude-from-doctest) + _filedir py + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _filedir py +} && + complete -F _flake8 flake8 + +# ex: filetype=sh diff --git a/completions/freebsd-update b/completions/freebsd-update new file mode 100644 index 0000000..d5be861 --- /dev/null +++ b/completions/freebsd-update @@ -0,0 +1,29 @@ +# bash completion for FreeBSD update tool - freebsd-update -*- shell-script -*- + +[[ $OSTYPE == *freebsd* ]] || return 1 + +_freebsd_update() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -b | -d) + _filedir -d + return + ;; + -f) + _filedir + return + ;; + -k | -r | -s | -t) + return + ;; + esac + + COMPREPLY=($(compgen -W "fetch cron upgrade install rollback IDS" -- \ + $cur)) +} && + complete -F _freebsd_update freebsd-update + +# ex: filetype=sh diff --git a/completions/freeciv b/completions/freeciv new file mode 100644 index 0000000..01af311 --- /dev/null +++ b/completions/freeciv @@ -0,0 +1,41 @@ +# freeciv client completions -*- shell-script -*- + +_freeciv() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help | --version | --name | --port | -[hvnp]) + return + ;; + --file | --log | --music | --read | --Sound | --tiles | -[flmrSt]) + _filedir + return + ;; + --Announce | -A) + COMPREPLY=($(compgen -W 'IPv4 IPv6 none' -- "$cur")) + return + ;; + --debug | -d) + COMPREPLY=($(compgen -W '{0..3}' -- "$cur")) + return + ;; + --Meta | --server | -[Ms]) + _known_hosts_real -- "$cur" + return + ;; + --Plugin | -P) + COMPREPLY=($(compgen -W 'none esd sdl' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + fi + +} && + complete -F _freeciv freeciv{,-{gtk{2,3},sdl,xaw}} civclient + +# ex: filetype=sh diff --git a/completions/freeciv-server b/completions/freeciv-server new file mode 100644 index 0000000..a34b5a2 --- /dev/null +++ b/completions/freeciv-server @@ -0,0 +1,22 @@ +# freeciv-server completion -*- shell-script -*- + +_civserver() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -f | -g | -l | -r | --file | --log | --gamelog | --read) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + fi + +} && + complete -F _civserver civserver freeciv-server + +# ex: filetype=sh diff --git a/completions/function b/completions/function new file mode 100644 index 0000000..6ae5271 --- /dev/null +++ b/completions/function @@ -0,0 +1,37 @@ +# bash shell function completion -*- shell-script -*- + +_function() +{ + local cur prev words cword + _init_completion || 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")) + else + COMPREPLY=("() $(type -- ${words[1]} | command sed -e 1,2d)") + fi +} && + complete -F _function function declare typeset + +# ex: filetype=sh diff --git a/completions/fusermount b/completions/fusermount new file mode 100644 index 0000000..7e48922 --- /dev/null +++ b/completions/fusermount @@ -0,0 +1,28 @@ +# fusermount completion -*- shell-script -*- + +_fusermount() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -*[hVo]) + return + ;; + -*u) + COMPREPLY=($(compgen -W "$(awk \ + '{ if ($3 ~ /^fuse(\.|$)/) print $2 }' /etc/mtab \ + 2>/dev/null)" -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + else + _filedir -d + fi +} && + complete -F _fusermount fusermount + +# ex: filetype=sh diff --git a/completions/gcc b/completions/gcc new file mode 100644 index 0000000..fa95274 --- /dev/null +++ b/completions/gcc @@ -0,0 +1,75 @@ +# gcc(1) completion -*- shell-script -*- + +_gcc() +{ + local cur prev prev2 words cword argument prefix prefix_length + _init_completion || return + + # Test that GCC is recent enough and if not fallback to + # parsing of --completion option. + if ! $1 --completion=" " 2>/dev/null; then + if [[ $cur == -* ]]; then + 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")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + else + _filedir + fi + return + fi + + # extract also for situations like: -fsanitize=add + if ((cword > 2)); then + prev2="${COMP_WORDS[cword - 2]}" + fi + + # sample: -fsan + if [[ $cur == -* ]]; then + argument=$cur + prefix="" + # sample: -fsanitize= + elif [[ $cur == "=" && $prev == -* ]]; then + argument=$prev$cur + prefix=$prev$cur + # sample: -fsanitize=add + elif [[ $prev == "=" && $prev2 == -* ]]; then + argument=$prev2$prev$cur + prefix=$prev2$prev + # sample: --param lto- + elif [[ $prev == --param ]]; then + argument="$prev $cur" + prefix="$prev " + fi + + if [[ ! -v argument ]]; then + _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-) + [[ ${flags} == "=*" ]] && compopt -o nospace 2>/dev/null + COMPREPLY=($(compgen -W "$flags" -- "")) + fi +} && + complete -F _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 && + { + 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 + } + +# ex: filetype=sh diff --git a/completions/gcl b/completions/gcl new file mode 100644 index 0000000..73a18b2 --- /dev/null +++ b/completions/gcl @@ -0,0 +1,21 @@ +# -*- shell-script -*- +# bash programmable completion for various Common Lisp implementations by +# Nikodemus Siivola + +_gcl() +{ + local cur prev words cword + _init_completion || 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")) + else + _filedir + fi + +} && + complete -F _gcl -o default gcl + +# ex: filetype=sh diff --git a/completions/gdb b/completions/gdb new file mode 100644 index 0000000..f78f8a5 --- /dev/null +++ b/completions/gdb @@ -0,0 +1,47 @@ +# bash completion for gdb -*- shell-script -*- + +_gdb() +{ + local cur prev words cword i + _init_completion || return + + # gdb [options] --args executable-file [inferior-arguments ...] + for ((i = 1; i < cword; i++)); do + if [[ ${words[i]} == --args ]]; then + _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 + # compgen -c works as expected if $cur contains any slashes. + IFS=$'\n' + COMPREPLY=($(PATH="$PATH:." compgen -d -c -- "$cur")) + 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")) + fi + elif ((cword == 2)); then + COMPREPLY=($(compgen -W "$(command ps axo comm,pid | + awk '{if ($1 ~ /^'"${prev##*/}"'/) print $2}')" -- "$cur")) + compopt -o filenames + COMPREPLY+=($(compgen -f -X '!?(*/)core?(.?*)' -o plusdirs \ + -- "$cur")) + fi +} && + complete -F _gdb gdb + +# ex: filetype=sh diff --git a/completions/genaliases b/completions/genaliases new file mode 100644 index 0000000..5953b9e --- /dev/null +++ b/completions/genaliases @@ -0,0 +1,15 @@ +# mailman genaliases completion -*- shell-script -*- + +_genaliases() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--quiet --help' -- "$cur")) + fi + +} && + complete -F _genaliases genaliases + +# ex: filetype=sh diff --git a/completions/gendiff b/completions/gendiff new file mode 100644 index 0000000..d37793f --- /dev/null +++ b/completions/gendiff @@ -0,0 +1,12 @@ +# gendiff(1) completion -*- shell-script -*- + +_gendiff() +{ + local cur prev words cword + _init_completion -o '@(diff|patch)' || return + + ((cword == 1)) && _filedir -d +} && + complete -F _gendiff gendiff + +# ex: filetype=sh diff --git a/completions/genisoimage b/completions/genisoimage new file mode 100644 index 0000000..dfa39c0 --- /dev/null +++ b/completions/genisoimage @@ -0,0 +1,38 @@ +# bash completion for mkisofs/genisoimage -*- shell-script -*- + +_mkisofs() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -o | -abstract | -biblio | -check-session | -copyright | -log-file | \ + -root-info | -prep-boot | -*-list) + _filedir + return + ;; + -*-charset) + COMPREPLY=($(compgen -W '$(mkisofs -input-charset \ + help 2>&1 | tail -n +3)' -- "$cur")) + return + ;; + -uid) + _uids + return + ;; + -gid) + _gids + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + else + _filedir + fi + +} && + complete -F _mkisofs mkisofs genisoimage + +# ex: filetype=sh diff --git a/completions/geoiplookup b/completions/geoiplookup new file mode 100644 index 0000000..c60be89 --- /dev/null +++ b/completions/geoiplookup @@ -0,0 +1,33 @@ +# geoiplookup(1) completion -*- shell-script -*- + +_geoiplookup() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -h | -'?' | -v) + return + ;; + -d) + _filedir -d + return + ;; + -f) + _filedir dat + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" -h)' -- "$cur")) + return + fi + + local ipvx + [[ $1 == *6 ]] && ipvx=-6 || ipvx=-4 + _known_hosts_real $ipvx -- "$cur" +} && + complete -F _geoiplookup geoiplookup geoiplookup6 + +# ex: filetype=sh diff --git a/completions/getconf b/completions/getconf new file mode 100644 index 0000000..de1ad2d --- /dev/null +++ b/completions/getconf @@ -0,0 +1,32 @@ +# getconf(1) completion -*- shell-script -*- + +_getconf() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -a) + _filedir + return + ;; + -v) + COMPREPLY=($(compgen -W \ + '$("$1" -a 2>/dev/null | awk "{ print \$1 }")' -- \ + "${cur:-POSIX_V}")) + return + ;; + esac + + if [[ $prev == PATH_MAX ]]; then # TODO more path vars, better handling + _filedir + elif [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '-a -v' -- "$cur")) + else + COMPREPLY=($(compgen -W \ + '$("$1" -a 2>/dev/null | awk "{ print \$1 }")' -- "$cur")) + fi +} && + complete -F _getconf getconf + +# ex: filetype=sh diff --git a/completions/getent b/completions/getent new file mode 100644 index 0000000..4c54a24 --- /dev/null +++ b/completions/getent @@ -0,0 +1,77 @@ +# bash completion for getent -*- shell-script -*- + +_getent() +{ + local cur prev words cword split + _init_completion -s || return + + local i db + for ((i = 1; i < cword; i++)); do + case ${words[i]} in + --version | --usage | --help | -!(-*)[V?]) + return + ;; + --service | -!(-*)s) + ((i++)) + ;; + -*) ;; + + *) + # First non-option value is the db + db=${words[i]} + break + ;; + esac + done + + case ${db-} in + passwd) + COMPREPLY=($(compgen -u -- "$cur")) + return + ;; + group) + COMPREPLY=($(compgen -g -- "$cur")) + return + ;; + services) + COMPREPLY=($(compgen -s -- "$cur")) + return + ;; + hosts) + COMPREPLY=($(compgen -A hostname -- "$cur")) + return + ;; + protocols | networks | ahosts | ahostsv4 | ahostsv6 | rpc) + COMPREPLY=($(compgen -W "$($1 $db | + awk '{ print $1 }')" -- "$cur")) + return + ;; + aliases | shadow | gshadow) + COMPREPLY=($(compgen -W "$($1 $db | cut -d: -f1)" -- "$cur")) + return + ;; + ethers | netgroup) + return + ;; + esac + + case $prev in + -s | --service) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${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")) + fi +} && + complete -F _getent getent + +# ex: filetype=sh diff --git a/completions/gkrellm b/completions/gkrellm new file mode 100644 index 0000000..c38c5ae --- /dev/null +++ b/completions/gkrellm @@ -0,0 +1,39 @@ +# gkrellm(1) completion -*- shell-script -*- + +_gkrellm() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -t | --theme) + _filedir -d + return + ;; + -p | --plugin) + _filedir so + return + ;; + -s | --server) + _known_hosts_real -- "$cur" + return + ;; + -l | --logfile) + _filedir + return + ;; + -g | --geometry | -c | --config | -P | --port | -d | --debug-level) + # Argument required but no completions available + return + ;; + -h | --help | -v | --version) + # All other options are noop with these + return + ;; + esac + + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) +} && + complete -F _gkrellm gkrellm gkrellm2 + +# ex: filetype=sh diff --git a/completions/gm b/completions/gm new file mode 100644 index 0000000..b86c9cc --- /dev/null +++ b/completions/gm @@ -0,0 +1,40 @@ +# bash completion for gm(1) -*- shell-script -*- + +_gm_commands() +{ + COMPREPLY+=($(compgen -W '$("$1" help | + awk "/^ +[^ ]+ +- / { print \$1 }")' -- "$cur")) +} + +_gm() +{ + local cur prev words cword + _init_completion || return + + if ((cword == 1)); then + _gm_commands "$1" + return + elif [[ $cword -eq 2 && ${words[1]} == time ]]; then + _gm_commands "$1" + return + fi + + local gmcmd=${words[1]} + [[ $gmcmd == time ]] && gmcmd=${words[2]} + + case $gmcmd in + help) + [[ $prev == help ]] && _gm_commands "$1" + return + ;; + version) + return + ;; + esac + + # TODO... defer some commnds to the imagemagick "gm"less completions etc? + compopt -o default +} && + complete -F _gm gm + +# ex: filetype=sh diff --git a/completions/gnatmake b/completions/gnatmake new file mode 100644 index 0000000..5f4b963 --- /dev/null +++ b/completions/gnatmake @@ -0,0 +1,26 @@ +# Gnatmake completion -*- shell-script -*- +# by Ralf_Schroth@t-online.de (Ralf Schroth) + +_gnatmake() +{ + local cur prev words cword + _init_completion || 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 + -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")) + else + # source file completion + _filedir '@(adb|ads)' + fi +} && + complete -F _gnatmake gnatmake + +# ex: filetype=sh diff --git a/completions/gnokii b/completions/gnokii new file mode 100644 index 0000000..039141a --- /dev/null +++ b/completions/gnokii @@ -0,0 +1,237 @@ +# gnokii(1) completion -*- shell-script -*- + +_gnokii_memory_type() +{ + # TODO: reduce the number of choices + COMPREPLY=($(compgen -W "IN OU SM ME MT" -- "$cur")) +} + +_gnokii() +{ + local cur prev words cword pprev tprev fprev + _init_completion || return + + case $prev in + --config) + _filedir + return + ;; + --phone) + local config_file + for config_file in "$XDG_CONFIG_HOME/gnokii/config" \ + "$HOME/.config/gnokii/config" "$HOME/.gnokiirc" \ + "$XDG_CONFIG_DIRS/gnokii/config" /etc/gnokiirc; do + [[ -f $config_file ]] && break + done + [[ ! -f $config_file ]] && return + COMPREPLY=($(compgen -W \ + "$(command sed -n 's/^\[phone_\(.*\)\]/\1/p' $config_file)" \ + -- "$cur")) + return + ;; + --help) + COMPREPLY=($(compgen -W 'all monitor sms mms phonebook calendar + todo dial profile settings wap logo ringtone security file + other' -- "$cur")) + return + ;; + --version | --shell | ping) + return + ;; + + # MONITOR + --monitor) + COMPREPLY=($(compgen -W 'delay once' -- "$cur")) + return + ;; + --getdisplaystatus | --displayoutput) + return + ;; + --netmonitor) + COMPREPLY=($(compgen -W 'reset off field devel next nr' \ + -- "$cur")) + return + ;; + + # SMS + --sendsms) + # (how)TODO ? + return + ;; + --savesms) + COMPREPLY=($(compgen -W '--sender --smsc --smscno --folder + --location --sent --read --deliver --datetime' -- "$cur")) + return + ;; + --memory-type | --memory | --getsms | --deletesms | --getmms | --deletemms | \ + --getphonebook | --deletephonebook) + _gnokii_memory_type + return + ;; + --getsmsc | --getcalendarnote | --deletecalendarnote | --gettodo | \ + --getspeeddial) + # TODO: grab a specific entry ID + return + ;; + --setsmsc | --smsreader | --createsmsfolder | --deletealltodos | \ + --showsmsfolderstatus) + return + ;; + --deletesmsfolder | --folder) + # TODO: folderid + return + ;; + --writephonebook) + COMPREPLY=($(compgen -W '--overwrite --find-free --memory-type + --location --vcard --ldif' -- "$cur")) + return + ;; + --writecalendarnote | --writetodo) + _filedir vcf + return + ;; + + # DIAL + --setspeeddial | --dialvoice | --senddtmf | --answercall | --hangup) + # TODO + return + ;; + --divert) + COMPREPLY=($(compgen -W '--op' -- "$cur")) + return + ;; + + # PROFILE + --getprofile | --setactiveprofile) + # TODO + return + ;; + --setprofile | --getactiveprofile) + return + ;; + + # SETTINGS + --reset) + COMPREPLY=($(compgen -W 'soft hard' -- "$cur")) + return + ;; + --setdatetime | --setalarm) + # TODO + return + ;; + --getdatetime | --getalarm) + return + ;; + + # WAP + --getwapbookmark | --writewapbookmark | --deletewapbookmark | \ + --getwapsetting | --writewapsetting | --activatewapsetting) + return + ;; + + # LOGOS + --sendlogo) + COMPREPLY=($(compgen -W 'caller op picture' -- "$cur")) + return + ;; + --setlogo | --getlogo) + COMPREPLY=($(compgen -W 'op startup caller dealer text' \ + -- "$cur")) + return + ;; + --viewlogo) + # TODO: logofile + return + ;; + + --entersecuritycode) + COMPREPLY=($(compgen -W 'PIN PIN2 PUK PUK2 SEC' -- "$cur")) + return + ;; + + # TODO: RINGTONES + esac + + # second level completion + if [[ $((cword - 2)) -ge 1 && ${words[cword - 2]} =~ --* ]]; then + pprev=${words[cword - 2]} + case $pprev in + --setspeeddial) + _gnokii_memory_type + return + ;; + --getsms | --deletesms | --getmms | --deletemms | --getphonebook | \ + --writetodo | --writecalendarnote) + # TODO: start number + return + ;; + --gettodo | --getcalendarnote) + COMPREPLY=($(compgen -W '{1..9} end --vCal' -- "$cur")) + return + ;; + --deletecalendarnote) + COMPREPLY=($(compgen -W '{1..9} end' -- "$cur")) + return + ;; + --divert) + COMPREPLY=($(compgen -W 'register enable query disable + erasure' -- "$cur")) + return + ;; + esac + fi + + # third level completion + if [[ $((cword - 3)) -ge 1 && ${words[cword - 3]} =~ --* ]]; then + tprev=${words[cword - 3]} + case $tprev in + --deletesms | --deletemms) + COMPREPLY=($(compgen -W 'end' -- "$cur")) + return + ;; + --getphonebook | --writetodo | --writecalendarnote) + COMPREPLY=($(compgen -W '{1..9} end' -- "$cur")) + return + ;; + --gettodo | --getcalendarnote) + [[ ${words[cword - 1]} == end ]] && + COMPREPLY=($(compgen -W '--vCal' -- "$cur")) + return + ;; + --divert) + COMPREPLY=($(compgen -W '--type' -- "$cur")) + return + ;; + esac + fi + + # fourth level completion + if [[ $((cword - 4)) -ge 1 && ${words[cword - 4]} =~ --* ]]; then + fprev=${words[cword - 4]} + case $fprev in + --getphonebook) + COMPREPLY=($(compgen -W '--raw --vcard --ldif' -- "$cur")) + return + ;; + --divert) + COMPREPLY=($(compgen -W 'all busy noans outofreach notavail' \ + -- "$cur")) + 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") + + # don't provide main command completions if one is + # already on the command line + [[ $COMP_LINE =~ $(tr ' ' '\b|' <<<$main_cmd) ]] && return + + COMPREPLY=($(compgen -W "$all_cmd" -- "$cur")) +} && + complete -F _gnokii gnokii + +# ex: filetype=sh diff --git a/completions/gnome-mplayer b/completions/gnome-mplayer new file mode 100644 index 0000000..32d93fc --- /dev/null +++ b/completions/gnome-mplayer @@ -0,0 +1,38 @@ +# gnome-mplayer(1) completion -*- shell-script -*- + +_gnome_mplayer() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + -'?' | --help | --help-all | --help-gtk) + return + ;; + --showcontrols | --showsubtitles | --autostart) + COMPREPLY=($(compgen -w '0 1' -- "$cur")) + return + ;; + --subtitle) + _filedir '@(srt|sub|txt|utf|rar|mpsub|smi|js|ssa|ass)' + return + ;; + --tvdriver) + COMPREPLY=($(compgen -W 'v4l v4l2' -- "$cur")) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" --help-all)' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _filedir +} && + complete -F _gnome_mplayer gnome-mplayer + +# ex: filetype=sh diff --git a/completions/gnome-screenshot b/completions/gnome-screenshot new file mode 100644 index 0000000..b3594d2 --- /dev/null +++ b/completions/gnome-screenshot @@ -0,0 +1,31 @@ +# gnome-screenshot(1) completion -*- shell-script -*- + +_gnome_screenshot() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --help | --help-* | --version | --delay | --display | -!(-*)[hd]) + return + ;; + --border-effect | -!(-*)e) + COMPREPLY=($(compgen -W 'shadow border vintage none' -- "$cur")) + return + ;; + --file | -!(-*)f) + _filedir '@(jp?(e)|pn)g' + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + fi +} && + complete -F _gnome_screenshot gnome-screenshot + +# ex: filetype=sh diff --git a/completions/gpasswd b/completions/gpasswd new file mode 100644 index 0000000..f1f2200 --- /dev/null +++ b/completions/gpasswd @@ -0,0 +1,25 @@ +# gpasswd(1) completion -*- shell-script -*- + +_gpasswd() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --add | --delete | --administrators | --members | -!(-*)[adAM]) + COMPREPLY=($(compgen -u -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + # TODO: only -A and -M can be combined + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + COMPREPLY=($(compgen -g -- "$cur")) +} && + complete -F _gpasswd gpasswd + +# ex: filetype=sh diff --git a/completions/gpg b/completions/gpg new file mode 100644 index 0000000..f0ca884 --- /dev/null +++ b/completions/gpg @@ -0,0 +1,38 @@ +# bash completion for gpg -*- shell-script -*- + +_gpg() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --sign | --clearsign | --decrypt-files | --load-extension | -!(-*)s) + _filedir + return + ;; + --export | --sign-key | --lsign-key | --nrsign-key | --nrlsign-key | --edit-key) + # 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")) + return + ;; + --recipient | -!(-*)r) + COMPREPLY=($(compgen -W "$($1 --list-keys 2>/dev/null | command sed -ne \ + 's@^.*<\([^>]*\)>.*$@\1@p')" -- "$cur")) + if [[ -e ~/.gnupg/gpg.conf ]]; then + COMPREPLY+=($(compgen -W "$(command sed -ne \ + 's@^[ \t]*group[ \t][ \t]*\([^=]*\).*$@\1@p' \ + ~/.gnupg/gpg.conf)" -- "$cur")) + fi + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$($1 --dump-options)' -- "$cur")) + fi +} && + complete -F _gpg -o default gpg + +# ex: filetype=sh diff --git a/completions/gpg2 b/completions/gpg2 new file mode 100644 index 0000000..cfa4023 --- /dev/null +++ b/completions/gpg2 @@ -0,0 +1,42 @@ +# gpg2(1) completion -*- shell-script -*- + +_gpg2() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --homedir) + _filedir -d + return + ;; + --sign | --clearsign | --options | --decrypt | -!(-*)s) + _filedir + return + ;; + --export | --sign-key | --lsign-key | --nrsign-key | --nrlsign-key | --edit-key) + # 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")) + return + ;; + --recipient | -!(-*)r) + COMPREPLY=($(compgen -W "$($1 --list-keys 2>/dev/null | + command sed -ne 's@^.*<\([^>]*\)>.*$@\1@p')" -- "$cur")) + if [[ -e ~/.gnupg/gpg.conf ]]; then + COMPREPLY+=($(compgen -W "$(command sed -ne \ + 's@^[ \t]*group[ \t][ \t]*\([^=]*\).*$@\1@p' \ + ~/.gnupg/gpg.conf)" -- "$cur")) + fi + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$($1 --dump-options)' -- "$cur")) + fi +} && + complete -F _gpg2 -o default gpg2 + +# ex: filetype=sh diff --git a/completions/gpgv b/completions/gpgv new file mode 100644 index 0000000..29315c9 --- /dev/null +++ b/completions/gpgv @@ -0,0 +1,46 @@ +# gpgv(1) completion -*- shell-script -*- + +_gpgv() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help | --version | --weak-digest | --*-fd | -!(-*)[?h]*) + return + ;; + --keyring) + _filedir "@(gpg|kbx)" + return + ;; + --homedir) + _filedir -d + return + ;; + esac + + local args + _count_args "" "--@(weak-digest|*-fd|keyring|homedir)" + + if [[ $cur == -* && $args -eq 1 ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + if ((args > 1)); then + 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 + fi + else + _filedir gpg + fi + else + _filedir "@(asc|gpg|sig|sign)" + fi +} && + complete -F _gpgv gpgv gpgv2 + +# ex: filetype=sh diff --git a/completions/gphoto2 b/completions/gphoto2 new file mode 100644 index 0000000..cbf84c0 --- /dev/null +++ b/completions/gphoto2 @@ -0,0 +1,55 @@ +# bash completion for gphoto2(1) -*- shell-script -*- + +_gphoto2() +{ + local cur prev words cword split + _init_completion -s -n : || return + + case $prev in + --debug-logfile) + _filedir + return + ;; + --hook-script) + _filedir + return + ;; + --filename) + _filedir + return + ;; + -u | --upload-file) + _filedir + return + ;; + --port) + COMPREPLY=($(compgen -W "$($1 --list-ports 2>/dev/null | + awk 'NR>3 { print $1 }')" -- "$cur")) + __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")) + return + ;; + --get-config | --set-config | --set-config-index | --set-config-value) + COMPREPLY=($(compgen -W "$( + $1 --list-config 2>/dev/null + )" -- "$cur")) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + fi + +} && + complete -F _gphoto2 gphoto2 + +# ex: filetype=sh diff --git a/completions/gprof b/completions/gprof new file mode 100644 index 0000000..5a4ab2d --- /dev/null +++ b/completions/gprof @@ -0,0 +1,56 @@ +# gprof(1) completion -*- shell-script -*- + +_gprof() +{ + local cur prev words cword split + _init_completion -s || return + + case $cur in + -A* | -C* | -J* | -p* | -P* | -q* | -Q* | -n* | -N* | -d*) + return + ;; + -S*) + cur=${cur:2} + _filedir + COMPREPLY=("${COMPREPLY[@]/#/-S}") + return + ;; + -O*) + cur=${cur:2} + COMPREPLY=($(compgen -P -O -W 'auto bsd 4.4bsd magic prof' \ + -- "$cur")) + return + ;; + esac + + case $prev in + -I | --directory-path) + _filedir -d + return + ;; + -R | --file-ordering | --external-symbol-table) + _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")) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _filedir +} && + complete -F _gprof gprof + +# ex: filetype=sh diff --git a/completions/groupadd b/completions/groupadd new file mode 100644 index 0000000..5f67f29 --- /dev/null +++ b/completions/groupadd @@ -0,0 +1,26 @@ +# groupadd(8) completion -*- shell-script -*- + +_groupadd() +{ + local cur prev words cword split + _init_completion -s || return + + # TODO: if -o/--non-unique is given, could complete on existing gids + # with -g/--gid + + case $prev in + --gid | --key | --password | -!(-*)[gKp]) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + fi +} && + complete -F _groupadd groupadd + +# ex: filetype=sh diff --git a/completions/groupdel b/completions/groupdel new file mode 100644 index 0000000..4d8ca7f --- /dev/null +++ b/completions/groupdel @@ -0,0 +1,27 @@ +# groupdel(8) completion -*- shell-script -*- + +_groupdel() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -h | --help) + return + ;; + -R | --root) + _filedir -d + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + COMPREPLY=($(compgen -g -- "$cur")) +} && + complete -F _groupdel groupdel + +# ex: filetype=sh diff --git a/completions/groupmems b/completions/groupmems new file mode 100644 index 0000000..2e89a5a --- /dev/null +++ b/completions/groupmems @@ -0,0 +1,27 @@ +# groupmems(8) completion -*- shell-script -*- + +_groupmems() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -a | --add | -d | --delete) + COMPREPLY=($(compgen -u -- "$cur")) + return + ;; + -g | --group) + COMPREPLY=($(compgen -g -- "$cur")) + return + ;; + -R | --root) + _filedir -d + return + ;; + esac + + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) +} && + complete -F _groupmems groupmems + +# ex: filetype=sh diff --git a/completions/groupmod b/completions/groupmod new file mode 100644 index 0000000..5516d31 --- /dev/null +++ b/completions/groupmod @@ -0,0 +1,29 @@ +# groupmod(8) completion -*- shell-script -*- + +_groupmod() +{ + local cur prev words cword split + _init_completion -s || return + + # TODO: if -o/--non-unique is given, could complete on existing gids + # with -g/--gid + + case $prev in + --gid | --help | --new-name | --password | -!(-*)[ghnp]) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + COMPREPLY=($(compgen -g -- "$cur")) +} && + complete -F _groupmod groupmod + +# ex: filetype=sh diff --git a/completions/growisofs b/completions/growisofs new file mode 100644 index 0000000..ee09fe6 --- /dev/null +++ b/completions/growisofs @@ -0,0 +1,39 @@ +# growisofs(1) completion -*- shell-script -*- + +_growisofs() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -version | -speed) + return + ;; + -Z | -M) + compopt -o nospace + _dvd_devices + return + ;; + /?(r)dev/*) + if [[ $cur == =* ]]; then + # e.g. /dev/dvd=foo.iso, /dev/dvdrw=/dev/zero + cur="${cur#=}" + _filedir + return + fi + ;; + esac + + if [[ $cur == -* ]]; then + # TODO: mkisofs options + COMPREPLY=($(compgen -W '-dvd-compat -overburn -speed= -Z -M' \ + -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _filedir +} && + complete -F _growisofs growisofs + +# ex: filetype=sh diff --git a/completions/grpck b/completions/grpck new file mode 100644 index 0000000..0fadbed --- /dev/null +++ b/completions/grpck @@ -0,0 +1,25 @@ +# grpck(8) completion -*- shell-script -*- + +_grpck() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --root | -!(-*)R) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + local opts=$(_parse_help "$1") + COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + return + fi + + _filedir +} && + complete -F _grpck grpck + +# ex: filetype=sh diff --git a/completions/gssdp-discover b/completions/gssdp-discover new file mode 100644 index 0000000..8454f52 --- /dev/null +++ b/completions/gssdp-discover @@ -0,0 +1,34 @@ +# bash completion for gssdp-discover -*- shell-script -*- + +_gssdp_discover() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --help | --target | --timeout | --rescan-interval | -[htnr]) + return + ;; + --interface | -i) + _available_interfaces -a + return + ;; + --message-type | -m) + local types=$($1 --help 2>&1 | + command sed -ne 's/^.*--message-type=.*(\([^)]*\))$/\1/p') + COMPREPLY=($( + IFS+=, + compgen -W "$types" -- "$cur" + )) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + fi +} && + complete -F _gssdp_discover gssdp-discover + +# ex: filetype=sh diff --git a/completions/gzip b/completions/gzip new file mode 100644 index 0000000..0144c3a --- /dev/null +++ b/completions/gzip @@ -0,0 +1,43 @@ +# bash completion for gzip -*- shell-script -*- + +_gzip() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --blocksize | --suffix | --help | --version | -!(-*)[bShV]) + return + ;; + --processes | -!(-*)p) + COMPREPLY=($(compgen -W "{1..$(_ncpus)}" -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1") {-1..-9}' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + local IFS=$'\n' xspec="*.@(gz|t[ag]z)" + [[ ${1##*/} == pigz ]] && xspec="*.@([gz]z|t[ag]z)" + + if [[ $prev == --* ]]; then + [[ $prev == --@(decompress|list|test) ]] && xspec="!"$xspec + [[ $prev == --force ]] && xspec= + elif [[ $prev == -* ]]; then + [[ $prev == -*[dlt]* ]] && xspec="!"$xspec + [[ $prev == -*f* ]] && xspec= + fi + + _tilde "$cur" || return + + compopt -o filenames + COMPREPLY=($(compgen -f -X "$xspec" -- "$cur") + $(compgen -d -- "$cur")) +} && + complete -F _gzip gzip pigz + +# ex: filetype=sh diff --git a/completions/hcitool b/completions/hcitool new file mode 100644 index 0000000..58bf5a7 --- /dev/null +++ b/completions/hcitool @@ -0,0 +1,380 @@ +# bash completion for bluez utils -*- shell-script -*- + +_bluetooth_addresses() +{ + if [[ -n ${COMP_BLUETOOTH_SCAN:-} ]]; then + COMPREPLY+=($(compgen -W "$(hcitool scan | + awk '/^\t/{print $1}')" -- "$cur")) + fi +} + +_bluetooth_devices() +{ + COMPREPLY+=($(compgen -W "$(hcitool dev | + awk '/^\t/{print $1}')" -- "$cur")) +} + +_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")) +} + +_bluetooth_packet_types() +{ + COMPREPLY=($(compgen -W 'DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3' \ + -- "$cur")) +} + +_hcitool() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + -i) + _bluetooth_devices + return + ;; + --role) + COMPREPLY=($(compgen -W 'm s' -- "$cur")) + return + ;; + --pkt-type) + _bluetooth_packet_types + return + ;; + esac + + $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 + name | info | dc | rssi | lq | afh | auth | key | clkoff | lst) + _count_args + if ((args == 2)); then + _bluetooth_addresses + fi + ;; + cc) + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--role --pkt-type' -- "$cur")) + else + _count_args + if ((args == 2)); then + _bluetooth_addresses + fi + fi + ;; + sr) + _count_args + if ((args == 2)); then + _bluetooth_addresses + else + COMPREPLY=($(compgen -W 'master slave' -- "$cur")) + fi + ;; + cpt) + _count_args + if ((args == 2)); then + _bluetooth_addresses + else + _bluetooth_packet_types + fi + ;; + tpl | enc | clock) + _count_args + if ((args == 2)); then + _bluetooth_addresses + else + COMPREPLY=($(compgen -W '0 1' -- "$cur")) + fi + ;; + esac + fi +} && + complete -F _hcitool hcitool + +_sdptool() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --bdaddr) + _bluetooth_addresses + return + ;; + esac + + $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 + search) + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--bdaddr --tree --raw --xml' \ + -- "$cur")) + else + _bluetooth_services + fi + ;; + browse | records) + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--tree --raw --xml' -- "$cur")) + else + _bluetooth_addresses + fi + ;; + add) + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--handle --channel' -- "$cur")) + else + _bluetooth_services + fi + ;; + get) + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--bdaddr --tree --raw --xml' \ + -- "$cur")) + fi + ;; + esac + fi +} && + complete -F _sdptool sdptool + +_l2ping() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -i) + _bluetooth_devices + return + ;; + -s | -c | -t | -d) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + else + _bluetooth_addresses + fi +} && + complete -F _l2ping l2ping + +_rfcomm() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -f | --config) + _filedir + return + ;; + -i) + _bluetooth_devices + _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 + if ((args == 2)); then + _bluetooth_devices + else + case $arg in + connect | bind) + if ((args == 3)); then + _bluetooth_addresses + fi + ;; + esac + fi + fi +} && + complete -F _rfcomm rfcomm + +_ciptool() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -i) + _bluetooth_devices + _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 + connect | release | loopback) + _count_args + if ((args == 2)); then + _bluetooth_addresses + fi + ;; + esac + fi +} && + complete -F _ciptool ciptool + +_dfutool() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -d | --device) + _bluetooth_devices + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + else + local args + _count_args + case $args in + 1) + COMPREPLY=($(compgen -W 'verify modify upgrade archive' \ + -- "$cur")) + ;; + 2) + _filedir + ;; + esac + fi +} && + complete -F _dfutool dfutool + +_hciconfig() +{ + local cur prev words cword + _init_completion || 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 + putkey | delkey) + _count_args + if ((args == 2)); then + _bluetooth_addresses + fi + ;; + lm) + _count_args + if ((args == 2)); then + COMPREPLY=($(compgen -W 'MASTER SLAVE NONE ACCEPT' \ + -- "$cur")) + fi + ;; + ptype) + _count_args + if ((args == 2)); then + _bluetooth_packet_types + fi + ;; + esac + fi +} && + complete -F _hciconfig hciconfig + +_hciattach() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '-n -p -t -b -s -l' -- "$cur")) + else + local args + _count_args + case $args in + 1) + COMPREPLY=($(printf '%s\n' /dev/tty*)) + COMPREPLY=($(compgen -W '${COMPREPLY[@]} + ${COMPREPLY[@]#/dev/}' -- "$cur")) + ;; + 2) + COMPREPLY=($(compgen -W 'any ericsson digi xircom csr bboxes + swave bcsp 0x0105 0x080a 0x0160 0x0002' -- "$cur")) + ;; + 3) + COMPREPLY=($(compgen -W '9600 19200 38400 57600 115200 230400 + 460800 921600' -- "$cur")) + ;; + 4) + COMPREPLY=($(compgen -W 'flow noflow' -- "$cur")) + ;; + 5) + _bluetooth_addresses + ;; + esac + fi +} && + complete -F _hciattach hciattach + +# ex: filetype=sh diff --git a/completions/hddtemp b/completions/hddtemp new file mode 100644 index 0000000..7b95f0e --- /dev/null +++ b/completions/hddtemp @@ -0,0 +1,38 @@ +# hddtemp(8) completion -*- shell-script -*- + +_hddtemp() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --file | -!(-*)f) + _filedir db + return + ;; + --listen | -!(-*)l) + _ip_addresses + return + ;; + --unit | -!(-*)u) + COMPREPLY=($(compgen -W 'C F' -- "$cur")) + return + ;; + --port | --separator | --syslog | --version | --help | -!(-*)[psSvh?]) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1") --help' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + else + cur=${cur:=/dev/} + _filedir + fi +} && + complete -F _hddtemp hddtemp + +# ex: filetype=sh diff --git a/completions/hid2hci b/completions/hid2hci new file mode 100644 index 0000000..f33a495 --- /dev/null +++ b/completions/hid2hci @@ -0,0 +1,15 @@ +# hid2hci completion -*- shell-script -*- + +_hid2hci() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--help --quiet -0 --tohci -1 --tohid' \ + -- "$cur")) + fi +} && + complete -F _hid2hci hid2hci + +# ex: filetype=sh diff --git a/completions/hostname b/completions/hostname new file mode 100644 index 0000000..ce1b32e --- /dev/null +++ b/completions/hostname @@ -0,0 +1,23 @@ +# hostname(1) completion -*- shell-script -*- + +_hostname() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help | --version | -!(-*)[hV]) + return + ;; + --file | -!(-*)F) + _filedir + return + ;; + esac + + [[ $cur == -* ]] && + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) +} && + complete -F _hostname hostname + +# ex: filetype=sh diff --git a/completions/hping2 b/completions/hping2 new file mode 100644 index 0000000..666838b --- /dev/null +++ b/completions/hping2 @@ -0,0 +1,35 @@ +# bash completion for hping2 -*- shell-script -*- + +_hping2() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --interface | -!(-*)I) + _available_interfaces + return + ;; + --spoof | -!(-*)a) + _known_hosts_real -- "$cur" + return + ;; + --tos | -!(-*)o) + COMPREPLY=($(compgen -W '02 04 08 10')) + return + ;; + --file | -!(-*)E) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + else + _known_hosts_real -- "$cur" + fi +} && + complete -F _hping2 hping hping2 hping3 + +# ex: filetype=sh diff --git a/completions/htop b/completions/htop new file mode 100644 index 0000000..b4916d5 --- /dev/null +++ b/completions/htop @@ -0,0 +1,33 @@ +# htop(1) completion -*- shell-script -*- + +_htop() +{ + local cur prev words cword split + _init_completion -s || return + + case "$prev" in + --sort-key | -!(-*)s) + COMPREPLY=($(compgen -W '$("$1" -s help)' -- "$cur")) + return + ;; + --user | -!(-*)u) + COMPREPLY=($(compgen -u -- "$cur")) + return + ;; + --delay | -!(-*)d) + # argument required but no completions available + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" --help)' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi +} && + complete -F _htop htop + +# ex: filetype=sh diff --git a/completions/htpasswd b/completions/htpasswd new file mode 100644 index 0000000..527684b --- /dev/null +++ b/completions/htpasswd @@ -0,0 +1,36 @@ +# htpasswd(1) completion -*- shell-script -*- + +_htpasswd() +{ + local cur prev words cword + _init_completion || return + + local i o=0 # $o is index of first non-option argument + for ((i = 1; i <= cword; i++)); do + case ${words[i]} in + -*n*) return ;; + -*) ;; + *) + o=$i + break + ;; + esac + done + + if ((o == 0 || o == cword)); then + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + # Password file (first non-option argument) + _filedir + + elif ((o == cword - 1)); then + # Username (second non-option argument) + COMPREPLY=($(compgen -W \ + '$(cut -d: -f1 "${words[o]}" 2>/dev/null)' -- "$cur")) + fi +} && + complete -F _htpasswd htpasswd + +# ex: filetype=sh diff --git a/completions/hunspell b/completions/hunspell new file mode 100644 index 0000000..92b4fe8 --- /dev/null +++ b/completions/hunspell @@ -0,0 +1,43 @@ +# hunspell(1) completion -*- shell-script -*- + +_hunspell() +{ + local cur prev words cword + _init_completion || 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")) + return + ;; + -i) + _xfunc iconv _iconv_charsets + return + ;; + -p) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + _filedir +} && + complete -F _hunspell hunspell + +# ex: filetype=sh diff --git a/completions/iconv b/completions/iconv new file mode 100644 index 0000000..81ae01b --- /dev/null +++ b/completions/iconv @@ -0,0 +1,38 @@ +# iconv(1) completion -*- shell-script -*- + +_iconv_charsets() +{ + COMPREPLY+=($(compgen -X ... -W '$(${1:-iconv} -l | \ + command sed -e "s@/*\$@@" -e "s/[,()]//g")' -- "$cur")) +} + +_iconv() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --help | --usage | --version | --unicode-subst | --byte-subst | \ + --widechar-subst | -!(-*)[?V]) + return + ;; + --from-code | --to-code | -!(-*)[ft]) + _iconv_charsets $1 + return + ;; + --output | -!(-*)o) + _filedir + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + fi +} && + complete -F _iconv -o default iconv + +# ex: filetype=sh diff --git a/completions/id b/completions/id new file mode 100644 index 0000000..a07e51d --- /dev/null +++ b/completions/id @@ -0,0 +1,18 @@ +# id(1) completion -*- shell-script -*- + +_id() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + local opts=$(_parse_help "$1") + [[ $opts ]] || opts="-G -g -u" # POSIX fallback + COMPREPLY=($(compgen -W "$opts" -- "$cur")) + else + COMPREPLY=($(compgen -u "$cur")) + fi +} && + complete -F _id id + +# ex: filetype=sh diff --git a/completions/idn b/completions/idn new file mode 100644 index 0000000..8023f8f --- /dev/null +++ b/completions/idn @@ -0,0 +1,26 @@ +# idn(1) completion -*- shell-script -*- + +_idn() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --help | --version | -!(-*)[hV]) + return + ;; + --profile | -!(-*)p) + COMPREPLY=($(compgen -W 'Nameprep iSCSI Nodeprep Resourceprep + trace SASLprep' -- "$cur")) + return + ;; + esac + + if ! $split && [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + fi +} && + complete -F _idn idn + +# ex: filetype=sh diff --git a/completions/ifstat b/completions/ifstat new file mode 100644 index 0000000..629786e --- /dev/null +++ b/completions/ifstat @@ -0,0 +1,68 @@ +# bash completion for ifstat(1) -*- shell-script -*- + +_ifstat() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --help | --version | --scan | --interval | -!(-*)[hvV]) + return + ;; + -!(-*)i) + # TODO comma separated + _available_interfaces -a + return + ;; + -!(-*)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")) + fi + return + ;; + --noupdate | -!(-*)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" + return + fi + ;; + -!(-*)t) + # iproute2: no completion (interval) + # traditional: pass through (add timestamp) + ! { + "$1" --help 2>&1 || : + } | + command grep -q -- '-t.*--interval' || return + ;; + --extended | -!(-*)x) + # iproute2: parse xstat types + COMPREPLY=($(compgen -W '$("$1" -x nonexistent-xstat 2>&1 | + awk "found { print \$1 } /supported xstats:/ { found=1 }")' \ + -- "$cur")) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + local opts=$(_parse_help "$1") + COMPREPLY=($(compgen -W '${opts:-$(_parse_usage "$1")}' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi +} && + complete -F _ifstat ifstat + +# ex: filetype=sh diff --git a/completions/iftop b/completions/iftop new file mode 100644 index 0000000..b73f4b6 --- /dev/null +++ b/completions/iftop @@ -0,0 +1,26 @@ +# iftop(8) completion -*- shell-script -*- + +_iftop() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -h | -f | -F | -m) + return + ;; + -i) + _available_interfaces -a + return + ;; + -c) + _filedir + return + ;; + esac + + COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) +} && + complete -F _iftop iftop + +# ex: filetype=sh diff --git a/completions/ifup b/completions/ifup new file mode 100644 index 0000000..5b35bfb --- /dev/null +++ b/completions/ifup @@ -0,0 +1,39 @@ +# Red Hat & Debian GNU/Linux if{up,down} completion -*- shell-script -*- + +_userland GNU || return 1 + +_ifupdown() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help | --version | --allow | --exclude | --option | -!(-*)[hVXo]) + return + ;; + --interfaces | -!(-*)i) + _filedir + return + ;; + --state-dir) + _filedir -d + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + local args + _count_args "" "@(--allow|-i|--interfaces|--state-dir|-X|--exclude|-o)" + + if ((args == 1)); then + _configured_interfaces + COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur")) + fi +} && + complete -F _ifupdown ifup ifdown ifquery ifstatus + +# ex: filetype=sh diff --git a/completions/influx b/completions/influx new file mode 100644 index 0000000..e9362e7 --- /dev/null +++ b/completions/influx @@ -0,0 +1,35 @@ +# bash completion for influx(8) -*- shell-script -*- + +_influx() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -version | -port | -database | -password | -username | -execute | -pps) + return + ;; + -host) + _known_hosts_real -- "$cur" + return + ;; + -format | -precision | -consistency) + local args=$($1 --help 2>&1 | awk "\$1 == \"$prev\" { print \$2 }") + COMPREPLY=($( + IFS+="\"'|" + compgen -W "$args" -- "$cur" + )) + return + ;; + -import | -path) + _filedir + return + ;; + esac + + [[ $cur == -* ]] && + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) +} && + complete -F _influx influx + +# ex: filetype=sh diff --git a/completions/info b/completions/info new file mode 100644 index 0000000..f50f842 --- /dev/null +++ b/completions/info @@ -0,0 +1,74 @@ +# bash completion for info -*- shell-script -*- + +_info() +{ + local cur prev words cword split + _init_completion -s || return + + # default completion if parameter looks like a path + if [[ $cur == @(*/|[.~])* ]]; then + _filedir + return + fi + + case $prev in + --apropos | --index-search | --node | --help | --version | -!(-*)[knhv]) + return + ;; + -!(-*)d) + if [[ ${1##*/} == info ]]; then + _filedir -d + return + fi + ;; + --directory) + _filedir -d + return + ;; + --dribble | --file | --output | --restore | --raw-filename | --rcfile | -!(-*)[for]) + _filedir + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + local i infopath=/usr/share/info + + if [[ ${INFOPATH-} == *: ]]; then + infopath=${INFOPATH}${infopath} + elif [[ ${INFOPATH:+set} ]]; then + infopath=$INFOPATH + fi + + _expand || return + + infopath=$infopath: + if [[ -n $cur ]]; then + infopath="${infopath//://$cur* }" + else + infopath="${infopath//:// }" + 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 + +# ex: filetype=sh diff --git a/completions/inject b/completions/inject new file mode 100644 index 0000000..fad73a1 --- /dev/null +++ b/completions/inject @@ -0,0 +1,26 @@ +# mailman inject completion -*- shell-script -*- + +_inject() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + -l | --listname) + _xfunc list_lists _mailman_lists + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--listname --queue --help' -- "$cur")) + else + _filedir + fi + +} && + complete -F _inject inject + +# ex: filetype=sh diff --git a/completions/inotifywait b/completions/inotifywait new file mode 100644 index 0000000..e5608fc --- /dev/null +++ b/completions/inotifywait @@ -0,0 +1,47 @@ +# bash completion for inotifywait(1) and inotifywatch(1) -*- shell-script -*- + +_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 | + command sed -e '/^Events:/,/^[^'$'\t'']/!d' \ + -ne 's/^'$'\t''\([^ '$'\t'']\{1,\}\)[ '$'\t''].*/\1/p')" \ + -- "$cur")) +} + +_inotifywait() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help | --exclude | --excludei | --format | --timefmt | --timeout | -!(-*)[ht]) + return + ;; + --fromfile | --outfile | -!(-*)o) + _filedir + return + ;; + --event | -!(-*)e) + _inotifywait_events "$1" + return + ;; + --ascending | --descending) + COMPREPLY=($(compgen -W 'total' -- "$cur")) + _inotifywait_events "$1" + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + _filedir +} && + complete -F _inotifywait inotifywait inotifywatch + +# ex: filetype=sh diff --git a/completions/insmod b/completions/insmod new file mode 100644 index 0000000..a59e753 --- /dev/null +++ b/completions/insmod @@ -0,0 +1,18 @@ +# Linux insmod(8) completion -*- shell-script -*- + +_insmod() +{ + local cur prev words cword + _init_completion || return + + # do filename completion for first argument + if ((cword == 1)); then + _filedir '@(?(k)o?(.[gx]z))' + else # do module parameter completion + COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" modinfo \ + -p ${words[1]} 2>/dev/null | cut -d: -f1)" -- "$cur")) + fi +} && + complete -F _insmod insmod insmod.static + +# ex: filetype=sh diff --git a/completions/installpkg b/completions/installpkg new file mode 100644 index 0000000..7455eb1 --- /dev/null +++ b/completions/installpkg @@ -0,0 +1,33 @@ +# Slackware Linux installpkg completion -*- shell-script -*- + +_installpkg() +{ + local cur prev words cword + _init_completion || return + + case "$prev" in + --root) + _filedir -d + return + ;; + --priority) + COMPREPLY=($(compgen -W 'ADD REC OPT SKP' -- "$cur")) + return + ;; + --tagfile) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--warn --md5sum --root --infobox --terse + --menu --ask --priority --tagfile' -- "$cur")) + return + fi + + _filedir 't[bglx]z' +} && + complete -F _installpkg installpkg + +# ex: filetype=sh diff --git a/completions/interdiff b/completions/interdiff new file mode 100644 index 0000000..9933d15 --- /dev/null +++ b/completions/interdiff @@ -0,0 +1,33 @@ +# interdiff(1) completion -*- shell-script -*- + +_interdiff() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --unified | --strip-match | --drop-context | -!(-*)[Upd]) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + local exts='@(?(d)patch|dif?(f))' word + for word in "${words[@]}"; do + if [[ $word == -@(z|-decompress) ]]; then + exts+='?(.@(gz|bz2))' + break + fi + done + _filedir "$exts" +} && + complete -F _interdiff interdiff + +# ex: filetype=sh diff --git a/completions/invoke-rc.d b/completions/invoke-rc.d new file mode 100644 index 0000000..4a5045a --- /dev/null +++ b/completions/invoke-rc.d @@ -0,0 +1,38 @@ +# invoke-rc.d(8) completion -*- shell-script -*- +# +# Copyright (C) 2004 Servilio Afre Puentes + +_invoke_rc_d() +{ + local cur prev words cword + _init_completion || return + + local sysvdir services options valid_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=($( + tr " " "\n" <<<"${words[*]} ${options[*]}" | + command sed -ne "/$(command sed 's/ /\\|/g' <<<"${options[*]}")/p" | + sort | uniq -u + )) + COMPREPLY=($(compgen -W '${valid_options[@]} ${services[@]}' -- "$cur")) + elif [[ -x $sysvdir/$prev ]]; then + COMPREPLY=($(compgen -W '`command sed -e "y/|/ /" \ + -ne "s/^.*Usage:[ ]*[^ ]*[ ]*{*\([^}\"]*\).*$/\1/p" \ + $sysvdir/$prev`' -- "$cur")) + else + COMPREPLY=() + fi + +} && + complete -F _invoke_rc_d invoke-rc.d + +# ex: filetype=sh diff --git a/completions/ip b/completions/ip new file mode 100644 index 0000000..12ad9aa --- /dev/null +++ b/completions/ip @@ -0,0 +1,378 @@ +# ip(8) completion -*- shell-script -*- + +_iproute2_etc() +{ + COMPREPLY+=($(compgen -W \ + "$(awk '!/#/ { print $2 }' /etc/iproute2/$1 2>/dev/null)" \ + -- "$cur")) +} + +_ip() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -V | -Version | -rc | -rcvbuf) + return + ;; + -f | -family) + COMPREPLY=($(compgen -W 'inet inet6 ipx dnet link' -- "$cur")) + return + ;; + -b | -batch) + _filedir + return + ;; + -force) + COMPREPLY=($(compgen -W '-batch' -- "$cur")) + return + ;; + esac + + local subcword cmd subcmd="" + for ((subcword = 1; subcword < ${#words[@]} - 1; 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]} + done + + if [[ ! -v 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")) + ;; + *) + COMPREPLY=($(compgen -W "help $($1 help 2>&1 | command sed -e \ + '/OBJECT := /,/}/!d' -e \ + 's/.*{//' -e \ + 's/}.*//' -e \ + 's/|//g')" -- "$cur")) + ;; + esac + return + fi + + [[ $subcmd == help ]] && return + + case $cmd in + l | link) + case $subcmd in + add) + # TODO + ;; + delete) + case $((cword - subcword)) in + 1) + _available_interfaces + ;; + 2) + COMPREPLY=($(compgen -W 'type' -- "$cur")) + ;; + 3) + [[ $prev == type ]] && + COMPREPLY=($(compgen -W 'vlan veth vcan dummy + ifb macvlan can' -- "$cur")) + ;; + esac + ;; + set) + if ((cword - subcword == 1)); then + _available_interfaces + else + case $prev in + arp | dynamic | multicast | allmulticast | promisc | \ + trailers) + COMPREPLY=($(compgen -W 'on off' -- "$cur")) + ;; + txqueuelen | name | address | broadcast | mtu | netns | alias) ;; + + *) + local c="arp dynamic multicast allmulticast + promisc trailers txqueuelen name address + broadcast mtu netns alias" + [[ $prev != @(up|down) ]] && c+=" up down" + COMPREPLY=($(compgen -W "$c" -- "$cur")) + ;; + esac + fi + ;; + show) + if ((cword == subcword + 1)); then + _available_interfaces + COMPREPLY+=($(compgen -W 'dev group up' -- "$cur")) + elif [[ $prev == dev ]]; then + _available_interfaces + elif [[ $prev == group ]]; then + _iproute2_etc group + fi + ;; + *) + ((cword == subcword)) && + COMPREPLY=($(compgen -W 'help add delete set show' \ + -- "$cur")) + ;; + esac + ;; + + a | addr | address) + case $subcmd in + add | change | replace) + if [[ $prev == dev ]]; then + _available_interfaces + elif [[ $prev == scope ]]; then + _iproute2_etc rt_scopes + else + : # TODO + fi + ;; + del) + if [[ $prev == dev ]]; then + _available_interfaces + elif [[ $prev == scope ]]; then + _iproute2_etc rt_scopes + else + : # TODO + fi + ;; + show | flush) + if ((cword == subcword + 1)); then + _available_interfaces + COMPREPLY+=($(compgen -W 'dev scope to label dynamic + permanent tentative deprecated dadfailed temporary + primary secondary up' -- "$cur")) + elif [[ $prev == dev ]]; then + _available_interfaces + elif [[ $prev == scope ]]; then + _iproute2_etc rt_scopes + fi + ;; + *) + ((cword == subcword)) && + COMPREPLY=($(compgen -W 'help add change replace del + show flush' -- "$cur")) + ;; + esac + ;; + + addrlabel) + case $subcmd in + list | add | del | flush) + if [[ $prev == dev ]]; then + _available_interfaces + else + : # TODO + fi + ;; + *) + ((cword == subcword)) && + COMPREPLY=($(compgen -W 'help list add del flush' \ + -- "$cur")) + ;; + esac + ;; + + r | route) + case $subcmd in + list | flush) + if [[ $prev == proto ]]; then + _iproute2_etc rt_protos + else + : # TODO + fi + ;; + get) + # TODO + ;; + a | add | d | del | change | append | r | replace | monitor) + if [[ $prev == via ]]; then + COMPREPLY=($(compgen -W "$($1 r | command sed -ne \ + 's/.*via \([0-9.]*\).*/\1/p')" -- "$cur")) + elif [[ $prev == "$subcmd" ]]; then + COMPREPLY=($(compgen -W "table default \ + $($1 r | cut -d ' ' -f 1)" -- "$cur")) + elif [[ $prev == dev ]]; then + _available_interfaces -a + elif [[ $prev == table ]]; then + COMPREPLY=($(compgen -W 'local main default' -- "$cur")) + else + COMPREPLY=($(compgen -W 'via dev weight' -- "$cur")) + fi + ;; + *) + ((cword == subcword)) && + COMPREPLY=($(compgen -W 'help list flush get add del + change append replace monitor' -- "$cur")) + ;; + esac + ;; + + rule) + case $subcmd in + add | del | list | lst) + case $prev in + from | to | tos | dsfield | fwmark | uidrange | ipproto | sport | \ + dport | priority | protocol | suppress_prefixlength | \ + suppress_ifgroup | realms | nat | goto) ;; + + iif | oif) + _available_interfaces -a + ;; + table | lookup) + COMPREPLY=($(compgen -W 'local main default' -- "$cur")) + ;; + *) + 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")) + ;; + esac + ;; + flush | save) + if [[ $prev == protocol ]]; then + : + else + COMPREPLY=($(compgen -W 'protocol' -- "$cur")) + fi + ;; + restore | show) ;; + *) + ((cword == subcword)) && + COMPREPLY=($(compgen -W 'help add del list flush save + restore show' -- "$cur")) + ;; + esac + ;; + + neigh) + case $subcmd in + add | del | change | replace) + # TODO + ;; + show | flush) + # TODO + ;; + *) + ((cword == subcword)) && + COMPREPLY=($(compgen -W 'help add del change replace + show flush' -- "$cur")) + ;; + esac + ;; + + ntable) + case $subcmd in + change) + # TODO + ;; + show) + # TODO + ;; + *) + ((cword == subcword)) && + COMPREPLY=($(compgen -W 'help change show' \ + -- "$cur")) + ;; + esac + ;; + + tunnel) + case $subcmd in + show) ;; + + add | change | del | prl | 6rd) + # TODO + ;; + *) + ((cword == subcword)) && + COMPREPLY=($(compgen -W 'help add change del show prl + 6rd' -- "$cur")) + ;; + esac + ;; + + maddr) + case $subcmd in + add | del) + # TODO + ;; + show) + if [[ $cword -eq $subcword+1 || $prev == dev ]]; then + _available_interfaces + [[ $prev != dev ]] && + COMPREPLY=($(compgen -W '${COMPREPLY[@]} dev' \ + -- "$cur")) + fi + ;; + *) + ((cword == subcword)) && + COMPREPLY=($(compgen -W 'help add del show' \ + -- "$cur")) + ;; + esac + ;; + + mroute) + case $subcmd in + show) + # TODO + ;; + *) + ((cword == subcword)) && + COMPREPLY=($(compgen -W 'help show' -- "$cur")) + ;; + esac + ;; + + monitor) + case $subcmd in + all) ;; + *) + ((cword == subcword)) && + COMPREPLY=($(compgen -W 'help all' -- "$cur")) + ;; + esac + ;; + + netns) + case $subcmd in + list | monitor) ;; + + add | identify | list-id) + # TODO + ;; + delete | exec | pids | set) + [[ $prev == "$subcmd" ]] && + COMPREPLY=($(compgen -W "$($1 netns list)" -- "$cur")) + ;; + *) + ((cword == subcword)) && + COMPREPLY=($(compgen -W 'help add delete exec + identify list list-id monitor pids set' -- "$cur")) + ;; + esac + ;; + + xfrm) + case $subcmd in + state | policy | monitor) + # TODO + ;; + *) + ((cword == subcword)) && + COMPREPLY=($(compgen -W 'state policy monitor' \ + -- "$cur")) + ;; + esac + ;; + esac +} && + complete -F _ip ip + +# ex: filetype=sh diff --git a/completions/ipcalc b/completions/ipcalc new file mode 100644 index 0000000..5603c26 --- /dev/null +++ b/completions/ipcalc @@ -0,0 +1,25 @@ +# ipcalc(1) completion -*- shell-script -*- + +_ipcalc() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help | --version | --split | -[hs]) + return + ;; + esac + + # --split takes 3 args + local i + for i in {1..3}; do + [[ ${words[cword - i]} == -@(-split|s) ]] && return + done + + [[ $cur != -* ]] || + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) +} && + complete -F _ipcalc ipcalc + +# ex: filetype=sh diff --git a/completions/iperf b/completions/iperf new file mode 100644 index 0000000..6347fe0 --- /dev/null +++ b/completions/iperf @@ -0,0 +1,69 @@ +# iperf(1) completion -*- shell-script -*- + +_iperf() +{ + local cur prev words cword split + _init_completion -s -n : || return + + 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]) + return + ;; + --format | -!(-*)f) + COMPREPLY=($(compgen -W 'k m g K M G' -- "$cur")) + return + ;; + --output | --fileinput | -!(-*)[oF]) + _filedir + return + ;; + --bind | -!(-*)B) + _available_interfaces -a + _ip_addresses -a + __ltrim_colon_completions "$cur" + return + ;; + --client | -!(-*)c) + _known_hosts_real -- "$cur" + return + ;; + --reportexclude | -!(-*)x) + COMPREPLY=($(compgen -W 'C D M S V' -- "$cur")) + return + ;; + --reportstyle | -!(-*)y) + COMPREPLY=($(compgen -W 'C' -- "$cur")) + return + ;; + --logfile) + _filedir log + return + ;; + esac + + $split && return + + # Filter mode specific options + local i filter=cat + for i in "${words[@]}"; do + case $i in + -s | --server) + filter='command sed -e /^Client.specific/,/^\(Server.specific.*\)\?$/d' + ;; + -c | --client) + filter='command sed -e /^Server.specific/,/^\(Client.specific.*\)\?$/d' + ;; + esac + done + [[ $filter != cat ]] && filter+=' -e /--client/d -e /--server/d' + + COMPREPLY=($(compgen -W \ + '$("$1" --help 2>&1 | $filter | _parse_help -)' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace +} && + complete -F _iperf iperf iperf3 + +# ex: filetype=sh diff --git a/completions/ipmitool b/completions/ipmitool new file mode 100644 index 0000000..920287d --- /dev/null +++ b/completions/ipmitool @@ -0,0 +1,199 @@ +# bash completion for ipmitool -*- shell-script -*- + +_ipmitool_singleline_help() +{ + COMPREPLY=($(compgen -W "$($1 $2 2>&1 | + command sed -ne 's/[,\r]//g' -e 's/^.*[Cc]ommands://p')" -- "$cur")) +} + +_ipmitool() +{ + local cur prev words cword + _init_completion || 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")) + return + ;; + -*I) + COMPREPLY=($(compgen -W "$($1 -h 2>&1 | + command sed -e '/^Interfaces:/,/^[[:space:]]*$/!d' \ + -ne 's/^[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*/\1/p')" \ + -- "$cur")) + return + ;; + -*H) + _known_hosts_real -- "$cur" + return + ;; + -*[fSO]) + _filedir + return + ;; + -*C) + COMPREPLY=($(compgen -W '{0..14}' -- "$cur")) + return + ;; + -*L) + COMPREPLY=($(compgen -W 'CALLBACK USER OPERATOR ADMINISTRATOR' \ + -- "$cur")) + return + ;; + -*A) + COMPREPLY=($(compgen -W 'NONE PASSWORD MD2 MD5 OEM' -- "$cur")) + return + ;; + -*o) + COMPREPLY=($(compgen -W "$($1 -o list 2>&1 | + awk '/^[ \t]+/ { print $1 }') list" -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + return + fi + + # Find out command and subcommand + + 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 + for c in "${cmds[@]}"; do + [[ ${words[i]} == "$c" ]] && cmd=$c && break + done + done + + if [[ ! -v cmd ]]; then + COMPREPLY=($(compgen -W '${cmds[@]}' -- "$cur")) + return + fi + + # Command/subcommand completions + + case $cmd in + + shell) ;; + + \ + exec) + _filedir + ;; + + chassis | power | kontronoem | fwum) + _ipmitool_singleline_help $1 $cmd + ;; + + lan) + case $subcmd in + print | set) ;; + + alert) + [[ $prev == alert ]] && + COMPREPLY=($(compgen -W 'print set' -- "$cur")) + ;; + stats) + [[ $prev == stats ]] && + COMPREPLY=($(compgen -W 'print set' -- "$cur")) + ;; + *) + COMPREPLY=($(compgen -W 'print set alert stats' \ + -- "$cur")) + ;; + esac + ;; + + sdr) + case $subcmd in + get | info | type | list | entity) ;; + + elist) + COMPREPLY=($(compgen -W 'all full compact event mclog fru + generic' -- "$cur")) + ;; + dump) + _filedir + ;; + fill) + case $prev in + fill) + COMPREPLY=($(compgen -W 'sensors file' -- "$cur")) + ;; + file) + _filedir + ;; + esac + ;; + *) + COMPREPLY=($(compgen -W 'get info type list elist entity + dump fill' -- "$cur")) + ;; + esac + ;; + + sensor) + case $subcmd in + list | get | thresh) ;; + + *) + COMPREPLY=($(compgen -W 'list get thresh' -- "$cur")) + ;; + esac + ;; + + sel) + case $subcmd in + info | clear | list | elist | delete) ;; + + add | save | writeraw | readraw) + _filedir + ;; + time) + [[ $prev == time ]] && + COMPREPLY=($(compgen -W 'get set' -- "$cur")) + ;; + *) + COMPREPLY=($(compgen -W 'info clear list elist delete add + get save writeraw readraw time' -- "$cur")) + ;; + esac + ;; + + user) + case $subcmd in + summary | list | disable | enable | priv | test) ;; + + set) + [[ $prev == set ]] && + COMPREPLY=($(compgen -W 'name password' -- "$cur")) + ;; + *) + COMPREPLY=($(compgen -W 'summary list set disable enable + priv test' -- "$cur")) + ;; + esac + ;; + + set) + [[ $prev == set ]] && + COMPREPLY=($(compgen -W 'hostname username password privlvl + authtype localaddr targetaddr port csv verbose' -- "$cur")) + ;; + + esac +} && + complete -F _ipmitool ipmitool + +# ex: filetype=sh diff --git a/completions/ipsec b/completions/ipsec new file mode 100644 index 0000000..4bc8cdf --- /dev/null +++ b/completions/ipsec @@ -0,0 +1,102 @@ +# Linux ipsec(8) completion (for FreeS/WAN and strongSwan) -*- shell-script -*- + +# Complete ipsec.conf conn entries. +# +# Reads a file from stdin in the ipsec.conf(5) format. +_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")) +} + +_ipsec_freeswan() +{ + local cur prev words cword + _init_completion || 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")) + return + fi + + case ${words[1]} in + auto) + COMPREPLY=($(compgen -W '--asynchronous --up --add --delete + --replace --down --route --unroute --ready --status + --rereadsecrets' -- "$cur")) + ;; + manual) + COMPREPLY=($(compgen -W '--up --down --route --unroute --union' \ + -- "$cur")) + ;; + ranbits) + COMPREPLY=($(compgen -W '--quick --continuous --bytes' -- "$cur")) + ;; + setup) + COMPREPLY=($(compgen -W '--start --stop --restart' -- "$cur")) + ;; + *) ;; + + esac +} + +_ipsec_strongswan() +{ + local cur prev words cword + _init_completion || 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")) + return + fi + + case ${words[1]} in + down | route | status | statusall | unroute | up) + local confdir=$(ipsec --confdir) + _ipsec_connections <"$confdir/ipsec.conf" + ;; + list*) + COMPREPLY=($(compgen -W '--utc' -- "$cur")) + ;; + restart | start) + COMPREPLY=($(compgen -W '--attach-gdb --auto-update --debug + --debug-all --debug-more --nofork' -- "$cur")) + ;; + pki) + COMPREPLY=($(compgen -W '--gen --issue --keyid --print --pub + --req --self --signcrl --verify' -- "$cur")) + ;; + pool) ;; + + irdumm) + _filedir 'rb' + ;; + *) ;; + + esac +} + +case "$(ipsec --version 2>/dev/null)" in + *strongSwan*) + complete -F _ipsec_strongswan ipsec + ;; + *) + complete -F _ipsec_freeswan ipsec + ;; +esac + +# ex: filetype=sh diff --git a/completions/iptables b/completions/iptables new file mode 100644 index 0000000..ffb905b --- /dev/null +++ b/completions/iptables @@ -0,0 +1,51 @@ +# bash completion for iptables -*- shell-script -*- + +_iptables() +{ + local cur prev words cword split + _init_completion -s || return + + local table chain='s/^Chain \([^ ]\{1,\}\).*$/\1/p' + + [[ ${words[*]} =~ [[:space:]]-(t|-table=?)[[:space:]]*([^[:space:]]+) ]] && + table="-t ${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")) + ;; + -*t) + COMPREPLY=($(compgen -W 'nat filter mangle' -- "$cur")) + ;; + -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")) + fi + ;; + *) + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$("$1" --help 2>&1 | + command sed -e "s/^\[\!\]//" | _parse_help -)' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + fi + ;; + esac + +} && + complete -F _iptables iptables + +# ex: filetype=sh diff --git a/completions/ipv6calc b/completions/ipv6calc new file mode 100644 index 0000000..c452c15 --- /dev/null +++ b/completions/ipv6calc @@ -0,0 +1,38 @@ +# ipv6calc completion -*- shell-script -*- + +_ipv6calc() +{ + local cur prev words cword split + _init_completion -s || return + + case "$prev" in + --debug | -!(-*)d) + return + ;; + --in | --out | --action | -!(-*)[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")) + return + ;; + --db-geoip | --db-ip2location-ipv4 | --db-ip2location-ipv6) + _filedir + return + ;; + --printstart | --printend) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$("$1" -h 2>&1 | + command sed -e "s/[][]//g" | _parse_help -)' -- "$cur")) + fi + +} && + complete -F _ipv6calc ipv6calc + +# ex: filetype=sh diff --git a/completions/iscsiadm b/completions/iscsiadm new file mode 100644 index 0000000..7786ddc --- /dev/null +++ b/completions/iscsiadm @@ -0,0 +1,66 @@ +# iscsiadm(1) completion -*- shell-script -*- + +_iscsiadm() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --mode | -!(-*)m) + COMPREPLY=($(compgen -W 'discovery node session iface fw host' \ + -- "$cur")) + return + ;; + --op | -!(-*)o) + COMPREPLY=($(compgen -W 'new delete update show' -- "$cur")) + return + ;; + --type | -!(-*)t) + COMPREPLY=($(compgen -W 'sendtargets st slp isns fw' -- "$cur")) + return + ;; + --loginall | --logoutall | -!(-*)[LU]) + COMPREPLY=($(compgen -W 'all manual automatic' -- "$cur")) + return + ;; + esac + + $split && return + + local options + if ((cword > 1)); then + + case ${words[2]} in + discovery) + options='--help --version --debug --print --interface --type \ + --portal --login --op --name --value' + ;; + node) + options='--help --version --debug --print --loginall \ + --logoutall--show -T --portal --interface --login \ + --logout --rescan --stats --op --name --value' + ;; + session) + options='--help --version --debug --print --sid --logout \ + --rescan --stats' + ;; + iface) + options='--help --version --debug --print --interface --op \ + --name --value' + ;; + fw) + options='--login' + ;; + host) + options='--print -H' + ;; + esac + else + options='--mode' + fi + + COMPREPLY=($(compgen -W "$options" -- "$cur")) +} && + complete -F _iscsiadm iscsiadm + +# ex: filetype=sh diff --git a/completions/isort b/completions/isort new file mode 100644 index 0000000..2a84e25 --- /dev/null +++ b/completions/isort @@ -0,0 +1,41 @@ +# isort completion -*- shell-script -*- + +_isort() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help | --add-import | --builtin | --future | --from-first | -ff | \ + --force-grid-wrap | -fgw | --indent | --lines | --lines-after-imports | -lai | \ + --lines-between-types | -lbt | --line-ending | -le | --no-lines-before | -nlb | \ + --dont-skip | -ns | --thirdparty | --project | --remove-import | --skip | \ + --skip-glob | -sg | --settings-path | -sp | --top | --virtual-env | --line-width | \ + --wrap-length | -wl | -[habfiloprstw]) + return + ;; + --jobs | -j) + COMPREPLY=($(compgen -W "{1..$(_ncpus)}" -- "$cur")) + return + ;; + --multi-line | -m) + COMPREPLY=($(compgen -W '{0..5}' -- "$cur")) + return + ;; + --section-default | -sd) + COMPREPLY=($(compgen -W 'FUTURE STDLIB THIRDPARTY FIRSTPARTY + LOCALFOLDER' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + _filedir '@(py|pyi)' +} && + complete -F _isort isort + +# ex: filetype=sh diff --git a/completions/isql b/completions/isql new file mode 100644 index 0000000..4258c51 --- /dev/null +++ b/completions/isql @@ -0,0 +1,14 @@ +# isql completion -*- shell-script -*- +# by Victor Bogado da Silva Lins + +_isql() +{ + local cur prev words cword + _init_completion || return + + [[ -f $ODBCINI ]] && + COMPREPLY=($(command grep "\[$cur" "$ODBCINI" | tr -d \[\])) +} && + complete -F _isql isql + +# ex: filetype=sh diff --git a/completions/iwconfig b/completions/iwconfig new file mode 100644 index 0000000..aa8fbf3 --- /dev/null +++ b/completions/iwconfig @@ -0,0 +1,90 @@ +# iwconfig completion -*- shell-script -*- + +_iwconfig() +{ + local cur prev words cword + _init_completion || return + + case $prev in + mode) + COMPREPLY=($(compgen -W 'managed ad-hoc master repeater secondary + monitor' -- "$cur")) + 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")) + fi + return + ;; + nwid) + COMPREPLY=($(compgen -W 'on off' -- "$cur")) + return + ;; + channel) + COMPREPLY=($(compgen -W "$(iwlist ${words[1]} channel | + awk '/^[ \t]*Channel/ {print $2}')" -- "$cur")) + return + ;; + + freq) + COMPREPLY=($(compgen -W "$(iwlist ${words[1]} channel | + awk '/^[ \t]*Channel/ {print $4"G"}')" -- "$cur")) + 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")) + fi + return + ;; + rate) + COMPREPLY=($(compgen -W 'auto fixed' -- "$cur")) + COMPREPLY+=($(compgen -W \ + "$(iwlist ${words[1]} rate | + awk '/^[ \t]*[0-9]/ {print $1"M"}')" -- "$cur")) + return + ;; + rts | frag) + COMPREPLY=($(compgen -W 'auto fixed off' -- "$cur")) + return + ;; + key | enc) + COMPREPLY=($(compgen -W 'off on open restricted' -- "$cur")) + return + ;; + power) + COMPREPLY=($(compgen -W 'period timeout off on' -- "$cur")) + return + ;; + txpower) + COMPREPLY=($(compgen -W 'off on auto' -- "$cur")) + return + ;; + retry) + COMPREPLY=($(compgen -W 'limit lifetime' -- "$cur")) + return + ;; + esac + + if ((cword == 1)); then + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--help --version' -- "$cur")) + else + _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")) + fi + +} && + complete -F _iwconfig iwconfig + +# ex: filetype=sh diff --git a/completions/iwlist b/completions/iwlist new file mode 100644 index 0000000..16aa39c --- /dev/null +++ b/completions/iwlist @@ -0,0 +1,22 @@ +# iwlist completion -*- shell-script -*- + +_iwlist() +{ + local cur prev words cword + _init_completion || return + + if ((cword == 1)); then + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--help --version' -- "$cur")) + else + _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")) + fi +} && + complete -F _iwlist iwlist + +# ex: filetype=sh diff --git a/completions/iwpriv b/completions/iwpriv new file mode 100644 index 0000000..4e38246 --- /dev/null +++ b/completions/iwpriv @@ -0,0 +1,31 @@ +# iwpriv completion -*- shell-script -*- + +_iwpriv() +{ + local cur prev words cword + _init_completion || return + + case $prev in + roam) + COMPREPLY=($(compgen -W 'on off' -- "$cur")) + return + ;; + port) + COMPREPLY=($(compgen -W 'ad-hoc managed' -- "$cur")) + return + ;; + esac + + if ((cword == 1)); then + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--help --version' -- "$cur")) + else + _available_interfaces -w + fi + else + COMPREPLY=($(compgen -W '--all roam port' -- "$cur")) + fi +} && + complete -F _iwpriv iwpriv + +# ex: filetype=sh diff --git a/completions/iwspy b/completions/iwspy new file mode 100644 index 0000000..38b7868 --- /dev/null +++ b/completions/iwspy @@ -0,0 +1,20 @@ +# iwspy completion -*- shell-script -*- + +_iwspy() +{ + local cur prev words cword + _init_completion || return + + if ((cword == 1)); then + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--help --version' -- "$cur")) + else + _available_interfaces -w + fi + else + COMPREPLY=($(compgen -W 'setthr getthr off' -- "$cur")) + fi +} && + complete -F _iwspy iwspy + +# ex: filetype=sh diff --git a/completions/jar b/completions/jar new file mode 100644 index 0000000..2289491 --- /dev/null +++ b/completions/jar @@ -0,0 +1,27 @@ +# jar(1) completion -*- shell-script -*- + +_jar() +{ + local cur prev words cword + _init_completion || return + + if ((cword == 1)); then + COMPREPLY=($(compgen -W 'c t x u' -- "$cur")) + return + fi + + case ${words[1]} in + *c*f) + _filedir + ;; + *f) + _filedir_xspec unzip + ;; + *) + _filedir + ;; + esac +} && + complete -F _jar jar + +# ex: filetype=sh diff --git a/completions/jarsigner b/completions/jarsigner new file mode 100644 index 0000000..1f26c9c --- /dev/null +++ b/completions/jarsigner @@ -0,0 +1,57 @@ +# jarsigner(1) completion -*- shell-script -*- + +_jarsigner() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -keystore) + COMPREPLY=($(compgen -W 'NONE' -- "$cur")) + _filedir '@(jks|ks|p12|pfx)' + return + ;; + -storepass | -keypass | -sigfile | -digestalg | -sigalg | -tsacert | -tsapolicyid | \ + -tsadigestalg | -altsigner | -altsignerpath | -providerName | -providerClass | \ + -providerArg) + return + ;; + -certchain | -tsa) + _filedir + return + ;; + -storetype) + COMPREPLY=($(compgen -W 'JKS PKCS11 PKCS12' -- "$cur")) + return + ;; + -signedjar) + _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) && \ + ${words[i - 1]} != -signedjar ]]; then + jar=true + break + fi + done + + 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")) + fi + _filedir '@(jar|apk)' + fi +} && + complete -F _jarsigner jarsigner + +# ex: filetype=sh diff --git a/completions/java b/completions/java new file mode 100644 index 0000000..d0f70ae --- /dev/null +++ b/completions/java @@ -0,0 +1,333 @@ +# bash completion for java, javac and javadoc -*- shell-script -*- + +# available path elements completion +_java_path() +{ + cur=${cur##*:} + _filedir '@(jar|zip)' +} + +# exact classpath determination +_java_find_classpath() +{ + local i + + # search first in current options + for ((i = 1; i < cword; i++)); do + if [[ ${words[i]} == -@(cp|classpath) ]]; then + classpath=${words[i + 1]} + break + fi + done + + # default to environment + [[ ! -v classpath ]] && classpath=${CLASSPATH-} + + # default to current directory + [[ -z $classpath ]] && classpath=. +} + +# exact sourcepath determination +_java_find_sourcepath() +{ + local i + + # search first in current options + for ((i = 1; i < cword; i++)); do + if [[ ${words[i]} == -sourcepath ]]; then + sourcepath=${words[i + 1]} + break + fi + done + + # default to classpath + if [[ ! -v sourcepath ]]; then + local classpath + _java_find_classpath + sourcepath=$classpath + fi +} + +# available classes completion +_java_classes() +{ + local classpath i + + # find which classpath to use + _java_find_classpath + + # convert package syntax to path syntax + cur=${cur//.//} + # parse each classpath element for classes + for i in ${classpath//:/ }; 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$')) + 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 }')) + elif type jar &>/dev/null; then + COMPREPLY+=($(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 + + # FIXME: if we have foo.class and foo/, the completion + # returns "foo/"... how to give precedence to files + # over directories? + fi + done + + if ((${#COMPREPLY[@]} != 0)); then + # remove class extension + COMPREPLY=(${COMPREPLY[@]%.class}) + # convert path syntax to package syntax + COMPREPLY=(${COMPREPLY[@]//\//.}) + fi +} + +# available packages completion +_java_packages() +{ + local sourcepath i + + # find which sourcepath to use + _java_find_sourcepath + + # convert package syntax to path syntax + cur=${cur//.//} + # parse each sourcepath element for packages + for i in ${sourcepath//:/ }; do + if [[ -d $i ]]; then + COMPREPLY+=($(command ls -F -d $i/$cur* 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[@]%/}) + # convert path syntax to package syntax + cur="${COMPREPLY[*]//\//.}" + fi +} + +# java completion +# +_java() +{ + local cur prev words cword + _init_completion -n : || return + + local i + + for ((i = 1; i < cword; i++)); do + case ${words[i]} in + -cp | -classpath) + ((i++)) # skip the classpath string. + ;; + -*) + # this is an option, not a class/jarfile name. + ;; + *) + # once we've seen a class, just do filename completion + _filedir + return + ;; + esac + done + + case $cur in + # standard option completions + -verbose:*) + COMPREPLY=($(compgen -W 'class gc jni' -- "${cur#*:}")) + return + ;; + -javaagent:*) + cur=${cur#*:} + _filedir '@(jar|zip)' + return + ;; + -agentpath:*) + cur=${cur#*:} + _filedir so + return + ;; + # various non-standard option completions + -splash:*) + cur=${cur#*:} + _filedir '@(gif|jp?(e)g|png)' + return + ;; + -Xbootclasspath*:*) + _java_path + return + ;; + -Xcheck:*) + COMPREPLY=($(compgen -W 'jni' -- "${cur#*:}")) + return + ;; + -Xgc:*) + COMPREPLY=($(compgen -W 'singlecon gencon singlepar genpar' \ + -- "${cur#*:}")) + return + ;; + -Xgcprio:*) + COMPREPLY=($(compgen -W 'throughput pausetime deterministic' \ + -- "${cur#*:}")) + return + ;; + -Xloggc:* | -Xverboselog:*) + cur=${cur#*:} + _filedir + return + ;; + -Xshare:*) + COMPREPLY=($(compgen -W 'auto off on' -- "${cur#*:}")) + return + ;; + -Xverbose:*) + COMPREPLY=($(compgen -W 'memory load jni cpuinfo codegen opt + gcpause gcreport' -- "${cur#*:}")) + return + ;; + -Xverify:*) + COMPREPLY=($(compgen -W 'all none remote' -- "${cur#*:}")) + return + ;; + # the rest that we have no completions for + -D* | -*:*) + return + ;; + esac + + case $prev in + -cp | -classpath) + _java_path + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + [[ $cur == -X* ]] && + COMPREPLY+=($(compgen -W '$(_parse_help "$1" -X)' -- "$cur")) + else + if [[ $prev == -jar ]]; then + # jar file completion + _filedir '[jw]ar' + else + # classes completion + _java_classes + fi + fi + + [[ ${COMPREPLY-} == -*[:=] ]] && compopt -o nospace + + __ltrim_colon_completions "$cur" +} && + complete -F _java java + +_javadoc() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -overview | -helpfile) + _filedir '?(x)htm?(l)' + return + ;; + -doclet | -exclude | -subpackages | -source | -locale | -encoding | -windowtitle | \ + -doctitle | -header | -footer | -top | -bottom | -group | -noqualifier | -tag | \ + -charset | -sourcetab | -docencoding) + return + ;; + -stylesheetfile) + _filedir css + return + ;; + -d | -link | -linkoffline) + _filedir -d + return + ;; + -classpath | -cp | -bootclasspath | -docletpath | -sourcepath | -extdirs | \ + -excludedocfilessubdir) + _java_path + return + ;; + esac + + # -linkoffline takes two arguments + if [[ $cword -gt 2 && ${words[cword - 2]} == -linkoffline ]]; then + _filedir -d + return + fi + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + else + # source files completion + _filedir java + # packages completion + _java_packages + fi +} && + complete -F _javadoc javadoc + +_javac() +{ + local cur prev words cword + _init_completion -n : || return + + case $prev in + -d) + _filedir -d + return + ;; + -cp | -classpath | -bootclasspath | -sourcepath | -extdirs) + _java_path + return + ;; + esac + + if [[ $cur == -+([a-zA-Z0-9-_]):* ]]; then + # Parse required options from -foo:{bar,quux,baz} + local helpopt=-help + [[ $cur == -X* ]] && helpopt=-X + # For some reason there may be -g:none AND -g:{lines,source,vars}; + # convert the none case to the curly brace format so it parses like + # 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#*:}")) + return + fi + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur")) + [[ $cur == -X* ]] && + COMPREPLY+=($(compgen -W '$(_parse_help "$1" -X)' -- "$cur")) + else + # source files completion + _filedir java + fi + + [[ ${COMPREPLY-} == -*[:=] ]] && compopt -o nospace + + __ltrim_colon_completions "$cur" +} && + complete -F _javac javac + +# ex: filetype=sh diff --git a/completions/javaws b/completions/javaws new file mode 100644 index 0000000..f42a1e5 --- /dev/null +++ b/completions/javaws @@ -0,0 +1,34 @@ +# javaws(1) completion -*- shell-script -*- + +_javaws() +{ + local cur prev words cword + _init_completion -n = || return + + case $prev in + -help | -license | -about | -viewer | -arg | -param | -property | -update | -umask) + return + ;; + -basedir | -codebase) + _filedir -d + return + ;; + -uninstall | -import) + _filedir jnlp + return + ;; + esac + + if [[ $cur == *= ]]; then + return + elif [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W "$(_parse_help "$1" -help) " -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _filedir jnlp +} && + complete -F _javaws javaws + +# ex: filetype=sh diff --git a/completions/jpegoptim b/completions/jpegoptim new file mode 100644 index 0000000..c366972 --- /dev/null +++ b/completions/jpegoptim @@ -0,0 +1,38 @@ +# jpegoptim(1) completion -*- shell-script -*- + +_jpegoptim() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --help | --version | -!(-*)[hV]*) + return + ;; + --dest | -!(-*)d) + _filedir -d + return + ;; + --max | --threshold | -!(-*)[mT]) + COMPREPLY=($(compgen -W '{0..100}' -- "$cur")) + return + ;; + --size | -!(-*)S) + COMPREPLY=($(compgen -W '{1..99}%' -- "$cur")) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _filedir 'jp?(e)g' +} && + complete -F _jpegoptim jpegoptim + +# ex: filetype=sh diff --git a/completions/jps b/completions/jps new file mode 100644 index 0000000..a451eec --- /dev/null +++ b/completions/jps @@ -0,0 +1,25 @@ +# jps(1) completion -*- shell-script -*- + +_jps() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -J* | -help) + return + ;; + 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")) + [[ ${COMPREPLY-} == -J* ]] && compopt -o nospace + else + _known_hosts_real -- "$cur" + fi +} && + complete -F _jps jps + +# ex: filetype=sh diff --git a/completions/jq b/completions/jq new file mode 100644 index 0000000..2d99c39 --- /dev/null +++ b/completions/jq @@ -0,0 +1,54 @@ +# jq(1) completion -*- shell-script -*- + +_jq() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help | --version | --arg | --argjson | --slurpfile | --argfile) + return + ;; + --indent) + COMPREPLY=($(compgen -W '{1..8}' -- "$cur")) + return + ;; + --from-file | --run-tests | -!(-*)f) + _filedir + return + ;; + -!(-*)L) + _filedir -d + return + ;; + esac + + ((cword > 2)) && + case ${words[cword - 2]} in + --arg | --argjson) + return + ;; + --slurpfile | --argfile) + _filedir json + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + local args + # TODO: DTRT with args taking 2 options + _count_args "" "@(--arg|--arg?(json|file)|--?(slurp|from-)file|--indent|--run-tests|-!(-*)[fL])" + + # 1st arg is filter + ((args == 1)) && return + # 2... are input files + _filedir json + +} && + complete -F _jq jq + +# ex: filetype=sh diff --git a/completions/jshint b/completions/jshint new file mode 100644 index 0000000..3622cec --- /dev/null +++ b/completions/jshint @@ -0,0 +1,38 @@ +# bash completion for jshint -*- shell-script -*- + +_jshint() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + -v | --version | -h | --help | --exclude | --filename | -e | --extra-ext) + return + ;; + -c | --config) + _filedir + return + ;; + --reporter) + COMPREPLY=($(compgen -W "jslint checkstyle unix" -- "$cur")) + return + ;; + --extract) + COMPREPLY=($(compgen -W "auto always never" -- "$cur")) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _filedir js +} && + complete -F _jshint jshint + +# ex: filetype=sh diff --git a/completions/json_xs b/completions/json_xs new file mode 100644 index 0000000..c93ba86 --- /dev/null +++ b/completions/json_xs @@ -0,0 +1,31 @@ +# json_xs completion -*- shell-script -*- + +_json_xs() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -*f) + COMPREPLY=($(compgen -W 'json cbor storable storable-file bencode + clzf eval yaml string none' -- "$cur")) + 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")) + return + ;; + -*e) + return + ;; + esac + + [[ $cur == -* ]] && + COMPREPLY=($(compgen -W '$(_parse_usage "$1") -f' -- "$cur")) +} && + complete -F _json_xs json_xs + +# ex: filetype=sh diff --git a/completions/jsonschema b/completions/jsonschema new file mode 100644 index 0000000..8a36ed3 --- /dev/null +++ b/completions/jsonschema @@ -0,0 +1,30 @@ +# bash completion for jsonschema -*- shell-script -*- + +_jsonschema() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help | --error-format | --validator | -[hFV]) + return + ;; + --instance | -i) + _filedir json + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + local args + _count_args "" "-*" + ((args == 1)) || return + _filedir '@(json|schema)' +} && + complete -F _jsonschema jsonschema + +# ex: filetype=sh diff --git a/completions/k3b b/completions/k3b new file mode 100644 index 0000000..87d26cd --- /dev/null +++ b/completions/k3b @@ -0,0 +1,48 @@ +# bash completion for k3b -*- shell-script -*- + +_k3b() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help* | --author | -v | --version | --license | --lang) + return + ;; + --datacd | --audiocd | --videocd | --mixedcd | --emovixcd | --videodvd) + _filedir + return + ;; + --copydvd | --formatdvd | --videodvdrip) + _dvd_devices + return + ;; + --copycd | --erasecd | --cddarip | --videocdrip) + _cd_devices + _dvd_devices + return + ;; + --cdimage | --image) + _filedir '@(cue|iso|toc)' + return + ;; + --dvdimage) + _filedir iso + return + ;; + --ao) + COMPREPLY=($(compgen -W 'alsa arts' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W "$(_parse_help "$1")" -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + else + _filedir + fi +} && + complete -F _k3b k3b + +# ex: filetype=sh diff --git a/completions/kcov b/completions/kcov new file mode 100644 index 0000000..672967a --- /dev/null +++ b/completions/kcov @@ -0,0 +1,64 @@ +# kcov(1) completion -*- shell-script -*- + +_kcov() +{ + local cur prev words cword split + _init_completion -s -n : || return + + case "$prev" in + --pid | -p) + _pids + return + ;; + --sort-type | -s) + COMPREPLY=($(compgen -W 'filename percent reverse lines + uncovered' -- "$cur")) + return + ;; + --include-path | --exclude-path) + _filedir + return + ;; + --replace-src-path) + if [[ $cur == ?*:* ]]; then + cur="${cur##*:}" + _filedir + else + _filedir + compopt -o nospace + fi + return + ;; + --limits | -l) + if [[ $cur == ?*,* ]]; then + prev="${cur%,*}" + cur="${cur##*,}" + COMPREPLY=($(compgen -W "{0..100}" -- "$cur")) + ((${#COMPREPLY[@]} == 1)) && + COMPREPLY=(${COMPREPLY/#/$prev,}) + else + COMPREPLY=($(compgen -W "{0..100}" -- "$cur")) + ((${#COMPREPLY[@]} == 1)) && COMPREPLY=(${COMPREPLY/%/,}) + compopt -o nospace + fi + return + ;; + --title | -t | --include-pattern | --exclude-pattern | --path-strip-level) + # argument required but no completions available + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" --help)' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _filedir +} && + complete -F _kcov kcov + +# ex: filetype=sh diff --git a/completions/kill b/completions/kill new file mode 100644 index 0000000..25cddba --- /dev/null +++ b/completions/kill @@ -0,0 +1,29 @@ +# kill(1) completion -*- shell-script -*- + +_kill() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -s) + _signals + return + ;; + -l) + return + ;; + esac + + if [[ $cword -eq 1 && $cur == -* ]]; then + # return list of available signals + _signals - + COMPREPLY+=($(compgen -W "-s -l" -- "$cur")) + else + # return list of available PIDs + _pids + fi +} && + complete -F _kill kill + +# ex: filetype=sh diff --git a/completions/killall b/completions/killall new file mode 100644 index 0000000..c7c0b0f --- /dev/null +++ b/completions/killall @@ -0,0 +1,36 @@ +# killall(1) completion -*- shell-script -*- + +[[ $OSTYPE == *@(linux|freebsd|darwin)* ]] || return 1 + +_killall() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --context | --older-than | --younger-than | --version | -!(-*)@([Zoy]|V*)) + return + ;; + --signal | -!(-*)s) + _signals + return + ;; + --user | -!(-*)u) + _allowed_users + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + ((cword == 1)) && _signals - + return + fi + + _pnames +} && + complete -F _killall killall + +# ex: filetype=sh diff --git a/completions/kldload b/completions/kldload new file mode 100644 index 0000000..f511158 --- /dev/null +++ b/completions/kldload @@ -0,0 +1,21 @@ +# FreeBSD kldload completion -*- shell-script -*- + +[[ $OSTYPE == *freebsd* ]] || return 1 + +_kldload() +{ + local cur prev words cword + _init_completion || return + + local moddir=/modules/ + [[ -d $moddir ]] || moddir=/boot/kernel/ + + compopt -o filenames + COMPREPLY=($(compgen -f "$moddir$cur")) + COMPREPLY=(${COMPREPLY[@]#$moddir}) + COMPREPLY=(${COMPREPLY[@]%.ko}) + +} && + complete -F _kldload kldload + +# ex: filetype=sh diff --git a/completions/kldunload b/completions/kldunload new file mode 100644 index 0000000..2e12282 --- /dev/null +++ b/completions/kldunload @@ -0,0 +1,15 @@ +# FreeBSD kldunload completion -*- shell-script -*- + +[[ $OSTYPE == *freebsd* ]] || return 1 + +_kldunload() +{ + local cur prev words cword + _init_completion || return + + COMPREPLY=($(compgen -W '$(kldstat)' -X 'kernel' -X '!*.ko' -- "$cur")) + COMPREPLY=(${COMPREPLY[@]%.ko}) +} && + complete -F _kldunload kldunload + +# ex: filetype=sh diff --git a/completions/koji b/completions/koji new file mode 100644 index 0000000..8efef9a --- /dev/null +++ b/completions/koji @@ -0,0 +1,245 @@ +# koji completion -*- shell-script -*- + +_koji_search() +{ + COMPREPLY+=($(compgen -W \ + '$("$1" -q search $2 "$cur*" 2>/dev/null)' -- "$cur")) +} + +_koji_build() +{ + _koji_search "$1" build +} + +_koji_package() +{ + _koji_search "$1" package +} + +_koji_user() +{ + _koji_search "$1" user +} + +_koji_tag() +{ + COMPREPLY+=($(compgen -W '$("$1" -q list-tags 2>/dev/null)' -- "$cur")) +} + +_koji_target() +{ + COMPREPLY+=($(compgen -W '$("$1" -q list-targets 2>/dev/null | + awk "{ print \$1 }")' -- "$cur")) +} + +_koji() +{ + local cur prev words cword split + _init_completion -s || return + + local commandix command + for ((commandix = 1; commandix < cword; commandix++)); do + if [[ ${words[commandix]} != -* ]]; then + command=${words[commandix]} + break + fi + done + + case $prev in + --help | --help-commands | -!(-*)h*) + return + ;; + --config | --keytab | -!(-*)[co]) + _filedir + return + ;; + --runas | --user | --editor | --by) + _koji_user "$1" + return + ;; + --authtype) + COMPREPLY=($(compgen -W 'noauth ssl password kerberos' -- "$cur")) + return + ;; + --topdir) + _filedir -d + return + ;; + --type) + case ${command-} in + latest-pkg | list-tagged) + COMPREPLY=($(compgen -W 'maven' -- "$cur")) + ;; + esac + return + ;; + --name) + case ${command-} in + list-targets) + _koji_target "$1" + ;; + esac + return + ;; + --owner) + _koji_user "$1" + return + ;; + --tag | --latestfrom) + _koji_tag "$1" + return + ;; + --package) + _koji_package "$1" + return + ;; + --build) + _koji_build "$1" + return + ;; + --build-target) + _koji_target "$1" + return + ;; + esac + + $split && return + + if [[ -v command ]]; then + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W \ + '$(_parse_help "$1" "$command --help")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + # How many'th non-option arg (1-based) for $command are we completing? + local i nth=1 + for ((i = commandix + 1; i < cword; i++)); do + [[ ${words[i]} == -* ]] || ((nth++)) + done + + case $command in + build | maven-build | win-build) + case $nth in + 1) + _koji_target "$1" + ;; + 2) + _filedir src.rpm + ;; + esac + ;; + cancel) + _koji_build "$1" + ;; + chain-build) + case $nth in + 1) + _koji_target "$1" + ;; + esac + ;; + download-build) + case $nth in + 1) + _koji_build "$1" + ;; + esac + ;; + import-comps) + case $nth in + 1) + _filedir xml + ;; + 2) + _koji_tag "$1" + ;; + esac + ;; + latest-by-tag) + _koji_package "$1" + ;; + latest-pkg | list-groups | list-tag-inheritance | show-groups) + case $nth in + 1) + _koji_tag "$1" + ;; + esac + ;; + list-tagged) + case $nth in + 1) + _koji_tag "$1" + ;; + 2) + _koji_package "$1" + ;; + esac + ;; + list-untagged) + case $nth in + 1) + _koji_package "$1" + ;; + esac + ;; + move-pkg) + case $nth in + 1 | 2) + _koji_tag "$1" + ;; + *) + _koji_package "$1" + ;; + esac + ;; + search) + case $nth in + 1) + COMPREPLY=($(compgen -W 'package build tag target + user host rpm' -- "$cur")) + ;; + esac + ;; + tag-pkg | untag-pkg) + case $nth in + 1) + _koji_tag "$1" + ;; + *) + _koji_package "$1" + ;; + esac + ;; + taginfo) + _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" + return + fi + done + _koji_tag "$1" + ;; + esac + ;; + esac + return + fi + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + elif [[ ! -v command ]]; then + COMPREPLY=($(compgen -W '$("$1" --help-commands 2>/dev/null | \ + awk "/^( +|\t)/ { print \$1 }")' -- "$cur")) + fi +} && + complete -F _koji koji arm-koji ppc-koji s390-koji sparc-koji + +# ex: filetype=sh diff --git a/completions/ktutil b/completions/ktutil new file mode 100644 index 0000000..6030a47 --- /dev/null +++ b/completions/ktutil @@ -0,0 +1,120 @@ +# ktutil completion -*- shell-script -*- + +_heimdal_principals() +{ + COMPREPLY=($(compgen -W "$(kadmin -l dump 2>/dev/null | + awk '{print $1}')" -- "$cur")) +} + +_heimdal_realms() +{ + COMPREPLY=($(compgen -W "$(kadmin -l dump 2>/dev/null | + awk '{print $1}' | awk -F@ '{print $2}')" -- "$cur")) +} + +_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")) +} + +_ktutil() +{ + local cur prev words cword split + _init_completion -s || return + + local command commands i options + + case $prev in + -p | --principal) + _heimdal_principals + return + ;; + -e | --enctype) + _heimdal_encodings + return + ;; + -a | --admin-server) + _known_hosts_real -- "$cur" + return + ;; + -r | --realm) + _heimdal_realms + return + ;; + -s | -k | --srvtab | --keytab) + _filedir + return + ;; + esac + + $split && return + + commands='add change copy get list remove rename purge srvconvert + srv2keytab srvcreate key2srvtab' + + for ((i = 1; i < cword; i++)); do + case ${words[i]} in + -k | --keytab) + ((i++)) + ;; + -*) ;; + + *) + command=${words[i]} + break + ;; + esac + done + + if [[ $cur == -* ]]; then + case ${command-} in + add) + options='-p --principal -V -e --enctype -w --password -r + --random -s --no-salt -h --hex' + ;; + change) + options='-r --realm -a --admin-server -s --server-port' + ;; + get) + options='-p --principal -e --enctype -r --realm -a + --admin-server -s server --server-port' + ;; + list) + options='--keys --timestamp' + ;; + remove) + options='-p --principal -V --kvno -e --enctype' + ;; + purge) + options='--age' + ;; + srv2keytab | key2srvtab) + options='-s --srvtab' + ;; + *) + options='-k --keytab -v --verbose --version -v --help' + ;; + esac + COMPREPLY=($(compgen -W "$options" -- "$cur")) + else + case ${command-} in + copy) + _filedir + ;; + get) + _heimdal_principals + ;; + rename) + _heimdal_principals + ;; + *) + COMPREPLY=($(compgen -W "$commands" -- "$cur")) + ;; + esac + fi +} && + complete -F _ktutil ktutil + +# ex: filetype=sh diff --git a/completions/larch b/completions/larch new file mode 100644 index 0000000..7ed9ca2 --- /dev/null +++ b/completions/larch @@ -0,0 +1,39 @@ +# larch(1) completion -*- shell-script -*- +# by Alex Shinn + +_larch() +{ + local cur prev words cword + _init_completion || return + + if [[ $cword -eq 1 || $prev == -* ]]; then + COMPREPLY=($(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 \ + move explicit-default set-manifest manifest check-manifest mkpatch \ + dopatch patch-report empty-patch make-archive make-category \ + make-branch make-version categories branches versions revisions \ + cat-archive-log archive-cache-revision archive-cached-revisions \ + archive-uncache-revision category-readme branch-readme \ + version-readme make-log logs add-log log-ls cat-log \ + log-header-field changelog log-for-merge merge-points \ + new-on-branch import commit get get-patch lock-branch \ + lock-revision push-mirror build-config update-config replay-config \ + record-config show-config config-history update replay delta-patch \ + star-merge tag prepare-branch finish-branch join-branch \ + whats-missing what-changed file-diffs pristines lock-pristine \ + my-revision-library library-find library-add library-remove \ + library-archives library-categories library-branches \ + library-versions library-revisions library-log library-file \ + 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")) + fi + +} && + complete -F _larch -o default larch + +# ex: filetype=sh diff --git a/completions/lastlog b/completions/lastlog new file mode 100644 index 0000000..214a174 --- /dev/null +++ b/completions/lastlog @@ -0,0 +1,25 @@ +# lastlog(8) completion -*- shell-script -*- + +_lastlog() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --before | --help | --time | -!(-*)@([bt]|h*)) + return + ;; + --user | -!(-*)u) + COMPREPLY=($(compgen -u -- "$cur")) + return + ;; + esac + + $split && return + + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace +} && + complete -F _lastlog lastlog + +# ex: filetype=sh diff --git a/completions/ldapsearch b/completions/ldapsearch new file mode 100644 index 0000000..6dc415e --- /dev/null +++ b/completions/ldapsearch @@ -0,0 +1,231 @@ +# bash completion for openldap -*- shell-script -*- + +_ldap_uris() +{ + COMPREPLY=($(compgen -W 'ldap:// ldaps://' -- "$cur")) +} + +_ldap_protocols() +{ + COMPREPLY=($(compgen -W '2 3' -- "$cur")) +} + +_ldapsearch() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -*h) + _known_hosts_real -- "$cur" + return + ;; + -*H) + _ldap_uris + return + ;; + -*T) + _filedir -d + return + ;; + -*[fy]) + _filedir + return + ;; + -*s) + COMPREPLY=($(compgen -W 'base one sub children' -- "$cur")) + return + ;; + -*a) + COMPREPLY=($(compgen -W 'never always search find' -- "$cur")) + return + ;; + -*P) + _ldap_protocols + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1") -MM -ZZ' -- "$cur")) + fi +} && + complete -F _ldapsearch ldapsearch + +_ldapaddmodify() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -*h) + _known_hosts_real -- "$cur" + return + ;; + -*H) + _ldap_uris + return + ;; + -*[Sfy]) + _filedir + return + ;; + -*P) + _ldap_protocols + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1") -MM -ZZ' -- "$cur")) + fi +} && + complete -F _ldapaddmodify ldapadd ldapmodify + +_ldapdelete() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -*h) + _known_hosts_real -- "$cur" + return + ;; + -*H) + _ldap_uris + return + ;; + -*[fy]) + _filedir + return + ;; + -*P) + _ldap_protocols + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1") -MM -ZZ' -- "$cur")) + fi +} && + complete -F _ldapdelete ldapdelete + +_ldapcompare() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -*h) + _known_hosts_real -- "$cur" + return + ;; + -*H) + _ldap_uris + return + ;; + -*y) + _filedir + return + ;; + -*P) + _ldap_protocols + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1") -MM -ZZ' -- "$cur")) + fi +} && + complete -F _ldapcompare ldapcompare + +_ldapmodrdn() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -*h) + _known_hosts_real -- "$cur" + return + ;; + -*H) + _ldap_uris + return + ;; + -*[fy]) + _filedir + return + ;; + -*P) + _ldap_protocols + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1") -ZZ -MM' -- "$cur")) + fi +} && + complete -F _ldapmodrdn ldapmodrdn + +_ldapwhoami() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -*h) + _known_hosts_real -- "$cur" + return + ;; + -*H) + _ldap_uris + return + ;; + -*[fy]) + _filedir + return + ;; + -*P) + _ldap_protocols + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1") -MM -ZZ' -- "$cur")) + fi +} && + complete -F _ldapwhoami ldapwhoami + +_ldappasswd() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -*h) + _known_hosts_real -- "$cur" + return + ;; + -*H) + _ldap_uris + return + ;; + -*[tTy]) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1") -MM -ZZ' -- "$cur")) + fi +} && + complete -F _ldappasswd ldappasswd + +# ex: filetype=sh diff --git a/completions/ldapvi b/completions/ldapvi new file mode 100644 index 0000000..cb01ac8 --- /dev/null +++ b/completions/ldapvi @@ -0,0 +1,51 @@ +# bash completion for ldapvi -*- shell-script -*- + +_ldapvi() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --host | -!(-*)h) + _known_hosts_real -- "$cur" + return + ;; + --sasl-mech | -!(-*)Y) + COMPREPLY=($(compgen -W 'EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 + PLAIN ANONYMOUS' -- "$cur")) + return + ;; + --bind) + COMPREPLY=($(compgen -W 'simple sasl' -- "$cur")) + return + ;; + --bind-dialog) + COMPREPLY=($(compgen -W 'never auto always' -- "$cur")) + return + ;; + --scope) + COMPREPLY=($(compgen -W 'base one sub' -- "$cur")) + return + ;; + --deref) + COMPREPLY=($(compgen -W 'never searching finding always' \ + -- "$cur")) + return + ;; + --encoding) + COMPREPLY=($(compgen -W 'ASCII UTF-8 binary' -- "$cur")) + return + ;; + --tls) + COMPREPLY=($(compgen -W 'never allow try strict' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + fi +} && + complete -F _ldapvi ldapvi + +# ex: filetype=sh diff --git a/completions/lftp b/completions/lftp new file mode 100644 index 0000000..72dedb4 --- /dev/null +++ b/completions/lftp @@ -0,0 +1,28 @@ +# lftp(1) completion -*- shell-script -*- + +_lftp() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -!(-*)f) + _filedir + return + ;; + --help | --version | -!(-*)[chveups]) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + COMPREPLY=($(compgen -W '$("$1" -c "bookmark list" 2>/dev/null)' -- "$cur")) + _known_hosts_real -- "$cur" +} && + complete -F _lftp lftp + +# ex: filetype=sh diff --git a/completions/lftpget b/completions/lftpget new file mode 100644 index 0000000..d21622e --- /dev/null +++ b/completions/lftpget @@ -0,0 +1,14 @@ +# lftpget(1) completion -*- shell-script -*- + +_lftpget() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '-c -d -v' -- "$cur")) + fi +} && + complete -F _lftpget lftpget + +# ex: filetype=sh diff --git a/completions/lilo b/completions/lilo new file mode 100644 index 0000000..af8539a --- /dev/null +++ b/completions/lilo @@ -0,0 +1,66 @@ +# bash completion for lilo(8) -*- shell-script -*- + +_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")) +} + +_lilo() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -C | -i | -m | -s | -S) + _filedir + return + ;; + -r) + _filedir -d + return + ;; + -I | -D | -R) + # label completion + local i conf + for i in "${!words[@]}"; do + if [[ ${words[i]} == -C ]]; then + conf=${words[i + 1]} + break + fi + done + _lilo_labels $conf + return + ;; + -A | -b | -M | -u | -U) + # device completion + cur=${cur:=/dev/} + _filedir + return + ;; + -T) + # topic completion + COMPREPLY=($(compgen -W 'help ChRul EBDA geom geom= table= + video' -- "$cur")) + return + ;; + -B) + _filedir bmp + return + ;; + -E) + _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")) + fi +} && + complete -F _lilo lilo + +# ex: filetype=sh diff --git a/completions/links b/completions/links new file mode 100644 index 0000000..e0c28e2 --- /dev/null +++ b/completions/links @@ -0,0 +1,100 @@ +# bash completion for links -*- shell-script -*- + +_links() +{ + local cur prev words cword + _init_completion -n : || return + + case $prev in + -html-t-text-color | -html-t-link-color) + COMPREPLY=($(compgen -W '{0..15}' -- "$cur")) + return + ;; + -http.fake-firefox | -html-[gt]-ignore-document-color) + COMPREPLY=($(compgen -W '0 1' -- "$cur")) + return + ;; + --help | -help | -mode | -display | -source | -dump | -width | -max-connections | \ + -max-connections-to-host | -retries | -receive-timeout | \ + -unrestartable-receive-timeout | -*-size | -*-proxy | \ + -append-text-to-dns-lookups | -ssl.client-cert-passwd | -http.fake-* | \ + -http.extra-header | -ftp.anonymous-passwd | -*-color | -*-gamma | \ + -bfu-aspect | -html-image-scale | -html-margin) + return + ;; + -lookup) + _known_hosts_real -- "$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")) + return + ;; + -codepage | -bookmarks-codepage | -http-assume-codepage) + _xfunc iconv _iconv_charsets + return + ;; + -download-dir) + _filedir -d + return + ;; + -bind-address) + _ip_addresses + return + ;; + -bind-address-ipv6) + _ip_addresses -6 + __ltrim_colon_completions "$cur" + 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")) + return + ;; + -address-preference | -http.referer) + COMPREPLY=($(compgen -W '{0..4}' -- "$cur")) + return + ;; + -ssl-certificates | -display-optimize | -gamma-correction) + COMPREPLY=($(compgen -W '{0..2}' -- "$cur")) + return + ;; + -ssl.client-cert-key) + _filedir '@(key|pem)' + return + ;; + -ssl.client-cert-crt) + _filedir '@(c?(e)rt|cer|pem|der)' + return + ;; + -bookmarks-file) + _filedir html + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" | + command grep -vF -- "->")' -- "$cur")) + 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" + fi + done + _filedir '@(htm|html)' + +} && + complete -F _links links links2 + +# ex: filetype=sh diff --git a/completions/lintian b/completions/lintian new file mode 100644 index 0000000..9343832 --- /dev/null +++ b/completions/lintian @@ -0,0 +1,176 @@ +# bash completion for lintian(1) and lintian-info(1) -*- shell-script -*- + +_lintian_tags() +{ + local match search tags + + tags=$(awk '/^Tag/ { print $2 }' /usr/share/lintian/checks/*.desc) + 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) + done + COMPREPLY+=($(compgen -W "$tags")) + elif [[ $cur == *,* ]]; then + COMPREPLY+=($(compgen -P "${cur%,*}," -W "$tags" -- "${cur##*,}")) + else + COMPREPLY+=($(compgen -W "$tags" -- "$cur")) + fi +} + +_lintian_checks() +{ + local match search todisable checks + + checks=$(awk '/^(Check-Script|Abbrev)/ { print $2 }' \ + /usr/share/lintian/checks/*.desc) + 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) + for name in $todisable; do + checks=$(command sed -e "s/\<$name\>//g" <<<$checks) + done + done + COMPREPLY+=($(compgen -W "$checks")) + elif [[ $cur == *,* ]]; then + COMPREPLY+=($(compgen -P "${cur%,*}," -W "$checks" -- "${cur##*,}")) + else + COMPREPLY+=($(compgen -W "$checks" -- "$cur")) + fi +} + +_lintian_infos() +{ + local match search infos + + infos=$(awk '/^Collector/ { print $2 }' \ + /usr/share/lintian/collection/*.desc) + 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) + done + COMPREPLY+=($(compgen -W "$infos")) + elif [[ $cur == *,* ]]; then + COMPREPLY+=($(compgen -P "${cur%,*}," -W "$infos" -- "${cur##*,}")) + else + COMPREPLY+=($(compgen -W "$infos" -- "$cur")) + fi +} + +_lintian() +{ + local cur prev words cword + _init_completion || return + + local lint_actions general_opts behaviour_opts configuration_opts + + lint_actions="--setup-lab --remove-lab --check --check-part --tags + --tags-from-file --ftp-master-rejects --dont-check-part --unpack + --remove" + general_opts="--help --version --print-version --verbose --debug --quiet" + behaviour_opts="--info --display-info --display-experimental --pedantic + --display-level --suppress-tags --suppress-tags-from-file --no-override + --show-overrides --color --unpack-info --md5sums --checksums + --allow-root --fail-on-warnings --keep-lab" + configuration_opts="--cfg --lab --archivedir --dist --area --section --arch + --root" + + if [[ $prev == -* ]]; then + case $prev in + -C | --check-part | -X | --dont-check-part) + _lintian_checks + ;; + -T | --tags | --suppress-tags) + _lintian_tags + ;; + --tags-from-file | --suppress-tags-from-file | --cfg | -p | \ + --packages-file) + _filedir + ;; + --lab | --archivedir | --dist | --root) + _filedir -d + ;; + --color) + COMPREPLY=($(compgen -W "never always auto html" -- "$cur")) + ;; + -U | --unpack-info) + _lintian_infos + ;; + --area | --section) + COMPREPLY=($(compgen -W "main contrib non-free" -- "$cur")) + ;; + --arch) ;; + + esac + fi + + case "$cur" in + --*) + COMPREPLY=($(compgen -W "$lint_actions $general_opts + $behaviour_opts $configuration_opts" -- "$cur")) + ;; + *,) + # If we're here, the user is trying to complete on + # --action tag,tag, + # Only few actions permit that, re-complete them now. + case "$prev" in + -C | --check-part | -X | --dont-check-part) + _lintian_checks + ;; + -T | --tags | --suppress-tags) + _lintian_tags + ;; + -U | --unpack-info) + _lintian_infos + ;; + esac + ;; + *) + # in Ubuntu, dbgsym packages end in .ddeb, lintian >= 2.57.0 groks + _filedir '@(?(u|d)deb|changes|dsc|buildinfo)' + ;; + esac + return 0 +} && + complete -F _lintian lintian + +_lintian_info() +{ + local cur prev words cword + _init_completion || return + + case "$prev" in + --help | --profile) + return + ;; + -t | --tags) + _lintian_tags + return + ;; + --include-dir) + _filedir -d + return + ;; + esac + + case "$cur" in + --*) + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + ;; + *) + _filedir + ;; + esac + return 0 +} && + complete -F _lintian_info lintian-info + +# ex: filetype=sh diff --git a/completions/lisp b/completions/lisp new file mode 100644 index 0000000..098567b --- /dev/null +++ b/completions/lisp @@ -0,0 +1,22 @@ +# -*- shell-script -*- +# bash programmable completion for various Common Lisp implementations by +# Nikodemus Siivola + +_lisp() +{ + local cur prev words cword + _init_completion || 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")) + else + _filedir + fi + +} && + complete -F _lisp -o default lisp + +# ex: filetype=sh diff --git a/completions/list_admins b/completions/list_admins new file mode 100644 index 0000000..5708179 --- /dev/null +++ b/completions/list_admins @@ -0,0 +1,17 @@ +# mailman list_admins completion -*- shell-script -*- + +_list_admins() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--all-vhost --all --help' -- "$cur")) + else + _xfunc list_lists _mailman_lists + fi + +} && + complete -F _list_admins list_admins + +# ex: filetype=sh diff --git a/completions/list_lists b/completions/list_lists new file mode 100644 index 0000000..c5b9ba7 --- /dev/null +++ b/completions/list_lists @@ -0,0 +1,21 @@ +# mailman list_lists completion -*- shell-script -*- + +_mailman_lists() +{ + COMPREPLY=($(compgen -W '$(list_lists -b 2>/dev/null)' -- "$cur")) +} + +_list_lists() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--advertised --virtual-host-overview --bare + --help' -- "$cur")) + fi + +} && + complete -F _list_lists list_lists + +# ex: filetype=sh diff --git a/completions/list_members b/completions/list_members new file mode 100644 index 0000000..639344c --- /dev/null +++ b/completions/list_members @@ -0,0 +1,36 @@ +# mailman list_members completion -*- shell-script -*- + +_list_members() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + -o | --output) + _filedir + return + ;; + -d | --digest) + COMPREPLY=($(compgen -W 'mime plain' -- "$cur")) + return + ;; + -n | --nomail) + COMPREPLY=($(compgen -W 'byadmin byuser bybounce unknown' \ + -- "$cur")) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--output --regular --digest --nomail + --fullnames --preserve --help' -- "$cur")) + else + _xfunc list_lists _mailman_lists + fi + +} && + complete -F _list_members list_members + +# ex: filetype=sh diff --git a/completions/list_owners b/completions/list_owners new file mode 100644 index 0000000..445be0b --- /dev/null +++ b/completions/list_owners @@ -0,0 +1,18 @@ +# mailman list_owners completion -*- shell-script -*- + +_list_owners() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--with-listnames --moderators --help' \ + -- "$cur")) + else + _xfunc list_lists _mailman_lists + fi + +} && + complete -F _list_owners list_owners + +# ex: filetype=sh diff --git a/completions/locale-gen b/completions/locale-gen new file mode 100644 index 0000000..4068201 --- /dev/null +++ b/completions/locale-gen @@ -0,0 +1,32 @@ +# locale-gen(8) completion -*- shell-script -*- + +_locale_gen() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --help | -h) + return + ;; + --aliases) + _filedir alias + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + COMPREPLY=($(compgen -W \ + '$(awk "{ print \$1 }" /usr/share/i18n/SUPPORTED 2>/dev/null)' \ + -- "$cur")) +} && + complete -F _locale_gen locale-gen + +# ex: filetype=sh diff --git a/completions/lpq b/completions/lpq new file mode 100644 index 0000000..36729d2 --- /dev/null +++ b/completions/lpq @@ -0,0 +1,28 @@ +# lpq(1) completion -*- shell-script -*- + +_lpq() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -P) + COMPREPLY=($(compgen -W "$(lpstat -a 2>/dev/null | cut -d' ' -f1)" -- "$cur")) + return + ;; + -U) + COMPREPLY=($(compgen -u -- "$cur")) + return + ;; + esac + + if [[ $cur == - ]]; then + COMPREPLY=($(compgen -W '-E -P -U -a -h -l' -- "$cur")) + return + fi + + _filedir +} && + complete -F _lpq lpq + +# ex: filetype=sh diff --git a/completions/lpr b/completions/lpr new file mode 100644 index 0000000..554f053 --- /dev/null +++ b/completions/lpr @@ -0,0 +1,33 @@ +# lpr(1) completion -*- shell-script -*- + +_lpr() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -P) + COMPREPLY=($(compgen -W "$(lpstat -a 2>/dev/null | cut -d' ' -f1)" -- "$cur")) + return + ;; + -U) + COMPREPLY=($(compgen -u -- "$cur")) + 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")) + [[ ${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")) + return + fi + + _filedir +} && + complete -F _lpr lpr + +# ex: filetype=sh diff --git a/completions/lrzip b/completions/lrzip new file mode 100644 index 0000000..eb2904c --- /dev/null +++ b/completions/lrzip @@ -0,0 +1,52 @@ +# lrzip(1) completion -*- shell-script -*- + +_lrzip() +{ + local cur prev words cword + _init_completion || return + + local xspec="*.lrz" + + case $prev in + -*@([wSm]|[Vh?]*)) + return + ;; + -*d) + xspec="!"$xspec + ;; + -*o) + _filedir + return + ;; + -*O) + _filedir -d + return + ;; + -*L) + COMPREPLY=($(compgen -W '{1..9}' -- "$cur")) + return + ;; + -*N) + COMPREPLY=($(compgen -W '{-20..19}' -- "$cur")) + return + ;; + -*p) + COMPREPLY=($(compgen -W "{1..$(_ncpus)}" -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + _tilde "$cur" || return + + local IFS=$'\n' + compopt -o filenames + COMPREPLY=($(compgen -f -X "$xspec" -- "$cur") $(compgen -d -- "$cur")) +} && + complete -F _lrzip lrzip + +# ex: filetype=sh diff --git a/completions/lsof b/completions/lsof new file mode 100644 index 0000000..eb1e967 --- /dev/null +++ b/completions/lsof @@ -0,0 +1,56 @@ +# lsof(8) completion -*- shell-script -*- + +_lsof() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -'?' | -h | +c | -c | -d | -F | -i | +r | -r | -s | -S | -T) + return + ;; + -A | -k | -m | +m | -o) + _filedir + return + ;; + +d | +D) + _filedir -d + return + ;; + -D) + COMPREPLY=($(compgen -W '? b i r u' -- "$cur")) + return + ;; + -f) + COMPREPLY=($(compgen -W 'c f g G n' -- "$cur")) + return + ;; + -g) + # TODO: handle ^foo exclusions, comma separated lists + _pgids + return + ;; + -p) + # TODO: handle ^foo exclusions, comma separated lists + _pids + return + ;; + -u) + # TODO: handle ^foo exclusions, comma separated lists + COMPREPLY=($(compgen -u -- "$cur")) + 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")) + return + fi + + _filedir +} && + complete -F _lsof lsof + +# ex: filetype=sh diff --git a/completions/lspci b/completions/lspci new file mode 100644 index 0000000..d50783c --- /dev/null +++ b/completions/lspci @@ -0,0 +1,41 @@ +# lspci(8) completion -*- shell-script -*- + +_lspci() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -*[sDO]) + return + ;; + -*i) + _filedir ids + return + ;; + -*p) + _filedir pcimap + return + ;; + -*A) + COMPREPLY+=($(compgen -W '$($1 -A help | command grep -vF :)' \ + -- "$cur")) + return + ;; + -*H) + COMPREPLY+=($(compgen -W "1 2" -- "$cur")) + return + ;; + -*F) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + fi +} && + complete -F _lspci lspci + +# ex: filetype=sh diff --git a/completions/lsscsi b/completions/lsscsi new file mode 100644 index 0000000..bcbc430 --- /dev/null +++ b/completions/lsscsi @@ -0,0 +1,27 @@ +# lsscsi(8) completion -*- shell-script -*- + +_lsscsi() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --help | --version | -!(-*)[hV]*) + return + ;; + --sysfsroot | -!(-*)y) + _filedir -d + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + fi +} && + complete -F _lsscsi lsscsi + +# ex: filetype=sh diff --git a/completions/lsusb b/completions/lsusb new file mode 100644 index 0000000..63cff54 --- /dev/null +++ b/completions/lsusb @@ -0,0 +1,20 @@ +# lsusb(8) completion -*- shell-script -*- + +_lsusb() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help | --version | -!(-*)@([sD]|[hV]*)) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + fi +} && + complete -F _lsusb lsusb + +# ex: filetype=sh diff --git a/completions/lua b/completions/lua new file mode 100644 index 0000000..3c4df90 --- /dev/null +++ b/completions/lua @@ -0,0 +1,23 @@ +# lua(1) completion -*- shell-script -*- + +_lua() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -e | -l | -v | -) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W "$(_parse_help "$1")" -- "$cur")) + return + fi + + _filedir 'l@(ua|?(ua)c)' +} && + complete -F _lua lua + +# ex: filetype=sh diff --git a/completions/luac b/completions/luac new file mode 100644 index 0000000..c763deb --- /dev/null +++ b/completions/luac @@ -0,0 +1,27 @@ +# luac(1) completion -*- shell-script -*- + +_luac() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -v | -) + return + ;; + -o) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W "$(_parse_help "$1")" -- "$cur")) + return + fi + + _filedir lua +} && + complete -F _luac luac + +# ex: filetype=sh diff --git a/completions/luseradd b/completions/luseradd new file mode 100644 index 0000000..4d66385 --- /dev/null +++ b/completions/luseradd @@ -0,0 +1,40 @@ +# luseradd(1) and lusermod(1) completion -*- shell-script -*- + +_luseradd() +{ + local cur prev words cword split + _init_completion -s || return + + case $prev in + --help | --usage | --gecos | --uid | --login | --plainpassword | --password | \ + --commonname | --givenname | --surname | --roomnumber | --telephonenumber | \ + --homephone | -!(-*)@([culPp]|[?]*)) + return + ;; + --directory | --skeleton | -!(-*)[dk]) + _filedir -d + return + ;; + --shell | -!(-*)s) + _shells + return + ;; + --gid | -!(-*)g) + _gids + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + [[ ${1##*/} == luseradd ]] || COMPREPLY=($(compgen -u -- "$cur")) +} && + complete -F _luseradd luseradd lusermod + +# ex: filetype=sh diff --git a/completions/luserdel b/completions/luserdel new file mode 100644 index 0000000..e36bda9 --- /dev/null +++ b/completions/luserdel @@ -0,0 +1,23 @@ +# luserdel(1) completion -*- shell-script -*- + +_luserdel() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --help | --usage | -!(-*)[?]*) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + return + fi + + COMPREPLY=($(compgen -u -- "$cur")) +} && + complete -F _luserdel luserdel + +# ex: filetype=sh diff --git a/completions/lvm b/completions/lvm new file mode 100644 index 0000000..e70ecc3 --- /dev/null +++ b/completions/lvm @@ -0,0 +1,861 @@ +# bash completion for lvm -*- shell-script -*- + +_lvm_filedir() +{ + cur=${cur:-/dev/} + _filedir +} + +_lvm_volumegroups() +{ + COMPREPLY=($(compgen -W "$(vgscan 2>/dev/null | + command sed -n -e 's|.*Found.*"\(.*\)".*$|\1|p')" -- "$cur")) +} + +_lvm_physicalvolumes_all() +{ + COMPREPLY=($(compgen -W "$(pvscan 2>/dev/null | + command sed -n -e 's|^.*PV \([^ ]*\) .*|\1|p')" -- "$cur")) +} + +_lvm_physicalvolumes() +{ + COMPREPLY=($(compgen -W "$(pvscan 2>/dev/null | + command sed -n -e 's|^.*PV \(.*\) VG.*$|\1|p')" -- "$cur")) +} + +_lvm_logicalvolumes() +{ + COMPREPLY=($(compgen -W "$(lvscan 2>/dev/null | + command sed -n -e "s|^.*'\(.*\)'.*$|\1|p")" -- "$cur")) + if [[ $cur == /dev/mapper/* ]]; then + _filedir + local i + for i in "${!COMPREPLY[@]}"; do + [[ ${COMPREPLY[i]} == */control ]] && unset 'COMPREPLY[i]' + done + fi +} + +_lvm_units() +{ + COMPREPLY=($(compgen -W 'h s b k m g t H K M G T' -- "$cur")) +} + +_lvm_sizes() +{ + COMPREPLY=($(compgen -W 'k K m M g G t T' -- "$cur")) +} + +# @param $1 glob matching args known to take an argument +_lvm_count_args() +{ + args=0 + local offset=1 + if [[ ${words[0]} == lvm ]]; then + offset=2 + fi + local i prev=${words[offset - 1]} + for ((i = offset; i < cword; i++)); do + # shellcheck disable=SC2053 + if [[ ${words[i]} != -* && $prev != $1 ]]; then + ((args++)) + fi + prev=${words[i]} + done +} + +_lvmdiskscan() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + fi +} && + complete -F _lvmdiskscan lvmdiskscan + +_pvscan() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + fi +} && + complete -F _pvscan pvscan + +_pvs() +{ + local cur prev words cword + _init_completion || return + + 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")) + return + ;; + --units) + _lvm_units + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_physicalvolumes_all + fi +} && + complete -F _pvs pvs + +_pvdisplay() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --units) + _lvm_units + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_physicalvolumes_all + fi +} && + complete -F _pvdisplay pvdisplay + +_pvchange() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --autobackup | --allocatable | -!(-*)[Ax]) + COMPREPLY=($(compgen -W 'y n' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_physicalvolumes_all + fi +} && + complete -F _pvchange pvchange + +_pvcreate() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --restorefile) + _filedir + return + ;; + --metadatatype | -!(-*)M) + COMPREPLY=($(compgen -W '1 2' -- "$cur")) + return + ;; + --metadatacopies) + COMPREPLY=($(compgen -W '0 1 2' -- "$cur")) + return + ;; + --metadatasize | --setphysicalvolumesize) + _lvm_sizes + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_filedir + fi +} && + complete -F _pvcreate pvcreate + +_pvmove() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --autobackup | -!(-*)A) + COMPREPLY=($(compgen -W 'y n' -- "$cur")) + return + ;; + --name | -!(-*)n) + _lvm_logicalvolumes + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_physicalvolumes + fi +} && + complete -F _pvmove pvmove + +_pvremove() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_physicalvolumes_all + fi +} && + complete -F _pvremove pvremove + +_vgscan() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + fi +} && + complete -F _vgscan vgscan + +_vgs() +{ + local cur prev words cword + _init_completion || return + + 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")) + return + ;; + --units) + _lvm_units + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_volumegroups + fi +} && + complete -F _vgs vgs + +_vgdisplay() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --units) + _lvm_units + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_volumegroups + fi +} && + complete -F _vgdisplay vgdisplay + +_vgchange() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --available | --autobackup | --resizeable | -!(-*)[aAx]) + COMPREPLY=($(compgen -W 'y n' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_volumegroups + fi +} && + complete -F _vgchange vgchange + +_vgcreate() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --autobackup | -!(-*)A) + COMPREPLY=($(compgen -W 'y n' -- "$cur")) + return + ;; + --metadatatype | -!(-*)M) + COMPREPLY=($(compgen -W '1 2' -- "$cur")) + return + ;; + --physicalextentsize | -!(-*)s) + _lvm_sizes + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + local args + _lvm_count_args '@(-A|--autobackup|-M|--metadatatype|-s|--physicalextentsize)' + if ((args == 0)); then + _lvm_volumegroups + else + _lvm_physicalvolumes_all + fi + fi +} && + complete -F _vgcreate vgcreate + +_vgremove() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_volumegroups + fi +} && + complete -F _vgremove vgremove + +_vgrename() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --autobackup | -!(-*)A) + COMPREPLY=($(compgen -W 'y n' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_volumegroups + fi +} && + complete -F _vgrename vgrename + +_vgreduce() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --autobackup | -!(-*)A) + COMPREPLY=($(compgen -W 'y n' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + + else + local args + _lvm_count_args '@(-A|--autobackup)' + if ((args == 0)); then + _lvm_volumegroups + else + _lvm_physicalvolumes + fi + fi +} && + complete -F _vgreduce vgreduce + +_vgextend() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --autobackup | -!(-*)A) + COMPREPLY=($(compgen -W 'y n' -- "$cur")) + return + ;; + --size | -!(-*)L) + _lvm_sizes + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + local args + _lvm_count_args '@(-A|--autobackup|-L|--size)' + if ((args == 0)); then + _lvm_volumegroups + else + _lvm_physicalvolumes_all + fi + fi +} && + complete -F _vgextend vgextend + +_vgport() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_volumegroups + fi +} && + complete -F _vgport vgimport vgexport + +_vgck() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_volumegroups + fi +} && + complete -F _vgck vgck + +_vgconvert() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --metadatatype | -!(-*)M) + COMPREPLY=($(compgen -W '1 2' -- "$cur")) + return + ;; + --metadatacopies) + COMPREPLY=($(compgen -W '0 1 2' -- "$cur")) + return + ;; + --metadatasize) + _lvm_sizes + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_volumegroups + fi +} && + complete -F _vgconvert vgconvert + +_vgcfgbackup() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --file | -!(-*)f) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_volumegroups + fi +} && + complete -F _vgcfgbackup vgcfgbackup + +_vgcfgrestore() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --file | -!(-*)f) + _filedir + return + ;; + --metadatatype | -!(-*)M) + COMPREPLY=($(compgen -W '1 2' -- "$cur")) + return + ;; + --name | -!(-*)n) + _lvm_volumegroups + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_volumegroups + fi +} && + complete -F _vgcfgrestore vgcfgrestore + +_vgmerge() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --autobackup | -!(-*)A) + COMPREPLY=($(compgen -W 'y n' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_volumegroups + fi +} && + complete -F _vgmerge vgmerge + +_vgsplit() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --autobackup | -!(-*)A) + COMPREPLY=($(compgen -W 'y n' -- "$cur")) + return + ;; + --metadatatype | -!(-*)M) + COMPREPLY=($(compgen -W '1 2' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + local args + _lvm_count_args '@(-A|--autobackup|-M|--metadatatype)' + if ((args == 0 || args == 1)); then + _lvm_volumegroups + else + _lvm_physicalvolumes + fi + fi +} && + complete -F _vgsplit vgsplit + +_vgmknodes() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_volumegroups + fi +} && + complete -F _vgmknodes vgmknodes + +_lvscan() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + fi +} && + complete -F _lvscan lvscan + +_lvs() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --options | --sort | -!(-*)[oO]) + COMPREPLY=($(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")) + return + ;; + --units) + _lvm_units + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_logicalvolumes + fi +} && + complete -F _lvs lvs + +_lvdisplay() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --units) + _lvm_units + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_logicalvolumes + fi +} && + complete -F _lvdisplay lvdisplay + +_lvchange() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --available | --autobackup | --contiguous | --persistent | -!(-*)[aACM]) + COMPREPLY=($(compgen -W 'y n' -- "$cur")) + return + ;; + --permission | -!(-*)p) + COMPREPLY=($(compgen -W 'r rw' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_logicalvolumes + fi +} && + complete -F _lvchange lvchange + +_lvcreate() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --autobackup | --contiguous | --persistent | --zero | -!(-*)[ACMZ]) + COMPREPLY=($(compgen -W 'y n' -- "$cur")) + return + ;; + --size | -!(-*)L) + _lvm_sizes + return + ;; + --permission | -!(-*)p) + COMPREPLY=($(compgen -W 'r rw' -- "$cur")) + return + ;; + --name | -!(-*)n) + _lvm_logicalvolumes + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + 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 + else + _lvm_physicalvolumes + fi + fi +} && + complete -F _lvcreate lvcreate + +_lvremove() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --autobackup | -!(-*)A) + COMPREPLY=($(compgen -W 'y n' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_logicalvolumes + fi +} && + complete -F _lvremove lvremove + +_lvrename() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --autobackup | -!(-*)A) + COMPREPLY=($(compgen -W 'y n' -- "$cur")) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_logicalvolumes + fi +} && + complete -F _lvrename lvrename + +_lvreduce() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --autobackup | -!(-*)A) + COMPREPLY=($(compgen -W 'y n' -- "$cur")) + return + ;; + --size | -!(-*)L) + _lvm_sizes + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + _lvm_logicalvolumes + fi +} && + complete -F _lvreduce lvreduce + +_lvresize() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --autobackup | -!(-*)A) + COMPREPLY=($(compgen -W 'y n' -- "$cur")) + return + ;; + --size | -!(-*)L) + _lvm_sizes + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + local args + _lvm_count_args '@(-A|--autobackup|-L|--size)' + if ((args == 0)); then + _lvm_logicalvolumes + else + _lvm_physicalvolumes + fi + fi +} && + complete -F _lvresize lvresize + +_lvextend() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --autobackup | -!(-*)A) + COMPREPLY=($(compgen -W 'y n' -- "$cur")) + return + ;; + --size | -!(-*)L) + _lvm_sizes + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1" --help)' -- "$cur")) + else + local args + _lvm_count_args '@(-A|--autobackup|-L|--size)' + if ((args == 0)); then + _lvm_logicalvolumes + else + _lvm_physicalvolumes + fi + fi +} && + complete -F _lvextend lvextend + +_lvm() +{ + local cur prev words cword + _init_completion || return + + if ((cword == 1)); then + COMPREPLY=($(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")) + else + case "${words[1]}" in + pvchange | pvcreate | pvdisplay | pvmove | pvremove | pvresize | pvs | pvscan | \ + vgcfgbackup | vgcfgrestore | vgchange | vgck | vgconvert | vgcreate | \ + vgdisplay | vgexport | vgextend | vgimport | vgmerge | vgmknodes | vgreduce | \ + vgremove | vgrename | vgs | vgscan | vgsplit | lvchange | lvcreate | lvdisplay | \ + lvextend | lvreduce | lvremove | lvrename | lvresize | lvscan) + _${words[1]} + ;; + esac + fi +} && + complete -F _lvm lvm + +# ex: filetype=sh diff --git a/completions/lz4 b/completions/lz4 new file mode 100644 index 0000000..f297b5d --- /dev/null +++ b/completions/lz4 @@ -0,0 +1,52 @@ +# lz4 completion -*- shell-script -*- + +_lz4() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -b) + _filedir + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -X '-*#*' -W \ + '$(_parse_help "$1" -h) -B{4..7} -i{1..9}' -- "$cur")) + return + fi + + local args word xspec="*.?(t)lz4" + _count_args + ((args > 2)) && return + + for word in "${words[@]}"; do + case $word in + -*[dt]*) + case $args in + 1) xspec="!"$xspec ;; + 2) [[ $word == *t* ]] && return ;; + esac + break + ;; + -z) + case $args in + 1) xspec= ;; + 2) xspec="!"$xspec ;; + esac + break + ;; + esac + done + + _tilde "$cur" || return + + local IFS=$'\n' + compopt -o filenames + COMPREPLY=($(compgen -f -X "$xspec" -- "$cur") $(compgen -d -- "$cur")) +} && + complete -F _lz4 lz4 lz4c + +# ex: filetype=sh diff --git a/completions/lzip b/completions/lzip new file mode 100644 index 0000000..05f169c --- /dev/null +++ b/completions/lzip @@ -0,0 +1,47 @@ +# lzip(1) completion -*- shell-script -*- + +_lzip() +{ + local cur prev words cword split + _init_completion -s || return + + local decompress=false + + case $prev in + --help | --version | --member-size | --match-length | --dictionary-size | \ + --volume-size | --data-size | -!(-*)@([bmsSB]|[hV]*)) + return + ;; + --decompress-!(-*)d) + decompress=true + ;; + --threads-!(-*)n) + COMPREPLY=($(compgen -W "{1..$(_ncpus)}" -- "$cur")) + return + ;; + --output-!(-*)o) + _filedir + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1") {-1..-9}' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + if $decompress; then + _filedir lz + return + fi + + local IFS=$'\n' + compopt -o filenames + COMPREPLY=($(compgen -f -X "*.lz" -- "$cur") $(compgen -d -- "$cur")) +} && + complete -F _lzip clzip lzip pdlzip plzip + +# ex: filetype=sh diff --git a/completions/lzma b/completions/lzma new file mode 100644 index 0000000..34fba89 --- /dev/null +++ b/completions/lzma @@ -0,0 +1,34 @@ +# lzma(1) completion -*- shell-script -*- +# by Per Øyvind Karlsen + +_lzma() +{ + local cur prev words cword split + _init_completion -s || return + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1") -{1..9}' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + local IFS=$'\n' xspec="*.@(lzma|tlz)" + + if [[ $prev == --* ]]; then + [[ $prev == --@(decompress|list|test) ]] && xspec="!"$xspec + [[ $prev == --compress ]] && xspec= + elif [[ $prev == -* ]]; then + [[ $prev == -*[dt]* ]] && xspec="!"$xspec + [[ $prev == -*z* ]] && xspec= + fi + + _tilde "$cur" || return + + compopt -o filenames + COMPREPLY=($(compgen -f -X "$xspec" -- "$cur") $(compgen -d -- "$cur")) +} && + complete -F _lzma lzma + +# ex: filetype=sh diff --git a/completions/lzop b/completions/lzop new file mode 100644 index 0000000..2642742 --- /dev/null +++ b/completions/lzop @@ -0,0 +1,59 @@ +# lzop(1) completion -*- shell-script -*- + +_lzop() +{ + local cur prev words cword + _init_completion || return + + case $prev in + --output | -!(-*)o) + _filedir + return + ;; + --path) + _filedir -d + return + ;; + --suffix | -!(-*)S) + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '-1 -2 -3 -4 -5 -6 -7 -8 -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")) + return + fi + + local xspec="*.?(t)lzo" + case $prev in + --decompress | --uncompress | --extract | --list | --ls | --info | --test) + xspec="!"$xspec + ;; + --force) + xspec= + ;; + --*) ;; + + -*f*) + xspec= + ;; + -*[dltx]*) + xspec="!"$xspec + ;; + esac + + _tilde "$cur" || return + + local IFS=$'\n' + compopt -o filenames + COMPREPLY=($(compgen -f -X "$xspec" -- "$cur") $(compgen -d -- "$cur")) +} && + complete -F _lzop lzop + +# ex: filetype=sh diff --git a/completions/macof b/completions/macof new file mode 100644 index 0000000..ad29f58 --- /dev/null +++ b/completions/macof @@ -0,0 +1,22 @@ +# macof completion -*- shell-script -*- + +_macof() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -i) + _available_interfaces -a + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_usage "$1")' -- "$cur")) + fi + +} && + complete -F _macof macof + +# ex: filetype=sh diff --git a/completions/mailmanctl b/completions/mailmanctl new file mode 100644 index 0000000..3bbc2f2 --- /dev/null +++ b/completions/mailmanctl @@ -0,0 +1,18 @@ +# mailmanctl completion -*- shell-script -*- + +_mailmanctl() +{ + local cur prev words cword + _init_completion || return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '--no-restart --run-as-user + --stale-lock-cleanup --quiet --help' -- "$cur")) + else + COMPREPLY=($(compgen -W 'start stop restart reopen' -- "$cur")) + fi + +} && + complete -F _mailmanctl mailmanctl + +# ex: filetype=sh diff --git a/completions/make b/completions/make new file mode 100644 index 0000000..96517c2 --- /dev/null +++ b/completions/make @@ -0,0 +1,170 @@ +# bash completion for GNU make -*- shell-script -*- + +_make_target_extract_script() +{ + local mode="$1" + shift + + local prefix="$1" + local prefix_pat=$(command sed 's/[][\,.*^$(){}?+|/]/\\&/g' <<<"$prefix") + local basename=${prefix##*/} + local dirname_len=$((${#prefix} - ${#basename})) + + 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 <