Terminal GuideTerminal Guide
helix icon

Helix

Text Editors
macOSLinuxWindows
Rust

Modern modal editor inspired by Kakoune/Neovim with built-in LSP.

Official Website

Features

Multiple SelectionsBuilt-in LSPTree-sitterNo Configuration Needed

Installation

Homebrew
brew install helix
Pacman (Arch)
pacman -S helix
Cargo (Rust)
cargo install helix

Why 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

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 --health

Selection-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 quotes
yap - Yank a paragraph
Unclear what gets selected before operation

Helix Operation Order

wd - Select word → Delete
mi"c - Select inside quotes → Change
mapy - Select paragraph → Yank
Selection highlighted before operation

Mode 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 modes

Insert 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

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 --health

Frequently Used Commands

Movement (Normal Mode)

KeyDescription
h j k lMove left, down, up, right
w / bMove to next / previous word (select)
eMove to end of word
gh / glMove to start / end of line
gg / geMove to start / end of file
Ctrl+d / Ctrl+uScroll half page down / up
mmMove to matching bracket
:numberJump to line number

Selection

KeyDescription
vSwitch to Select mode
xSelect entire line
%Select entire file
sSearch in selection with regex
;Shrink selection to single character
Alt+;Reverse selection direction
mi + delimiterSelect inside delimiters (e.g., mi")
ma + delimiterSelect around delimiters (e.g., ma")

Editing (Use After Selecting)

KeyDescription
dDelete selection
cDelete and enter Insert mode
yYank (copy) selection
p / PPaste after / before selection
u / UUndo / Redo
> / <Indent / Unindent
~Toggle case
r + charReplace selection with character

Multi-cursor

KeyDescription
CAdd new cursor on next line
Alt+CAdd new cursor on previous line
sSearch matches in selection and add cursors
SSplit selection and add cursor to each part
,Keep only primary cursor
Alt+,Remove all but primary cursor

Space Menu

KeyDescription
Space+fFile picker
Space+bBuffer picker
Space+sSymbol picker (LSP)
Space+/Grep entire project
Space+kShow hover info (LSP)
Space+rRename (LSP)
Space+aCode action (LSP)
Space+wWindow menu

Configuration

Helix configuration is stored in ~/.config/helix/config.toml.

~/.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.

~/.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

LSP Health Check
# 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  # macOS

Tips

  • Run hx --tutor to access the Helix tutorial. Even Vim users should complete it to get comfortable with Selection-First.
  • Vim's dw is wd in Helix. Think of it as "select word then delete".
  • x selects a line, press again for multiple lines. d to delete, c to change.
  • s is a powerful feature that searches in selection and creates cursors at each match.
  • Press Space to open a menu showing available commands. Built-in which-key functionality.
  • Tree-sitter-powered selection expansion: Alt+o for parent node, Alt+i for child node.
  • No plugin system yet, but LSP, Tree-sitter, and DAP (debugger) are built-in. Plugins are often unnecessary.
Written by Dai AokiPublished: 2026-01-20

Related Articles

Explore More