chiark / gitweb /
hashmap: add OrderedHashmap as a distinct type
[elogind.git] / shell-completion / bash / localectl
1 # localectl(1) completion                                 -*- shell-script -*-
2 #
3 # This file is part of systemd.
4 #
5 # Copyright 2010 Ran Benita
6 #
7 # systemd is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU Lesser General Public License as published by
9 # the Free Software Foundation; either version 2.1 of the License, or
10 # (at your option) any later version.
11 #
12 # systemd is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 # General Public License for more details.
16 #
17 # You should have received a copy of the GNU Lesser General Public License
18 # along with systemd; If not, see <http://www.gnu.org/licenses/>.
19
20 __contains_word () {
21         local w word=$1; shift
22         for w in "$@"; do
23                 [[ $w = "$word" ]] && return
24         done
25 }
26
27 __locale_fields=( LANG LANGUAGE LC_CTYPE LC_NUMERIC LC_TIME \
28                   LC_COLLATE LC_MONETARY LC_MESSAGES LC_PAPER \
29                   LC_NAME LC_ADDRESS LC_TELEPHONE \
30                   LC_MEASUREMENT LC_IDENTIFICATION )
31 # LC_ALL is omitted on purpose
32
33 _localectl() {
34         local i verb comps locale_vals
35         local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
36         local OPTS='-h --help --version --no-convert --no-pager --no-ask-password
37                     -H --host'
38
39         if __contains_word "$prev" $OPTS; then
40                 case $prev in
41                         --host|-H)
42                                 comps=''
43                         ;;
44                 esac
45                 COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
46                 return 0
47         fi
48
49         if [[ $cur = -* ]]; then
50                 COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
51                 return 0
52         fi
53
54         local -A VERBS=(
55                [STANDALONE]='status list-locales list-keymaps'
56                   [LOCALES]='set-locale'
57                   [KEYMAPS]='set-keymap'
58                       [X11]='set-x11-keymap'
59         )
60
61         for ((i=0; i < COMP_CWORD; i++)); do
62                 if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]}; then
63                         verb=${COMP_WORDS[i]}
64                         break
65                 fi
66         done
67
68         if [[ -z $verb ]]; then
69                 comps=${VERBS[*]}
70         elif __contains_word "$verb" ${VERBS[LOCALES]}; then
71                 if [[ $cur = *=* ]]; then
72                         mapfile -t locale_vals < <(command localectl list-locales 2>/dev/null)
73                         COMPREPLY=( $(compgen -W '${locale_vals[*]}' -- "${cur#=}") )
74                 elif [[ $prev = "=" ]]; then
75                         mapfile -t locale_vals < <(command localectl list-locales 2>/dev/null)
76                         COMPREPLY=( $(compgen -W '${locale_vals[*]}' -- "$cur") )
77                 else
78                         compopt -o nospace
79                         COMPREPLY=( $(compgen -W '${__locale_fields[*]}' -S= -- "$cur") )
80                 fi
81                 return 0
82         elif __contains_word "$verb" ${VERBS[KEYMAPS]}; then
83                 comps=$(command localectl list-keymaps)
84         elif __contains_word "$verb" ${VERBS[STANDALONE]} ${VERBS[X11]}; then
85                 comps=''
86         fi
87
88         COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
89         return 0
90 }
91
92 complete -F _localectl localectl