_tasker_task_dirs() { local root d name if [[ -d "$PWD/tasks" ]]; then root="$PWD/tasks" else root="$PWD" fi shopt -s nullglob for d in "$root"/*/; do name="${d%/}" name="${name##*/}" if [[ "$name" =~ ^[0-9]{2}-[0-9]{2}-[0-9]{2}\ [0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]+)?$ ]]; then printf '%s\n' "$name" fi done } _tasker_completion() { local cur prev words cword subcommand COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" local commands="new list set delete" subcommand="" for word in "${COMP_WORDS[@]:1}"; do case "$word" in new|list|set|delete) subcommand="$word" break ;; esac done if [[ -z "$subcommand" ]]; then COMPREPLY=( $(compgen -W "$commands" -- "$cur") ) return 0 fi case "$subcommand" in new) case "$prev" in -p|-d) return 0 ;; esac COMPREPLY=( $(compgen -W "-p -d" -- "$cur") ) ;; list) case "$prev" in -s|--status) COMPREPLY=( $(compgen -W "OPEN IN_PROGRESS CLOSED" -- "$cur") ) return 0 ;; -p|--priority|--min-priority|-c|--contains) return 0 ;; esac COMPREPLY=( $(compgen -W "-s --status -p --priority --min-priority -c --contains" -- "$cur") ) ;; set) case "$prev" in -s|--status) COMPREPLY=( $(compgen -W "OPEN IN_PROGRESS CLOSED" -- "$cur") ) return 0 ;; -n|--name|-p|--priority|-d|--desc) return 0 ;; esac if [[ "$cur" == -* ]]; then COMPREPLY=( $(compgen -W "-n --name -s --status -p --priority -d --desc" -- "$cur") ) else COMPREPLY=( $(compgen -W "$(_tasker_task_dirs)" -- "$cur") ) fi ;; delete) COMPREPLY=( $(compgen -W "$(_tasker_task_dirs)" -- "$cur") ) ;; esac } complete -F _tasker_completion tasker