Moving to Helix
Helix (hx) is a modern modal editor built in
Rust. Unlike Vim/Neovim, Helix ships with a built-in LSP client, tree-sitter
integration, and multiple cursor support out of the box — no plugins required.
Why Helix over Vim/Neovim?
- Zero-config LSP — language servers are detected and configured
automatically from your project. No more
nvim-lspconfigor Mason. - Tree-sitter natively — syntax highlighting, text objects, and navigation all use tree-sitter. No plugins needed.
- Multiple cursors — a first-class feature, not an afterthought.
- Built-in file picker — fuzzy finding via
fzf-like interface, no Telescope. - Selection-driven editing — Helix flips the Vim model: motions extend the selection first, then you act on it. This is more intuitive once you adjust.
Key Differences from Vim
| Concept | Vim / Neovim | Helix |
|---|---|---|
| Normal mode | motions act immediately | motions extend the selection |
| Insert mode | i to enter | i enters insert (same) |
| Select then act | d2w (delete 2 words) | 2w extends selection, d deletes it |
| File explorer | Requires plugin | Built-in <space>f or :open |
| LSP | Plugin required | Built-in, auto-configured |
| Config | Lua / Vimscript | ~/.config/helix/config.toml |
| Language config | Per-plugin setup | ~/.config/helix/languages.toml |
Getting Started
1# macOS
2brew install helix
3
4# Arch
5sudo pacman -S helix
6
7# or build from source
8git clone https://github.com/helix-editor/helix
9cargo install --path helix-term
Configuration
Helix uses toml for everything. See the
official config docs.
Example ~/.config/helix/config.toml:
1theme = "catppuccin_macchiato"
2
3[editor]
4line-number = "relative"
5cursorline = true
6color-modes = true
7end-of-line-diagnostics = "hint"
8
9[editor.cursor-shape]
10insert = "bar"
11normal = "block"
12select = "underline"
13
14[editor.indent-guides]
15render = true
16
17[editor.inline-diagnostics]
18cursor-line = "warning"
19other-lines = "warning"
20
21[editor.lsp]
22display-messages = true
Language Configuration
Language servers, formatters, and tree-sitter grammars are configured in
~/.config/helix/languages.toml. See the
language config docs.
1
2[language-server.ty]
3command = "uvx"
4args = ["--from", "ty", "ty", "server"]
5
6[[language]]
7name = "python"
8language-servers = ["ty"]
9
10[language-server.rust-analyzer]
11command = "rust-analyzer"
12
13[[language]]
14name = "rust"
15language-servers = ["rust-analyzer"]
16auto-format = true
Key Mappings
Helix’s default keymap is well thought-out. See the official keymap docs.
Notable differences from Vim:
<space>is the leader key — opens a menu of common actions (file picker, LSP commands, buffers, etc.)venters select mode (equivalent to Vim’s visual mode)Ccopies the selection to the clipboardAlt+hjklmoves between split windowsg(go-to) +hmoves to the start of the lineg(go-to) +lmoves to the end of the line:opens the command mode (similar to Vim)
Switching from Vim
The biggest mental shift is selection-first editing. In Vim, you press d2w
— a command followed by a motion. In Helix, you press 2w to extend the
selection to the second word boundary, then d to delete the selection.
This means dd (delete line) becomes xd (extend to full line, then delete).
Vim muscle memory refresher:
| Action | Vim | Helix |
|---|---|---|
| Delete line | dd | xd |
| Delete 2 words | d2w | 2wd |
| Yank line | yy | xy |
| Change inside brackets | ci( | mi(d |
| Comment toggle | gc (with plugin) | gc (built-in) |
| Format file | gg=G (with plugin) | :fmt |
| Find files | Requires plugin | <space>f |
| LSP goto def | gd (with plugin) | <space>gd |
| LSP rename | grn (with plugin) | <space>r |
Other things
miwselect current wordvglselect to end of line (ghfor beginning of line)