One of the "new" things in Emacs is something called Org mode. If you're an Emacs user and need an outliner, a calendar, a TODO list, or just a place to capture your thoughts, it's great. I've been using Org mode for a while and love it's features. A while back, I started using it with Remember mode to capture thoughts about a book I'm writing, notes in meetings, and a personal journal. I learned over the weekend about something called Org-capture, a Remember mode replacement and took a few minutes to get it set up. Since there were some rough spots, I thought I'd blog my experience for others.
First, you ought to do yourself a favor and download the latest org-mode.el files. The ones that come with your Emacs distro aren't likely to contain the Org-capture files. You can follow the standard instructions for setting up Org-mode. I like the following hook for turning on things like spell checking and turning off truncate-lines
.
(add-hook 'org-mode-hook \t (lambda () \t 'turn-on-font-lock \t (setq word-wrap 1) \t (setq truncate-lines nil) \t (flyspell-mode 1)))
I sent up Org-capture s that files are stored in my Dropbox and added several templates like so:
(setq org-directory "~/Dropbox/Documents/orgfiles/") (setq org-default-notes-file (concat org-directory "notes.org")) (define-key global-map "\\C-cr" 'org-capture) (setq org-capture-templates `( ("n" "Notes" entry (file+datetree \t\t ,(concat org-directory "notes.org")) \t"* %^{Description} %^g %? Added: %U") ("b" "Book" entry (file+datetree \t \t ,(concat "~/Dropbox/Documents/KRL Book/krl.txt")) "* Topic: %^{Description} %^g %? Added: %U") ("j" "Journal" entry (file ,(concat org-directory "journal.org")) "** %^{Title} %U %(journal-google-weather \\"Lindon, UT\\") %? ") \t ))
For more information on setting up templates, see this article on Capture mode and date trees and the manual entry.
The file+datetree
designation in the preceding templates creates a date tree outline in the Org file for easy reference.
I wanted to be able to access Org-capture from anywhere. I found this article on GTD capture in Org mode, but it's based on the old Remember mode, not the new Org-capture mode. Here's a screencast showing how this works:
With a simple keypress I'm able to fire up an Emacs window in capture mode from whatever application I'm then using, make my notes, and save the results. As I mentioned, the article on GTD capture in Org mode wasn't based on Org-capture, but the older Reember mode. I updated that code to use Org-capture. Here's the updated code:
(defadvice org-capture-finalize (after delete-capture-frame activate) "Advise capture-finalize to close the frame" (if (equal "capture" (frame-parameter nil 'name)) (delete-frame))) (defadvice org-capture-destroy (after delete-capture-frame activate) "Advise capture-destroy to close the frame" (if (equal "capture" (frame-parameter nil 'name)) (delete-frame))) ;; make the frame contain a single window. by default org-capture ;; splits the window. (add-hook 'org-capture-mode-hook 'delete-other-windows) (defun make-capture-frame () "Create a new frame and run org-capture." (interactive) (make-frame '((name . "capture") (width . 120) (height . 15))) (select-frame-by-name "capture") (setq word-wrap 1) (setq truncate-lines nil) (org-capture))
I trigger this with Quicksilver. To do that I created a simple bash script called capture
#!/bin/bash /usr/bin/emacsclient -n -e '(make-capture-frame)'
Setting up a Quicksilver trigger to call the script is trivial. I bound it to Command-Option-Backslash.
You might have noticed, that the template for my journal entries contains this little bit of magic:
%(journal-google-weather \\"Lindon, UT\\")
That tells the template to evaluate the function journal-google-weather
. This is something I hacked together using the google-weather
library:
(defun journal-google-weather (location) (let* ((data (ignore-errors \t\t (google-weather-get-data location))) \t (forecast (when data (caddr (google-weather-data->weather data))))) (when forecast (let ((condition (cdaadr (assoc 'condition forecast))) (low (cdaadr (assoc 'low forecast))) (high (cdaadr (assoc 'high forecast))) (city (google-weather-data->city data)) \t ) \t(format-spec "%L | %c | High: %hF Low: %lF" \t\t `((?c . ,condition) \t\t (?L . ,location) \t\t (?l . ,low) \t\t (?h . ,high)))))))
When this runs, emacs contacts the Google weather API, parses the result for the given location, and inserts a formated string into my journal header like so:
... [2010-12-12 Sun 21:12] Lindon, UT | Partly Cloudy | High: 52F Low: 30F
I'm loving the easy ability I have now to capture information from mail, the Web or anywhere else and put it into a notes file for later. Give it a try!