Files
dotfiles/zsh/completions_mac/_launchctl
T
2026-07-28 10:23:36 +02:00

128 lines
3.9 KiB
Plaintext

#compdef launchctl
# macOS launchd completion.
_launchctl_domains() {
local uid=$EUID
local -a domains=(
'system:system services'
"user/${uid}:services for the current user"
"gui/${uid}:services in the current graphical session"
)
_describe -t domains 'launchd domain' domains
}
_launchctl_service_targets() {
local uid=$EUID label
local -a targets=()
while IFS=$'\t' read -r _ _ label; do
[[ -n $label ]] && targets+=("gui/${uid}/${label}")
done < <(launchctl list 2>/dev/null | tail -n +2)
if (( ${#targets} )); then
_describe -t services 'launchd service target' targets
else
_message 'launchd service target'
fi
}
_launchctl() {
local context state state_descr line
typeset -A opt_args
local -a commands=(
'bootstrap:register services or directories in a domain'
'bootout:unregister services or directories from a domain'
'enable:enable a service'
'disable:disable a service'
'kickstart:run or restart a service'
'kill:send a signal to a service'
'print:show a domain or service'
'print-disabled:show persistent enable and disable overrides'
'list:list loaded services'
'start:start a legacy service by label'
'stop:stop a legacy service by label'
'remove:remove a legacy service by label'
'load:load legacy plist files'
'unload:unload legacy plist files'
'setenv:set an environment variable'
'unsetenv:unset an environment variable'
'getenv:get an environment variable'
'limit:view or change resource limits'
'config:set persistent launchd configuration'
'dumpstate:dump launchd state'
'reboot:reboot a launchd domain or the system'
'version:show launchd version'
'help:show launchctl help'
)
_arguments -C \
'1:command:->command' \
'*::argument:->args'
case $state in
command)
_describe -t commands 'launchctl command' commands
;;
args)
case $words[2] in
bootstrap)
if (( CURRENT == 3 )); then
_launchctl_domains
else
_files -g '*.plist(-.)'
fi
;;
bootout)
if (( CURRENT == 3 )); then
_launchctl_domains
_launchctl_service_targets
else
_files -g '*.plist(-.)'
fi
;;
enable|disable|kickstart)
_launchctl_service_targets
;;
print)
_launchctl_domains
_launchctl_service_targets
;;
print-disabled)
_launchctl_domains
;;
load|unload)
_files -g '*.plist(-.)'
;;
start|stop|remove)
local -a labels
labels=(${${(f)"$(launchctl list 2>/dev/null)"}[2,-1]##*$'\t'})
_describe -t services 'service label' labels
;;
kill)
if (( CURRENT == 3 )); then
_signals
else
_launchctl_service_targets
fi
;;
setenv)
if (( CURRENT == 3 )); then
_parameters
else
_message 'value'
fi
;;
getenv|unsetenv)
_parameters
;;
*)
_message 'argument'
;;
esac
;;
esac
}
_launchctl "$@"