about summary refs log tree commit diff
path: root/Completion
diff options
context:
space:
mode:
Diffstat (limited to 'Completion')
-rw-r--r--Completion/Unix/Command/.distfiles1
-rw-r--r--Completion/Unix/Command/_devtodo174
2 files changed, 175 insertions, 0 deletions
diff --git a/Completion/Unix/Command/.distfiles b/Completion/Unix/Command/.distfiles
index 9d74c518a..115f2d930 100644
--- a/Completion/Unix/Command/.distfiles
+++ b/Completion/Unix/Command/.distfiles
@@ -38,6 +38,7 @@ _cvs
 _darcs
 _date
 _dd
+_devtodo
 _dhclient
 _dict
 _diff
diff --git a/Completion/Unix/Command/_devtodo b/Completion/Unix/Command/_devtodo
new file mode 100644
index 000000000..06fc675fc
--- /dev/null
+++ b/Completion/Unix/Command/_devtodo
@@ -0,0 +1,174 @@
+#compdef devtodo todo tda tde tdd tdr
+## completion for devtodo 0.1.20 <http://swapoff.org/DevTodo>
+
+typeset -a arg_generic arg_add todo_opts \
+           priorities
+typeset -A arg_pair arg_desc
+typeset -i i
+typeset expl
+
+for ((i=2; i <= $#words; i++)) {
+	if [[ $words[$i] == '--database' ]] {
+		todo_opts+=(--database ${~words[$((++i))]})
+	}
+}
+
+priorities=(verylow low medium high veryhigh)
+
+arg_add=(
+	'-p[priority]:priority:_todo_priority'
+	'-g[parent item]:parent:_todo_index'
+)
+
+arg_generic=(
+	'--remove[remove items]:index:_todo_index'
+	'--database[database file]:file:_files'
+	'--global-database[global database file]:file:_files'
+	'*--colour[item color]:color:_todo_color'
+	'--force-colour[force use of colors]'
+	'--mono[no colors]'
+	'--help[display help]'
+	'--version[display version]'
+	'--title[todo title]:string: '
+	'--date-format[strftime time formet]:time string: '
+	'*--format[define format]:format:_todo_format'
+	'*--use-format[output format]:format:_todo_format'
+	'--sort[sort database]:sort expression:_todo_sort'
+	'--paranoid[paranoid parmissions etc]'
+	'--database-loaders[loader order]:database loader: '
+	'--backup[backup database]:count: '
+	'--timeout[display timeout]:seconds: '
+	'--purge[purge completed items]:days: '
+	'*'{'--filter','-f'}'[show items matching filter]:filter:_todo_filter'
+	'*::item:_todo_index'
+)
+
+arg_pair=(
+	'verbose'     'v'
+	'add'         'a'
+	'graft'       'g'
+	'link'        'l'
+	'reparent'    'R'
+	'priority'    'p'
+	'edit'        'e'
+	'done'        'd'
+	'not-done'    'D'
+	'global'      'G'
+	'TODO'        'T'
+	'all'         'A'
+)
+
+arg_desc=(
+	'verbose'     '[be verbose]'
+	'add'         '[add item]:item'
+	'graft'       '[parent item]:parent:_todo_index'
+	'link'        '[link file into database]:database:_files'
+	'reparent'    '[change item parent]:index:_todo_index'
+	'priority'    '[item priority]:priority:_todo_priority'
+	'edit'        '[edit item]:index:_todo_index'
+	'done'        '[mark as done]:index:_todo_index'
+	'not-done'    '[mark as undone]:index:_todo_index -u'
+	'global'      '[use global database]'
+	'TODO'        '[generate TODO file]'
+	'all'         '[show all items]'
+)
+
+for arg in ${(k)arg_pair}; {
+	arg_generic+='(--'$arg')-'${arg_pair[$arg]}${arg_desc[$arg]}
+	arg_generic+='(-'${arg_pair[$arg]}')--'${arg}${arg_desc[$arg]}
+}
+
+function _todo_index () {
+	typeset number text i entry last_entry depth last_depth=0 IFS=$'\n'
+	typeset -a index desc
+	for i in $*; do
+		case $i in
+			-u) todo_opts+=(--filter done)
+		esac
+	done
+	for entry in $(todo $todo_opts -f +children --format display='%1>%i%n:%t\n'); do
+		number=${entry%%:*}
+		depth=$(( ${#number} - ${#${number// }} ))
+		((depth)) && entry=${(j:.:)${${(s:.:):-a.${last_entry%%:*}}[2,depth+1]}}.$entry
+		text=${entry#*:}
+		number=${${entry%%:*}// }
+		entry=$number:$text
+		index+=$entry
+		last_depth=$depth
+		last_entry=$entry
+	done
+	_describe -t items index index
+}
+
+function _todo_color () {
+	if compset -P '*='; then
+		_wanted color expl 'color' \
+		compadd black red green yellow blue magenta cyan white default
+	else
+		_wanted item expl 'item' \
+		compadd -S '=' $priorities title info
+	fi
+}
+
+function _todo_filter {
+	typeset prefix
+	if [[ ${#${words[$CURRENT]}} -gt 0 ]] {
+		prefix=${${words[$CURRENT]}[1]}
+		_wanted expression expl 'filter expression' \
+		compadd -p $prefix -- all children done $priorities
+	} else {
+		# XXX the '-' makes problems
+		_wanted expression expl 'filter expression' \
+		compadd -S '' -- - + = all children done $priorities
+	}
+}
+
+function _todo_format () {
+	typeset prefix
+	if [[ -prefix *= ]] {
+		_message 'format string'
+	} else {
+		_wanted expression expl 'format name' \
+		compadd -S '=' display generated verbose-display verbose-generated
+	}
+}
+
+function _todo_priority () {
+	_wanted priority expl 'priority' \
+	compadd default $priorities
+}
+
+function _todo_sort () {
+	typeset -a keys used_prefixes
+	typeset key prefix=''
+	keys=(created completed text priority duration none done)
+	for key in $keys; {
+		[[ $key != none ]] && keys+="-$key"
+	}
+
+	if [[ -prefix *, ]] {
+		prefix=${words[$CURRENT]%,*},
+		used_prefixes=(${(s:,:)prefix})
+		for key in $used_prefixes; {
+			[[ $key == -* ]] && used_prefixes+=$key[2,-1] || used_prefixes+=-$key
+		}
+	}
+	_wanted expression expl 'sort expression' \
+	compadd -F used_prefixes -qS , -P "$prefix" $keys
+}
+
+case $service in
+	tda)
+		_arguments -s $arg_add
+	;;
+	tde|tdd)
+		_arguments -s ':index:_todo_index'
+	;;
+	tdr)
+		zstyle ':completion:*:tdr:*' ignore-line yes
+		_arguments -s '*:index:_todo_index'
+	;;
+	*todo)
+		_arguments -s $arg_generic
+	;;
+esac