diff options
author | Thomas Mitterfellner <thomas.mitterfellner@gmail.com> | 2015-01-09 23:45:04 +0100 |
---|---|---|
committer | Peter Stephenson <p.w.stephenson@ntlworld.com> | 2015-01-10 19:55:47 +0000 |
commit | 9e94cd84c61e672d6f9888c0b82f2eff2a12b316 (patch) | |
tree | aaa01cd6eba2329a66de28cafeb268b1c5efe14a | |
parent | 67d1c03698a86ce2ae3a08f16cbd3839d3303ddb (diff) | |
download | zsh-9e94cd84c61e672d6f9888c0b82f2eff2a12b316.tar.gz zsh-9e94cd84c61e672d6f9888c0b82f2eff2a12b316.tar.xz zsh-9e94cd84c61e672d6f9888c0b82f2eff2a12b316.zip |
34195: new qdbus completion
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Completion/Linux/Command/_qdbus | 112 |
2 files changed, 117 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog index b5ac8799a..b61bee4b7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2015-01-10 Peter Stephenson <p.w.stephenson@ntlworld.com> + + * 34195: Thomas Mitterfellner: Completion/Linux/Command/_qdbus: + new completion. + 2015-01-10 Barton E. Schaefer <schaefer@zsh.org> * 34212, 34313: Src/builtin.c: do not change unset-ness of special diff --git a/Completion/Linux/Command/_qdbus b/Completion/Linux/Command/_qdbus new file mode 100644 index 000000000..d665c7af1 --- /dev/null +++ b/Completion/Linux/Command/_qdbus @@ -0,0 +1,112 @@ +#compdef qdbus +# +# Copyright (C) 2015 Thomas Mitterfellner <thomas.mitterfellner@gmail.com> +# +# This file is released under the GPLv2. +# +# version 0.1 + +# get the type of a method: 1 means function, 2 means property +getType () { + case "$1" in + "method"*) echo 1 ;; + "property"*) echo 2 ;; + *) echo 0 ;; + esac +} + +# get the index of a method in an array of methods +getIndex () { + local e + local index + local type_ + index=0 + for e in "${@:2}"; do + index=$(( index + 1 )) + type_=$(getType "$e") + if [[ $type_ == 1 ]] ; then + if [[ "$e" == *"$1("* ]] ; then + echo $index + return 0 + fi + elif [[ $type_ == 2 ]] ; then + if [[ "$e" == *"$1" ]] ; then + echo $index + return 0 + fi + fi + done + echo 0 +} + +_qdbus() { + local curcontext="$curcontext" state line + local services + local path_ + local methods + local names + local types + local properties + local index + typeset -A opt_args + + _arguments "--system[connect to system bus]"\ + "--literal[print literal replies]"\ + "1:service name:->service"\ + "2:path:->path"\ + "3:method:->method"\ + "*:arguments:->arguments" + + case $state in + service) + services=( $(qdbus ${words[@]:1:-1} | grep -E '^([^:])') ) + compadd "$@" $services + ;; + + path) + path_=( $(qdbus ${words[@]:1:-1} 2>/dev/null) ) + + compadd "$@" $path_ + ;; + + method) + IFS=$'\n' + methods=( $(qdbus ${words[@]:1:-1} | \ + grep -e "^method" | \ + sed -r 's/method (.+) (.+)\((.*)\)/\2:\1(\3)/g' 2>/dev/null) ) + properties=( $(qdbus ${words[@]:1:-1} | \ + grep -e "^property" | \ + sed -r 's/property (.+) (.+) (.+)/\3:\1 \2/g' 2>/dev/null) ) + + _describe properties properties -J properties + _describe methods methods -J methods + ;; + + arguments) + IFS=$'\n' + + path_pos=$(( ${(M)#words:#--*} + 2)) + method_pos=$(( $path_pos + 2)) + names=( $(qdbus ${words[@]:1:$path_pos} | grep -e '^[mp]' 2>/dev/null) ) + index=$(getIndex "${words[$method_pos]}" $names[@]) + method=$names[$index] + + arg_pos=$(( ${#words} - $method_pos )) + if [[ $(getType "$method") -eq 1 ]] ; then + method_args="$(echo $method | sed -r 's/(.+) (.+) (.+)\((.*)\)/\4/g')" + IFS=$',' method_args_=(${=method_args}) + num_args=${#method_args_} + if [[ $arg_pos -le $num_args ]] ; then + _message "${method_args_[$arg_pos]}" + fi + else + property_=$(echo "$method" |\ + sed -r 's/property (.+) (.+) (.+)/\1 \2/g') + if [[ $arg_pos -eq 1 ]] ; then + + _message ${property_} + fi + fi + ;; + esac +} |