My journey of mastering Helix editor
How I learned to master Helix editor as a Vim user
I first heard about Helix about two years ago while learning Rust. I tried picking it up because of its batteries-included features, but kept going back to Vim — switching key bindings overnight is like switching from driving on the left to driving on the right. Then sometime in 2026, tired of installing a dozen plugins just to turn Vim into an IDE, I forced myself to learn Helix inside out. It paid off. I can now comfortably use it as my daily driver. Below are the lessons I collected — things that might help anyone else looking to master Helix.
Navigation#
| Purpose | Action |
|---|---|
| Move to beginning of line | g h |
| Move to start of line (non-blank) | g s |
| Move to end of line | g l |
Note: these are two-key sequences — g enters goto mode, then the second key performs the jump.
Selection / Surrounding#
| Purpose | Action |
|---|---|
| Change word under cursor | miwc (select inside word, then change) |
| Keep only the primary selection | , |
| Collapse to a single cursor | ; |
Replace surrounding character from { to [ | m r { [ |
| Add surrounding character | m s <char> |
| Remove surrounding character | m d <char> |
| Case-insensitive replace in search | (?-i)word |
| Multi-cursor select via search | /<word> Enter s (select all matches) |
| Vertical selection (add cursors below) | position cursor, v, C, then move to select |
| Vertical selection (add cursors above) | position cursor, v, Alt-C, then move |
| Undo | u |
| Redo | U |
| Select to end of file | v g e |
| Select to end of line | v g l |
| Select to start of line | v g h |
| Select to start of file | v g g |
| Delete to end of line | v g l d (or t<enter>d) |
| Swap current line with next | select first line with x, then d p |
| Comment / uncomment selection | Ctrl-c |
| Vertical split | :vsplit or Ctrl-w v |
| Horizontal split | :hsplit or Ctrl-w s |
| List files containing pattern | Space / then keyword |
| Select column and yank-join | C... v left/right, :yank-join, navigate, p |
LSP#
| Purpose | Action |
|---|---|
| List references | g r |
| Go to definition | g d |
| Jump back in jumplist | Ctrl-o |
| Jump forward in jumplist | Ctrl-i |
Shell & Misc#
| Purpose | Action |
|---|---|
| Insert shell output before cursor | :insert-output <cmd> (escape % as %%) |
| Open debug log | :open-log |
| Run shell command | :sh <cmd> |
| Clear command output from screen | Ctrl-c |
| Sort selected lines | select lines, Alt-s (split on newlines), :sort |
| Check language health | hx --health <language> (e.g. hx --health rust) |
Example — insert today’s date:
:insert-output date +%%Y-%%m-%%dplaintextMy ~/.config/helix/config.toml:
theme = "tokyonight"
[editor]
true-color = true
[keys.normal]
"C-A-o" = "expand_selection"
"C-A-a" = "shrink_selection"
[editor.soft-wrap]
enable = true
wrap-indicator = "↪ "tomlMy ~/.config/helix/languages.toml:
[[language]]
name = "javascript"
auto-format = true
[[language]]
name = "sql"
language-servers = ["sqls"]
[language-server.sqls]
# go install github.com/sqls-server/sqls@latest
# and add ~/go/bin to $PATH
command = "sqls"toml