1#compdef devtodo todo tda tde tdd tdr
2## completion for devtodo 0.1.20 <http://swapoff.org/DevTodo>
3
4typeset -a arg_generic arg_add todo_opts \
5           priorities
6typeset -A arg_pair arg_desc
7typeset -i i
8typeset expl
9
10for ((i=2; i <= $#words; i++)) {
11	if [[ $words[$i] == '--database' ]]; then
12		todo_opts+=(--database ${~words[$((++i))]})
13	elif [[ $words[$i] == '--sort' ]]; then
14		todo_opts+=(--sort ${words[$((++i))]})
15	fi
16}
17
18priorities=(verylow low medium high veryhigh)
19
20arg_add=(
21	'-p[priority]:priority:_todo_priority'
22	'-g[parent item]:parent:_todo_index'
23)
24
25arg_generic=(
26	'--remove[remove items]:index:_todo_index'
27	'--database[database file]:file:_files'
28	'--global-database[global database file]:file:_files'
29	'*--colour[item color]:color:_todo_color'
30	'--force-colour[force use of colors]'
31	'--mono[no colors]'
32	'--help[display help]'
33	'--version[display version]'
34	'--title[todo title]:string: '
35	'--date-format[strftime time formet]:time string: '
36	'*--format[define format]:format:_todo_format'
37	'*--use-format[output format]:format:_todo_format'
38	'--sort[sort database]:sort expression:_todo_sort'
39	'--paranoid[paranoid parmissions etc]'
40	'--database-loaders[loader order]:database loader: '
41	'--backup[backup database]:count: '
42	'--timeout[display timeout]:seconds: '
43	'--purge[purge completed items]:days: '
44	'*'{'--filter','-f'}'[show items matching filter]:filter:_todo_filter'
45	'*::item:_todo_index'
46)
47
48arg_pair=(
49	'verbose'     'v'
50	'add'         'a'
51	'graft'       'g'
52	'link'        'l'
53	'reparent'    'R'
54	'priority'    'p'
55	'edit'        'e'
56	'done'        'd'
57	'not-done'    'D'
58	'global'      'G'
59	'TODO'        'T'
60	'all'         'A'
61)
62
63arg_desc=(
64	'verbose'     '[be verbose]'
65	'add'         '[add item]:item'
66	'graft'       '[parent item]:parent:_todo_index'
67	'link'        '[link file into database]:database:_files'
68	'reparent'    '[change item parent]:index:_todo_index'
69	'priority'    '[item priority]:priority:_todo_priority'
70	'edit'        '[edit item]:index:_todo_index'
71	'done'        '[mark as done]:index:_todo_index'
72	'not-done'    '[mark as undone]:index:_todo_index -u'
73	'global'      '[use global database]'
74	'TODO'        '[generate TODO file]'
75	'all'         '[show all items]'
76)
77
78for arg in ${(k)arg_pair}; {
79	arg_generic+='(--'$arg')-'${arg_pair[$arg]}${arg_desc[$arg]}
80	arg_generic+='(-'${arg_pair[$arg]}')--'${arg}${arg_desc[$arg]}
81}
82
83function _todo_index () {
84	typeset number text i entry last_entry depth last_depth=0 IFS=$'\n'
85	typeset -a index desc
86	for i in $*; do
87		case $i in
88			-u) todo_opts+=(--filter done)
89		esac
90	done
91	for entry in $(todo $todo_opts -f +children --format display='%1>%i%n:%t\n'); do
92		number=${entry%%:*}
93		depth=$(( ${#number} - ${#${number// }} ))
94		((depth)) && entry=${(j:.:)${${(s:.:):-a.${last_entry%%:*}}[2,depth+1]}}.$entry
95		text=${entry#*:}
96		number=${${entry%%:*}// }
97		entry=$number:$text
98		index+=$entry
99		last_depth=$depth
100		last_entry=$entry
101	done
102	_describe -t items index index
103}
104
105function _todo_color () {
106	if compset -P '*='; then
107		_wanted color expl 'color' \
108		compadd black red green yellow blue magenta cyan white default
109	else
110		_wanted item expl 'item' \
111		compadd -S '=' $priorities title info
112	fi
113}
114
115function _todo_filter {
116	typeset prefix
117	if [[ ${#${words[$CURRENT]}} -gt 0 ]] {
118		prefix=${${words[$CURRENT]}[1]}
119		_wanted expression expl 'filter expression' \
120		compadd -p $prefix -- all children done $priorities
121	} else {
122		# XXX the '-' makes problems
123		_wanted expression expl 'filter expression' \
124		compadd -S '' -- - + = all children done $priorities
125	}
126}
127
128function _todo_format () {
129	typeset prefix
130	if [[ -prefix *= ]] {
131		_message 'format string'
132	} else {
133		_wanted expression expl 'format name' \
134		compadd -S '=' display generated verbose-display verbose-generated
135	}
136}
137
138function _todo_priority () {
139	_wanted priority expl 'priority' \
140	compadd default $priorities
141}
142
143function _todo_sort () {
144	typeset -a keys used_prefixes
145	typeset key prefix=''
146	keys=(created completed text priority duration none done)
147	for key in $keys; {
148		[[ $key != none ]] && keys+="-$key"
149	}
150
151	if [[ -prefix *, ]] {
152		prefix=${words[$CURRENT]%,*},
153		used_prefixes=(${(s:,:)prefix})
154		for key in $used_prefixes; {
155			[[ $key == -* ]] && used_prefixes+=$key[2,-1] || used_prefixes+=-$key
156		}
157	}
158	_wanted expression expl 'sort expression' \
159	compadd -F used_prefixes -qS , -P "$prefix" $keys
160}
161
162case $service in
163	tda)
164		_arguments -s $arg_add
165	;;
166	tde|tdd)
167		_arguments -s ':index:_todo_index'
168	;;
169	tdr)
170		zstyle ':completion:*:tdr:*' ignore-line yes
171		_arguments -s '*:index:_todo_index'
172	;;
173	*todo)
174		_arguments -s $arg_generic
175	;;
176esac
177