My emacs lisp collection

This is a copy of my Emacs collection, with some HTML files added to document it. The collection is fairly extensive (the code I wrote myself is now 51k lines, about 1.9Mb) by now -- I started writing elisp around 1987 as far as I can remember; I think GNUemacs was on version 17 at the time.

For many years, I gave up on Usenet because of the spam, and didn't pay much attention to any other forms of announcement; during this period, I re-invented many Emacs wheels. I'm now working my way through the Emacs sources, finding out what's in there and removing my near-duplicates (except in a few cases where I really prefer my version) and I'm trying to keep up with what's being posted, to avoid future duplication (again, except where I really want something a bit different).


emacs-versor on SourceForge (project page at
Versatile cursors, giving a wider variety of ways of moving around files through a narrow interface such as just the arrow keys, or pedals set up to imitate them.
This package is meant for people who manage several majordomo lists. It composes and sends majordomo commands, parses the replies, and maintains a cache of the membership of each list. It could do with a bit more work on it.
Download and configure packages on demand. Like a remote version of autoload but with opportunities to set variables, hooks etc at the same time as specifying where to get the package from. Particularly handy if you're a flashcard based nomad and don't want to have to take all the big packages around with you.
Loads all the el / elc files in a directory.
Major mode for editing diary files. Colours days of the week differently. -->
editing/generic-text.el and friends
Mode-sensitive insertion of markup, using the same commands for TeX, LaTeX, HTML, *roff, and plain text. (Not all implemented yet -- *roff contributions would be welcome.) They provide similar facilities to html-helper-mode but consistently across several markup-language modes.
editing/replace-regexp-list.el and editing/edit-tree.el
Apply lots of edits systematically. These two are most useful used together. I don't need them often, but when I do need them, I really need them!
Giant writing.
mulvoc (on Sourceforge)
MUlti-Lingual VOCabularies, read in from CSV (Comma-Separated Value) files (a spreadsheet interchange format). I have great expectations of this (there's early-stage enthusiasm for you), but it is quite new. It now has quite a few source files, and has now become a SourceForge project so people can share vocabularies there.
Show localization for source files, e.g. translations of comments and perhaps names. Intended for (typically open-source) developers in countries where knowledge of English is not typically good; particularly where there may be large organizations who could have translators translating the comments on open-source code that their programmers then work on.
sidebrain (project page at
A working memory tool for programmers: it maintains a stack of your current tasks, and a queue or pool of pending tasks, and a set of observations, to help to remind you what you're doing. This is a fairly new project; for what I can tell so far, it helps me to keep focused on what I'm doing.
Allow commands embedded in dictated text, for voice recognition. Needs my improved version of vr.el.

Directory location and structure

Because I ship my emacs setup around between various machines, it all uses an environment $COMMON (which on a Unix-style system I set to $HOME/common) as its idea of where everything lives. This directory (the one in which this page resides) expects to be found at $COMMON/emacs. It also expects some companion directories, $COMMON/open-projects containing packages from sourceforge etc (including one which I manage), and $COMMON/emacs-library containing packages I have downloaded from elsewhere. (By the way, I can definitely recommend this way of working: $COMMON contains also my research papers, personal web site etc -- all the things I ship around all my machines -- and all fits handily onto a USB key. That way, I can keep my machines at home isolated from the Internet, and concentrate on getting things done there, without email interruptions and web distractions.)

$COMMON points to the things I wrote myself. All the things that I gathered from the net, rather than wrote myself, are pointed to by $GATHERED.

Code related to this way of working is in file-handling/filenames-in-env.el and in file-handling/common-directory.el.

My emacs startup structure

My .emacs sets up some environment variables representing where the rest of my emacs stuff is, then loads the contents of config, which mostly uses use-package to find and configure packages.

My emacs directory contents

Some of this is acquired long ago from others, but I wrote most of it myself. (Stuff I downloaded from others goes in a separate directory.) I'm trying to update all files in it that I remember I wrote myself, to identify them as such. I also mean to GPL it all, although some files may yet have escaped getting a GPL notice in them.

This sets the rest of my Startup going. It makes extensive use of basics/load-directory.el.
Choosing fonts etc.
Autoload stubs. I probably ought to move more into here.
I load these early in my Startup sequence. It contains things like basics/load-directory.el which is used heavily in the rest of my startup sequence.
Some stuff for arranging the many buffers I use into groups, and swapping them in and out; less important now that machines are larger than they were when I wrote it.
Some keyboard setup that ought to move elsewhere.
Code for data structure handling.
General editing code.
Things for handling elisp. Some more stuff should probably move into here.
e-mail handling, including a package for handling majordomo list management messages.
Using filenames found in buffers, synchronizing files and buffers, and things like that.
Games and entertainments written in elisp; see also well-being/ for relaxations.
Includes a major mode for JPEG files, which displays the meta-data.
Setting things up for use by pedals that I used to augment the keyboard because of my RSI. Most of this is moving over to emacs-versor on SourceForge.
hardware devices
Interfaces for I/O devices not usually used for editing, such as joysticks.
Miscellaneous stuff.
Setting variables etc for various modes.
My extensions to emacs code which I have loaded from elsewhere. Includes stuff for VM and for BBDB; and lots of adapters for voice. Also, there are some extra features for type-break (and some setup for it).
Natural language handling, starting with a package for handling vocabulary lists.
Saving and restoring state between Emacs sessions, done using load-directory.
Things that I'm still playing around with, or that have yet to grow to maturity.
research (on
Code for doing research; includes (voluntary!) logging of emacs user behaviour for empirical research, and organization of research papers
I find I'm much more productive off-line, shuttling my files around on USB mass storage devices. I'm not the only one who finds this, I know, and with the information (and distraction) overload that can so easily happen nowadays, and with the risk of large companies attempting to interfere with FLOSS development, I think it could be an important part of the way forward for software developments, so I'm starting a line of research into how to do ``unplugged'' distributed development.
Emacs software for change-ringing, mostly for learning methods.
These are loaded as I quit emacs, and the code in them fills in a directory which is loaded on start-up. See persistence/*.el for the framework for this.
Like savers1, but loaded after it because of some order dependencies. See persistence/*.el for the framework for this.
Not quite ``embedded emacs'', but Emacs setups for specific purposes, separate from my main emacs Startup.
Everything in this directory is loaded at start-up. Some of it should get moved to directories organized by what kind of thing the code does, and some should be given autoloads etc rather than being loaded at the start every time, so things may disappear from here and resurface in other directories, over the first few months of making my collection public.
Stuff relevant to system administration, such as looking at dmesg results.
Web related functions, many of them for writing HTML.
Stuff for looking after the user, such as breathing exercises.

Expected contents of ../emacs-library

You have to fetch these from their respective homes.

Big Brother Data Base -- an email address manager and much more. I have some additional code for this in my-extensions-to-packages/bbdb/.
Reader for Comma Separated Value files from spreadsheets
A major mode for editing html, which I prefer to the built-in html-mode
Personal Process logging -- I'm not yet using this but mean to sometime
View Mail -- my preferred mail reader. I have a little additional code for this at my-extensions-to-packages/vm.
A web browser inside emacs (there are also some interfaces available to get emacs to control external browsers)
Improved facilities for editing LaTeX and other TeX-family markup languages.

Expected contents of ../open-projects

Versatile cursors, giving a wider variety of ways of moving around files through a narrow interface such as just the arrow keys, or pedals set up to imitate them.
Interface to Dragon Naturally Speaking. I have additional code to go with this, at my-extensions-to-packages/voice/.

Compatibility etc

I've not yet tried to unpick everything so each piece can be used by itself in a vanilla emacs. I might get round to some of that sometime (I hope I will, but then I hope all kinds of things).

I've not tried any of these with Xemacs. I'd be interested to hear if you use any of my files successfully with it, and will mark them as such if you do, but I'm not planning to get into that myself for the time being.

[My emacs index] [My computing index] [My home page]

Contact me
Last modified: Fri Oct 12 23:06:16 IST 2007