Syncing Required Packages in Emacs

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.

blogroll

social