diff --git a/data/Makefile b/data/Makefile index 4db247cc..3fce9399 100644 --- a/data/Makefile +++ b/data/Makefile @@ -19,6 +19,12 @@ install: install -m644 repod-main.conf $(DESTDIR)/$(PREFIX)/share/xbps/repo.d/00-main.conf install -d $(DESTDIR)/$(PREFIX)/share/zsh/site-functions install -m644 _xbps* $(DESTDIR)/$(PREFIX)/share/zsh/site-functions + install -d $(DESTDIR)/$(PREFIX)/share/bash-completion/completions + install -m644 xbps.bash $(DESTDIR)/$(PREFIX)/share/bash-completion/completions/xbps + for file in xbps-checkvers xbps-create xbps-dgraph xbps-install \ + xbps-pkgdb xbps-query xbps-reconfigure xbps-remove xbps-rindex; do \ + ln -s xbps $(DESTDIR)/$(PREFIX)/share/bash-completion/completions/$$file; \ + done .PHONY: uninstall uninstall: diff --git a/data/xbps.bash b/data/xbps.bash new file mode 100644 index 00000000..e60b7576 --- /dev/null +++ b/data/xbps.bash @@ -0,0 +1,91 @@ +_xbps_parse_help() { + local IFS line word + + $1 --help 2>&1 | while IFS=$'\n' read -r line; do + [[ $line == *([ $'\t'])-* ]] || continue + + IFS=$' \t,=' + for word in $line; do + [[ $word == -* ]] || continue + printf -- '%s\n' $word + done + done | sort | uniq +} + +_xbps_all_packages() { + xbps-query -s "$1*" | sed 's/^... \([^ ]*\)-.* .*/\1/' +} + +_xbps_installed_packages() { + xbps-query -l | sed 's/^.. \([^ ]*\)-.* .*/\1/' +} + +_xbps_all_reply() { + COMPREPLY=( $( compgen -W '$(_xbps_all_packages "$1")' -- "$1") ) +} + +_xbps_installed_reply() { + COMPREPLY=( $( compgen -W '$(_xbps_installed_packages)' -- "$1") ) +} + +_xbps_complete() { + local cur prev words cword + + _init_completion || return + + if [[ "$cur" == -* ]]; then + COMPREPLY=( $( compgen -W '$( _xbps_parse_help "$1" )' -- "$cur") ) + return + fi + + local common='-C|--config|-r|--rootdir' + local morecommon="$common|-c|--cachedir" + + case $1 in + xbps-dgraph) + if [[ $prev != @(-c|-o|-r) ]]; then + _xbps_installed_reply $cur + return + fi + ;; + xbps-install) + if [[ $prev != @($morecommon) ]]; then + _xbps_all_reply $cur + return + fi + ;; + xbps-pkgdb) + if [[ $prev == @(-m|--mode) ]]; then + COMPREPLY=( $( compgen -W 'auto manual hold unhold' -- "$cur") ) + return + fi + if [[ $prev != @($common) ]]; then + _xbps_installed_reply $cur + return + fi + ;; + xbps-query) + if [[ $prev != @($morecommon|-p|--property|-o|--ownedby) ]]; then + _xbps_all_reply $cur + return + fi + ;; + xbps-reconfigure) + if [[ $prev != @($common) ]]; then + _xbps_installed_reply $cur + return + fi + ;; + xbps-remove) + if [[ $prev != @($morecommon) ]]; then + _xbps_installed_reply $cur + return + fi + ;; + esac + + _filedir +} + +complete -F _xbps_complete xbps-checkvers xbps-create xbps-dgraph xbps-install \ + xbps-pkgdb xbps-query xbps-reconfigure xbps-remove xbps-rindex