29.05.2025

This commit is contained in:
Alexander Neonxp Kiryukhin 2025-05-29 14:53:31 +03:00
parent cefce84f5e
commit ed137a15ff
Signed by: NeonXP
SSH key fingerprint: SHA256:SVt7TjxbVc87m1QYaQziOJ0N3OCFURv2g76gD/UTTXI
28 changed files with 552 additions and 420 deletions

View file

@ -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 "$@"