Introduction
I’ve used Emacs for many years.
My fingers knew the native bindings by heart. C-a, C-e, C-k, M-f,
the whole choreography of chords. I never really questioned it.
Then I moved to Doom Emacs.
Doom is built around Evil, the Vim emulation layer. Vim keybindings are the
default, on purpose. And the first thing I did was turn them off.
It was pure habit. I had years of native muscle memory and no intention of
throwing it away to relearn how to move a cursor.
So for a while I ran Doom the “wrong” way: a Vim-first distribution with Vim
disabled.
Later, I changed my mind.
Giving Evil a Real Chance
At some point it felt silly to run Doom against its own grain.
The whole project is designed around Evil. Most of its polish, its defaults,
its bindings assume you’re editing the Vim way. By keeping native bindings I
was fighting the tool instead of using it.
So I flipped the switch and committed to it.
The beginning was rough.
There’s a whole grammar to learn. Modes. Operators. Motions. Text objects. A
language where pressing keys in the wrong order does nothing useful, and where
the “obvious” Emacs reflex is suddenly wrong.
For a few days I was slower at everything.
Then, slowly, it started to make sense. And once it did, I kept it. This is
still how I edit today.
One thing matters before the bindings, though.
What I switched to isn’t really Evil. It’s Doom in Evil mode, which is a
very different, much friendlier thing.
It’s Doom, Not Raw Vim
This distinction took me a while to appreciate.
Evil on its own is the engine: it teaches Emacs to speak Vim. But raw Evil is
spartan. Doom wraps it in a coherent set of defaults, a leader key,
discoverable menus, and dozens of small integrations that make the modal
model pleasant instead of merely functional.
which-key is the clearest example. Start a key sequence, pause, and Doom
shows you every possible continuation in a popup. You’re never stranded
wondering what comes next.
So when I say I switched to Evil, I really mean I switched to Doom’s curated
take on it. I don’t think I would have stuck with bare Evil. The polish is
what kept me.
The Mental Model That Made It Click
The breakthrough wasn’t memorising bindings.
It was understanding that Vim editing is a small language: a verb, then
something to act on.
You combine an operator (the verb) with a motion or a text object
(what to act on):
d — delete
c — change (delete, then drop into insert mode)
y — yank (copy)
And the things to act on:
w — to the next word
iw / aw — “inner word” / “a word” (with surrounding space)
i) / a) — inside / around parentheses
ip / ap — inside / around a paragraph
Once that clicks, you stop memorising commands and start composing them. dw,
ci), yap — none of these needed to be learned individually. They fall out
of the grammar.
The other revelation was the dot command.
Pressing . repeats your last change. Edit one word, jump to the next
occurrence, press ., and you’ve made the same edit again. It sounds trivial.
It’s one of the things I’d miss the most.
The Editing Bindings I Reach For Daily
These are the ones that earned a permanent place in my hands.
Acting on the word under the cursor:
daw — delete a word (and its surrounding space)
caw — change a word (delete it and land in insert mode)
diw — delete the inner word, leaving the spaces
ciw — change the whole inner word
cw — change from the cursor to the end of the word
Working with indentation, which is wonderful in indentation-heavy languages:
dii — delete everything at the current indentation level
cii — change that whole block
Doom ships the indentation text object (ii / ai), so these compose just
like the word objects.
Commenting:
gcc — toggle the comment on the current line
gc + a motion — comment a region, e.g. gcap to comment a paragraph
And for shuffling things around, there’s a surprising amount you can do with
operators and the p (paste) register. The Vim wiki has a
good reference on swapping characters, words and lines
that I still go back to.
Getting Around
Motion is where the modal model really pays off, because once you’re in
normal mode the whole keyboard is navigation.
Jumping to a line is just the line number followed by G:
That puts the cursor on line 30. (:30 followed by Enter does the same.)
Within a line, f and t are indispensable:
f( — jump forward to the next (
t( — jump just before it
; and , — repeat that jump forward and backward
But the binding that genuinely changed how I move is Doom’s avy integration,
hiding under the gs prefix:
gss — type a couple of characters and jump to anything visible on screen
gsj / gsk — jump visually to a line below / above
gs SPC — jump to any character, anywhere in the buffer
After a while, reaching for the mouse or hammering arrow keys feels slow.
For code, Doom’s LSP layer adds the usual suspects:
gd — go to definition
gr — find references
K — show documentation for the symbol under the cursor
Doom’s Polish: The Leader Key
This is the part that has very little to do with Vim, and everything to do
with why Doom is comfortable.
Almost every non-editing action lives under the SPC leader key:
SPC f f — find a file
SPC b b — switch buffer
SPC p p — switch project
SPC w — window management
SPC s — search (in buffer, project, etc.)
SPC g g — open Magit
SPC : — run a command (the old M-x)
Because of which-key, I never had to memorise these up front. I’d press
SPC, read the menu, and drill down. The bindings stuck on their own through
repetition.
And when I want to know what a key does in the current mode, the bindings help
is right there under SPC h b — a searchable list of everything currently
bound. It’s how I discovered half of what I now use.
What I Didn’t Fully Convert
I’m not a purist about any of this.
A few Emacs reflexes survived the switch, simply because my fingers refused to
let them go.
The big one is C-g. It’s my universal “get me out of here”, and it works
everywhere in Doom, so I never replaced it. Leaving insert mode is the clearest
case: I still do it three different ways depending on where my hands are —
Esc, jk, or C-g. I never forced myself to settle on one.
In insert mode I also kept C-a and C-e to jump to the start and end of the
line. That’s an Emacs-ism rather than a Vim one — Doom keeps those motions
alive in insert state — and it’s so wired into my hands that switching to a
normal-mode motion just to reach the end of a line never felt worth it.
And every so often I still reach for M-x instead of SPC : to run a command.
Old habits.
On top of that I keep a handful of small custom bindings, and they fall into
two telling camps.
Some of them duplicate what Evil already does. I bound my own commands to
duplicate a line and to change the case of a word, even though Evil has
perfectly good answers — yyp to duplicate a line, gUiw / guiw to upper-
or lower-case a word. I kept the Emacs versions purely out of reflex.
Others have no Vim equivalent at all, and those I would never give up.
Narrowing is the clearest example: focusing the buffer on a single region or
function is a pure Emacs power, so I gave it a proper home under the leader.
(map! :leader
:desc "Narrow to region" "n r" #'narrow-to-region
:desc "Narrow to defun" "n f" #'narrow-to-defun
:desc "Widen" "n w" #'widen)
That’s the honest part of the story. I didn’t replace one orthodoxy with
another. I took Doom’s Evil as a strong default and bent the last few percent
to fit my hands.
If anything, that’s the lesson: the goal isn’t to edit like Vim, or like
Emacs. It’s to edit like you, on top of sane defaults.
Resources
A few things that helped me far more than any single cheat sheet:
Was It Worth It?
Yes — with an asterisk.
It was worth it because, after the rough first days, modal editing genuinely
made me faster: the verb-plus-object grammar turns most common edits into a
couple of deliberate keystrokes.
The asterisk is that “switching to Evil” undersells what actually happened. I
didn’t move to Vim. I moved to Doom, resisted its way of working for a while,
then finally let it do what it was built to do.
The grammar fought me. Then it made sense. And it stuck.