X-Git-Url: https://git.madduck.net/etc/taskwarrior.git/blobdiff_plain/b2bea6a2530dc8ae41eb5120565406fb7317e3b5..8078ceed9b50dad2d319a74e2d3014b6ff649b47:/.zsh/zshrc/parts.d/50-taskwarrior?ds=inline

diff --git a/.zsh/zshrc/parts.d/50-taskwarrior b/.zsh/zshrc/parts.d/50-taskwarrior
index 9138c2b..2ca20b9 100644
--- a/.zsh/zshrc/parts.d/50-taskwarrior
+++ b/.zsh/zshrc/parts.d/50-taskwarrior
@@ -9,21 +9,52 @@
 
 if whence task >/dev/null; then
 
-  alias t=task
-  alias t\?='alias -rm t t[a-z]'
-  alias ta='t add'
-  alias tc='t call'
-  alias th='t attach'
-  alias tn='t next'
-  alias tl='t all'
-  alias ty='t sync'
-  alias td='t done'
-  alias te='t edit'
-  alias tm='t modify'
-  alias ts='t start'
-
-  run_at_most_every 30s \
-    task 2>/dev/null || :
+  function task_() {
+    local filter cmd args nofilter=0
+    cmd="$1"; shift
+
+    case "$cmd" in
+      (add|attach|call) nofilter=1;;
+    esac
+
+    for i in "$@"; do
+      case "$nofilter@$i" in
+        (0@<->) :;&
+        (0@/*/) filter="${filter:+$filter }$i";;
+        (*) args="${args:+$args }$i";;
+      esac
+    done
+    eval task $filter $cmd $args
+  }
+
+  function task_postpone() {
+    local args
+    for i in scheduled due until wait; do
+      if [[ -n "$(eval task _get "$1"."$i")" ]]; then
+        args="${args:+$args }${i}:${i}+$2"
+      fi
+    done
+    eval task "$1" modify $args
+  }
+
+  alias t\?='alias -rm t t[-+a-z] | sed -r "s,_ ?, ,"'
+  alias ta='task_ add'
+  alias tc='task_ call'
+  alias th='task_ attach'
+  alias tl='task_ all'
+  alias ty='task_ next rc.recurrence=on >/dev/null && task_ sync'
+  alias td='task_ done'
+  alias te='task_ edit'
+  alias tu='task_ undo'
+  alias tm='task_ modify'
+  alias ts='task_ start'
+  alias tw='task_ waiting'
+  alias tp='task_postpone'
+  alias t+='task_ annotate'
+  alias t='task_ ""'
+
+  run_at_most_every 5m \
+    t 2>/dev/null || :
 fi
 
 # vim:ft=zsh