<-- (back)

wait, helix is so good

13 Mar, 2025
dev
setup
taste
opinion
1.4k words

Tell me if this sounds familiar.

You start programming. Maybe you used Unity following Brackets tutorials, maybe it's scratch or mind storms, maybe it's sublime with some Python script you wanted to do some thing with, maybe it's JupyterLab or IntelliJ at first year of uni. Whatever.

Then you realize "wait, everyone uses this one thing". And that one thing is vscode. So you try it and spend a while using that because it's pretty nice and very, very standard.

Then, as the years go on, you hear about other text editors, like "vim", "neovim","sublime", the JetBrains ones, "Kate", "nano", "lapce", "atom" and so on, but this "vim" one (or maybe "neovim") keeps popping up. It seems that maybe advanced programmers use it, or maybe it's just weird people because why would you have an editor in the terminal? A gui like vscode seems to make much more sense.

Then you realize that the people using neovim are not lunatics, but in fact are rather proficient programmers. And the point of neovim is that you can go really fast. Like, crazy fast it seems. So, since you want to be one of "the good ones" you try neovim.

You configure it for a while but give up after not too long and realize that you were extremely uncomfortable in the terminal. Maybe it's not for you. You continue with vscode. You customize vscode. You make it a very nice experience.

And then, after a few more years you realize that vscode doesn't really let you do some things. You have to use the mouse. There are inherent inefficiencies. And at some point you just grow tired of everything being slow and suboptimal.

So... You try neovim again. But this time it sticks! Because you had a reason. You configure it. At first is messy, but you add to it, you trim it, you water it, and by the end you have a beautiful bonsai, you have become one with the keyboard and you spend the rest of your days coding as if the computer was truly a part of you.

...except that YOUR CONFIG IS FULL OF SPAGHETTI CODE, YOU DONT KNOW WHAT 90% OF IT DOES, EVERYTHING KEEPS BREAKING AND THE TIME YOU'RE NOT SPENDING DEBUGGING WHY THAT THING DOESNT WORK YOU SPEND IT CONFIGURING IT MORE TO BE ABLE TO DO WHAT EVERY NORMIE DOES IN VSCODE AT THE SAME SPEED BECAUSE YOU JUST ENDED UP WITH A BLOATED MORE INCONVINIENT EDITOR MADE BY YOURSELF.

Introducing: Helix

Yes, I now use Helix full time, I'm very happy with it and I basically have none of these problems. But I still really like neovim and vim and what they represent; it's just that, in my opinion, it has a few fundamental flaws.

For one, it's bloated with obscure legacy code. Did you know that the main language of neovim is actually Vim script? This definitely comes through in the user experience, which I don't think need convincing. But, more importantly, I'm not a designer. And yeah, I think I can design nice software if I put in the time but realistically, I don't want to do that. I want to either really build my own editor or just have someone who has given this thought to give me their top solutions and let me alter reasonable decisions with some reasonable configuration.

Neovim is in this weird place where you kinda build your own editor using some building blocks, which would already be dubious in its own right but it's made even worse by the fact that this wasn't planned out at all. In a way it's fascinating that such a vibrant community has emerged from such a poorly planned out situation! I do honestly love that.

But I don't love feeling like I have a half-assed editor and spending more time coding my config than the actual code I want to write.

Configuration and plugins

At first I was put off by helix because it didn't have plugins. If you've used neovim for a while you might think this is a non-starter, but that's because neovim by itself really needs help to be a decent modern editor. In contrast, helix just... works. My config is just this:

# This is literally all of it
theme = "vim_dark_high_contrast"

[editor]
completion-timeout = 5
completion-trigger-len = 1
end-of-line-diagnostics = "hint"
line-number = "relative"

[editor.auto-save]
focus-lost = true

[editor.cursor-shape]
insert = "bar"
normal = "block"
select = "underline"

[editor.inline-diagnostics]
cursor-line = "warning"

A lot of people say that "no config" is the reason to use Helix. I disagree tho. I will say that I do consider software that needs extensive configuration to be a clear red flag. Again, I really value having some person/community that has really given time to think what a good design is, and work from there.

Good design by default

Good design with little configuration is also useful for defaults and help. If I'm pair programming with another person using Helix, I can take their computer and do whatever I want with fluency because I can be reasonably sure that most keys do the same thing. If look up how to do something in the editor, it's much more clear what I need to do, which can't be said with neovim. I'm a big fan of reasonable defaults.

One thing that was missing from Helix was a file tree explorer. I had plenty of grievances with both of the standard file explorer plugins in Neovim, but I really liked the concept. I thought it was going to be a problem. Here's the thing: it wasn't. I started using Helix and I realized that the file explorer often was more distracting than helpful? It certainly isn't faster to move around there. If I want to change the structure of files, I'd rather open a new terminal and use yazi, which is generally well built and doesn't give me the headaches that the neovim plugins did. And if I want to move between files, a file tree explorer sure isn't the most efficient way! It's better to use file name searches, jumplists and sometimes buffers.

A feature I wanted in neovim is some kind of multicursor. There are plenty of plugins, but I just... couldn't use them well. It was a big learning step to overcome. And it's harder to "design" the keybinds for than usual. The plugin author can't make that for you, since god knows what your keybinds are already. So I just never used them; until Helix, where they are wonderfully integrated with reasonable commands.

And OMG, THEY'RE THE BEST! I didn't realize how many times what I really wanted to do was do a search in a selection, put a cursor on each match and start editing from there. No, it's not lps rename variable. The difference between multicursor and Neovim's block-visual mode is night and day.

Performance

Also, since everything is built with Rust using good data structures and whatnot, the editor is extremely snappy. Neovim is also fast out of the box, but if you're not careful with lazy loading and choosing your plugins it's easy to make the experience sluggish. That was definitely my experience, even though I was using lazy to manage my packages. It's fixable, yes, but that's another thing you have to care about.

Conclusion

I feel that, in a sense, Helix is making me better at writing out code because it has made certain design decisions. For some people this is unnaceptable, I know. Plugins are coming soon enough, so if you really have a very specific workflow that you have to stick by, then, sure, wait it out.

But, especially if you're somewhat young, I think it's good to let go of your hubris to see what Helix might offer. Try to stick to the defaults for a bit. I'm astounded at how good of an experience I've had with something that I thought I had so many opinions about. The whole reason I switched from vscode to neovim is because I just was too frustated at how some things were in vscode and how I felt they limited me. So I switched. I thought that all the configuration was necessary because I just needed something very specific to me. So I configured. To have a good experience in neovim you have to become an expert neovim, so I did. I got "pretty good"™, but apparently not good enough. I lived in a constant "bodged" state.

And then, I tried Helix... and it just worked.