Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

PATCH: completion for dbus-send and dbus-monitor



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



Messages sorted by: Reverse Date, Date, Thread, Author