]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
zsh: Complete systemctl subcommands in separate tags
authorDaniel Shahaf <d.s@daniel.shahaf.name>
Tue, 7 Jan 2020 20:17:26 +0000 (20:17 +0000)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 8 Jan 2020 08:43:01 +0000 (09:43 +0100)
Fixes #14422

shell-completion/zsh/_systemctl.in

index 18663fca2ee39b6d3b41896d8632429f440c5ec2..66bf03d05876a688736ce655a95c1a10ca175bdd 100644 (file)
@@ -3,6 +3,8 @@
 
 (( $+functions[_systemctl_commands] )) || _systemctl_commands()
 {
+    local expl i
+
     local -a unit_commands=(
         # Unit Commands
         "list-sockets:List sockets"
         "suspend-then-hibernate:Suspend the system for a period of time, and then hibernate it"
     )
 
-    local -a _systemctl_cmds=(
-        "${unit_commands[@]}"
-        "${machine_commands[@]}"
-        "${unit_file_commands[@]}"
-        "${job_commands[@]}"
-        "${environment_commands[@]}"
-        "${manager_state_commands[@]}"
-        "${system_commands[@]}"
-    )
+    local -a groups=( unit machine unit_file job environment manager_state system )
+    local -a _systemctl_cmds
+    for i in $groups; do
+        _systemctl_cmds+=( "${(@P)${:-"${i}_commands"}}" )
+    done
 
     if (( CURRENT == 1 )); then
-        _describe -t commands 'systemctl command' _systemctl_cmds || compadd "$@"
+        _tags ${^groups//_/-}-commands
+        while _tags; do
+            for i in $groups; do
+                if _requested ${i//_/-}-commands; then
+                    _describe -t ${i//_/-}-commands "${i//_/ } command" ${i}_commands \
+                        && ret=0
+                fi
+            done
+        done
     else
-        local curcontext="$curcontext" expl
+        local curcontext="$curcontext"
 
         cmd="${${_systemctl_cmds[(r)$words[1]:*]%%:*}}"
         # Deal with any aliases