Editor Configs and stuff

Posted March 10, 2026

I've been switching between editors a lot recently. I'm a macOS user (currently…) so that does dictate some of my editor choices.

It also depends on my mood, I guess. Sometimes I prefer to use Helix in the terminal, and sometimes I prefer to use Nova because it feels very clean to use. Occasionally, I will use Zed or VS Code for features.

Helix configuration

Helix is very "batteries included", in that it comes with a lot of what you would expect by default. This is nice because configuration is annoying. I used to be an avid NeoVim user, and the configuration can get quite… intense? You basically need a package manager for it.

Helix comes with LSP support (program that performs IDE functions for you, specialized for a certain language) and highlighting through Tree-Sitter. Unlike other LSP IDEs, it does not bundle them and expects you to install the IDEs through your package manager.

You can view LSP support through the hx --health argument (command?) which will spit out something like this:

$ hx --health rust
Configured language servers:
  ✓ rust-analyzer: /Users/jo/.cargo/bin/rust-analyzer
Configured debug adapter:
  ✘ 'lldb-dap' not found in $PATH
Configured formatter: None
Tree-sitter parser: ✓
Highlight queries: ✓
Textobject queries: ✓
Indent queries: ✓

My helix configuration is quite short:

toml ~/.config/helix/config.toml
theme = "rose_pine_dawn"

[editor]
auto-format = true

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

[keys.normal]
x = "select_line_below"
X = "select_line_above"

… This is a bit misleading, though. First off, there's languages.toml, which I use for configuring language specific stuffs:

toml …/languages.toml
[language-server.rust-analyzer.config]
check.command = "clippy"

To explain the rest of my config I'll have to go through the tools I'm using.

  • SuperHTML is an LSP (and some other stuff) for HTML. It's lints (warnings? errors?) are based on spec, instead of Prettier which seems to be "vibes". Specifically, it doesn't have "end slashes" like <br />. I hate end slashes.
  • DPrint is a multi-language code formatter, which seems to be maintained by a member of the Deno team.
  • VSCode has a few built in language servers, which have been put on brew and such.
  • Emmet is basically a very easy way to do very succinct macros for HTML and CSS. I guess people don't do this anymore because of ai... whatever..
toml …/languages.toml (continued)
[language-server.emmet-lsp]
command = "emmet-language-server"
args = ["--stdio"]

[[language]]
name = "html"
language-servers = [{ name = "superhtml", except-features = [ "format" ]}, "emmet-lsp"]
auto-format = true
formatter = { command = "dprint", args = ["fmt", "--stdin", "html"] }

[[language]]
name = "css"
language-servers = [ { name = "vscode-css-language-server", except-features = [ "format" ]} ]
auto-format = true
formatter = { command = "dprint", args = ["fmt", "--stdin", "css"] }

[[language]]
name = "javascript"
language-servers = [ { name = "typescript-language-server", except-features = [ "format" ] }]
auto-format = true
formatter = { command = "dprint", args = ["fmt", "--stdin", "javascript"] }

[[language]]
name = "typescript"
language-servers = [ { name = "typescript-language-server", except-features = [ "format" ] }]
auto-format = true
formatter = { command = "dprint", args = ["fmt", "--stdin", "typescript"] }

The context within which I use Helix

I usually run Helix inside Zellij, which is like a less confusing Tmux. I don't have too much to say about it, but it allows me to do JJ work, compilers, etc. side by side with the editor.

Dark/Light mode switching

I use macOS, which has a global light/dark theme toggle. I'm personally more of a light mode user nowadays (I have astigmatism, and I'm trying to be more diurnal nowadays) but I use dark mode sometimes so I would like my applications to switch themes.

Current theme of choice for me is Rosé Pine. I used to be a Catppuccin user, but their light theme is just bad. It's horrible to look at.

For Helix, this issue was marked as a wont-fix, so I decided to roll my own script for it. The idea being that if you alias hx to this function, every time you open it the theme will be synced for you.

fish config.fish
function lightDark -a light dark
    if defaults read -g AppleInterfaceStyle 2>/dev/null | grep -q Dark
        echo $dark
    else
        echo $light
    end
end

function hx
    set CONFIG_FILE "$HOME/.config/helix/config.toml"
    set THEME (lightDark rose_pine_dawn rose_pine)

    if test -f "$CONFIG_FILE"; and grep -q "^theme" "$CONFIG_FILE"
        sed -i '' "s/^theme = .*/theme = \"$THEME\"/" "$CONFIG_FILE"
    end
    command hx $argv
end

Now, you can basically do the same thing for Zellij…

fish config.fish (continued)
function zellij
    set CONFIG_FILE "$HOME/.config/zellij/config.kdl"
    set THEME (lightDark rose-pine-dawn rose-pine)

    if test -f "$CONFIG_FILE"; and grep -q "^theme" "$CONFIG_FILE"
        sed -i '' "s/^theme .*/theme \"$THEME\"/" "$CONFIG_FILE"
    end
    command zellij $argv
end

It's pretty similar to do the same in bash, zsh, etc. You just want to set an alias instead of a function, probably?

Nova

It's a macOS only application. It's big sells are:

  • Very nice UI
  • No AI
  • Works well enough

I'm still trying to configure it. For me, I'm not totally happy with the linting and formatting for web stuff yet, unlike Helix.

Extensions I like:

I'm missing formatting for HTML/CSS and some linting. There are options, I just haven't had the time to try all of them yet.

Nova seems to have a bit of an "issue" about having a bunch of similar extensions. I think part of the reason is that because Nova is paid, there is not as much of a userbase as something like VS Code. The only real way to figure out which one you should use is guessing from the last-updated time, though the Rust extensions have helpfully sequentially numbered themselves.

Collage of Nova extensions.

Another thing is that it doesn't have Helix keybindings. I have come to accept the fact that I will not be able to conform everything to the muscle memory of one text editor. It has a Vim mode, but switching between Helix and Vim is actively harmful to muscle memory. When I'm using Nova, I'm okay with being a bit slower. For most developers, words per minute is not a useful metric for programming work.

Zed

I love-hate Zed. Compared to Nova it's ugly and has bad text rendering. However it does have more support for extensions and debugging and stuff, like VS Code.

jsonc ~/.config/zed/config.json
{
  "base_keymap": "JetBrains",
  "helix_mode": true,
  "which_key": { // Gives hints about Helix binds
    "enabled": true,
    "delay_ms": 100,
  },

  "tab_size": 4,
  "project_panel": {
    "sort_mode": "mixed",
  },

  "format_on_save": "on", // Yea, it's a string "on" or "off"??
  "autosave": "on_focus_change",

  "disable_ai": true, // thank you zed team

  // Inline errors (vsc code lens, default in jetbrains)
  "diagnostics": {
    "inline": {
      "enabled": true,
      "max_severity": null,
    },
  },

  // Theming
  "icon_theme": {
    "mode": "system",
	  // These are from an extension
    "light": "JetBrains New UI Icons (Light)",
    "dark": "JetBrains New UI Icons (Dark)",
  },
  "ui_font_size": 16,
  "ui_font_family": ".SystemUIFont", // SF Pro on macOS
  "buffer_font_size": 12.0,
  "buffer_font_family": "Maple Mono",
  "buffer_line_height": "comfortable",
  "theme": {
    "light": "Rosé Pine Dawn",
    "dark": "Rosé Pine Moon",
  },

  // Language stuff
  "lsp": {
    "rust-analyzer": {
      "initialization_options": {
        "check": {
          "command": "clippy"
        }
      }
    },
    // I've omitted some stuff because it's not too useful
  },
}

There's a bunch more stuff you can configure in Zed (keymap.json, tasks.json, project specific overrides, …) but it's not very useful to me to go that deep. Zed feels like the Vim of GUI editors, in a bad way. I would list my extensions, but you can probably figure out what I would install based on what I've listed above.