Emacs Refactoring

Vote on HN

While I waited for Coupa customers to be upgraded, I decided to clean up my .emacs config file. My .emacs was never a pretty thing to admire. Without any restraint, I often added whatever cool code snippet I came across online. The file became verbose, redundant, and a general mess. I set out to make it more modular and easier to follow.

The first thing I wanted to fix was this really ugly section where I manipulate the load-path and load my plugins. I created a convention to install each plugin in it's own folder, and to have a install hook for each plugin. For example, the ruby plugin looks like:

~/.emacs.d/plugins
  ruby
    ruby.el
    load-ruby.el

Previously, I added the following 2 lines for every plugin.

(add-to-list 'load-path "~/.emacs.d/plugins/ruby")
(load "load-ruby.el")

But thanks to the EmacsWiki, I learned about normal-top-level-add-to-load-path. In the finished version, I put the plugin names in a list and iterate over them:

;;; ### Plugin Initialization ###
(setq plugins-to-load
  '("harvey-navigation" "javascript" "dsvn" "ruby" "ido"))

;; add to "~/.emacs.d/plugins/__plugins-to-load__ to load-path
(let* ((my-lisp-dir "~/.emacs.d/plugins")
       (default-directory my-lisp-dir))
  (setq load-path (cons my-lisp-dir load-path))
  (normal-top-level-add-to-load-path plugins-to-load))

;; run the init file for the plugin
(mapcar (lambda (plugin-name)
          (load (concat "load-" plugin-name ".el")))
        plugins-to-load)

In the process of changing how plugins are loaded, I removed several plugins that I never used. This lowered my emacs load time by a large perceptible amount.

My .emacs isn't something I work with very often, but I derived a fair amount of satisfaction that the next time I need to tweak something, I'll know it won't suck.

You can find the finished config here.

comments powered by Disqus