shell-completion: work on session shell is --user is used

https://bugs.freedesktop.org/show_bug.cgi?id=61695
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2013-04-05 07:45:30 -04:00
parent ac2b34e155
commit 9e542e0b3a
2 changed files with 40 additions and 32 deletions

View file

@ -18,7 +18,8 @@
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
__systemctl() {
systemctl --full --no-legend "$@"
local mode=$1; shift 1
systemctl $mode --full --no-legend "$@"
}
__contains_word () {
@ -28,11 +29,11 @@ __contains_word () {
}
__filter_units_by_property () {
local property=$1 value=$2 ; shift 2
local mode=$1 property=$2 value=$3 ; shift 3
local units=("$@")
local props
IFS=$'\n' read -rd '' -a props < \
<(__systemctl show --property "$property" -- "${units[@]}")
<(__systemctl $mode show --property "$property" -- "${units[@]}")
for ((i=0; $i < ${#units[*]}; i++)); do
if [[ "${props[i]}" = "$property=$value" ]]; then
printf "%s\n" "${units[i]}"
@ -40,24 +41,24 @@ __filter_units_by_property () {
done
}
__get_all_units () { __systemctl list-units --all \
__get_all_units () { __systemctl $1 list-units --all \
| { while read -r a b; do printf "%s\n" "$a"; done; }; }
__get_active_units () { __systemctl list-units \
__get_active_units () { __systemctl $1 list-units \
| { while read -r a b; do printf "%s\n" "$a"; done; }; }
__get_inactive_units () { __systemctl list-units --all \
__get_inactive_units () { __systemctl $1 list-units --all \
| { while read -r a b c d; do [[ $c == "inactive" ]] && printf "%s\n" "$a"; done; }; }
__get_failed_units () { __systemctl list-units \
__get_failed_units () { __systemctl $1 list-units \
| { while read -r a b c d; do [[ $c == "failed" ]] && printf "%s\n" "$a"; done; }; }
__get_enabled_units () { __systemctl list-unit-files \
__get_enabled_units () { __systemctl $1 list-unit-files \
| { while read -r a b c ; do [[ $b == "enabled" ]] && printf "%s\n" "$a"; done; }; }
__get_disabled_units () { __systemctl list-unit-files \
__get_disabled_units () { __systemctl $1 list-unit-files \
| { while read -r a b c ; do [[ $b == "disabled" ]] && printf "%s\n" "$a"; done; }; }
__get_masked_units () { __systemctl list-unit-files \
__get_masked_units () { __systemctl $1 list-unit-files \
| { while read -r a b c ; do [[ $b == "masked" ]] && printf "%s\n" "$a"; done; }; }
_systemctl () {
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
local i verb comps
local i verb comps mode
local -A OPTS=(
[STANDALONE]='--all -a --defaults --fail --ignore-dependencies --failed --force -f --full --global
@ -95,12 +96,17 @@ _systemctl () {
return 0
fi
if [[ "$cur" = -* ]]; then
COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
return 0
fi
if __contains_word "--user" ${COMP_WORDS[*]}; then
mode=--user
else
mode=--system
fi
local -A VERBS=(
[ALL_UNITS]='is-active is-failed is-enabled status show mask preset'
[ENABLED_UNITS]='disable reenable'
@ -135,58 +141,58 @@ _systemctl () {
comps="${VERBS[*]}"
elif __contains_word "$verb" ${VERBS[ALL_UNITS]}; then
comps=$( __get_all_units )
comps=$( __get_all_units $mode )
elif __contains_word "$verb" ${VERBS[ENABLED_UNITS]}; then
comps=$( __get_enabled_units )
comps=$( __get_enabled_units $mode )
elif __contains_word "$verb" ${VERBS[DISABLED_UNITS]}; then
comps=$( __get_disabled_units )
comps=$( __get_disabled_units $mode )
elif __contains_word "$verb" ${VERBS[STARTABLE_UNITS]}; then
comps=$( __filter_units_by_property CanStart yes \
$( __get_inactive_units \
comps=$( __filter_units_by_property $mode CanStart yes \
$( __get_inactive_units $mode \
| while read -r line; do \
[[ "$line" =~ \.(device|snapshot)$ ]] || printf "%s\n" "$line"; \
done ))
elif __contains_word "$verb" ${VERBS[RESTARTABLE_UNITS]}; then
comps=$( __filter_units_by_property CanStart yes \
$( __get_all_units \
comps=$( __filter_units_by_property $mode CanStart yes \
$( __get_all_units $mode \
| while read -r line; do \
[[ "$line" =~ \.(device|snapshot|socket|timer)$ ]] || printf "%s\n" "$line"; \
done ))
elif __contains_word "$verb" ${VERBS[STOPPABLE_UNITS]}; then
comps=$( __filter_units_by_property CanStop yes \
$( __get_active_units ) )
comps=$( __filter_units_by_property $mode CanStop yes \
$( __get_active_units $mode ) )
elif __contains_word "$verb" ${VERBS[RELOADABLE_UNITS]}; then
comps=$( __filter_units_by_property CanReload yes \
$( __get_active_units ) )
comps=$( __filter_units_by_property $mode CanReload yes \
$( __get_active_units $mode ) )
elif __contains_word "$verb" ${VERBS[ISOLATABLE_UNITS]}; then
comps=$( __filter_units_by_property AllowIsolate yes \
$( __get_all_units ) )
comps=$( __filter_units_by_property $mode AllowIsolate yes \
$( __get_all_units $mode ) )
elif __contains_word "$verb" ${VERBS[FAILED_UNITS]}; then
comps=$( __get_failed_units )
comps=$( __get_failed_units $mode )
elif __contains_word "$verb" ${VERBS[MASKED_UNITS]}; then
comps=$( __get_masked_units )
comps=$( __get_masked_units $mode )
elif __contains_word "$verb" ${VERBS[STANDALONE]} ${VERBS[NAME]}; then
comps=''
elif __contains_word "$verb" ${VERBS[JOBS]}; then
comps=$( __systemctl list-jobs | { while read -r a b; do printf "%s\n" "$a"; done; } )
comps=$( __systemctl $mode list-jobs | { while read -r a b; do printf "%s\n" "$a"; done; } )
elif __contains_word "$verb" ${VERBS[SNAPSHOTS]}; then
comps=$( __systemctl list-units --type snapshot --full --all \
comps=$( __systemctl $mode list-units --type snapshot --full --all \
| { while read -r a b; do printf "%s\n" "$a"; done; } )
elif __contains_word "$verb" ${VERBS[ENVS]}; then
comps=$( __systemctl show-environment \
comps=$( __systemctl $mode show-environment \
| while read -r line; do printf "%s\n" "${line%%=*}=";done )
compopt -o nospace

View file

@ -404,7 +404,9 @@ _outputmodes() {
__systemctl()
{
systemctl --full --no-legend --no-pager "$@"
local -a _modes
_modes=("--user" "--system")
systemctl ${words:*_modes} --full --no-legend --no-pager "$@"
}
@ -556,7 +558,7 @@ done
(( $+functions[_systemctl_delete] )) || _systemctl_delete()
{
compadd "$@" - $(__systemctl list-units --type snapshot --all \
| cut -d' ' -f1 2>/dev/null ) || _message "no snampshot found"
| cut -d' ' -f1 2>/dev/null ) || _message "no snapshot found"
}
# Completion functions for ENVS