Configuring for Emacs 22 and 25
Tags: emacs, orgmode
Published: 2018-02-03 22:58:43

---
title: "Configuring for Emacs 22 and 25"
published: true
tags: emacs, orgmode
canonical_url: http://gonsie.com/blorg/emacs-v22.html
---

I work in high performance computing (HPC). This means I work on some of biggest and best supercomputers in the world. It also means that I work on some biggest and best supercomputers from 5 or 10 years ago.

Recently, I found myself on a machine with Emacs 22. This post documents some of the changes I had to make to my Emacs configuration files to ensure that they could be used for any Emacs version I was likely to come across.

## Old Initialization File Setup

Ever since I’ve restarted using Emacs (from [SublimeText](https://dev.to/gonsie/converting-from-sublime-text-to-emacs-1ajj)), I’ve been using a few configuration files. I wanted my `.emacs` to be pretty generic and high level. This would call an `init.el` file which had a bunch of settings and packages. I also put a bunch of machine-specific configurations in a `.emacs-custom.el` file.

Looking at Emacs 22, I don’t think there is any support for `package.el`. I could roll with an old version, but after a quick search I could only find a snapshot for Emacs 23. In reality, I don’t need full Emacs package support, I just want to ensure my basic settings are on (I love my colors and hate auto-save files).

## New Scheme

The new scheme has four files, three of which are called from the root `.emacs` file.

### `.emacs`

This file contains all vanilla Emacs 22 settings. Some packages, such as autopair or org, have at one point been included in the Emacs distribution, but are not guaranteed. That said, the settings in this file should be safe for **all** versions of Emacs.

### `.emacs-custom.el`

This file contains any machine-specific settings (such as the ispell path) or customize settings. Note that you have to manually `touch` this file when getting set up on a new machine or Emacs will complain.

### `init.el`

This file contains everything to do with packages. It has the set-up for MELPA and then use-package for everything else. I actually really like how clean and single purpose this file turned out to be.

### `theme.el`

This file contains all the settings for my color theme. This file must be correct (i.e., not throwing errors) for all versions of Emacs as well. Any package-specific colors must be properly protected in case the package isn’t loaded.

For my particular setup, I am only able to achieve this because I include the `color-theme` package/elisp files with my dotfiles distribution. Colors are notoriously tricky, so I’ve got something that works and I’m not changing it.

## Tips

Here are a few snippets I used to make everything work.

### Checking The Emacs Version

The `init.el` should only be called from Emacs 25 or greater. My `init.el` would probably work for Emacs 24 as well, but I’ll leave it for now.

```
(when (< 24 emacs-major-version)
  (load "~/.config/emacs/init.el"))
```

### Checking for a Package

Some package specific colors can only be set if the package is loaded. I suppose this could be done through use-package, but I have org outside of that for now.

```
(when (require 'org nil 'noerror)
  (set-face-attribute 'org-table t :foreground "#536fd6"))
```

### Package Initialization

Since my packages are all loaded in the `init.el` file (and the file is only loaded for specific Emacs versions), I put the MELPA setup and `(package-initialize)` calls in there. This causes `package.el` to complain and automatically put a call to `(package-initalize)` in the `.emacs` file. Thus, to use a setup like this, I needed to add a comment at the beginning of my `.emacs` file.

```
;; package.el will check for this comment; it's actually called from init.el
;; (package-initialize)
```

## Conclusion

I think this new scheme is quite slick. I get my favorite colors and settings no matter what machine I’m working on. Plus, there are no complaints/warnings/errors when I start up Emacs.