It may be over, this, one of my longest relationships. For nearly 20 years we've been faithful partners, ever since I was first introduced my sophomore year of college. No, I don't mean Perl, because this pre-dates my love of even Perl by several years. No, I fear my relationship with (X)Emacs may be coming to an end.
It was so wonderful at first, that rush of New Relationship Energy. I was introduced to emacs by a few older CS students I'd befriended, one of whom had left MIT to return to Oklahoma because the student loans were starting to scare him. OU didn't teach Lisp (or Scheme), so he channeled his fondness for these into emacs and emacs evangelism. I was teased mercilessly for my simplistic use of vi, and repeatedly tempted by emacs' many and varied features. Programmability not the least of them. Mind you, we didn't have vim then. Heck, elvis hadn't even entered the building, let alone had time leave. So I was lured in by the promise of excitement and exploration emacs offered.
For years, I've faithfully used emacs, then XEmacs. I've watched my customizations grow from one meager e-lisp file to a set of six files (not counting the master ~/.xemacs/init.el file and the generated files like ~/.xemacs/custom.el). Plus literally dozens of other files I've collected, some of which eventually ended up in the core distribution (like cperl-mode). Possibly my favorite of the small and subtle additions would have to be the bindings for <Home> and <End>:
(defun home () "Home - begin of line, once more - screen, once more - buffer." (interactive nil) (cond ((and (eq last-command 'home) (eq last-last-command 'home)) (goto-char (point-min))) ((eq last-command 'home) (move-to-window-line 0)) (t (beginning-of-line))) (setq last-last-command last-command) ) (defun end () "End - end of line, once more - screen, once more - buffer." (interactive nil) (cond ((and (eq last-command 'end) (eq last-last-command 'end)) (goto-char (point-max)) ) ((eq last-command 'end) (move-to-window-line -1) (end-of-line) ) (t (end-of-line) ) ) (setq last-last-command last-command) )
They aren't mine, but I happily added them. With these, <Home> will go to the start of a line on the first press, to the top left corner of the buffer on the second, and to the very start of the file on the third. Very handy, much less RSI-worthy than ESC-<. And <End> does the same thing, only going end-of-line, bottom-right-corner, end-of-buffer. The thing is, I have literally dozens of these, if not into the hundreds, that I've accumulated over the past 20 years. Some I've written, most I've gotten from newsgroups and the like, as people shared their favorite little hacks.
But I've grown, matured, and XEmacs has been slow to keep up with the world around us. Even with the MULE package installed, I have a headache trying to type in Cyrillic in a buffer. And when I save it, it usually mangles it. I try to set the encoding for the buffer, but while it has nearly 100 encodings to offer me, none of them are UTF-8. The GUI is clumsy, even in XEmacs which forked from emacs specifically to address GUI issues that the emacs base was not interested in dealing with. Handling of fonts is just plain retarded, refusing to set a face to certain size values even when I know that the font itself is TrueType, and is coming from the Xorg font server as available in pretty much any size you ask for. Even the GTK+ port fails me... it's in worse shape than the older one. It's linked directly to the GTK+ environment (and thus their improved font handling), and the interface is still retarded, especially in the handling of fonts.
Granted, for such a sizeable application XEmacs' memory footprint is pretty small. But when I look at the other tools available to me-- jEdit, Eclipse-- it just can't keep up. Mixed-mode editing? Only as a clumsy hack. Integration with your desktop? Not even remotely. Sure, Eclipse is a bloated, monolithic IDE, but I can easily switch to something lighter-weight and have the same basic key-bindings when I have smaller tasks.
Though it pains me to turn my back on 20 years of friendship, I just don't know how much more time I can waste trying to work around these things. The cases where I have to go to an alternative editor just because XEmacs can't handle the file in question grow almost daily. I think it may be time to put XEmacs on the shelf, alongside the class ring, fraternity jersey and other relics of my college days.