Skip to content


Subversion checkout URL

You can clone with
Download ZIP
My emacs configuration, including collected third-party code (much of it as git submodules). For my personal convenience, but you are welcome to borrow from it, and equally welcome to provide any feedback you think I could benefit from.
Emacs Lisp
Failed to load latest commit information.
snippets Snippet to embed an ipython terminal in a script
.gitignore Updating gitignore (projectile cache, recentf)
HIVE-variables.el Tidying up system/platform tweaks
LICENCE Finally add licence file! Updating the README; don't need post-install notes any more
custom-erlang.el Fixing up a bunch of elisp conventions checkdoc whinges about
custom-escreen.el Change current-screen face in escreen advice
custom-eshell.el Add eshell/clear
custom-functions.el Kill processes from list-processes view.
custom-general.el Quick hack to disable show-whitespace in eshell
custom-helm.el Helm: add binding for project-ag
custom-js-web.el URL-decode/encode region commands
custom-latex.el Fixing up a bunch of elisp conventions checkdoc whinges about
custom-lisp.el Need to require cider-eval-sexp-fu
custom-org.el Update org customisation
custom-stats.el Fixing up a bunch of elisp conventions checkdoc whinges about
custom-xml.el Fixing up a bunch of elisp conventions checkdoc whinges about
darwin.el Fixing up a bunch of elisp conventions checkdoc whinges about
gnu-linux.el Fixing up a bunch of elisp conventions checkdoc whinges about
init.el helm-projectile is a separate package
thinkpad-variables.el Removed custom variables sections relating to disabled commands
windows-nt.el Tweaks to windows setup (& use path-separator)


This is my emacs configuration, placed on github for portability and general sharing. It has accumulated a decent amount of cruft over the years, so please feel free to point out where it can be improved.

These days I have a fairly homogenous environment across my different installations, so there's not a lot of effort put in to making things backwards-compatible. Currently that means Emacs24, on a Linux (Ubuntu) host, although the only thing I'm aware of that breaks on Emacs23 is the colour-theme stuff. See also the platform and host-specific loading files if things start to deviate much.


This should be as simple as cloning from github. If you check out to ~/.emacs.d then you are finished. Otherwise, you can place it where-ever you feel like and just symlink init.el to ~/.emacs; it is designed to be portable like this.

I now use el-get for managing dependencies, which made a huge difference after years of hand-managing git submodules. This should bootstrap itself already on first load, but if for some reason an install fails (a host is down, etc) you might need to disable entries in *mh/packages* for example.

General Notes

The top-level file is init.el; it basically just adds its parent directory (which should be where you checked this out) to the load-path, and loads a bunch of mode- and task-specific files. These are by convention named custom-<task>.el, mainly so they will be grouped together in a directory listing. The exception is the allowance for platform-specific initialisation, which is loaded by looking for a file with the same name as the symbol-value of system-type.

For efficiency, I have borrowed a few hints from Jacob Gabrielson's post on effective emacs, in particular setting things up for autoload where possible, and as a result making heavy use of eval-after-load. This might occasionally make it a bit harder to read.

There's a bit of defensive coding; in place of (require 'foo) followed by configuration, I tend to use (when (require 'foo nil t) ...) instead. The last argument to require means to simply return nil but not signal an error in the event that a feature cannot be loaded. Yes, this all could and possibly should be wrapped as a macro.

Something went wrong with that request. Please try again.