/etc/bash_completion.d/zypper.sh is in zypper-common 1.11.13-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | # zypper bash completion script
#
# A hackweek gift from Marek Stopka <mstopka@opensuse.org>
# Major rewrite by Josef Reidinger <jreidinger@suse.cz>
# 2009/02/19 Allow empty spaces in repos names, Werner Fink <werner@suse.de>
#
# some TODOs:
# - complete package names for install/remove/update
_strip()
{
local s c o
if test ${#COMPREPLY[@]} -gt 0 ; then
s="${COMP_WORDBREAKS// }"
s="${s// }"
s="${s//[\{\}()\[\]]}"
s="${s} (){}[]"
o=${#s}
while test $((o--)) -gt 0 ; do
c="${s:${o}:1}"
COMPREPLY=(${COMPREPLY[*]//${c}/\\${c}})
done
fi
}
_zypper() {
ZYPPER_CMDLIST=()
ZYPPER="$(type -p zypper)"
local noglob=$(shopt -po noglob)
local magic_string="Command options:"
local comp cur prev command
local -a opts=()
local -i ITER=0
local IFS=$'\n'
# Do not expand `?' for help
set -o noglob
if test ${#ZYPPER_CMDLIST[@]} -eq 0; then
ZYPPER_CMDLIST=($(LC_ALL=POSIX $ZYPPER -q -h | \
sed -rn '/^[[:blank:]]*Commands:/,$ {
/[\t]{4}/d
s/^[[:blank:]]*//
s/^[[:upper:]].*://
s/[[:blank:]]+[[:upper:]].*$//
s/,[[:blank:]]+/\n/
s/\?/\\?/
/^$/d
p
}'))
fi
if test $COMP_CWORD -lt 1 ; then
let COMP_CWORD=${#COMP_WORDS[@]}
fi
prev=${COMP_WORDS[COMP_CWORD-1]}
cur=${COMP_WORDS[COMP_CWORD]}
let ITER=COMP_CWORD
while test $((ITER--)) -ge 0 ; do
comp="${COMP_WORDS[ITER]}"
if [[ "${ZYPPER_CMDLIST[@]}" =~ "${comp}" ]]; then
command=${COMP_WORDS[ITER]}
break;
fi
if [[ "${comp}" =~ "zypper" ]]; then
command="zypper"
break;
fi
done
unset ITER comp
case "$prev" in
"--type" | "-t")
opts=(package patch pattern product)
COMPREPLY=($(compgen -W "${opts[*]}" -- ${cur}))
_strip
eval $noglob
return 0;
;;
"--repo" | "-r")
opts=(${opts[@]}$(echo; LC_ALL=POSIX $ZYPPER -q lr | \
sed -rn '/^[0-9]/{
s/^[0-9]+[[:blank:]]*\|[[:blank:]]*([^|]+).*/\1/
s/[[:blank:]]*$//
p
}'))
COMPREPLY=($(compgen -W "${opts[*]}" -- ${cur}))
_strip
eval $noglob
return 0;
;;
esac
unset prev
if [[ "$command" =~ "zypper" ]]; then
opts=(${ZYPPER_CMDLIST[*]}$(echo; LC_ALL=POSIX $ZYPPER -q help 2>&1 | \
sed -rn '/Global Options:/,/Commands:/{
/[\t]{4}/d
s/^[[:blank:]]*//
/[[:upper:]].*:/d
s/[[:blank:]]+[[:upper:]].*$//
s/[,[:blank:]].*$/\n/
/^$/d
p
}'))
COMPREPLY=($(compgen -W "${opts[*]}" -- ${cur}))
_strip
eval $noglob
return 0;
fi
if test -n "$command" ; then
opts=$(LC_ALL=POSIX $ZYPPER -q help $command 2>&1 | sed -e "1,/$magic_string/d" -e 's/.*--/--/' -e 's/ .*//')
#handling individual commands if they need more then we can dig from help
case "$command" in
help | \?)
opts=(${ZYPPER_CMDLIST[@]})
;;
removerepo | rr | modifyrepo | mr | renamerepo | nr | refresh | ref)
opts=(${opts[@]}$(echo; LC_ALL=POSIX $ZYPPER -q lr | \
sed -rn '/^[0-9]/{
s/^[0-9]+[[:blank:]]*\|[[:blank:]]*([^|]+).*/\1/
s/[[:blank:]]*$//
/^$/d
p
}'))
;;
addservice | as | modifyservice | ms | removeservice | rs)
opts=(${opts[@]}$(echo; LC_ALL=POSIX $ZYPPER -q ls | \
sed -rn '/^[0-9]/{
s/^[0-9]+[[:blank:]]*\|[[:blank:]]*([^|]+).*/\1/
s/[[:blank:]]*$//
/^$/d
p
}'))
;;
removelock | rl)
opts=(${opts[@]}$(echo; LC_ALL=POSIX $ZYPPER -q ll | \
sed -rn '/^[0-9]/{
s/^[0-9]+[[:blank:]]*\|[[:blank:]]*([^|]+).*/\1/p
s/[[:blank:]]*$//
/^$/d
p
}'))
;;
esac
IFS=$'\n'
COMPREPLY=($(compgen -W "${opts[*]}" -- ${cur}))
_strip
fi
eval $noglob
}
complete -F _zypper -o default zypper
|