Thoughts on Helix

I’ve been a die-hard vim user for 12 years. But recently, inspired by posts from Julia Evans and Felix Knorr, I have been trying out Helix–a relatively new terminal-based editor written in Rust–and I’ve been pleasantly surprised by the experience.
Things I like
It’s snappy! Even though some of the command flows have changed, I can still get around the editor using my old vim muscle memory.
I never got around to configuring LSP permanently in vim, it always felt too brittle. But Helix’s built-in LSP and tree-sitter integrations are smooth enough that I’ve been getting a lot of use out of them. I like being able to jump to references/definitions and use tree-sitter for navigation and selection.
Multiple cursors is another thing I knew existed in other common editors but never used – I find myself actually using Helix’s implementation now since it was intuitive to pick up.
Where I struggled
The biggest thing I miss is netrw. Helix has amazing fuzzy file search, which I love, but I also frequently need to poke around the directory tree and add/rename/delete things.
Selecting text seems less straightforward. Sometimes things are auto-highlighted, but other times when I want to highlight a selection it randomly stops highlighting midway through. I know there are likely some rules here I’m not aware of, but coming from vim it’s confusing.
Okay, this is a small but annoying one: exiting insert mode in vim moves the cursor back one space, but in Helix it stays put. It was really hard to overcome my muscle memory on this one.
Final thoughts
Overall despite being a bit slower in Helix until my muscle memory can adapt, I’ve enjoyed the benefits enough that I’m going to continue trying to use it as my primary editor.
Here’s my config.toml so far:
theme = "monokai_pro_spectrum"
[editor]
true-color = true
rulers = [80]
cursorline = true
[editor.cursor-shape]
insert = "bar"
[keys.normal]
"D" = ["extend_to_line_end", "delete_selection"]
"^" = "goto_first_nonwhitespace"
"0" = "goto_first_nonwhitespace"
"$" = "goto_line_end"
"-" = "file_picker_in_current_directory"
"C-e" = "scroll_down"
"C-y" = "scroll_up"
[keys.select]
"^" = "goto_first_nonwhitespace"
"0" = "goto_first_nonwhitespace"
"$" = "goto_line_end"
[keys.normal.space]
"f" = "file_picker_in_current_directory"