Skip to content

Editors & terminal

Reviewed against 92e8426, 2026-10-17. Files: dot_config/nvim/**, dot_config/ghostty/config, dot_claude/**, .chezmoitemplates/zed-settings.json (rendered to ~/.config/zed/settings.json and, on Windows, ~/AppData/Roaming/Zed/settings.json).

Neovim

Kickstart-style lazy.nvim config. Requires Neovim 0.11+: lsp.lua uses vim.lsp.config() and mason-lspconfig v2's auto-enable, and treesitter.lua targets nvim-treesitter's main branch. Distro packages older than that fail on start (G-02).

Options (lua/options.lua): line numbers + relative, cursorline, sign column always, scrolloff 8, no wrap, truecolor, dark background, 4-space soft tabs with smart indent, ignorecase + smartcase, no hlsearch, splits open right/below, persistent undo, no swap or backup, updatetime 50, timeoutlen 300, mouse on, system clipboard (unnamedplus), confirm on quit, visible whitespace (», ·, ␣).

Keymaps (lua/keymaps.lua, leader = Space):

Keys Action
<Esc> clear search highlight
<leader>w / <leader>q save / quit
<C-h> <C-l> window left / right
<C-j> <C-k> window down / up
]q [q quickfix next / previous
J / K (visual) move selection down / up
<C-d> <C-u> n N keep cursor centred
<leader>p (visual) paste without yanking
<leader>y / <leader>Y yank to system clipboard
<S-h> / <S-l> previous / next buffer
<leader>ff fg fb fh fr / Telescope files, live grep, buffers, help, resume, in-buffer
<leader>e nvim-tree toggle
<leader>gg LazyGit
gd gr K <leader>rn <leader>ca <leader>fm LSP definition, references, hover, rename, code action, format
<C-Space> <CR> <Tab> <S-Tab> (insert) completion open, confirm, next, previous

Colourscheme tokyonight night; lualine themed to match. Plugins, LSP servers and parsers: generated Neovim page.

Ghostty (macOS desktop only)

Setting Value
font-family / font-size / font-thicken JetBrainsMono Nerd Font / 14 / true
theme Catppuccin Mocha, opacity 1.0
Window 10 px padding balanced, window-save-state = always, unfocused split opacity 0.7
Cursor block, no blink
copy-on-select clipboard
clipboard-paste-protection true
mouse-hide-while-typing true
scrollback-limit 10,000,000
macos-option-as-alt true
macos-titlebar-style tabs
Keybinds cmd+h/j/k/l → goto split (overrides macOS Hide), cmd+enter → fullscreen

Shell integration left at Ghostty's auto-detect defaults.

Zed (every desktop profile)

Zed replaced VS Code as the GUI editor on 2026-09-22. One template, .chezmoitemplates/zed-settings.json, renders to ~/.config/zed/settings.json on macOS and Linux and to ~/AppData/Roaming/Zed/settings.json on Windows. Skipped on headless (Zed needs a GPU). Installed by the gui.Brewfile cask, the ZedIndustries.Zed winget package, and zed.dev/install.sh on Linux desktops.

Setting Value
base_keymap VSCode
theme dark mode, Ayu Dark / Ayu Light
icon_theme Colored Zed Icons Theme Dark (from the extension below)
ui_font_size / buffer_font_size / buffer_font_family 16 / 15 / JetBrainsMono Nerd Font
autosave / format_on_save on_focus_change / on
cli_default_open_behavior existing_window
minimap.show always
session.trust_all_worktrees true
Panels project, outline, collaboration and git docked right; agent docked left
agent_servers claude-acp from the registry
auto_install_extensions Zed installs these itself on launch: generated list

There is no separate extension installer script any more; add a line to auto_install_extensions and push. EDITOR/VISUAL stay nvim for terminal use; git config core.editor too.

Claude Code status line (macOS + Linux)

dot_claude/statusline.sh → ~/.claude/statusline.sh: Catppuccin Mocha powerline segments, in order model + effort (mauve), context % (blue), 5-hour session % (teal), directory (peach) and git branch + status (yellow). Context and session turn red at 80%. Directory and git logic follow ~/.config/starship.toml. Needs bash, jq and git. No network calls.

dot_claude/modify_private_settings.json sets statusLine and env.CLAUDE_CODE_SUBAGENT_MODEL=sonnet in ~/.claude/settings.json, and adds the plugins below if they're missing (a local /plugin disable is kept). Claude Code owns the rest of that file (permissions, plugins, drafts), which stays per-machine and out of this public repo. If jq is missing or the file isn't valid JSON, the script passes it through unchanged. Windows ignores .claude entirely.

Subagent routing

dot_claude/CLAUDE.md → ~/.claude/CLAUDE.md: a task → agent/model/effort table that the main (Opus) session follows on every Agent call: Haiku for lookups, Sonnet for implementation, Opus for planning and review, Fable only when stuck. dot_claude/agents/Explore.md overrides the built-in Explore agent so code search runs on Haiku at medium effort instead of the main model. CLAUDE_CODE_SUBAGENT_MODEL=sonnet catches any agent that names no model (general-purpose, workflow agents).

Plugins

  • codex@openai-codex (openai/codex-plugin-cc): /codex:review, /codex:adversarial-review and /codex:rescue run on the ChatGPT/Codex subscription, not Claude Max. Added only where codex and node are on PATH, because its hooks run node. The codex cask is in gui.Brewfile; log in once with codex login. Leave the review gate (/codex:setup --enable-review-gate) off: it can loop Claude and Codex and burn both limits.
  • typesafe@typesafe-ai (typesafe-ai/skills): one skill that teaches Claude the TypeSafe/Jev API for projects that call it. Code it writes needs TYPESAFE_API_KEY.