Helix - a 3-month review and tips

Helix is a modal text editor for the terminal, like Vim and Neovim, but with its own twists. I’ve been using it daily for the past three months, so I now have thoughts to share about it.

(I was already using it on a casual level for about a year now, but since I code on a remote server for work, this was a great chance to really use it well.)

The stuff I like

I like Helix a lot! I first tried it out because I was tired of how barebones Vim is without thick configs and plugins, and the need to maintain all that.

  • Powerful features are built-in, no plugins required
  • Good settings by default, reducing the amonut of configuration needed
  • Config files are purely declarative, instead of being actual Lua scripts
  • No confusing distinction between “buffers” and “tabs”, like Vim/Neovim
  • Multi-cursor!
  • Strong focus on interactivity, for example…
    • If multiple actions share key sequences, they automatically become a menu, so you can see what your options are. For example, pressing g reveals a menu listing what you could press as the second key in the sequence.
    • Key sequences are “backwards” compared to Vim. You select a range of text first, then you select an action. For example, deleting a word is wd instead of dw. This way, you can more interactively choose your editing actions.

Some issues I’ve had

Not everything is perfect. I’ve encountered some problems trying to go all-in with Helix for writing code. I don’t think any of them really break my desire to keep using it, though.

  • Glitchy appearance when running in Byobu/tmux, though I found some fix online for this
  • When the setup process for a language server works, it’s a breeze, but (uncommonly) when it doesn’t, it’s back to cargo cult configs like Neovim
  • Sometimes, language server suggestions are slow to appear, or even complete (though this may be a language server-specific issue)
  • The HTML editing experience isn’t as good as Codium’s. What I really like from Codium is the “wrap selection with HTML” option. I couldn’t find anything like that for Helix.
  • There’s no way to format only a selected range of text. Only full-file formatting.
  • Sometimes, tooltips cut off the bottom of the doc comments
  • I wish that when splitting windows, each split got its own set of buffers instead of them all sharing the all the open buffers. I find it hard to juggle what’s open where with the buffer list being global.

Cool keybinds

Some cool keybinds I learned during this adventure of going hardcore with Helix. I’m skipping the basic keys and Vim-inherited stuff here.

  • m for Match menu
    • ms(: Match Surround, with parentheses
    • mi[: Match Inside square brackets
  • :reflow on multiple lines of comments to smartly redistribute text to fit within 80 columns
  • binding Caps Lock to Escape is really nice!
  • g for Go menu
    • gw (Go Word) to choose any word on screen to jump to
    • gr (Go References) with LSP support, see all references to a variable
    • gd (Go Definition) to go to where a class, template, etc. is defined
  • A-i & A-o: smartly grow/shrink selection, with LSP support
  • C-i & C-o: teleport cursor based on history
    • handy in long files: move way high up to edit something, then press C-o to jump right back to where you were before that
  • space-w or C-w for window/splits menu
    • then v to open a split on the right
  • space menu has lots of nice things
    • space-/ is a recursive ripgrep-like search starting from the cwd, also showing a preview window on the right