Skip to content

feat(helix): add a Helix setup shaped like the AstroNvim config - #16

Merged
hyperb1iss merged 4 commits into
mainfrom
nova/helix
Sep 16, 2026
Merged

hyperb1iss merged 4 commits into
mainfrom
nova/helix

Conversation

@hyperb1iss

Copy link
Copy Markdown
Owner

Helix gets a first-class seat next to Neovim: two TOML files linked at ~/.config/helix, the same language servers and formatters the AstroNvim config already installs, and a Space leader laid out the way AstroNvim taught these hands. Motions and the g, m and z minor modes stay stock Helix, because the select-then-act model is the reason to try the editor. What carries over is the muscle memory that has nothing to do with motions: the Space groups (find, buffers, language tools, git, toggles, diagnostics, agents), Ctrl-s, ]b and [b, and Esc collapsing back to one cursor.

🛠️ How it works

Helix resolves servers by name on PATH, so sh/helix.sh appends Mason's bin directory and every server Neovim installed lights up with no second install: ty and ruff, vtsls, rust-analyzer, marksman, taplo, the yaml, json, css and html servers, tailwindcss and docker-language-server. helix/languages.toml swaps in the two servers Helix does not define (vtsls, docker-language-server), trims the defaults that are not installed so hx --health stays honest, and wires the same formatters conform uses (prettier, stylua, shfmt). Format-on-save is off by default like g.autoformat in the Neovim config; every formatted language opts in, so Space u F flips them all together.

The statusline follows the heirline layout: a mode block with Nerd Font glyphs and the LSP spinner, the git branch, file name and state on the left; buffer and workspace diagnostics, selection count and length, register, position and file type on the right. Helix paints the bar from theme scopes, so the matching colors land in the SilkCircuit helix theme (hyperb1iss/silkcircuit#27). Until that merges, the bar renders with the current SilkCircuit colors.

A few bindings work around Helix quirks worth knowing when reading the config:

Binding Quirk
Space a y copies file:line or file:start-end :sh expands its first word only when the whole word is an expansion, so the variables sit behind set --
Space g b blames the line git blame -l prefixes boundary commits with ^, so it reads --porcelain
Space f c greps the word under the cursor global search runs as you type, so the macro ends without Enter
rust-analyzer clippy languages.toml merges three levels deep, so the default config block is copied whole before adding check.command

Defining Space a as the agents group replaces Helix's default Space a code action; code actions live at Space l a, as in AstroNvim. Space w saves, so window mode is Ctrl-w.

🧪 Validation

Helix 25.07.1 was driven in a pty against the linked config with a committed scratch repo: clean boot with no config error, :config-reload reports "Config refreshed", the file, diagnostics and buffer pickers open, the toggles echo their new values, Space g b shows the commit in a popup, Space a y puts scratch.py:1 and scratch.py:2-3 on the clipboard (checked with pbpaste), and Space f c on a word lists both matching lines. The statusline renders as NORMAL main │ scratch.py │ 1 sel 1 char │ 1:1 14% │ python with the pencil and select-all glyphs in insert and select mode, and the bufferline appears with a second buffer. hx --health resolves servers and formatters for all 14 configured languages with sh/helix.sh sourced. taplo check, shellint, prettier --check, markdownlint and pkg-sync list for apt, ppa, pacman and winget all pass.

An independent verification agent cross-checked every bound command and key name against the 25.07.1 static and typable command lists, every language and server name against the default languages.toml, and simulated the depth-3 merge to confirm the rust-analyzer defaults survive. Its three findings (the Space a claim, the clobbered rust-analyzer block, and an overbroad :sh rationale) are fixed in the branch.

Not exercised: the Linux package paths (ppa:maintainers/helix-editor may not publish arm64 builds, in which case apt falls back to the older universe package) and Windows via winget.

📌 Follow-ups

The branch carries 8f32fa7 (fix(moniker)), which sits unpushed on local main; once main is pushed it drops out of this diff. The vitepress config already fails prettier --check on main and is left as found.

🤖 Generated with Claude Code

hyperb1iss and others added 4 commits September 15, 2026 13:38
Herdr delivers HERDR_PLUGIN_EVENT_JSON as {"event": ..., "data": {...}},
with agent_status and pane_id inside data. The handler read them off the
top level, so every pane.agent_status_changed hook exited before naming
anything and tabs stayed numbered. Unwrap data when present, keeping the
flat shape as a fallback.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E6ZMPccKUq6uyexvfxSWaG
Helix 25.07 config and language wiring, linked at ~/.config/helix by the
base layer. Motions and minor modes stay stock Helix; the Space leader
mirrors the Neovim groups (f find, b buffers, l language tools, g git,
u toggles, x diagnostics, a agents) plus Ctrl-s, ]b/[b and Esc collapsing
to one cursor. Space a y copies a file:line reference for pasting at an
agent, Space g g opens lazygit in a tmux popup, Space g b blames the line.

languages.toml swaps in the servers Mason already installs for Neovim
(vtsls, docker-language-server, ty and ruff) and wires the same
formatters conform uses (prettier, stylua, shfmt). sh/helix.sh appends
Mason's bin directory to PATH so Helix resolves them with no second
install. editor.auto-format stays off as the master switch, matching
g.autoformat in the Neovim config, with every formatted language opted in
so Space u F flips them together.

Two Helix quirks shaped the bindings: languages.toml merges only three
levels deep, so the rust-analyzer config block is copied whole before
adding clippy, and a :sh command expands its first word only when the
whole word is an expansion, so Space a y parks its variables behind
set --. Theme is silkcircuit-glow; the SilkCircuit installer owns the
themes directory, which is why the two files are linked individually.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Adds docs/helix/ to the VitePress site with the structure, quick start,
a coming-from-Neovim table, every Space group, the language server map
and the gotchas the config works around. The README gains a Helix row in
the core tools table and a line in the repository tree, and helix/ gets
the short README the other tool directories carry.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Mode block with Nerd Font glyphs (terminal, pencil, select-all), the
LSP spinner and git branch on the left with the file name and its state;
buffer and workspace diagnostics, selection count and length, register,
position and file type on the right, cyan bars between the sections.
Helix takes the bar colours from the theme, so the matching surface and
mode hues land in the SilkCircuit helix theme alongside this.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@hyperb1iss
hyperb1iss merged commit ad0df44 into main Sep 16, 2026
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant