glib2/gsettings.zsh

152 lines
4.3 KiB
Bash

#compdef gsettings
_gsettings() {
_arguments : \
'--schemadir[A directory to search for additional schemas]:additional schema:_path_files -/' \
':gsettings command:_gsettings_commands' \
'*: :_gsettings_rest_args'
}
(( $+functions[_gsettings_commands] )) || _gsettings_commands() {
local -a command_list
command_list=(
'help:show the help'
'list-schemas:list installed schemas'
'list-relocatable-schemas:list relocatable schemas'
'list-keys:list keys in a schema'
'list-children:list children of a schema'
'list-recursively:list keys and values, recursively'
'range:queries the range of a key'
'get:get the value of a key'
'set:set the value of a key'
'reset:reset the value of a key'
'reset-recursively:reset all values in a given schema'
'writable:check if a key is writable'
'monitor:watch for changes'
)
_describe -t commands 'gsettings commands' command_list
}
(( $+functions[_gsettings_rest_args] )) || _gsettings_rest_args() {
local CMD_IDX=2
local SCHEMA_IDX=3
local KEY_IDX=4
local VALUE_IDX=5
local offset=0
local opt_schemadir schemadir cmd schema key
if [[ $#words -ge 4 && "${(Q)words[2]}" == --schemadir ]]; then
opt_schemadir=--schemadir
schemadir="${(Q)words[3]}"
offset=2
fi
cmd="${(Q)words[CMD_IDX+offset]}"
case $((CURRENT-offset)) in
$SCHEMA_IDX)
case "$cmd" in
help)
_gsettings_help_targets
;;
list-keys|list-children|list-recursively|range|get|set|reset| \
reset-recursively|writable|monitor)
_gsettings_schemas "$opt_schemadir" "$schemadir"
;;
esac
;;
$KEY_IDX)
case "$cmd" in
get|set|range|reset|writable|monitor)
schema="${(Q)words[SCHEMA_IDX+offset]}"
_gsettings_keys "$opt_schemadir" "$schemadir" "$schema"
;;
esac
;;
$VALUE_IDX)
case "$cmd" in
set)
schema="${(Q)words[SCHEMA_IDX+offset]}"
key="${(Q)words[KEY_IDX+offset]}"
_gsettings_values "$opt_schemadir" "$schemadir" "$schema" "$key"
;;
esac
;;
esac
}
(( $+functions[_gsettings_help_targets] )) || _gsettings_help_targets() {
local -a target_list
target_list=(
'help:show the help'
'list-schemas:list installed schemas'
'list-relocatable-schemas:list relocatable schemas'
'list-keys:list keys in a schema'
'list-children:list children of a schema'
'list-recursively:list keys and values, recursively'
'range:queries the range of a key'
'get:get the value of a key'
'set:set the value of a key'
'reset:reset the value of a key'
'reset-recursively:reset all values in a given schema'
'writable:check if a key is writable'
'monitor:watch for changes'
)
_describe -t help-target 'help targets' target_list
}
(( $+functions[_gsettings_schemas] )) || _gsettings_schemas() {
local -a schema_list
schema_list=(
${(@f)"$(gsettings $1 $2 list-schemas 2>/dev/null)"}
${(@f)"$(gsettings $1 $2 list-relocatable-schemas 2>/dev/null)"}
)
if [[ $#schema_list == 0 ]]; then
schema_list=(
${(@f)"$(gsettings list-schemas 2>/dev/null)"}
${(@f)"$(gsettings list-relocatable-schemas 2>/dev/null)"}
)
fi
_describe -t schemas 'schemas' schema_list -V
}
(( $+functions[_gsettings_keys] )) || _gsettings_keys() {
local -a key_list
key_list=(${(@f)"$(gsettings $1 $2 list-keys $3 2>/dev/null)"})
if [[ $#key_list == 0 ]]; then
key_list=(${(@f)"$(gsettings list-keys $3 2>/dev/null)"})
fi
_describe -t keys 'keys' key_list -V
}
# Complete possible values including bool and enum
(( $+functions[_gsettings_values] )) || _gsettings_values() {
local -a range
range=(${(@f)"$(gsettings $1 $2 range $3 $4 2>/dev/null)"})
if [[ $#range == 0 ]]; then
range=(${(@f)"$(gsettings range $3 $4 2>/dev/null)"})
fi
case "$range[1]" in
'type b')
_gsettings_complete_bool
;;
'enum')
_gsettings_complete_enum $range[2,-1]
;;
esac
}
(( $+functions[_gsettings_complete_bool] )) || _gsettings_complete_bool() {
local -a bool_list
bool_list=('true' 'false')
_describe -t val-bool 'possible values (bool)' bool_list -V
}
(( $+functions[_gsettings_complete_enum] )) || _gsettings_complete_enum() {
local -a enum_list
enum_list=(${(@Q)"${@}"})
_describe -t val-enum 'possible values' enum_list -V
}
_gsettings