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