about summary refs log tree commit diff
diff options
context:
space:
mode:
authorThomas Mitterfellner <thomas.mitterfellner@gmail.com>2015-01-09 23:45:04 +0100
committerPeter Stephenson <p.w.stephenson@ntlworld.com>2015-01-10 19:55:47 +0000
commit9e94cd84c61e672d6f9888c0b82f2eff2a12b316 (patch)
treeaaa01cd6eba2329a66de28cafeb268b1c5efe14a
parent67d1c03698a86ce2ae3a08f16cbd3839d3303ddb (diff)
downloadzsh-9e94cd84c61e672d6f9888c0b82f2eff2a12b316.tar.gz
zsh-9e94cd84c61e672d6f9888c0b82f2eff2a12b316.tar.xz
zsh-9e94cd84c61e672d6f9888c0b82f2eff2a12b316.zip
34195: new qdbus completion
-rw-r--r--ChangeLog5
-rw-r--r--Completion/Linux/Command/_qdbus112
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
+}