--- /dev/null
+_todo()
+{
+ local cur prev opts
+ COMPREPLY=()
+ cur="${COMP_WORDS[COMP_CWORD]}"
+ prev="${COMP_WORDS[COMP_CWORD-1]}"
+
+ COMMANDS="add a addto addm append app archive command del \
+ rm depri dp do help list ls listall lsa listcon \
+ lsc listfile lf listpri lsp listproj lsproj move \
+ mv prepend prep pri p replace report"
+
+ # Add custom commands from add-ons, if installed.
+ COMMANDS="$COMMANDS $('ls' ${TODO_ACTIONS_DIR:-$HOME/.todo.actions.d}/ 2>/dev/null)"
+
+ OPTS="-@ -@@ -+ -++ -d -f -h -p -P -PP -a -n -t -v -vv -V -x"
+
+ if [ $COMP_CWORD -eq 1 ]; then
+ completions="$COMMANDS $OPTS"
+ else
+ case "${prev}" in
+ -*) completions="$COMMANDS $OPTS";;
+ *) return 0;;
+ esac
+ fi
+
+ COMPREPLY=( $( compgen -W "$completions" -- $cur ))
+ return 0
+}
+
+complete -F _todo todo.sh
+# If you define an alias (e.g. "t") to todo.sh, you need to explicitly enable
+# completion for it, too:
+complete -F _todo t