weakty

I took Zed for a spin today (0.119), after learning that it had been open sourced. I had used Zed before (about eight or nine months ago) and it continued to live in my applications folder. I last left it in a state where the version I was on would not open; it immediately crashed. To be fair to Zed, I could have easily updated it at any time, and I’m sure it would have resolved the problem. But, I had forgotten about it long after I had played with it briefly.

I spent about 45 minutes using it today and another 10 minutes recently before starting to write this post. That’s not enough time to really give a fair shake at something, but honestly, I jump around editors for fun, so I’m used to gleaning what I like / need / dislike / don’t need fairly quickly.

Things I really like

Vim mode built in

I can’t (comfortably) use an editor without Vim mode. Despite their Vim mode being labelled as in beta, it works well enough for my uses and having it built into the editor is very nice.

Built in Terminal

This is another thing I need. Being able to hit CMD+J to launch (or CTRL+` to open a terminal where you are is very useful. The fact that it uses Alacritty under the hood bodes well.

Built in LSP + Tree Sitter

Not having to mess with setting up LSP / Tree-sitter is just lovely. Helix is the same. I love that I don’t have to toggle what languages I want, like in Doom+Emacs—everything is bundled into the binary. Also, unlike emacs, it’s easy to install. I’m not installing and setting languages up frequently, but I appreciate this small perk.

Keybindings

Zed seems to have good support for keybindings. I can simulate a lot of what I get with Doom using prefixes. This was added a few months ago. At this point, it’s a bit difficult for me to unlearn that SPC w h will navigate to an editor pane on my left. So, I can set that up like this in the keymap settings:

  {
    "context": "Editor && vim_mode == normal && !VimWaiting && !menu",
    "bindings": {
      // put key-bindings here if you want them to work only in normal mode
      "[ d": "editor::GoToPrevHunk",
      "] d": "editor::GoToHunk",

      // Workspace movement
      "space w h": ["workspace::ActivatePaneInDirection", "Left"],
      "space w l": ["workspace::ActivatePaneInDirection", "Right"],
      "space w k": ["workspace::ActivatePaneInDirection", "Up"],
      "space w j": ["workspace::ActivatePaneInDirection", "Down"],

      // File ops
      "space f s": "workspace::Save",
      "space o o": "editor::RevealInFinder"
    }
  },

Nice to haves

Fast

It’s fast, sure. I haven’t used it long enough to know how fast, and honestly, it doesn’t really matter to me that much. People seem to complain about the speed of their editors a lot. I use emacs and it sometimes hangs for seconds performing certain functions, and there is definitely some typing lag. But with that said, I save so much time in emacs, that it’s more than worth putting up with a bit of latency. Will that always be true? We’ll see.

Code Sharing

Being able to have pair programming (and even screen sharing) in your editor is cool. It doesn’t come to mind for me as a crucial element, but that’s because, sadly, I do not pair a lot these days.

UI

Zed has a pleasant, simple UI. I like it. It’s bundled with tons of themes, all of which seem plenty viewable in their own right.

Tree-sitter things

Being able to fold by the syntax of a language is a fantastic feature. Same with expanding and shrinking selected text. Love it. I don’t use either of these things a ton, but having that option is so nice. Free folding out of the box for heex expressions in .ex files? Sure. Love that. Not so easy in Emacs (along with syntax highlighting those heex expressions.

AI built in

I do not use co-pilot, so I can’t comment on this, but I do use ChatGPT as a substitute for a pairing buddy — especially when I don’t know something about a new language or framework. So, having that integration in the editor isn’t going to get any complaints for me.

Things I need

There are things that Zed does not have (yet) that I find pretty crucial to my workflows. I already covered some of these in my similar post on the Helix editor.

Magit

Magit has saved me so much time over the years. It encourages good committing hygiene, and the bindings are embedded in my fingertips at this point.

An interpreted language

I don't write much elisp, but having the option is great. Many people more talented and interested than I in creating packages and tools has led to interesting innovation. Let’s look at a small example:

Orderless

Zed does not have something like Orderless, a small plugin that "that divides the pattern into space-separated components, and matches candidates that match all the components in any order." Orderless allows me to find files in my project even though I don’t know the path—the order. Below, I can find the file lib/bike_brigade_web/live/campaign_live/show.html.heex by typing camp show heex or heex show camp or even eex how amp and it works. These kinds of nice touches are what make emacs so useful—and Orderless was only created in the last few years!

Edit: on closer inspection, Zed seems to have a pretty good fuzzy finder when opening files—you just can’t have blank spaces in your search.

Having a hackable editor—at emacs levels—would be awesome. I believe Helix is exploring a lisp option as well. Will that happen? It's hard to imagine Zed, which seems to be competing in the space of mainstream editors—doing something like that as it could potentially alienate the horde of people coming from vscode.

Perhaps folks behind Zed are pretty aware of the benefits of parenthesis land, seeing that one (or more?) contributors worked on tree-sitter, which is s-expression based).

Test Runners

Lots of IDEs (and Vscode) have the ability to run tests from the test’s code with the click of the mouse. This is also possible in emacs provided that the language mode you are using has been configured as such. I love that in Elixir, I can hit SPC m t s and run the single test that is under my cursor. My impatient side struggles when I see people having to manually enter a test name, + the lines of code it’s on. I’ve seen some feature requests for this on Zed’s GitHub issues.

Wrap up

I’m impressed and excited! It’s nice to see a GUI editor that is fast, simple, clean, and seems powerful. I look forward to seeing how extensible it becomes now that it is open source. I hope it becomes a tool in my toolbox—one that is not too customizable (to avoid tinkering too) and can get the job done at the speed I’m type-thinking.