Helix
Modern modal editor inspired by Kakoune/Neovim with built-in LSP.
Official WebsiteFeatures
Installation
brew install helixpacman -S helixcargo install helixWhy Use Helix?
Helix is a "postmodern text editor" that adopts the "Selection-First" philosophy from the Kakoune editor. It features a "batteries included" design with LSP, Tree-sitter, and multi-cursor support out of the box, with no configuration needed.
Selection-First
Consistent "select-then-operate" paradigm. Visually confirm what changes before executing operations.
Built-in LSP
LSP support without plugins. Code completion, jump to definition, and refactoring work out of the box.
Tree-sitter Included
Accurate syntax highlighting, smart selection, and code folding with no configuration.
Multi-cursor
Edit with multiple cursors simultaneously. Splitting selections into multi-cursors is intuitive.
Installation
# macOS (Homebrew)
brew install helix
# Ubuntu/Debian (official PPA or binary)
sudo add-apt-repository ppa:maveonair/helix-editor
sudo apt update
sudo apt install helix
# Fedora
sudo dnf install helix
# Arch Linux
sudo pacman -S helix
# Install via Cargo (Rust)
cargo install helix-term --locked
# AppImage
curl -LO https://github.com/helix-editor/helix/releases/latest/download/helix-*.AppImage
chmod +x helix-*.AppImage
# Check version
hx --version
# Health check (verify LSP and Tree-sitter status)
hx --healthSelection-First Paradigm
Vim/Neovim uses "operation → target" order (e.g., dw = delete + word), while Helix uses "select → operate" order (e.g., wd = select word + delete).
Vim Operation Order
dw - Delete word (d=delete, w=word)ci" - Change inside quotesyap - Yank a paragraphHelix Operation Order
wd - Select word → Deletemi"c - Select inside quotes → Changemapy - Select paragraph → YankMode Explanation
Helix has multiple modes with different behavior from Vim.
Normal Mode (Default)
Mode for navigation and selection. Always has something selected (at least one character).
Esc key to return from other modesInsert Mode
Mode for entering text. Works like a standard editor.
i (insert before), a (insert after), o (add line below)Select Mode
Mode for extending selections. Movement commands expand the selection.
v key to enter (selection inverted from Normal)Picker Mode
Fuzzy finder for selecting files, commands, symbols, etc.
Space+f (files), Space+b (buffers), etc.Basic Operations
# Open a file
hx filename.txt
# Open multiple files
hx file1.txt file2.txt
# Open directory (file picker)
hx .
# Open and jump to specific line
hx filename.txt:10
# Open tutorial
hx --tutor
# Check configuration file location
hx --healthFrequently Used Commands
Movement (Normal Mode)
| Key | Description |
|---|---|
h j k l | Move left, down, up, right |
w / b | Move to next / previous word (select) |
e | Move to end of word |
gh / gl | Move to start / end of line |
gg / ge | Move to start / end of file |
Ctrl+d / Ctrl+u | Scroll half page down / up |
mm | Move to matching bracket |
:number | Jump to line number |
Selection
| Key | Description |
|---|---|
v | Switch to Select mode |
x | Select entire line |
% | Select entire file |
s | Search in selection with regex |
; | Shrink selection to single character |
Alt+; | Reverse selection direction |
mi + delimiter | Select inside delimiters (e.g., mi") |
ma + delimiter | Select around delimiters (e.g., ma") |
Editing (Use After Selecting)
| Key | Description |
|---|---|
d | Delete selection |
c | Delete and enter Insert mode |
y | Yank (copy) selection |
p / P | Paste after / before selection |
u / U | Undo / Redo |
> / < | Indent / Unindent |
~ | Toggle case |
r + char | Replace selection with character |
Multi-cursor
| Key | Description |
|---|---|
C | Add new cursor on next line |
Alt+C | Add new cursor on previous line |
s | Search matches in selection and add cursors |
S | Split selection and add cursor to each part |
, | Keep only primary cursor |
Alt+, | Remove all but primary cursor |
Space Menu
| Key | Description |
|---|---|
Space+f | File picker |
Space+b | Buffer picker |
Space+s | Symbol picker (LSP) |
Space+/ | Grep entire project |
Space+k | Show hover info (LSP) |
Space+r | Rename (LSP) |
Space+a | Code action (LSP) |
Space+w | Window menu |
Configuration
Helix configuration is stored in ~/.config/helix/config.toml.
# Theme settings
theme = "catppuccin_mocha"
[editor]
# Line numbers
line-number = "relative"
# Cursor shape
cursorline = true
# Mouse support
mouse = true
# Auto-save
auto-save = true
# True Color
true-color = true
# Colored mode indicator
color-modes = true
# Buffer line
bufferline = "multiple"
# Idle timeout
idle-timeout = 50
[editor.cursor-shape]
insert = "bar"
normal = "block"
select = "underline"
[editor.statusline]
left = ["mode", "spinner", "file-name", "file-modification-indicator"]
center = []
right = ["diagnostics", "selections", "position", "file-encoding", "file-type"]
separator = "│"
mode.normal = "NORMAL"
mode.insert = "INSERT"
mode.select = "SELECT"
[editor.lsp]
display-messages = true
display-inlay-hints = true
[editor.indent-guides]
render = true
character = "│"
skip-levels = 1
[editor.whitespace.render]
space = "none"
tab = "all"
newline = "none"
[editor.file-picker]
hidden = false
[editor.soft-wrap]
enable = true
# Key mappings
[keys.normal]
# Save
C-s = ":w"
# Save all
C-S-s = ":wa"
# Window navigation (Vim-style Ctrl+w)
C-h = "jump_view_left"
C-j = "jump_view_down"
C-k = "jump_view_up"
C-l = "jump_view_right"
[keys.insert]
# jk to enter Normal mode
j = { k = "normal_mode" }
[keys.select]
# jk to enter Normal mode in Select mode too
j = { k = "normal_mode" }Language Configuration
Language-specific settings are stored in ~/.config/helix/languages.toml.
# Formatter settings
[[language]]
name = "rust"
auto-format = true
[[language]]
name = "python"
auto-format = true
formatter = { command = "black", args = ["-", "-q"] }
[[language]]
name = "javascript"
auto-format = true
formatter = { command = "prettier", args = ["--parser", "typescript"] }
[[language]]
name = "typescript"
auto-format = true
formatter = { command = "prettier", args = ["--parser", "typescript"] }
[[language]]
name = "json"
formatter = { command = "prettier", args = ["--parser", "json"] }
[[language]]
name = "markdown"
soft-wrap.enable = true
# LSP server settings
[language-server.typescript-language-server]
command = "typescript-language-server"
args = ["--stdio"]
[language-server.pyright]
command = "pyright-langserver"
args = ["--stdio"]LSP Verification and Setup
# Full health check
hx --health
# Language-specific health check
hx --health rust
hx --health python
hx --health typescript
# Install common LSP servers
# Rust
rustup component add rust-analyzer
# Python
pip install pyright
# or
npm install -g pyright
# TypeScript/JavaScript
npm install -g typescript-language-server typescript
# Go
go install golang.org/x/tools/gopls@latest
# Lua
brew install lua-language-server # macOSTips
- •Run
hx --tutorto access the Helix tutorial. Even Vim users should complete it to get comfortable with Selection-First. - •Vim's
dwiswdin Helix. Think of it as "select word then delete". - •
xselects a line, press again for multiple lines.dto delete,cto change. - •
sis a powerful feature that searches in selection and creates cursors at each match. - •Press
Spaceto open a menu showing available commands. Built-in which-key functionality. - •Tree-sitter-powered selection expansion:
Alt+ofor parent node,Alt+ifor child node. - •No plugin system yet, but LSP, Tree-sitter, and DAP (debugger) are built-in. Plugins are often unnecessary.