I realized a couple of days ago that part of the reason OmniFocus and Things feel better compared to org-mode is that they’ve got a much more pleasant visual design: There’s way more room, screen elements are better differentiated, and they present with a variable-width font. So I did some poking around in Cocoa Emacs to see if I could clean up org-mode a little. There’s no particular master plan here, just some things that made org-mode look nicer.
If you’re looking for the quickest wins, the first three (picking a better theme, hiding leading stars, and using org-bullets) make a big difference right away and work in both Cocoa and console Emacs. They don’t involve any fiddling with faces. The fourth (opening up the line height) works on Cocoa Emacs and definitely helps a busy file feel a little more scannable; and it’s also fiddle-free.
A Nicer Theme
The flat-ui theme gives Emacs a more muted palette that’s similar to the one OmniFocus uses. Stick it in your
.emacs.d/themes and invoke it with:
(load-file "~/.emacs.d/themes/flatui-theme.el") (load-theme 'flatui t)
Hide Leading Stars to Declutter
You can turn off the display of all the asterisks in a heading but the last one:
(setq org-hide-leading-stars t)
org-bullets gives you the ability to change the way the asterisks used in org-mode present on the screen. The defaults aren’t great. I ended up using normal bullets for level 1 and 2 headings (which are equivalent to folders and projects in my own org hierarchy) and open circles for lower levels (which are usually todos for me).
Downplay “DONE” and Similar States
I set the face for
bright black and the weight to
thin to help push completed items to the background. I often squirrel notes away under information gathering todos, so I don’t like to completely archive a todo until the project is complete. By muting the display of done items, they’re still there and searchable, but they don’t compete with active TODO items when I’m scanning my list.
Open Up Line Height
It helps to open things up between lines a little:
(setq line-spacing '0.25)
Differentiate With Size and Weight
You don’t need to go bananas. I gave the highest heading levels a small bump in size (
:height 1.2 for level 1 headings,
:height 1.1 for level 2) and helped them stand out by setting their weight to
semi-bold. I sized metadata faces down to
:height 0.8 (
org-special-keyword) and also made the tags face less dark, which reduces the sense of clutter and makes tags more scannable.
In the process of changing these faces, I learned a new trick I can’t believe I’d missed in the past: Place the cursor over a given element in an org file and use the command
customize-face, and Emacs will present the face of the current text you’re on as the default argument. That makes it easy to visually identify what you want to change and quickly jump to its customization page.
Use Variable Width for Headings
… and maybe the body.
I explicitly set the typeface for headings to Helvetica Neue, and I’ve been using this hook for org-mode:
(add-hook 'org-mode-hook (lambda () (variable-pitch-mode t)))
It sets the body type for any org-mode buffer to variable width. The drawback of variable width type is that it breaks some indentation (since Emacs still thinks in terms of fixed-width characters). The advantage is that it’s a little more pleasant to read. I haven’t made up my mind about it yet.
If you do end up using a variable-width font for everything, don’t forget to explicitly set the face for org-table to a fixed-width choice.
All that gets you to here:
Review It in a Terminal Window
Because it ought to be able to work there, too.
In a Gist
If you’d like these to play with, I put them in a gist for easy cut-n-paste inside a
custom-set-faces block in your own init.el: