diff --git a/Makefile b/Makefile index 60dbd47..c4be286 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,8 @@ MANDIR=$(DESTDIR)/usr/share/man/man1/ TARGET_PATH=$(DESTDIR)/usr/bin DISTFILES=jshon MANFILE=jshon.1 +ZSHSRC=jshon_zsh_completion +ZSHCOMP=$(DESTDIR)/usr/share/zsh/site-functions/_pbpst #VERSION=$(shell date +%Y%m%d) VERSION=$(shell git show -s --format="%ci" HEAD | cut -d ' ' -f 1 | tr -d '-') @@ -27,6 +29,7 @@ clean: install: $(INSTALL) -D $(DISTFILES) $(TARGET_PATH)/$(DISTFILES) $(INSTALL) -D $(MANFILE) $(MANDIR)/$(MANFILE) + $(INSTALL) -D $(ZSHSRC) $(ZSHCOMP) dist: clean sed -i "s/#define JSHONVER .*/#define JSHONVER ${VERSION}/" jshon.c diff --git a/jshon_zsh_completion b/jshon_zsh_completion new file mode 100644 index 0000000..7d2dbcb --- /dev/null +++ b/jshon_zsh_completion @@ -0,0 +1,58 @@ +#compdef jshon + +typeset -A opt_args +setopt extendedglob + +# general operations +_jshon_opts_operations=( + -t'[returns type]' + -l'[returns length (integer)]' + -k'[returns newline seperated list of keys]' + -p'[pops the last manipulation from the stack]' + -a'[maps the remaining actions across the selected element]' + -j'[returns encoded json]' + -u'[returns decoded string]' + -n'[returns a json element to be inserted into a structure]' + -s'[returns a json encoded string]' +) + +_jshon_opts_index=( + -e'[returns json value at index]' + -i'[insert item into array at index]' + -d'[removes item in array or object]' +) + +# options for passing to _arguments: options common to all operations +_jshon_opts_common=( + -P'[strips a jsonp callback]' + -S'[returns output sorted by key]' + -Q'[disables error reporting on stderr]' + -V'[enables pass by value on the edit stack]' + -F'[ read from a file instead of stdin]:Path to file:_files -./' + -I'[In place editing (only works with -F)]' + -C'[continue on potentially recoverable errors]' + -0'[null delimiters - changes delimiter of -u from newline to null]' #only works for -u + --version'[returns a YYYYMMDD timestamp and exits]' +) + +_jshon_action_none() { + _arguments -s : \ + "$_jshon_opts_operations[@]" \ + "$_jshon_opts_common[@]" \ + "$_jshon_opts_index[@]" \ +} + +# main dispatcher +_jshon() { + local -a args cmds; + local tmp + args=( ${${${(M)words:#-*}#-}:#-*} ) + for tmp in $words; do + cmds+=("${${_jshon_opts_operations[(r)*$tmp\[*]%%\[*}#*\)}") + done + case $args in #$words[2] in + *) _jshon_action_none ;; + esac +} + +_jshon "$@"