zsh-workers
 help / color / mirror / code / Atom feed
* PATCH: completion for dbus-send and dbus-monitor
@ 2012-09-27 23:06 Oliver Kiddle
  0 siblings, 0 replies; only message in thread
From: Oliver Kiddle @ 2012-09-27 23:06 UTC (permalink / raw)
  To: Zsh workers

This is a completion function for dbus. It could be improved in some
areas such as automatically handling types of arguments to dbus methods
but I'm not quite sure what the correct dbus-send syntax is for things
like arrays of arrays and parsing the output with nested zsh expressions
isn't much fun anyway. I've also not bothered too much about things
like bus addresses that are rarely specified explicitly.

Oliver

Index: Completion/Unix/Command/_dbus
===================================================================
RCS file: Completion/Unix/Command/_dbus
diff -N Completion/Unix/Command/_dbus
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ Completion/Unix/Command/_dbus	27 Sep 2012 22:58:50 -0000
@@ -0,0 +1,87 @@
+#compdef dbus-send dbus-monitor
+
+local curcontext="$curcontext" state line find end ret=1
+typeset -A opt_args
+local -a suf introspect interfaces
+
+case $service in
+  dbus-send)
+    _arguments -A "--*" -C \
+      '(--session)--system' '(--system)--session' \
+      '--address=-:bus address:->addresses' \
+      '--dest=-:connection:->connections' \
+      '--print-reply=-::format:(literal)' \
+      '--reply-timeout=-:timeout (ms)' \
+      '--type=-:type:(method_call signal)' \
+      ':object path:->objectpaths' \
+      ':message name:->methods' \
+      ':content:->contents' && ret=0
+  ;;
+  dbus-monitor)
+    _arguments -A "--*" -C \
+      '(--session)--system' '(--system)--session' \
+      '--address=-:bus address:->addresses' \
+      '(--profile)--monitor' '(--monitor)--profile' \
+      '*:watch expression:->expressions' && ret=0
+  ;;
+esac
+
+case $state in
+  addresses)
+    compset -P '*;'
+    if compset -P '*='; then
+      _files  && ret=0
+    else
+      _message -e addresses address
+    fi
+  ;;
+  connections)
+    _wanted connections expl connection compadd ${=${(M)PREFIX:#*.*}:+-M 'r:|.=* r:|=*'} ${$(_call_program connections dbus-send ${opt_args[(I)--system]} --print-reply=literal --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.ListActivatableNames 2>/dev/null):#(array|\[|\])} ${$(_call_program connections dbus-send ${opt_args[(I)--system]} --print-reply=literal --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.ListNames 2>/dev/null):#(array|\[|\])} && ret=0
+  ;;
+  objectpaths)
+    if [[ -prefix / ]]; then
+      compset -P ${PREFIX%%[^/]#}
+      _wanted objectpaths expl 'object path' compadd -qS/ ${${${(M)${(f)"$(_call_program objectpaths dbus-send --print-reply ${(M)words:#(--dest=|--system|--address=)*} ${${IPREFIX%/}:-/} org.freedesktop.DBus.Introspectable.Introspect 2>/dev/null)"}:#*node name=[^/]##\"*}#*\"}%\"*} && ret=0
+    else
+      _wanted objectpaths expl 'object path' compadd -S '/' -r '-=' '' && ret=0
+    fi
+  ;;
+  methods)
+    introspect=( ${(M)${(f)"$(_call_program methods dbus-send --print-reply ${(M)words:#(--dest=|--system|--address=|/)*} org.freedesktop.DBus.Introspectable.Introspect 2>/dev/null)"}:#*name=*} )
+    interfaces=( ${${${(M)introspect:#*interface name=*}#*\"}%\"*} )
+    _wanted interfaces expl interface compadd -qS. -M 'r:|.=* r:|=*' -a interfaces && ret=0
+    if [[ $compstate[nmatches] != $#interfaces ]] && compset -P '*.'; then
+      find="*interface name=?${IPREFIX%.}??"
+      end=${interfaces[(i)${IPREFIX%.}]}
+      _wanted methods expl method compadd ${${${(M)${${introspect[${introspect[(i)$find]}+1,(in.end+1.)*interface name=*]}:#*interface name=*}:#*${${opt_args[--type]%_*}:-method} name=*}#*\"}%\"*} && ret=0
+    fi
+  ;;
+  contents)
+    compset -S ':*' || suf=( -S : )
+    while compset -P '(array|dict|variant):'; do
+      :
+    done
+    if compset -P '*:'; then
+      _message -e value 'value'
+    else
+      _alternative -O suf \
+        'containers:container:(array dict variant)' \
+	'types:type:(string double byte boolean objpath '${(j. .):-{,u}int{16,32,64}}\) && ret=0
+    fi
+  ;;
+  expressions)
+    _values -w -s , 'expression' \
+      'type:message type:(signal method_call method_return error)' \
+      'sender:bus or name' \
+      'interface:interface' \
+      'member:member' \
+      'path:path' \
+      'path_namespace:path' \
+      'destination:unique name' \
+      arg{0..9}:value \
+      'arg0namespace:namespace' \
+      'eavesdrop:eavesdropping:(true false)' && ret=0
+  ;;
+esac
+
+return ret


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2012-09-27 23:13 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-09-27 23:06 PATCH: completion for dbus-send and dbus-monitor Oliver Kiddle

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).