
Multiple cursors as a core editing primitive, inspired by Kakoune. Commands manipulate selections which allows concurrent code editing. Tree-sitter integration Tree-sitter produces error tolerant and…
It's a joke. If Neovim is the modern Vim, then Helix is post-modern.
Eventually, yes! We'd like to prototype a WebGPU-based alternative frontend. See the discussion on GitHub.
While there is currently no plugin system available, we do intend to eventually have one. But this will take some time (more discussion here).
Mainly by having more things built-in. Kakoune is composable by design, relying on external tooling to manage splits and provide language server support. Helix instead chooses to integrate more. We also use tree-sitter for highlighting and code analysis.
By starting from scratch we were able to learn from our experience with Vim and make some breaking changes. The result is a much smaller codebase and a modern set of defaults. It's easier to get started if you've never used a modal editor before, and there's much less fiddling with config files.
Contribute code on GitHub.
Discuss the project on Matrix.
Sponsor development on OpenCollective.
This is only tangentially related, but regarding:
>>Post-modern?!
>It's a joke. If Neovim is the modern Vim, then Helix is post-modern.
It's interesting that postmodern is so often used by people, perhaps less familiar with the arts and the humanities, to mean "an update to modern" or a progression thereof. They use it in a strictly literal sense, eschewing the precise meaning of the term they're referencing by mere addition of discontinuity as incremental difference.
Obviously, there's little impact to this. The term is hardly degraded by engineers advertising to other engineers. It looks a touch unread, but then again we have people like Thiel and Luckey misinterpreting Tolkien, so again it's hardly the most egregious example. I guess it just jumped out to me because I was hoping to see something creative truly postmodern.
That jumped out at me too the first time I ran into Helix making this joke, and I was also disappointed to find that they meant modern++.
That said, I’m not sure I agree with your assessment that it’s wrong, exactly. Postmodernism did indeed follow modernism and come into being as a reaction to modernism. So I think “postmodernism” has a naive and original sense of being “what follows modernism”. Decades (so many at this point!) of discourse have added layers to that and undermined it and generally made it more complex. But the underlying meaning of the term remains.
(If your instinct is to respond with arguments about how works not limited to late 20th century western culture can be nonetheless classified as postmodern, I hear you, but the fact that the term itself was only coined post modernism remains, and is all I’m pointing to.)
Personally, I get more hung up on people using “modern” to mean “new”. Then to use “postmodern” to mean “more new” while to my ears (eyes) it means “dated af” is even funnier and more jarring.
Helix, the first editor to not believe in grand narratives. Helix, the relativist editor. Helix, now updated with the latest from Foucault and Derrida!
>Postmodernism did indeed follow modernism and come into being as a reaction to modernism.
I definitely agree that, strictly speaking, postmodernism is a somewhat loose label for an eclectic set of ideas and expressions following modernism. My issue was not with the label being denotatively incorrect – that postmodernism implies a deliberate and retrospective relation to what is labeled "modern" – but rather that the term invokes a spirit that is utterly missing from the project.
There is no rejection of teleological narratives, and in fact by misapplying this term acts to reinforcing them. It doesn't meaningful critique the projects its in conversation with except in terms that reinforce the underlying assumptions that motivated their production. It critiques Vim in terms of codebase complexity and multiplexity, and these concepts are nothing if not deeply familiar. Even with regards to the concept of coding as the composition and production of language, Helix only looks to make that process more efficient, rather than examine how this process reproduces itself, or how intent is masked and produced through abstraction and reference to the work of other programmers/authors.
I am not saying that it should have done that. It is by all means a perfectly good editor. But a perfectly good editor does not a postmodern editor make.
If anything, one could argue that the process of vibecoding is more recognizably postmodern, especially as a strict rejection of the modernist belief system that produces that process of coding. Its nondeterminism rejects efficient, coherent processes. It requires one to reimagine production as its ends, rather than by beginning with conventional initialization rituals. Its discursive rather than dictatorial.
Not to say vibecoding is the end of coding or even the way "forward", just as to say postmodernism is not the teleological end to thought.
Lol. You win.
Good point on vibing though.
Except that, from that talk, Larry clearly has some idea about what the term postmodernism means in art & culture and isn’t just using it to mean “modern++”.
>we have people like Thiel and Luckey misinterpreting Tolkien
Could you provide an example / be more specific about this?
Peter Thiel owns a company called Palantir that designs its offices to look like Hobbiton.
It might be less of a misinterpretation and more of an on the nose joke about being overtly evil.
I mean its fair to say that its deliberately on the nose. However, I would argue that despite being definitionally correct, Palantir still represents a misinterpretation by discarding the works in their whole. I brought it up because postmodern does correctly imply a reaction to what is "modern", but its also a body of work in its own right.
This is not to say that Tolkien's authorial intent is final, nor necessarily discernible, but we are obligated to examine the palantirs' presentation as not just a passive object with certain, defined qualities, but as devices that have their own consequential histories within the narrative. Thiel naming his company after a tool presented textually as fallible, misleading, and myopic (in addition to its obvious power) with ostensibly no desire to attach such connotations to the company requires, in my mind, at least a superficial reading. We can even disregard the fact that these were mostly tools for an evil opposed by Tolkien, and not make the (valid) argument that their presentation within the text is could be considered direct argument in opposition to their creation. I personally think that to build a company and name it after a work that argues against that company's mission/purpose requires misinterpretation of the reference material, both in terms of poor comprehension of metaphor and as a poor response to the text and the body of discourse that surrounds and infuses it.
They are Tolkien fans and yet they are building the devices (Palantir, Anduril) which evil will eventually use to dominate. Palantir is well-named but tragic that a fan would build it. Anduril is poorly-named as it is the sword used to combat industrial power rather than represent it.
This has been my main editor for prose and code for a few years now (Sublime Text -> Atom -> Vim -> Helix). Overall, it has been great. Many LSPs work almost out-of-the-box, and my config is a fraction the size of my old .vimrc.
Surprisingly, it didn’t take that long to update my Vim muscle memory. Days or weeks, maybe? However, I still have mixed feelings about modal editors in general, and most of my gripes with Helix are actually about modal editors and/or console editors in general.
Code folding is a feature I’m still waiting for.
Curious to hear your gripes about modal editors! I'm a long time Emacs user (traditional keybindings, not evil-mode), but I also started using Vim in parallel a little over a decade ago. I feel very proficient/productive in both, regularly using many of Vim's more advanced motions and functionality. I generally love the power and composability of Vim text objects, and definitely experience the benefit of using them. But there are some times where I am doing things like many small edits within a line where rapidly changing modes for all of the edits starts to feel cumbersome.
For Emacs, I use multiple cursors and a treesitter-based plug-in for incrementally expanding or reducing the selection by text objects. I also have a collection of my own helper functions for working with text that make my non-modal Emacs approach still feel very comparable to the power of manipulating text in Vim.
Curious to hear if your issues with modal editing are similar.
- It feels like I know all the efficient keybindings, but when someone looks over my shoulder, I become conscious of how much time I spend mashing Esc/CapsLock and i/I/a/A/o/O, compared to how much editing actually happens.
- I have nomouse mode on, to try to learn modal editors properly. But the mouse is actually fairly fast for getting to a specific cursor position. In theory, using Helix motions could be faster (and there's gw if I don't know what motion to use). In practice, the mental process of turning a point on the coordinate plane into the correct series of motions (including i) feels vastly slower.
Still, Vim, Helix, etc are incredible for structural manipulation of text, and I miss what they provide any time I edit text somewhere else, even with the universal keybindings that are available for navigating/selecting/deleting words, lines, etc. I tried Vim mode in Zed and it just didn't cut it.
Some things about Helix that I particularly like: speed and stability (no weird lag on visual block insert!), the jump to diagnostics/changes pattern (]d <Space>a is a surprisingly nice spellcheck interface, with <Space>d for the overview), the jumplist, and the good-by-default fuzzy pickers.
My main gripe with modal editors is that they still use the Escape key to go back to normal mode even though Escape was chosen for historical reasons (used to sit much much closer to the home row on older Unix Keyboards) In Linux and MacOs I can change it with just one gui setting but it's still annoying how everyone went with it. It's not mentionned in most vim tutorials. According to a vim reddit poll, at least half of the users are just using Escape where it is now instead of one of the alternatives. This is beyond me, it feels like someone inventing glasses in order to see better but everyone settled on cast iron frames.
Cassepipe, it’s not a great default for sure. What do you have yours mapped to? I mapped jj to return to normal mode and also save my file. So, as I’m typing, I just hit jj, the jj vanishes, and this command is run:
<Esc>:w<CR>
I could just have it escape instead without saving.
If I hadn’t chose jj it would have been ff, which is also always under an index finger. I do wish I’d been clued into the idea when I started with Vim instead of two years later.
I find the jj/jk hack a bit too clever for my taste. I just map CapsLock to Escape system-wide because it also unlocks quick escaping for shells vi-modes too and I realized that actually Escape is a really nice key to have around in a lot of UIs to get out/go back/cancel what you are doing. I also like that it's a simple gui setting away (or registry key editing in windows).
I either put CapsLock where Escape sits or use both shifts simultaneously (one cancels it) but even then I almost never use it. The rare times I need to type a lot of uppercase together is generally code in vim and visual selection + gU does the job.
The point of my comment was not to shill for a particular solution though but for the vim community to acknowledge the problem publicly instead of it being some insider knowledge you discover in a random internet comment six months into fighting vim (if you haven't dropped out yet)
What key would be a good candidate as a default though? Imagine the memes for exiting vim if you needed a modifier to get into normal mode. Caps lock is truly a useless key and should be escape anyway.
As someone who cut their teeth on a sun "programmer" layout, I really need control to be in that position. I might try mapping the vestigial control key to escape though. Or maybe the hack that dtj1123 describes (tap is escape, hold is control), if I can pull that off on macos.
<ctrl-[> always works out of the box which is less of a stretch than esc.
I do jk as I always find a roll easier on the fingers than a double-tap jj or kk. You could also use space provided you aren't using one of those distros that bases its identity on the spacebar.
Yea for me capslock is a systemwide esc for me. Works great.
doesnt it get annoying when you actually have to type two adjacent j ?
I have caps remapped to esc when tapped, and ctrl when held. Takes perhaps a weekend to get used to, but once the muscle memory is there it feels incredibly comfortable and natural.
Which tool can do that kind of wizardry? I've seen either but not both.
I have similar types of bindings. I just found a keyboard that can use ZMK. There's quite a few out there.
ZMK (or it's free software cousin QMK) are super flexible and you can create lots of custom behaviors for keys (tap/hold behaviors, double press, layering, etc...). It takes some time and effort to learn how to set it all up. Some of the more complicated behaviors require using their dsl for mapping the keys instead of their GUI editor. Considering the ridiculous amount of hours I spend at my computer using a keyboard, I felt it was worth the investment in learning.
On macOS I use Karabiner-Elements to do the exact same thing. Also, my config is only applied in terminals, everywhere else the original functionality is kept. So, I'd say it is quite flexible.
Karabiner on macos, keyd on Linux.
Last time I checked, on all OSes you need to install some third-party software alas. Hopefully I am wrong now.
I believe it's done via a daemon that intercepts keystrokes
I configure it in the firmware of my keyboard with QMK
I have hesitated many times to set this up but I don't want to get used to something that I cannot set up in less than 30 seconds on a new machine.
Not having Escape where CapsLock sits on a new machine already makes it infuriatingly unusable already :)
I map caps to ctrl and do ctrl-[ to get to normal mode. The main reason is using Vim bindings in other editors where Esc can get intercepted by other bindings but ctrl-[ has always worked everywhere.
My opinion is that going back to normal mode is too important a key to be a key combo, and a weird one at that (is it [ or ] ?). I am pretty sure you can get used to it but we humans get used to anything really, doesn't make it good. My pressing on CapsLock happens at a subconscious level. Quick edit and then punctuate with CapsLock with the pinkie. Some random key combo is not acceptable.
But again my point is that the default sucks. You probably learned a about Ctrl + [ while looking online for alternatives after realizing the default sucked
at least on linux you can map caps lock to esc if tapped and ctrl if held
https://www.dannyguo.com/blog/remap-caps-lock-to-escape-and-... has a good run down of the ways to do this.
But you do have to install and configure xcape. By native I meant something that would either be an gui option on your DE or a simple command from something that is already installed on a linux distro like `setxkbmap`
I mean... if people don't mind reaching, so what? I purposefully don't remap my leader key, although I don't have many leader mappings so it's not like I'm reaching for it constantly.
My wrists are fine! Unless by "you" you mean the people reaching for escape.
I mean if people don't mind having cast iron glasses, sure
No but really, vim's paradim that you should go back to normal mode constantly. With the current situation you get posts on the vim subreddit asking/telling you about insert mode editing commands. You might as well use Emacs at that point, at least it would be the intended workflow
Ah so you're saying people would probably not ask these question if exiting insert mode had a more accessible key?
Possibly, though would have to see data, I guess. I feel like a lot of people are just curious about Vim and spend all their time in insert mode anyway. I have seen a bunch of those questions around "how would I do this without exiting insert mode" questions, though I'm not sure that having a more accessible escape key would change all of their minds. The "I want to use this new thing but I'm only interested in using it in a way that I'm used to" mindset is rampant among programmers.
[flagged]
Tried it again few days ago. I kinda get that currently you can only use AI on Helix through LSP, but on top of that it does not have auto-refreshing files when changed outside - makes it really hard to work with external AIs, as I'm just constantly worrying if I'm editing a stale file.
I know it's not a proper fix, but helix does have `:reload` and `:reload-all` commands
I have reload-all bound to Ctrl-r
Same!
GitHub Copilot, Claude Code and Codex provide fairly good IDE integrations. They don't just edit files behind your back. They actually edit the files you have in the IDEs using editor APIs and even show you a nice diff view. This way you never have content that is out of sync. I find this approach very usable and appealing.
On the other hand, many of the AI tools and their companies think that you should completely ditch IDEs for CLIs only, because "nobody needs to write code anymore". Some of them even stopped maintaining IDE extensions and go all-in in CLIs.
(I call that complete BS)
I've noticed that Codex usually uses the native editing tools and shows me a diff, but sometimes it just sidesteps that and does a cat > file << EOF, so I need to rely on Git diffs to tell what it did.
> This way you never have content that is out of sync.
They can definitely go out of sync, particularly if something that isn't the editor or the AI changes the code (e.g. running shell commands or opening the file in a different editor and making changes there). I've had a whole load of issues with VSCode where there's been spurious edits all over the place that show up again even if I try and revert them, because every time the AI makes an unrelated edit, VSCode tries to reset the file to the version it thinks exists and then play the AI's edits on top.
That problem already existed long before the age of LLMs?
I don’t even open a text editor anymore 90% of the time. Seems clear to me that IDEs, in the traditional sense, don’t really have a place in the future of software creation. They might morph into something that does, but definitely not in their current form, imo.
If you actually want to engineer properly and review the code rather than pushing out vibe coded slop PRs, then IDEs absolutely do have a future.
> If you actually want to engineer properly.
I think this statement is misguided, and potentially comes from a lack of experience in getting AI coders to produce quality.
Proper engineering does not come about from the tools you use or how you use them. Proper engineering has always come from thought, and reasoning, it never was about the act of coding. It always was about the systems thinking and expressing the goals and desires that matched the requirements.
IDEs were never needed to properly engineer and in the days of AI will become increasingly less important.
Tools for planning, reviewing, and commenting on code are the future. The necessity to edit actual code is coming to an end.
Yes, that's what I said, I'm contrasting properly engineered AI code to vibe coded slop AI code, not that human written code is inherently better engineered.
I was feeling this pain also; so I switched my workflow to watching file changes with lazygit, and then switching to helix to make small tweaks.
Another option you may want to try is mux (github.com/coder/mux). It wraps the LLM in a nice interface which has the ability to do line/block comments on changes by the LLM that then goes goes into your next prompt. It’s very early stage though: v0.19.0.
With time I actually came to get accustomed to it and to enjoy my files not reloading automatically with Claude Code changes.
> you can only use AI on Helix through LSP
How do other editors do this, if they don't use LSPs? Helix specifically choses LSP as the integration mechanism (in combination with TreeSitter) for supporting different programming languages, because it is a language-agnostic protocol and therefore only needs to be implemented once. Is there some established AI-agnostic protocol/interface? I don't think MCP would work here?
ACP Agent Client Protocol https://agentclientprotocol.com/get-started/registry
This is a distinctly Zed solution - trying to move the agent experience into the editor, rather than just giving the agent an interface with which to control and read from the editor.
Not only do the most popular editors have little-to-no incentive to implement it (they’re more interested in pushing their own first-class implementations, rather than integrating those of others), it’s much more work to integrate the evolving agent experience into the IDE than it would be to provide IDE integration points for the agents themselves.
So, I think this project would have been much more successful if it had been more focussed on keeping the agent and IDE experiences separated but united by the protocol, instead of trying to deeply marry them. But that’s not in line with Zed’s vision and monetization strategy.
It won’t be long before the big players start to release their own cloud-based editors. They’ll be cloud-based because the moat is wider, and they’ll try to move coding to the cloud in the way that Google Workspaces moved docs to the cloud. Probably with huge token discounts to capture people. If you squint, you can already see this starting to happen with Claude Desktop, which runs its agent loop on the cloud (you can tell because skills appear to need to be uploaded).
Notably, Microsoft, with VSCode and GitHub have a web-based editor advantage in this space, but no models.
It's not just Zed, Emacs has has a thriving ACP implementation in agent-shell[0], and allows for some very cool integrations[1]. There are a fair number of other clients[2] as well.
[0]: https://github.com/xenodium/agent-shell
The second half of this is spot on. The now is making IDEs that can integrate with agents, not the other way around. Soon the Claude and Codex will do that for us on their hosts and the argument is it will save sending the context up.
Just watching filesystem for file changes and updating the in-memory view of the file on any change? This isn’t really relevant to MCP, though one option is to provide a different tool to the AI agent for file modifications, which would make modifications through the file editor itself.
> Just watching filesystem for file changes
This is non-trivial, if you want to do it efficiently. On Linux you can set up an inotify listener for individual files, but not for entire directories. This also breaks down if you are working with data on non-local drives.
> Is there some established AI-agnostic protocol/interface?
AFAIK no
The latter is pretty easy to vibe-patch in:
Man I heard about this being addressed soon for years. I have given up on Helix by now, but it’s wild that this still hasn’t been released.