This post describes my method to learn Emacs native keybindings from an ex-Vimmer’s perspective. It’s an extension from a Reddit post.
Evil-mode journey
My Emacs journey started with Spacemacs. At that time, I had the misconception that Emacs has lengthy and incomprehensible keybindings, so without a second thought, I chose to go with Vim-bindings, which I used for 6 years and even read a book about. Spacemacs is surely a great project, opening up all the goodies of Emacs to a Vimmer. The iconic mnemonics system is effective, at least at the very beginning. However, over time I found that:
-
Mnemonics requires more key presses:
SPC f f
(3) vsC-x
C-f
(2 keys, or 2.5?),SPC h d f
(4) vsC-h f
(2). Most search tools likeag
,rgrep
requires 4 key presses. Most of the time we also need an extraESC
to enter normal state. Mistype rate is higher as a result, and gets frustrating quickly. -
Commands from various packages are placed under same key prefix
SPC letter
, making it difficult to form an overall picture of what things each package does/can do, which is essential for customization in the long term. -
The consideration of how commands should be organized evolves over time, so user needs to adapt accordingly. I personally recommend my Spacemacs friends to watch Spacemacs ABC Series, it’s gorgeous, but recorded 3 years ago, many keybindings have changed since.
These problems gave me a headache, urging me to write my own config. I could
have tried evil-mode
, but having seen too many evil-mode-related compatibility
issues in Spacemacs project, I did not think my poor Elisp skills can support me
through the extra mess added on top of writing a config from scratch.
So the dilemma in front of me is: continue with Spacemacs mnemonics, or go with Emacs native bindings? I feel lucky now that I chose to give Emacs binding a try.
Demystifying Emacs bindings
There are countless jokes and comics on Emacs’s seemingly ridiculous keybindings. Good laughs indeed, but at the end of day, it’s not incomprehensible. It has well-defined conventions listed at:
In summary, the general rules are:
C-x
reserved for Emacs native essential keybindings: buffer, window, frame, file, directory, etc…C-c
reserved for user and major mode:C-c letter
reserved for user.<F5>
-<F9>
reserved for user.C-c
C-letter
reserved for major mode.
- Don’t rebind
C-g
,C-h
andESC
.
I find this convention extremely useful, as it highlights where to
look at when reading Emacs bindings. For example, in org-mode
, the
command org-insert-link
is bound to C-c
C-l
. At first sight it seemed
complex: I need to remember to press Control
(“not Alt
"), and keep it
pressed, and pressed l
again… but the idea is actually short:
-
I’m trying to call a major-mode specific command (
org-*
), so I should pressC-c
first. -
Major-mode commands should use
C-letter
. -
(Same-old) mnemonics:
l
ink!
Then the only thing I need to remember is actually just: l
. A much
more succinct mindmap, isn’t it? Longer bindings are no more
daunting. For example, in ESS (mode for statistical languages such as
R, Stata), ess-load-library
is bound to C-c
C-e
C-l
. Seems long, but
all it says is just 2 keys with mnemonic: l(oad)
under e(xtra)
in
major-mode! All C-c C-{letter}
-like bindings became just a letter
away.
With these thoughts in mind, I find it much easier to understand
bindings such as C-x C-f
, C-x C-s
, C-c C-n
(normally assigned to
“(n)ext block/headings/title” in major-mode), C-c C-k
(normally
assigned to (k)ill-related commands in major-mode), C-c M-w
(copy a
syntactic unit in major-mode), etc. You will certainly notice more of
these patterns.
Of course there are exceptions: in the above example, the companion command for
org-insert-link
is org-store-link
, which is suggested to bound to C-c l
,
occupying one of my customized binding space. But now at least 1) I know why
it’s not bound by default, and why it suggests this binding; 2) I know I have
the freedom to bound to other keys. That’s where one’s customization starts off.
Dipping the water (or making the jump)
The debate over keybinding style is a never-ending one. Coming from a Vim background, I do miss the compositionality it provides. In terms of editing only, Vim is hard to beat.
Turning to Emacs, though, reveals to me a different philosophy where commands are first-class citizens. It seems to me that, instead of only asking “how do I manipulate these text characters”, Emacs is focusing more on “what commands I should use in this context to achieve my goal”. It emphasizes on being familiar to what a package does exactly, which commands it provdes, and what each command do, then combine them in a memorable way. Keybindings are merely representation to flows of thoughts.
I find this philosophy resembles much to UNIX’s “do one thing and do
it well”. With that thought, I started to study each package in depth,
and assign them bindings that fit in my workflow. For example, these
are the packages I assign to utilize C-c letter
space: p
for
projectile
, g
for ma(g)it
, m
for mu4e
, r
for visual-(r)egexp
, w
for
eyebrowse
(used as workspace), etc. With the keybinding convention,
commands tailored for different purposes are arranged in a consistent,
meaningful and mnemonic way, reducing mental efforts greatly. My
editing flow then becomes chaining commands with intentions: “I wish
to open the file (C-x C-f
), regenerate the project tags (C-c p R
), and
take a look at magit status (C-c g s
)”.
To wrap up, I like to perceive the process of learning keybindings as
acquainting oneself with the layout of a toolbox: Calling a command is
like knowing where your tool lies in the box, and a clear layout
improves productivity vastly. Native Emacs bindings is the layout
designed by the toolbox creators. It’s actually comprehensible and
reasonable. It’s mnemonic at many aspects. Its C-c
bindings for
major-mode is just the same idea of leader key. I haven’t mentioned
the normal navigation keys, but if you are someone working with
terminals all day, its consistency with terminal bindings is also a
huge plus.
Hope these are useful for new Emacs users, or Vimmers/Spacemacsers who had never tried Emacs native key bindings.