Why I Switched to Helix After Two Decades of Vim

By • min read
<p>Earlier this summer, a friend described how they loved the Helix text editor because it required almost no configuration—much like my own fondness for the Fish shell. Intrigued, I decided to give Helix a try after using Vim and Neovim for over 20 years. Three months later, I’ve gathered enough impressions to share. Here’s what stands out.</p> <h2 id="built-in-language-servers">The Appeal of Built-in Language Servers</h2> <p>What originally drew me to Helix was its seamless Language Server Protocol (LSP) integration. In Vim or Neovim, setting up a reliable LSP—for features like <strong>go-to-definition</strong> or <strong>rename symbol</strong>—often meant hours of tinkering with plugins and configuration files. I had tried building my own config from scratch and using pre-built frameworks, but nothing felt effortless. Helix ships with LSP support right out of the box. I can now rename a variable across an entire project with a single shortcut, regardless of language, without touching a single config file. That immediate <em>just works</em> experience was a game-changer.</p><figure style="margin:20px 0"><img src="/images/helix-search.png" alt="Why I Switched to Helix After Two Decades of Vim" style="width:100%;height:auto;border-radius:8px" loading="lazy"><figcaption style="font-size:12px;color:#666;margin-top:5px">Source: jvns.ca</figcaption></figure> <h2 id="superior-search-experience">Superior Search Experience</h2> <p>Searching across a repository is one of my favorite Helix features. When I invoke a project-wide search, Helix displays results in a pane that lets me scroll through matches while seeing the full context around each line. For example, if I search for a function name, I can review the surrounding code before jumping to a file. In contrast, the ripgrep plugin I used in Vim showed only the matched line with no surrounding context, making it harder to decide which result was relevant. Helix’s approach saves time and reduces cognitive load.</p> <h2 id="user-friendly-keyboard-shortcuts">User-Friendly Keyboard Shortcuts</h2> <p>Helix includes a quick reference popup that appears when I press certain keys. For instance, pressing <kbd>g</kbd> shows a list of jump destinations like <em>go to definition</em>, <em>go to reference</em>, or <em>go to next diagnostic</em>. I don’t use these commands daily, so I often forget the exact shortcuts. Having a cheat sheet built into the editor is a small but thoughtful aid that prevents me from reaching for the mouse or searching the web.</p> <h2 id="translating-vim-habits">Translating Vim Habits to Helix</h2> <p>Moving from Vim to Helix required adjusting a few ingrained habits. Here are the key differences I encountered.</p> <h3 id="navigating-without-marks">Navigating Without Marks</h3> <p>Vim’s marks (<code>ma</code>, <code>'a</code>) let you jump to saved positions in a file. Helix doesn’t support marks in the same way. Instead, I rely on <strong>Ctrl+O</strong> and <strong>Ctrl+I</strong> to navigate backward and forward through my cursor location history. This approach works well for quick jumps between recent spots, though it lacks the permanence of named marks.</p><figure style="margin:20px 0"><img src="https://jvns.ca/images/helix-search.png" alt="Why I Switched to Helix After Two Decades of Vim" style="width:100%;height:auto;border-radius:8px" loading="lazy"><figcaption style="font-size:12px;color:#666;margin-top:5px">Source: jvns.ca</figcaption></figure> <h3 id="macros-vs-multiple-cursors">Macros vs. Multiple Cursors</h3> <p>Helix does support macros, but I’ve found myself using multiple cursors almost exclusively for batch edits. For example, to change the same pattern across a document, I press <kbd>%</kbd> to select the entire buffer, then <kbd>s</kbd> to filter the selection with a regex, and finally edit all occurrences simultaneously. This workflow feels more intuitive and less error-prone than recording and replaying macros.</p> <h3 id="buffer-management-instead-of-tabs">Buffer Management Instead of Tabs</h3> <p>Helix doesn’t have Neovim-style tabs, but it provides a buffer switcher (<code>&lt;space&gt;b</code>) that gives an overview of open buffers. There’s an ongoing pull request to add tabs, and meanwhile the <code>bufferline = "multiple"</code> setting approximates a tab bar with <kbd>gp</kbd>/<kbd>gn</kbd> for navigation and <code>:bc</code> to close buffers. It’s a bit different, but after some use, I appreciate the simplicity of buffer management without tab pages.</p> <h2 id="helix-annoyances">A Few Helix Annoyances</h2> <p>No editor is perfect, and Helix has its share of rough edges. Here’s what has bothered me so far.</p> <ul> <li><strong>Reflow feels clunky.</strong> The <code>:reflow</code> command in Helix doesn’t handle list items as gracefully as Vim’s <code>gq</code>. In markdown lists, the reflow often breaks numbered sequences or misaligns bullet points. A GitHub issue tracks this, and I hope it improves.</li> <li><strong>Missing features.</strong> Some Vim staples, like the ability to sort lines or apply external filters (<code>!</code>), are absent or require workarounds in Helix. For now, I pipe text to external commands using Terminal mode, but it’s not as direct as Vim’s approach.</li> </ul> <p>Despite these annoyances, the core editing experience—especially the LSP integration and search—has kept me loyal. I’m still learning new tricks, and the Helix community is active, so I expect many of these pain points will be addressed over time.</p>