Ubiquitous Emacs

I use emacs. Like almost all of my computing choices, it's rooted idiosyncratically in my early Linux experiences -- I use emacs (probably) because when I was 12, vim was mentioned but not covered by my linux reference and therefore seemed cryptic; emacs, though, had the menus (via F10), even at the terminal, and acted more like programs I was used to, thanks to its control+character sequences. Over time, I've gotten used to having it as my editor. It got me through my nightmarish C++ projects, it's helped me keep my python clean, and it even has a Wiki mode that helped me organize my thesis. Since I started using it, I had a vague idea of how customizable it is, but until recently, everything (reasonable) I've wanted emacs to do, it has done.

Now, however, I'd like to start a project to give a little back to emacs. A few months ago, I came across Steven G Harms's blog entry on the philosophical difference in emacs and vi users. He makes a charmingly insightful point that it's an issue of worldview, and I recommend the entry if you're geeking out. He also claims that "most emacs users will admit, without their custom modifications to the emacs reality ( aka a user�s .emacs file ) emacs doesn�t work like they like it to, or like they expect, it�s much less portable." This seems like a strange problem to have, though; I can store my pictures remotely, take my bookmarks with me, and edit documents online. I should be able to take my .emacs file with me, too. Emacs can even have an integrated web browser, so it seems like it should be a solvable problem.

I've been thinking about this for a few months, but not seriously. However, a few things happened to make me want to serious solve this problem. Prior to BarCamp, I was working out my last, neat JavaScript demo, and in begging help with a silly bug in chat, someone mentioned that my code wasn't idiomatic; I was using for loops instead of the map method of my arrays. And he was right; I write JavaScript a lot more like C++ than lisp, mainly because I know C++ and not lisp. But, JavaScript is a functional programming language, even if it looks like C++. Then, at BarCamp (which was awesome), I learned about Uncommon Web, which uses lisp to do unholy things with web applications, similar to seaside and Smalltalk. The talk, combined with the previous night's realization that my lack of functional programming experience is making my javascript and python weak and weird, has me wanting to learn lisp. And if I'm going to learn lisp, I'm going to need a project, so why not make emacs more portable?

Although I'll write up a better treatment sometime soon, the basic idea isn't too complicated. I'd like to write a web app that hosts emacs extensions and generates .emacs files for users. A user of this site would select the extensions that s/he wants to use (e.g., Wiki mode, slime, python mode, nxml) and add custom code that should be in the .emacs file to a customization profile. Then, when that user goes to a new computer, s/he could request a bootstrapping .emacs file that would, when emacs loads, contact the web application and download all of the user's extensions and modifications, including an extension to ease resynchronizing. Thus, a user would just need to have an account on my site and download one file and then would have his/her customized emacs, readily available on any computer. In an ideal world, I could provide some version control, bug tracking, and hosting for emacs extenders to develop their work.

I'm currently learning some lisp to see if this is feasible. I do, thankfully, already have a tentative name for the project: umacs (for Ubiquimacs, for Ubiquitous Emacs). It's a distraction from moving target, but I like having a few projects to think about at a time; as one gets stuck, I can move to the other while ideas gel. Plus, I'm hoping for synergistic effects from learning lisp -- in theory, it should help my python and javascript. Working with Uncommon Web will, I also hope, increase the sophistication of my understanding of web applications. At worst, it'll be interesting. If you know of any similar projects, please do comment; although I want to learn, I don't want to duplicate someone else's efforts.


  • Changed "Javascript is an ML language" to "Javascript is a functional programming language," thanks to an attentive commenter who noticed the confusion; I must have been rhyming or looking at too many wikipedia tabs at once.
  • map is a dojo idiom, not a javascript idiom.