Skip to content

Add Emacs config with Zed-matching Synthwave84 Soft theme - #13

Merged
DROOdotFOO merged 2 commits into
mainfrom
emacs-synthwave84
Aug 8, 2026
Merged

Add Emacs config with Zed-matching Synthwave84 Soft theme#13
DROOdotFOO merged 2 commits into
mainfrom
emacs-synthwave84

Conversation

@DROOdotFOO

Copy link
Copy Markdown
Owner

Adds a chezmoi-managed Emacs config with a theme that matches Zed exactly.

Vanilla Emacs 30 (emacs-plus@30) at ~/.config/emacs: use-package +
package.el, the vertico/corfu completion stack, magit, and eglot +
tree-sitter for Elixir, Rust, TS, Go, Python, Lua, Nix, and Solidity.
New frames open on a dashboard rather than an empty *scratch*.

Theme

Zed and Ghostty were already on different Synthwave84 variants. Rather than
force one, this mirrors the split the Zed theme itself makes:

  • UI and syntax come from a new [data.theme.soft] block -- the
    Synthwave84 Soft variant Zed uses. It also carries the syntax roles
    (keyword, string, function, type, ...) that [data.theme] lacks.
  • ANSI faces reuse the base [data.theme] keys, so shell buffers inside
    Emacs still match Ghostty.

[data.theme] is untouched, so no existing template changes behavior.

Verified against a live GUI frame: Monaspace Neon, bg #2e2a3e,
keyword #fee380, string #ffa15a, function #5af5f3, type #ff92e0 --
identical to the shipped Zed theme.

Notable findings

~/.emacs.d silently shadows XDG. startup--xdg-or-homedot
(startup.el:506-524) returns ~/.emacs.d whenever that directory merely
exists -- it never checks for an init.el. The stale native-comp cache
there would have disabled this entire config. setup-emacs.sh and
make doctor now guard against it reappearing.

mise shims were invisible to the daemon. ruff and rust-analyzer are
mise shims, and mise activates from .zshrc, which the daemon's login shell
never sources; rust-analyzer only appeared to work via a separate cargo
copy. The shims directory is now added to exec-path explicitly.

config/theme/synthwave84.toml had drifted from the shipped Zed theme on
keyword (#ff7edb -> #fede5d) and type (#72f1b8 -> #ff7edb).
Corrected.

Design notes

  • eglot only hooks a mode when its server binary is on PATH, so missing
    servers degrade to a plain major mode instead of erroring. Only
    rust-analyzer and lua-language-server are installed here; the other
    languages open in tree-sitter modes with no LSP.
  • All runtime state (elpa, eln-cache, grammars, custom.el) is redirected
    to XDG dirs, keeping the chezmoi-managed tree free of drift -- so no
    home/.chezmoiignore was needed.
  • The classic startup screen only renders during true startup, so under a
    daemon emacsclient frames never see it. initial-buffer-choice points at
    a freshly refreshed dashboard, which is consulted per frame.

Manual testing

  • chezmoi apply deploys 10 files; chezmoi verify ~/.config/emacs clean
  • emacs --batch --eval '(princ user-emacs-directory)' -> ~/.config/emacs/
  • Daemon loads all six lisp/ modules; custom-enabled-themes is (synthwave84-soft)
  • Live GUI frame reports the exact Soft palette hexes and Monaspace Neon
  • 18 tree-sitter grammars compile; .ex/.rs/.go/.lua/.py/.ts/.nix/.yaml all open in their -ts-mode
  • eglot hooks rust-ts-mode and python-ts-mode; opening a Go file with no gopls yields no error
  • New client frame opens *dashboard* in dashboard-mode
  • make lint, pre-commit, and the CI template gate (every .tmpl rendered against a CI-rendered config) all pass
  • make doctor: 40 passed, 0 failed
  • Theme byte-compiles with byte-compile-error-on-warn t

Note: the Brewfile change marks run_onchange_after_brew-bundle.sh pending, so
a full chezmoi apply will run brew bundle install.

🤖 Generated with Claude Code

Vanilla Emacs 30 (emacs-plus) at ~/.config/emacs, managed by chezmoi:
use-package + package.el, vertico/corfu completion, magit, and eglot +
tree-sitter for Elixir, Rust, TS, Go, Python, Lua, Nix, and Solidity.

The theme is templated from a new [data.theme.soft] block, the
Synthwave84 Soft variant Zed uses. That block also carries the syntax
roles [data.theme] lacks. ANSI faces deliberately reuse the base
palette, so terminal buffers inside Emacs still match Ghostty --
the same split the Zed theme itself makes.

Notes:
- eglot only hooks a mode when its server binary exists, so missing
  servers degrade to a plain major mode instead of erroring.
- mise shims are added to exec-path explicitly; mise activates from
  .zshrc, which the daemon's login shell never sources.
- All runtime state (elpa, eln-cache, grammars) is redirected to XDG
  dirs to keep the chezmoi-managed tree free of drift.
- Emacs prefers ~/.emacs.d whenever it merely exists, so setup-emacs.sh
  and `make doctor` guard against that directory reappearing.
- Corrects keyword/type in config/theme/synthwave84.toml, which had
  drifted from the shipped Zed theme.
New client frames landed on an empty *scratch* in fundamental-mode.
Add dashboard.el with an ASCII banner, recent files, projects, and
bookmarks, themed to the Soft palette.

The classic startup screen only renders during real startup, so under
a daemon emacsclient frames never see it. Point initial-buffer-choice
at a freshly refreshed dashboard instead, which is consulted per frame.

Also restore *scratch* to lisp-interaction-mode with a short header,
and exclude temp dirs and elpa from recentf so the dashboard's recents
list stays meaningful.
@DROOdotFOO
DROOdotFOO merged commit 45b2964 into main Aug 8, 2026
5 checks passed
@DROOdotFOO
DROOdotFOO deleted the emacs-synthwave84 branch August 8, 2026 16:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant