I use Emacs on several different computers. To keep my configuration
consistent across all of them, I do what many people do and made the
~/.emacs.d directory a git repository. I don’t like to keep
copies of all of the Elisp extensions that I use, such as paredit and
geiser, in this repository. Instead, I prefer to use package.el
(introduced in Emacs 24) with the MELPA repository. This saves me
from having to manually keep all of the extensions I use up-to-date,
but requires another method to keep useful packages in sync between
computers.
There’s a project called Pallet that solves this problem, but it was
too heavy for my liking. Instead, I wrote a short function that
simply iterates over a list of required packages and installs those
that are not currently installed.
;; Additional packages that I use.
(setq required-packages
'(better-defaults
elfeed
geiser
ido-ubiquitous
js2-mode
magit
paredit
rainbow-delimiters
smex))
(defun install-missing-packages ()
"Install all required packages that haven't been installed."
(interactive)
(mapc (lambda (package)
(unless (package-installed-p package)
(package-install package)))
required-packages)
(message "Installed all missing packages!"))
Now, it’s as easy as typing M-x install-missing-packages RET when
starting Emacs for the first time on a new computer to download all of
the extensions that I need. Note that before calling
install-missing-packages you must have already initialized the
package manager via the package-initialize function. This
approach does require some manual bookkeeping in order to keep the
required-packages list up-to-date with your workflow, but I
haven’t found it to be problematic.
Update: If this solution is too simplistic for you, you should check
out use-package, which reddit user lunayorn pointed out to
me. Thanks!
Check out the comments on reddit.
From the blog dthompson by David Thompson and used with permission of the author. All other rights reserved by the author.