Sunday, December 09, 2012

Customizing exec-path and load-path

Emacs has two main list of paths it uses to find files, the
load-path and the exec-path. The load-path is a list of
directories that should be used to look for load files. The
exec-path is a list of directories that should be used to look for
binary executables, the equivalent of the shell variable $PATH (and
is initialized from it).

The exec-path is the one that usually doesn't require any
modification. If it is modified, it makes sense to do so by
customizing the variable, which puts it in custom.el, which I've
already recommended be local-only, and not checked into git.

The load-path controls what directories are searched for load,
load-library, and require. The directories in load-path are
used in order of their appearance in that variable. So if there's two
entries in load-path, ("~/foo" "~/bar"), and they both have a file
baz.el, a (require 'baz) will load the one in ~/foo. Most
people add to the load-path with the elisp add-to-list command,
which will put the new entry in the front of the list, which will mean
anything in that directory will override everything else. This is
useful for using a more recent version of a library that comes bundled
with emacs.

By default, the load-path contains with the list of emacs
directories that is part of the emacs standard set of elisp, such as
(on my mac) "/Applications/Emacs.app/Contents/Resources/lisp/cedet",
and many other similar directories. This variable used to frequently
need customization, and I've long had something in my initialization
that adds everything under ~/.emacs.d to my load-path:

This is the only way I've found to recursive add things to the
load-path. When I added this, I felt it was necessary to avoid
having to specify directories for every package I downloaded. Some
packages, like org, needed two directories to be put in the
load-path. It was annoying. But this is a heavy-handed solution to
the problem. It adds a whopping 110 entries to my load-path. That
can't be good.

Furthermore, ELPA already handles adding things to the load-path.
I'm going to get rid of it under the theory that ELPA is handling
everything I currently care about, and anything else can be dealt with
as a special case. However, there is one directory I'd like to be on
my load-path that isn't right now, and that's the ~/.emacs.d/
directory itself. I'd like to be able to add other .elisp files in
this directory as well. The following elisp accomplishes that:

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

Today's lesson is a simple one: Using ELPA largely obviates the need
for adding directories to load-path. But if you do have special
directories you'd like to add, then use add-to-list to add them.

About Me

I'm a Software Engineer who moved from Silicon Valley to NYC. I'm on several parallel quests: to try all the most interesting (and cheap) NY restaurants, to increase the amount of skeptical thinking in the world, and to spread my fascination with coding and technology.