« Folder syncronization | Main | OSCON 2006 »

todo.sh

I'm trying to use the todo.sh organizer to sort some of my work. Usually I use small 3 by 4 cards, and they are great to collect stuff to do, but they are not that great when I need to organize them into projects and define priorities.

First impressions are good. It's a simple script with a simple command line interface.

One of the first things I did was adding a short alias, t, as suggested at their site. This cuts down a lot of typing but being a lazy bastard myself, I wanted more.

So I wrote this:

# todo.sh completion by Pedro Melo <melo@simplicidade.org>
# 
# for updates see: http://www.simplicidade.org/notes/archives/2006/07/todosh.html

_todo_sh()
{
  local cur prev commands options command

  TODOSHRC=${TODOSHRC:-${HOME}/.todo}
  if [ -r $TODOSHRC ] ; then
    . $TODOSHRC
  fi

  if [ ! -r $TODO_FILE ] ; then
    echo "ERROR: cannot read todo.txt file."
    echo "Make sure TODOSHRC is set with the correct .todo config file";
    return 0
  fi

  COMPREPLY=()
  cur=${COMP_WORDS[COMP_CWORD]}
  prev=${COMP_WORDS[COMP_CWORD-1]}

  commands='add append archive contexts del do list listpri \
            prepend pri projects replace remdup report'
  options="-d -p -q -v"

  if [[ $COMP_CWORD -eq 1 ]] ; then
    if [[ ${cur} == -* ]] ; then
     COMPREPLY=( $( compgen -W "$options" -- $cur ) )
    else
      COMPREPLY=( $( compgen -W "$commands" -- $cur ) )
    fi

    return 0
  fi

  case "${prev}" in
    @(add|list))
      local projects=$(egrep -o 'p:\w+' $TODO_FILE | sort | uniq -c | sort -rn | awk '{ print $2 }')
      local contexts=$(egrep -o '@\w+' $TODO_FILE | sort | uniq -c | sort -rn | awk '{ print $2 }')
      COMPREPLY=( $(compgen -W "${projects} ${contexts}" -- ${cur}) )
      return 0
      ;;

    @(append|del|do|prepend|pri|replace))
      local n_todos=$(wc -l $TODO_FILE)
      local tasks=$(seq 1 $n_todos)
      COMPREPLY=( $(compgen -W "${tasks}" -- ${cur}) )
      return 0
      ;;

    listpri)
      local pris=$(egrep -o '\(\w+\)' ~/Documents/todo/todo.txt | cut -c2 | sort | uniq -c | sort -rn | awk '{ print $2 }')
      COMPREPLY=( $(compgen -W "${pris}" -- ${cur}) )
      return 0
      ;;

    *)
      ;;
  esac

  return 0
}
complete -F _todo_sh -o default todo.sh

It's a bash_completion script. Copy & paste it into your own ~/.bash_completion.d/todo or the system /etc/bash_completion.d/todo.

It completes all the options and commands. It also completes @contexts and p:projects in list and add. It completes task numbers on all the commands that use them, and completes priorities in listpri.

It assumes that the todo.sh configuration file is at ~/.todo. If in your case you have it in a different place, you can set the environment variable TODOSHRC.

If you, like me, added your own alias shortcut to todo.sh, add this line after the alias definition:

complete -F _todo_sh -o default t

In my case, I was using the alias t for todo.sh. If you use another alias, replace the last t with your chosen alias.

The completion can be made smarter. Some commands need to expand to a task number and then free text, and inside the free text, expanding to @contexts or p:projects would be useful.

Contacts

melo@simplicidade.org (XMPP/email)
+351 302 029 050 (voice)
melopt (Skype)

IronMan challenge

Iron Man badge Are you ready to be an Iron Man? Join the challenge and find out! (what is the meaning of this little man?)

Moosaico

Junta-te!

Recent Comments

Powered by Disqus
Creative Commons License
This weblog is licensed under a Creative Commons License.
Powered by
Movable Type 3.2