14 Dec 2018

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) vs C-x C-f (2 keys, or 2.5?), SPC h d f (4) vs C-h f (2). Most search tools like ag , rgrep requires 4 key presses. Most of the time we also need an extra ESC 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:

Emacs Key Bindings Convention

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.

reserved for user. - reserved for user. C-c C-letter reserved for major mode. Don’t rebind C-g , C-h and ESC .

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 press C-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.