<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs/tests/test-ui-config--buffer-cursor-state.el, branch main</title>
<subtitle>My Emacs configuration
</subtitle>
<id>https://git.cjennings.net/dotemacs/atom?h=main</id>
<link rel='self' href='https://git.cjennings.net/dotemacs/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/'/>
<updated>2026-06-05T10:28:58+00:00</updated>
<entry>
<title>feat(term): replace vterm with ghostel as the terminal engine</title>
<updated>2026-06-05T10:28:58+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-05T10:28:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=ebdf9e466b0e1f86e9b7d76650ac32408273e7a7'/>
<id>urn:sha1:ebdf9e466b0e1f86e9b7d76650ac32408273e7a7</id>
<content type='text'>
I swapped the terminal engine from vterm to ghostel (libghostty-vt) everywhere. term-config replaces vterm-config (the F12 terminal, the C-; x menu, tmux history capture), and ai-term replaces ai-vterm (the F9 Claude-agent launcher). ghostel renders the agent TUI without vterm's flicker under heavy streaming, and one engine now covers every terminal workflow.

Two behavior changes fall out of the swap. F9 launches in a terminal frame now: ghostel renders in TTY frames, so the old GUI-only guard is gone. Terminal windows no longer dim when unfocused: ghostel resolves its palette into the native module per-terminal, so there's no per-window color hook to dim through the way vterm had.

auto-dim drops its vterm color-advice path, the dashboard Terminal button launches ghostel, and the vterm and vterm-toggle packages are removed. The tmux pane-history and copy-mode machinery carried over unchanged. It keys on the pty tty, which ghostel exposes.
</content>
</entry>
<entry>
<title>refactor(ui): four UI/navigation hygiene fixes from module-by-module re-review</title>
<updated>2026-05-16T07:56:25+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-16T07:56:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=d618bb4620d5d651027e772b8ccc490e1bab6d80'/>
<id>urn:sha1:d618bb4620d5d651027e772b8ccc490e1bab6d80</id>
<content type='text'>
- popper-config.el: move `(popper-mode +1)` and `(popper-echo-mode
  +1)` from the use-package `:init` block into `:config`.
  `:disabled t' on use-package skips `:config' but still runs
  `:init', so the previous shape enabled popper-mode on every load,
  including batch / test runs, despite the disabled marker.

- modeline-config.el: make `cj/modeline-vc-fetch' fall back when
  the internal `vc-git--symbolic-ref' is missing.  `require' uses
  `nil 'noerror', the call sits inside an `fboundp' guard, and
  `ignore-errors' wraps the call itself so an Emacs version that
  renames or removes the accessor leaves `branch' at
  `vc-working-revision''s output instead of crashing the modeline.

- ui-config.el: guard the cursor-color `post-command-hook' behind
  `(display-graphic-p)' both at install time and inside the
  function body.  Batch / TTY runs short-circuit cleanly with no
  per-command overhead.  A `server-after-make-frame-hook' catches
  the daemon case where the first GUI frame is created after
  ui-config loads and installs the hook lazily.  Updates
  test-ui-config--buffer-cursor-state and
  test-ui-cursor-color-integration to stub `display-graphic-p' so
  the work body still runs under batch.

- nerd-icons-config.el: drop `:demand t' (`:defer t' now), keeping
  the `:config' advice install as the natural lazy-on-load path.
  Add a `with-eval-after-load 'nerd-icons' block as a safety net for
  the already-loaded case on re-eval; the block uses `advice-member-p'
  so the advice never stacks.
</content>
</entry>
<entry>
<title>fix(ui-config): use the writeable cursor color in a live vterm</title>
<updated>2026-05-11T14:12:32+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-11T14:12:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=a70bb985c86aee2b701b40d5c3fae720863cfa4e'/>
<id>urn:sha1:a70bb985c86aee2b701b40d5c3fae720863cfa4e</id>
<content type='text'>
`vterm-mode' sets `buffer-read-only', so `cj/set-cursor-color-according-to-mode' painted the cursor with the read-only color (orange) whenever point was in a vterm. That includes the live terminal, not just `vterm-copy-mode'. But a live terminal takes input: keystrokes go to the process, not the buffer. So a live vterm now reports `unmodified' instead. `vterm-copy-mode' still reports `read-only': there it really is a read-only Emacs buffer the user navigates, and the orange cursor is the right signal.

I pulled the state cond out of `cj/set-cursor-color-according-to-mode' into `cj/--buffer-cursor-state' so it's unit-testable without a real frame or `set-cursor-color'.
</content>
</entry>
</feed>
