Reminders with Quicksilver and Growl
June 13, 2009
For my todo system, I’ve been using Quicksilver with Remember the Milk for a while. It’s great for being able to throw things into my todo list at anytime (as long as I’m at my laptop). Especially with its natural language date parsing: “buy some cheerios tomorrow” or “see brothers bloom tuesday.” However, it’s not a very good reminder system.
Occasionally I’d use it with a specific time (“dentist appointment tomorrow 9am”), but for the most part, Remember the Milk todos are not about micro time management within the day. Especially since they don’t have a good notification method. So for reminders, I had to build my own system. Here’s what I wanted:
- Simple text scheduling from Quicksilver
- Growl for the reminder
- Natural scheduling (“go home at 7pm”, “eat lunch in 5m”)
Since most Unix systems (including OS X) have the `at` command for scheduling commands with a decent syntax, and Growl has the `growlnotify` command, I decided to start at the command line with a shell script.
#!/bin/bash
growlnotify=/usr/local/bin/growlnotify
normal=$(echo $1 | sed -e 's/ in / at /')
what=${normal%% at*}
when=${normal##*at }
when=$(echo $when | sed -e 's/^\([0-9]*\)m$/now + \1 minutes/')
when=$(echo $when | sed -e 's/^\([0-9]*\)h$/now + \1 hours/')
result=$(echo "$growlnotify -s -m '$what' > /dev/null 2>&1" | at $when 2>&1)
if [ $? -eq 0 ]; then
result=${result##*at }
result="Scheduled for $result"
fi
$growlnotify -m "$result"
This script takes a single argument string in the format I described above, splitting $what and $when with either “at” or “in”. Then I expand relative time (“10m” or “2h”) into the format `at` wants (“now + 10 minutes” — which I didn’t want to have to type). It schedules the command to use `growlnotify` with $what (as a sticky notification, so it won’t go away until I click it), and then immediately tells you when it was scheduled for if successful, or it tries to show you the error if not.
So that works fine. Now Quicksilver. You can write new actions in AppleScript, but I didn’t want to try and figure out how to write the above in AppleScript. It was hard enough figuring it out in bash. So the AppleScript action is just going to call out to that shell script.
using terms from application "Quicksilver" on process text str do shell script "/Users/Jeff/.scripts/growlat.sh \"" & str & "\" > /dev/null 2>&1" set selection of application "Quicksilver" to str end process text end using terms from
Apparently AppleScript files are not plain text, so you have to write it using Script Editor. Make sure the path to growlat.sh points to the shell script above. Then save this as Remind.scpt in your user’s “~/Library/Application Support/Quicksilver/Actions” directory. If it doesn’t exist, just make the directory. Restart Quicksilver and you should now have a Remind action! It’ll look like this:

June 13, 2009 at 1:28 pm
Perhaps partly inspired by your original post about it, there now exists a plug-in for GNOME-Do to do this as well, so Linux users can just grab the latest version and have it as well: http://img189.imageshack.us/img189/6757/screenshoth.png
Definitely convenient and simple.
June 13, 2009 at 1:33 pm
That’s pretty cool. Actually, in the process of making this, I found some actions that are disabled by default in Quicksilver that do something very close to this. I think it was without Growl and had you schedule when in a separate step (as opposed to all in a single line of text).
September 7, 2009 at 11:55 am
can you test a relative time with minutes? I dont think at is working ok for me…
eq
at now + 1 minute
at now+1m
at now+10m
will all ‘fire’ in 15 seconds!
ps. at seems to accept the ‘now+1m’ format
September 7, 2009 at 12:05 pm
Huh, relative time with minutes works for me. I’ve been using this for a while for things like “laundry in 15m” etc… and it all works.
You sure at accepts now+1m? It might accept it, but does it understand it and schedule properly?