From Vim to Spacemacs...?

3 minute read

A few days ago I decided to try out Spacemacs, an Emacs Kit designed around Evil Mode (vi simulation in Emacs) and a Leader key (Space, hence Spacemacs). The Spacemacs tagline says “the best editor is neither Emacs nor Vim, it’s Emacs and Vim!": let’s see how it feels!

What I want from my editor

  • vi motions :)
  • git integration
  • customization
  • file navigation and manipulation
  • seamless navigation between the editor’s splits and tmux panes
  • editing of lisp s-expressions

What I got with Spacemacs

First of all, a great documentation! In general, a tool already packed with a number of nice-to-have features and a consistent set of keybindings (more about this below).

First impressions

“Oh god, it’s so slow!"

I soon got through that stage by having a Emacs server running in the background (emacs --daemon) and connecting to it with emacsclient .!

A note about keybindings

All keybindings are organized around <Space> followed by a sequence of keys and they are grouped by functionality, so (for example) all git related keybindings are prefixed by <Space> g. This makes it much easier to remember them, and gives a very consistent experience! If you don’t remember a specific binding but you still remember its prefix, you can type the prefix and wait, a popup will show you all the defined keybindings… Also, <Space> ? will bring up a popup which allows you to search through all the keybindings.

Vi motions

Spacemacs is built around Evil Mode, an amazing simulation layer which gives all the vi motions I can think of. One small (intended) difference between standard vi motions and Spacemacs is in how s behaves in visual mode: it has been in fact remapped to some sort of vim-surround functionality… Here’s an example: say we have the word hello and we select it (ve), then we press s… Nothing happens because Spacemacs is still waiting for an input. If we now type " we get "hello". I’m still getting used to this but I like to have this easy way to surround a selection! Also, the original functionality is still available by using c.

Update: Unlike previously stated in this post, it is actually possible (and very easy) to use jk as the escape sequence but there was a mistake in my configuration. As suggested by @spacemacs (thank you, this tip made my day!), it can be set by adding the following expression to dotspacemacs/init

(setq evil-escape-key-sequence "jk")

Git integration

The git configuration layer provides a nice git integration (although git gutter is a bit buggy). Tip: time machine (<Space> g t) allows you to browse through the current file’s git history!


Out of the box, Spacemacs already provides some nice-to-haves (find file in project, surround words, easy motion): in addition, there are many configuration layers to choose from, so most of the times one line in .spacemacs is enough!… and of course, there’s elisp!

File navigation

Integration with projectile is packed under the prefix <Space> p, which provides features well known to CtrlP users like myself: for example, <Space> p f brings up a popup which lets your search a file everywhere in the project (projects are defined implicitly: the root is the directory which contains a .git repository) whereas <Space> p e brings up a list of recently opened files.

Seamless navigation between emacs and tmux

It’s as easy as adding one line to .spacemacs (the tmux configuration layer) and define the keybindings in tmux.conf. Done! The keybindings are available here: evil-tmux-navigator.

Editing of lisp s-expressions

I’m not a lisp ninja but I like to write some clojure code every now and then, and I grew used to paredit.vim, which happens to be a porting of Emacs own paredit to vim… Spacemacs uses evil-lisp-state to provide the same functionality, available under the prefix <Space> k.

Conclusions (for now)

So far I’m pretty happy about Spacemacs, also considering that setting it up to have a configuration very close to my vim’s took me just a couple of hours (mostly spent reading the documentation). This gave me enough motivation to try and make the switch: since yesterday, vim is aliased to emacsclient in my shell… Let’s see how this goes!