summaryrefslogtreecommitdiff
path: root/zsh
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--zsh/comp/todotxt.zsh-completion107
-rw-r--r--zsh/conf.d/todo.zsh95
-rw-r--r--zsh/zshrc2
3 files changed, 204 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 "$@"
diff --git a/zsh/conf.d/todo.zsh b/zsh/conf.d/todo.zsh
new file mode 100644
index 0000000..18cc240
--- /dev/null
+++ b/zsh/conf.d/todo.zsh
@@ -0,0 +1,95 @@
+
+# Expand multiple lines removal
+todo() {
+ local pattern="[[:digit:] ]##"
+ setopt extendedglob # Enable extended regexes
+ setopt localoptions
+ case $* in
+ $~pattern)
+ for number in $*; do
+ todo rm $number
+ done
+ ;;
+ \*)
+ for number in $(todol |
+ sed $'s/\e\[[0-9;:]*[a-zA-Z]//g' | # Remove color from list output
+ sed 's/^[^0-9].*//' | # Remove non-task lines
+ sed -r 's/^([0-9]+).*/\1/' # Only keep the number in task's lines
+ ); do
+ todo rm $number
+ done
+ ;;
+ *)
+ echo '\e[1;31mWrong parameter : \e[0;31m'$*'\e[0m'
+ echo 'Usage: todor NUMBERS'
+ echo '\e[1mNUMBERS:\e[0m'
+ echo ' Space-separated line numbers to delete (ex: 1 5 6)'
+ echo ' \e[2mBrace expansion can also be used for adjacent NUMBERS, like : {5..7}'
+ echo ' \e[2mWildcard character (*, beware of expansion, rather "quote" or \\escape it)'
+ echo ' is also supported to deleted every line.'
+ ;;
+ esac
+}
+
+# Print a reminder about todo.txt's syntax
+todostx() {
+ echo -e "$(
+ cat <<-TodoTxtSyntax
+ \e[1;32m╭────────────────────────────────── Syntaxe de todo.txt ──────────────────────────────────╮\e[0m
+ \e[1;32m│\e[0m \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m Principe de base : \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m \e[1;3m1 ligne = 1 tâche\e[0m \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m Le format des tâches est libre, néanmoins plusieurs \e[1mnotations\e[0m permettent de les \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m structurer : \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┏ \e[1;2mMarque de complétion\e[0;1;33m*\e[0m (pour les tâche \e[1;33mcomplétées\e[0m, toujours en premier) \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ Format : \e[1;2mx␣\e[0m \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┏ \e[1;31mPriorité\e[33m*\e[0m (pour les tâche \e[1;33mnon complétées\e[0m, toujours en premier) \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┃ Format : \e[1;31m(\e[0m[\e[1;31mA-Z\e[0m]\e[1;31m␣) \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┃ \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┃ ┏ \e[2;38;5;172mDate de complétion\e[0;1;33m*\e[0m (pour les tâche \e[1;33mcomplétées\e[0m, toujours après le \e[2mx\e[0m ; \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┃ ┃ si présente, la date de création doit aussi l'être) \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┃ ┃ Format : (\e[2;38;5;172m20\e[0m|\e[2;38;5;172m19\e[0m)[\e[2;38;5;172m00-99\e[0m]\e[2;38;5;172m-\e[0m[\e[2;38;5;172m00-12\e[0m]\e[2;38;5;172m-\e[0m[\e[2;38;5;172m00-31\e[0m]\e[2;38;5;172m␣\e[0m \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┃ ┃ \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┃ ┃ ┏ \e[2;38;5;172mDate de création\e[0;1;33m*\e[0m \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┃ ┃ ┃ Format : Idem date de complétion \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┃ ┃ ┃ \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┃ ┃ ┃ ┏ \e[1mDescription de la tâche\e[0m, peut inclure \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┃ ┃ ┃ ┃ diverse étiquettes (projet, contexte, \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┃ ┃ ┃ ┃ clé:valeur) \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┻ ━┻━ ━━━━┻━━━━━ ━━━━━┻━━━━ ━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━ \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m \e[1;2mx\e[0;1m \e[31m(A) \e[0;2;38;5;172m2012-12-21 2000-09-05\e[0;1;31m Live in \e[38;5;112m+peace\e[31m on \e[38;5;13m@Earth\e[31m \e[3;38;5;12mdue:eternity \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ━━┳━━━ ━━┳━━━ ━━━━━┳━━━━━━ \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┃ ┗ \e[1mÉtiquette \e[3;38;5;12mclé:valeur\e[0;1;33m*\e[0m, \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┃ pour renseigner des \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┃ types de métadonnée \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┃ supplémentaires \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┃ \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ ┗ \e[1mÉtiquette de \e[3;38;5;13mcontexte\e[0;1;33m*\e[0m, précédée \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ d'un espace, n'en contenant pas et \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ indiquée par un \e[1;3;38;5;13m@\e[0m, une tâche peut \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ faire partie de plusieurs contextes \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┃ \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m ┗ \e[1mÉtiquette de \e[3;38;5;112mprojet\e[0;1;33m*\e[0m, précédée d'un espace, \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m n'en contenant pas et indiquée par un \e[1;3;38;5;112m+\e[0m, une \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m tâche peut faire partie de plusieurs projets \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m \e[2;3mLes champs marqués d'un \e[0;1;33m*\e[0;2;3m sont optionnels, on peut choisir ou non de les \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m \e[2;3minclure, mais si on le fait, \e[1mla syntaxe de leur format doit être respectée\e[0;2;3m. \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m \e[2;3mNote : L'exemple proposé n'est pas valide, puisqu'il cumule la marque de complétion \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m \e[2;3met la priorité. \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m \e[2;3mDeux exemples valides, une tâche non complétée et une complétée, seraient :\e[0m \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m \e[1;31m(A) \e[0;2;38;5;172m2000-09-05\e[0;1;31m Live in \e[38;5;112m+peace\e[31m on \e[38;5;13m@Earth\e[31m \e[3;38;5;12mdue:eternity \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m \e[1;2mx\e[0;1m \e[0;2;38;5;172m2012-12-21 2000-09-05\e[0;1;31m Live in \e[38;5;112m+peace\e[31m on \e[38;5;13m@Earth\e[31m \e[3;38;5;12mdue:eternity \e[0;1;32m│\e[0m
+ \e[1;32m│\e[0m \e[0;1;32m│\e[0m
+ \e[1;32m╰─────────────────────────────────────────────────────────────────────────────────────────╯\e[0m
+
+ TodoTxtSyntax
+ )" | ${PAGER:-less}
+}
diff --git a/zsh/zshrc b/zsh/zshrc
index b8d2cfe..95f285d 100644
--- a/zsh/zshrc
+++ b/zsh/zshrc
@@ -59,7 +59,9 @@ alias gitu='git add . && git commit && git push'
alias g=git
alias share='wl-paste | curl -si -d @- https://nixshare.ru/paste/clipboard.txt | grep "location:" | sed -s "s/location: //" | wl-copy'
alias p=python3
+alias t=todo.sh
[[ ! -f `which exa` ]] || alias ls="exa" && alias ll="exa -l"
+compdef _todo t
# }}}
# {{{ Functions