diff options
| author | 2025-05-29 14:53:31 +0300 | |
|---|---|---|
| committer | 2025-05-29 14:53:31 +0300 | |
| commit | ed137a15ff54dd4fc9a30183d9d626ae6f0cff50 (patch) | |
| tree | d84002bcf418ad6c09c0e163f75a869006c3fc84 /zsh/comp/todotxt.zsh-completion | |
| parent | Обновления конфигов (diff) | |
| download | dotfiles-ed137a15ff54dd4fc9a30183d9d626ae6f0cff50.tar.gz dotfiles-ed137a15ff54dd4fc9a30183d9d626ae6f0cff50.tar.bz2 dotfiles-ed137a15ff54dd4fc9a30183d9d626ae6f0cff50.tar.xz dotfiles-ed137a15ff54dd4fc9a30183d9d626ae6f0cff50.zip | |
29.05.2025
Diffstat (limited to '')
| -rw-r--r-- | zsh/comp/todotxt.zsh-completion | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/zsh/comp/todotxt.zsh-completion b/zsh/comp/todotxt.zsh-completion new file mode 100644 index 0000000..bd5b7c3 --- /dev/null +++ b/zsh/comp/todotxt.zsh-completion @@ -0,0 +1,107 @@ +#compdef todo.sh + +_todo() { + local curcontext="$curcontext" state state_descr line + typeset -A opt_args + local -a args commands subcmds + + local _todo_sh=${_todo_sh:-${words[1]}} + local -r MOVE_COMMAND_PATTERN='(move|mv)' + local -r OPTS=('-@' '-@@' '-+' '-++' '-d' '-f' '-h' '-p' '-P' '-PP' '-a' '-n' '-t' '-v' '-vv' '-V' '-x') + local -r COMMANDS=( + 'add:a new task' + 'a:add alias' + 'addto:add to file' + 'addm:add multiple' + 'append:app:app:append to task' + 'archive:move done tasks to archive' + 'command:run addon' + 'del:rm:delete task' + 'depri:dp:remove priority' + 'do:mark as done' + 'help:show help' + 'list:ls:list tasks' + 'listaddons:show installed addons' + 'listall:lsa:list all tasks' + 'listcon:lsc:list contexts' + 'listfile:lf:list files' + 'listpri:lsp:list by priority' + 'listproj:lsprj:list projects' + 'move:mv:move task between files' + 'prepend:insert text at beginning' + 'pri:p:set priority' + 'replace:modify task' + 'report:generate report' + 'shorthelp:brief help' + ) + + _arguments -C \ + "1: :->cmds" \ + "*:: :->args" + + case $state in + cmds) + local addons=($(eval TODOTXT_VERBOSE=0 "$_todo_sh" command listaddons 2>/dev/null)) + args=($COMMANDS $addons $OPTS) + _describe 'todo.sh command' args + ;; + args) + cur="${words[CURRENT]}" + prev="${words[CURRENT-1]}" + + case "$prev" in + command) + _describe 'subcommand' COMMANDS + ;; + help) + local addons=($(eval TODOTXT_VERBOSE=0 "$_todo_sh" command listaddons 2>/dev/null)) + args=($COMMANDS $addons) + _describe 'help topic' args + ;; + addto|listfile|lf|move|mv) + local files=($(eval TODOTXT_VERBOSE=0 "$_todo_sh" command listfile 2>/dev/null)) + _describe 'file' files + ;; + *) + case "$cur" in + due:*) + _values 'due date' $(seq 0 30 | xargs -I{} date -d "+{} days" +%Y-%m-%d) + ;; + *@today*|*@now*) + _wanted dates expl 'date' compadd -S '' -- $(date +%Y-%m-%d) + ;; + +*) + local projects=($(eval TODOTXT_VERBOSE=0 "$_todo_sh" command listproj 2>/dev/null)) + [[ ${#projects} -eq 0 ]] && projects=($(eval TODOTXT_VERBOSE=0 TODOTXT_SOURCEVAR=\$DONE_FILE "$_todo_sh" command listproj 2>/dev/null)) + _describe 'project' projects -p '+' + ;; + @*) + local contexts=($(eval TODOTXT_VERBOSE=0 "$_todo_sh" command listcon 2>/dev/null)) + [[ ${#contexts} -eq 0 ]] && contexts=($(eval TODOTXT_VERBOSE=0 TODOTXT_SOURCEVAR=\$DONE_FILE "$_todo_sh" command listcon 2>/dev/null)) + _describe 'context' contexts -p '@' + ;; + [0-9]##) + local task=($(eval TODOTXT_VERBOSE=0 "$_todo_sh" \ + '-@ -+ -p -x command ls "^ *${cur} "' 2>/dev/null | \ + sed -e 's/^ *[0-9]\{1,\} //' \ + -e 's/^\((.) \)\{0,1\}[0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} /\1/' \ + -e 's/^\([xX] \)\([0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} \)\{1,2\}/\1/' \ + -e 's/[[:space:]]*$//' -e '1q')) + _message -r "Task ${cur}: ${task}" + ;; + *) + if [[ ${words[1]} == $~MOVE_COMMAND_PATTERN ]] && (( CURRENT == 3 )); then + local files=($(eval TODOTXT_VERBOSE=0 "$_todo_sh" command listfile 2>/dev/null)) + _describe 'destination file' files + else + _files + fi + ;; + esac + ;; + esac + ;; + esac +} + +_todo "$@" |
