I use Emacs. However, unlike some Emacs users, I don't treat it as a
religion. In fact, I'd rather be using a more "modern" IDE; one that
understands my code on a deeper level and provides things like refactoring
tools, integrated debugging, and "view method implementation" that work
reliably and don't require weeks of configuration effort to use. One
that uses modern UI conventions instead of arcana from the 70s so that my
friends who are
not emacs-heads can quickly wrap their heads around
what's going on on my screen, and perhaps dare to touch my keyboard.
However, even if one is keen to do it, switching away from Emacs is a big
deal. I see lots of editors that advertise "emacs
keybindings". While I appreciate the effort, these features always
look like someone who has
no idea how to use Emacs worked through
some kind of quick cheat-sheet of features like "keybinding for Save",
"keybinding for Save As", "keybinding for Close Window" and just added
them one after another. Sometimes, with no regard for whether these
keys conflict with other shortcuts! (I'm looking at you, gnome
"key-theme".)
Do you think you can write an editor which can replace Emacs for me?
Here are a few features, taken both from my years of customizing Emacs to
meet my needs and some basic features in Emacs itself that non-natives
never seem to understand.
I'm leaving out the extremely basic stuff like "syntax highlighting" and
"automatic indentation" since most editors do OK on those fronts already.
These are the things that I find have been subtle, in that they're
broken almost everywhere outside of emacs.
Can you do what I mean when I press the "go" button?
When I
edit code, I repeat these steps endlessly:
- Edit a test file.
- Run the tests.
- Edit an implementation file.
- Run the tests.
In order to do this in my current emacs setup, I open my
implementation file, then open my test file, then press F9. Then, I
edit a little bit, and press F9 again. Then, I switch to the
implementation file, type a little bit, and press F9 again - Emacs knows
which tests to run, because the implementation file has an annotation in
it which describes the test-cases that are associated with it.
When I'm done, I push F5 and it immediately jumps my cursor to the error
that i'm working on.
This works for me in Java, in C, and in Python. I've got a little
bit of custom emacs-lisp code that I wrote to do each of them. I'm
willing to write a little more. But, is it very easy in your editor
to grab a global keybinding? To write a plugin in 4 or 5 lines of
code that just formats a command-line string to run? To parse the
output of a subprocess? To visit a file and line number without
requiring further user interaction?
Can I reach the thing I need to work on fast?
Let's say I'm
working on a file called "foo.c". I want to open "bar-baz-boz-qux.c"
in the same directory. In Emacs, this is probably just "control-x
control-f b <tab> <enter>" - maybe a few more letters if there
are other "bar-" files. Do I need to hit more buttons than that in
your editor? Do I need to reach for the mouse? Do I need to
navigate the inefficient-even-from-the-keyboard GTK file dialog?
Now, let's say I've got the file "foo.c" open in several different
branches of the same project, and I want to quickly alternate between
them, display them side-by-side, etc. In Emacs, "C-x C-b" will bring
up a list of every open file, and as I type its name, the list is reduced
to only those who match what I've typed so far. So if, for example,
I type "foo.c", I'll get all my "foo.c"s. I can cycle between them
with C-s until I get the one that I want.
I don't want to hunt around and click on a tab-bar or hit "next next next
next". I just want to type in a little bit of the file name and have
the editor figure the rest out for itself.
Can I use it on Mac, Linux, FreeBSD, Solaris, and Windows?
Emacs
is extremely portable. Every operating system I want to work on (and
many, many that I hope I never do) can run it. I don't want to
invest the energy to learn a new editor if I can't use it everywhere.
Can I use it remotely over the internet?
Collaboratively?
You can cheat on this one: if you can run in a
terminal (and under
Screen), then you get both of
these for free. Emacs cheats that way. But if you
can't
run in a terminal - no, I'm sorry, VNC is not an acceptable
substitute. It doesn't perform adequately over the internet and it
probably never will - as the internet gets faster, the average display
gets bigger and has more colors on it.
Your editor probably can't run in a terminal. So you'd better give
me a way to pair-program with people over the internet and a way to access
the editor on my desktop machine when I'm away from home.
Can I see whitespace?
I don't like to leave invisible droppings in
files when I edit them. I'd like to be able to see trailing
whitespace, highlight it, and eliminate it. I'd like to be able to
tell if I have any tabs in my files (python does not like that very much).
Do I need to carefully juggle my clipboard - or do you have a "kill
ring"?
Normally, if you cut some text, then cut some other text, you
lose the first text — unless you use "undo" or something like that and
screw up your editing state.
In Emacs, when I cut five or six different pieces of text, and I go to
paste them, I can paste
any of them. I don't have to
carefully remember what's on my clipboard, because the last 60 or so
things that I cut or copied are around in case I need any of them.
Do I need to carefully remember where I was and scroll around to get
back there - or do you have a "mark ring"?
Emacs has what amounts to a
"back button" for your text editor. If I edit something interesting,
go to another window, go to another project, and then want to jump back a
few steps, I can easily do that.
This is particularly helpful when, for example, inserting some import
statements. I'm in the middle of a function in the middle of a big
file. I want to use the Foo class, but it's not available yet.
So, I jump to the beginning of the buffer, type "from baz.bar.foo
import Foo" and then hit "C-u C-space" to jump back to the middle of that
function I was working on. "C-x C-space" does something similar, but
can even take me to different files.
Can you do smart word-wrapping?
/**
* When I have a long documentation comment in ActionScript,
JavaScript or
* Java, Emacs will helpfully wrap it like this. If I make
changes in the
* middle and then re-wrap it, it stays wrapped and helpfully adjusts
the
* placement of the asterisks along the left-hand side. Can
your editor do
* this?
*/
# But when I have a comment in Python, it's formatted like this. I
don't have
# to tell Emacs anything about the different comment styles.
-- For that matter, it can understand and properly format SQL comments
too.
-- And C/C++, and Ruby, and PHP, and more.
"""
If I format code inside a docstring, it flows properly too. Granted,
there are
a lot of bugs in this particular case in the stock Emacs, but since it
works
everywhere else I have written some workarounds. (You could always
work around
it by inserting some extra blank lines before wrapping, but that
always
bothered me.) Can I customize how your flowing works if I don't like
it?
"""
Is there version-control integration?
If I'm editing a project
that uses bzr, darcs, git, svn, hg, perforce, or cvs, I can get a nice
"status" page as a jumping-off point in Emacs to show me which files are
in version control and what files I've edited. I can update, commit,
pull, push, and diff out without leaving the editor. Can your editor
do that? And I don't just mean, can your editor do that for SVN.
Does it support all of the systems I just named and a few others for
good measure?
Can I tell what I'm working on?
I don't like having to scroll
around to figure out what function I'm in the middle of when I forget.
I work on a lot of code, and I browse a lot of code, and sometimes
if I'm in the middle of a 200-line-long function I can't see the class or
the function name. Emacs has a feature called "which-func-mode"
which allows me to glance at the bottom of the screen and instantly know
what function I'm working on. Fancy, glowy sidebars with tree-views
of my whole source file and inheritance hierarchy are great, but can I
always see the name of the class and the method that I'm working on
now? Even if there are so many other methods on that class
that the fancy method list on the left has to scroll?
Last but not least...
Can I code for it?
I'm a programmer and I need a programmer's
editor. I don't want to write giant, heavyweight plugins; I want to
be able to quickly toss off a snippet of code which modifies the editor.
But, I'm not an IDE developer. I don't want to write a giant
plugin; I want an editor which lets me organically grow my own
modifications when I find myself doing some task frequently.
For example, I have my own "snippets"-type module, "quick-hack mode",
which does a ton of clever-clever things like inserting
def (self):
"""
"""
when I type "def" inside of a "class" block. (of course
the "def" is omitted otherwise).
I have a hotkey to turn this off in case other people find it annoying —
and it's difficult to be ambivalent about this mode, you either love it or
hate it: it's a very personal thing, and I don't expect your editor to
support it directly. This mode was developed after years of
observing my own peculiar tics while editing and crafting conveniences to
support that and free me from distractions.
Since developing this kind of support code isn't my main interest, coding
needs to be more than possible, it needs to be easy. I need
interactive help and the ability to load a brief snippet of code into the
editor without restarting it; a reasonable debugger so when it blows up in
my face I can at least sort of tell why.
Do you feel lucky? Well, do you?
Emacs has a lot of
features. You don't have to replicate them all. But if you
want me and the millions like me — okay well maybe not millions, but
it's not just me either — to switch to your shiny new editor, you'd better
be doing all of these things
and doing
at least one or two
other totally awesome things that emacs can't do.