aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* chore(todo): re-scope wttrin task to the verified root causeCraig Jennings14 hours1-1/+4
| | | | Replaces the wrong "blocked on shipping" read. The real cause was the inventory capture matching only versioned package dirs, fixed in a5fd0b4d and verified on a clean load. Remaining work is a clean-Emacs inventory regen and getting the new face into the checkout source.
* fix(theme-studio): capture unversioned local checkouts in the package inventoryCraig Jennings14 hours1-1/+4
| | | | build-inventory.el grouped faces by their defining file and pulled the package name only from versioned directories (/elpa/PKG-VERSION/). Locally-developed packages live in unversioned directories (/elpa/PKG/), so every one of them was silently excluded from the studio. Make the version suffix optional so unversioned checkouts are captured too. Verified against a clean wttrin load: wttrin-key resolves to /elpa/wttrin/wttrin.elc and the regex extracts "wttrin". The inventory itself needs regenerating in a clean Emacs to pick these up.
* chore(todo): re-scope the wttrin theme-studio task to its real shapeCraig Jennings15 hours1-2/+2
| | | | Investigation showed wttrin is not a studio app at all: package-inventory.json is generated from installed packages, has no wttrin entry, and wttrin is on an unmerged feature branch so the capture cannot see it. So it is a from-scratch build blocked on wttrin shipping, not the one-line face add the handoff implied.
* fix(eat): bind zoom-out and reset in eat-semi-char-mode-mapCraig Jennings15 hours1-0/+13
| | | | In eat-semi-char-mode, C-- was bound to eat-self-input and forwarded to the terminal, so it never reached text-scale-decrease and the font could only grow. A session climbed to text-scale 17 (~20x, unreadable) with no in-buffer way down. Bind C-- to text-scale-decrease and C-0 to a reset helper. C-= and C-+ already passed through. Low cost: the terminal program and tmux don't use Ctrl+-, and C-0 shadows digit-argument inside eat buffers only.
* chore(todo): file inbox handoffs as tasksCraig Jennings15 hours1-0/+5
| | | | Two actionable items from the inbox: eat semi-char mode swallows zoom-out (home-emacs, with the proposed binding fix in the body) and a new wttrin-instructions-header face for the theme-studio wttrin preview (emacs-wttrin). The other two emacs-wttrin notes were informational changes that already landed in weather-config.el and verified live, so they only needed marking processed.
* chore(todo): close the dirvish preview rebuild taskCraig Jennings16 hours1-2/+2
| | | | Shipped this session in 61b68fcf and visually verified, so the sub-task becomes a dated event-log entry under the Theme-Studio project.
* chore(theme): WIP set nerd-icons-completion-dir-face to goldCraig Jennings16 hours2-2/+3
| | | | Gold completing-read folders against the silver file and dirvish icons. The nerd-icons-config override is what lets this face win over the global dir advice.
* fix(nerd-icons): color completing-read folders via the completion dir faceCraig Jennings16 hours1-1/+14
| | | | The cj/--nerd-icons-color-dir advice forces nerd-icons-yellow onto every dir icon, which wins over nerd-icons-completion's inherit-behind dir face, so setting nerd-icons-completion-dir-face had no visible effect and folders just followed nerd-icons-yellow. Redefine the file-category completion icon to copy the dir icon and prepend nerd-icons-completion-dir-face so it takes the foreground. The copy keeps nerd-icons' memoized original untouched, so dired and dirvish folders are unaffected. Now completing-read folders carry their own color while file icons keep their type face.
* chore(theme-studio): refresh face-coverage reportCraig Jennings22 hours1-196/+1256
| | | | The committed report was dated 2026-06-18 and 457 faces behind the current set (1293 to 1750 tracked, 43 to 51 package groups). Regenerated from current face data.
* chore(theme): WIP palette pass over nerd-icons and dirvish facesCraig Jennings22 hours2-121/+146
| | | | Region background to #424f5e, highlight distant-foreground, a few ui face locks, plus a sweep of the nerd-icons color palette (the d/l/alt variants) and several dirvish faces (file-modes, free-space, hl-line, inactive).
* feat(theme-studio): rebuild the dirvish preview as a realistic two-paneCraig Jennings22 hours2-24/+106
| | | | The preview was a flat catalog dumping every face on labeled lines. It's now a believable two-pane dirvish: an active directory listing (the real nerd-icon glyph and color per file type, dir-entry counts, file sizes, the hl-line on the selected row, a dimmed backup) beside an ls-l preview of the selected dir. Faces that don't fit a calm listing (vc, git, subtree, media, proc, narrow, emerge) moved to a labeled extras strip below, so all 38 dirvish faces stay covered. Glyphs and colors mirror what nerd-icons actually emits per type.
* chore(todo): file the session's deferred work, close ghostel consolidationCraig Jennings24 hours1-5/+30
| | | | Add seven tasks for the deferred changes from the EAT, dirvish, and completion-category work: darken the EAT diff colors, rebuild the theme-studio dirvish preview (under the Theme-Studio project), root-cause webm previews, completion categories for the mu4e attachment picker and the file-basename pickers, and two watchlist items at #D (the Claude Code upstream bleed and the occur/xref font-lock question). Close Consolidate on EAT now that Phase 5 shipped this session.
* fix(ibuffer): exclude ibuffer from global font-lock so its faces standCraig Jennings24 hours1-0/+6
| | | | ibuffer paints its rows with manual nerd-icons and ibuffer faces, and global font-lock was leaking font-lock-keyword-face onto the buffer and mode names. Exclude ibuffer-mode, the same fix as the shr-rendered reader modes. An empirical scan confirmed plain tabulated-list listings like package-menu and Buffer-menu survive font-lock untouched, so this is scoped to ibuffer, whose content trips keyword fontification.
* fix(reader): exclude eww and nov from global font-lock so shr colors showCraig Jennings24 hours2-0/+12
| | | | eww and nov both render with shr, which paints buffers with manual face properties, and global font-lock was overwriting them with syntactic string fontification, the same bug just fixed for elfeed. An audit of live buffers caught nov directly (two open epub buffers, faces clobbered). eww has font-lock-defaults nil too and is the same shr-rendered pattern as the already-excluded elfeed-show and mu4e-view, so I excluded it alongside. The *sdcv* dictionary buffer has its own font-lock-defaults, so its font-lock is by design and left alone.
* fix(elfeed): exclude elfeed modes from global font-lock so the theme showsCraig Jennings24 hours1-0/+7
| | | | elfeed paints its search and entry buffers with manual face properties, the date, title, feed, and tag faces the theme styles. Left in global-font-lock-mode the buffer also got syntactic fontification, which overwrote those with font-lock-string-face, so it lost every theme color. Exclude elfeed-search-mode and elfeed-show-mode through cj/exclude-from-global-font-lock, the same fix dashboard and mu4e already use.
* feat(completion): annotate the Signal and contact pickers via categoriesCraig Jennings25 hours2-5/+25
| | | | Two pickers have bare-name candidates worth a category: the Signal recipient picker, where a name maps to a phone or UUID, and org-contacts find, where a name maps to an email. I tag each with a custom category and a table annotation-function that shows the looked-up value. marginalia has no annotator for these custom categories, so it leaves the table's annotation in place. The other Tier-2 candidates from the survey (ai-term projects, the mu4e contact list) already carry their info inline, so a category adds nothing and I left them bare.
* feat(completion): tag four pickers with categories for marginaliaCraig Jennings25 hours5-5/+40
| | | | Add cj/completion-table (and an annotated variant) to system-lib: a wrapper that tags any collection with a completion category so marginalia, embark, consult, and sorting can recognize the candidates. None of the config's completing-reads declared a category, so the rich-candidate pickers showed bare. This applies it to the four whose candidates match a standard category and so need no custom annotator: benchmark-method (function), ERC buffer switch (buffer), ai-term close (buffer), and theme switch (theme). Each now annotates for free.
* feat(music): configurable in-track seek via an mpv control socketCraig Jennings30 hours1-3/+41
| | | | The subprocess player I just switched to dropped in-track seek. I re-added it without the startup fragility that made the IPC player unreliable. mpv still plays the track as a direct argument, so the reliable start is untouched, and --input-ipc-server opens a control socket that only carries seek commands to the already-playing process. f and b seek by cj/music-seek-seconds (default 5). The socket send is a no-op when nothing is playing, so it never errors.
* fix(music): drive mpv as a direct subprocess for reliable playbackCraig Jennings30 hours1-16/+59
| | | | EMMS drove mpv over an IPC socket, starting it idle and sending loadfile across the socket. That handshake left mpv loaded but never streaming, so playback silently failed and the playing flag never set. I replaced it with a subprocess player that runs mpv with the track as a direct argument, the invocation that plays every time. Pause works in place through process signals, SIGSTOP and SIGCONT. In-track seek is gone, the deliberate trade for reliability. --no-config isolates this mpv from the interactive video setup so the two cannot interfere, and it follows the system default audio sink.
* chore(theme): save WIP theme stateCraig Jennings2 days1-1/+14
|
* fix(eat): exclude eat-mode from global font-lockCraig Jennings2 days1-0/+9
| | | | EAT paints its whole palette with manual face text properties. Inside global-font-lock-mode the terminal buffer also got syntactic fontification, so a quoted string in program output (a diff shown by Claude Code) became font-lock-string-face and overrode the foreground EAT had painted. The result was the theme's string green over the green diff-added background, green on green. I excluded eat-mode the same way dashboard and mu4e are, through cj/exclude-from-global-font-lock. A mode-hook can't do it because global font-lock runs after the mode hook.
* chore(todo): file theme-studio package-coverage and guide-support tasksCraig Jennings2 days1-32/+33
|
* fix(theme): ansi-color-bright-magenta inherits magenta, not itselfCraig Jennings2 days2-256/+259
| | | | The bright-magenta face was self-referential, so it resolved to no color and difftastic's bright-magenta string literals rendered near-black. Point it at ansi-color-magenta like the other bright faces. Also a broader WIP ansi/palette pass.
* feat(eat): reset SGR at newline to contain unterminated-color bleedCraig Jennings2 days2-0/+36
| | | | Claude Code and similar inline TUIs sometimes truncate a colored span without emitting a reset; the unterminated color then bleeds onto every following line in the EAT buffer. Advise eat-term-process-output to inject an SGR reset before each newline, containing the bleed to its own line. Validated in real EAT and via an ansi-color proxy: it contains the bleed and leaves per-line coloring intact, since programs re-open their color on each line. Gated by cj/eat-reset-sgr-at-newline (default on) so it can be disabled if a program ever carries one color across newlines without re-opening it.
* feat(eat): tame the viewport bounce from full-frame inline redrawsCraig Jennings2 days2-1/+23
| | | | Claude Code (and any Ink-style inline TUI) moves the terminal cursor up to redraw its whole block and back to the bottom on every tick; EAT follows the cursor with point, so the Emacs window chases it up and down -- the bounce. Add cj/--eat-tame-scroll on eat-mode-hook: scroll-conservatively 101, scroll-margin 0, and auto-window-vscroll nil, so the window line-scrolls minimally instead of recentering. It doesn't remove the bounce (the inline redraw is the root) but makes each jump gentler.
* chore(elisp): clear byte-compile warnings via declarations and a loop rewriteCraig Jennings2 days4-6/+17
| | | | Add the missing declare-function and defvar declarations that silence the not-known-to-be-defined and free-variable warnings in local-repository, org-webclipper, and weather-config. Rewrite jumper--location-exists-p from dotimes to cl-loop thereis, which fixes a spurious unused-variable warning and short-circuits on the first match. The remaining obsolete-generalized-variable warnings (point in pearl-config, buffer-substring in org-webclipper) come from upstream package macros (pearl, org-web-tools) and are not fixable in our code.
* feat(dirvish): make dired d=diff and D=delete to match the conventionCraig Jennings2 days2-3/+35
| | | | dired's d was dired-flag-file-deletion and D was dired-do-delete, while the ediff diff sat on e. Bind d to the ediff diff and keep D as delete, so the d=diff / D=delete pair is consistent with C-; b and ibuffer. d no longer flags for deletion -- mark with m for batch deletes, then D. Fix the stale commentary (it called d "delete" and D "duplicate") and add which-key labels for the pair.
* fix(custom-buffer-file): correct swapped which-key labels for C-; b d and DCraig Jennings2 days1-2/+2
| | | | C-; b d is cj/diff-buffer-with-file and C-; b D is cj/delete-buffer-and-file, but the which-key labels had them reversed -- d read as "delete file" and D as "diff buffer with file". The mislabel made D look like the diff key, so pressing it to see a diff deleted the file instead. Swap the labels to match the actual bindings.
* fix(eat): forward word-motion arrows to the terminal in agent buffersCraig Jennings2 days2-1/+17
| | | | C-/M-left/right were in EAT's default eat-semi-char-non-bound-keys, so they fell through to Emacs and ran left-word/right-word, moving point in the EAT buffer instead of being sent to the program. The terminal's own cursor never moved, so the next keystroke snapped point back to the real cursor -- the "cursor jumps back" symptom when editing claude's input. Bind them to eat-self-input so they forward as word motion, the way ghostel did. Window arrows (S-, C-M-) still reach Emacs for windmove and buffer-move.
* fix(eat): make Escape the unified copy-mode exitCraig Jennings2 days2-1/+33
| | | | EAT's semi-char mode left the bare escape key unbound and treated ESC only as the Meta prefix, so a lone Escape never reached the pty. That is why C-<up>'s tmux copy-mode could not be exited with Escape: tmux's own Escape=cancel binding never saw the key. Bind <escape> to forward ESC to the terminal, so it cancels tmux copy-mode and still works in TUIs like vim. Also bind <escape> in eat-mode-map to return to semi-char, so the same key exits EAT's own emacs and char modes. One exit key for both copy views; q is no longer required.
* chore(ibuffer): put diff on d and delete on DCraig Jennings2 days2-0/+19
| | | | In the ibuffer buffer list, d now diffs the buffer at point against its saved file (ibuffer-diff-with-file, was on =) and D marks it for deletion (was on d; x still executes the marks).
* refactor(term): finish ghostel retirement (phase 5)Craig Jennings2 days22-87/+45
| | | | Remove the dead ghostel app from theme-studio: the GHOSTEL_FACES/SEED data, the registry row, the renderGhostelPreview previewer, and the package_seed test, then regenerate the tool. ansi-color stays since eat inherits it. Rename testutil-ghostel-buffers to testutil-terminal-buffers and drop make-fake-ghostel-buffer; the toggle-filter test now uses the eat fixture, since agents are eat. Fix the comments that still called the agent buffers ghostel (they're eat now) in eat-config and the ai-term and auto-dim test docstrings. I also package-deleted the unused ghostel ELPA package. Full suite green; the remaining ghostel mentions are accurate migration history.
* chore(todo): file the video-loop manual check under Manual testingCraig Jennings2 days1-0/+7
|
* chore(theme): save WIP theme stateCraig Jennings2 days2-86/+55
|
* chore(elfeed): add four podcasts, tag the last two untagged feedsCraig Jennings2 days1-2/+14
| | | | Added Odd Lots, Conversations with Tyler, Plain English with Derek Thompson, and the All-In Podcast. I resolved each channel_id and verified the feed resolves with fresh content before adding; Odd Lots uses Bloomberg's audio playlist since its channel handle is an empty placeholder. Also tagged the two feeds that carried only yt: On with Kara Swisher (on) and Tropical Tidbits (tropical).
* chore(elfeed): add Platypus Economics YouTube channelCraig Jennings2 days1-0/+3
|
* chore(media): default video player to mpvCraig Jennings2 days1-2/+4
| | | | mpv resolves streaming-site URLs itself via yt-dlp, so it needs no pre-extracted stream URL or format-guessing the way vlc does. This drives both elfeed's v (cj/play-with-video-player) and the general default.
* feat(external-open): open videos in a looping playerCraig Jennings2 days2-16/+142
| | | | Opening a video from dirvish routed through cj/xdg-open to the OS default handler, which plays it once. I pulled the video extensions into their own cj/video-extensions list and route them through a new cj/open-video-looping, which launches mpv with --loop-file=inf (the player and its args are both customizable) detached, so the video plays on repeat. Audio and office docs still use the OS default handler. The find-file advice already covers dirvish RET, so this applies wherever a video is opened.
* test(init): drop deleted term-config from the classified-modules list; mark ↵Craig Jennings3 days2-3/+2
| | | | consolidation phase 4 done
* refactor(term): retire ghostel, migrate copy-mode and tmux-history to eat-configCraig Jennings3 days10-671/+288
| | | | Complete the EAT consolidation by removing ghostel. ai-term and F12 already run on EAT, so ghostel's only remaining users were the dashboard launcher and term-config itself. Migrate the terminal-generic pieces into eat-config: the tmux copy-mode (C-<up> enters it, the same UX and keybinding as before, since agents run EAT over tmux) and the tmux-history capture, swapping ghostel-send-string for a pty write and the mode checks to eat-mode. Repoint the dashboard "Launch Terminal" to the eshell/EAT toggle, swap the face-diagnostic terminal-mode check to eat-mode, and refresh auto-dim's comment. Delete term-config.el and its init require. EAT's default semi-char non-bound-keys already lets windmove, buffer-move, and the Emacs essentials reach the terminal. Tests retargeted; the obsolete ghostel-keymap-exceptions tests are dropped.
* chore(todo): mark ai-term EAT port done (phase 3), file the agent-launch checkCraig Jennings3 days1-10/+20
|
* feat(ai-term): run agents through EAT instead of ghostelCraig Jennings3 days4-119/+96
| | | | Port ai-term from ghostel to EAT. Agents spawn in an EAT terminal running the same tmux session (tmux new-session -A -s aiv-<project>), so the persistence and detach/reattach model is unchanged. A spike confirmed EAT + tmux detach and reattach exactly like ghostel + tmux. The swaps: (ghostel) becomes (eat) with eat-buffer-name carrying the agent name, ghostel-send-string becomes a process-send-string helper, and the M-SPC swap chord is bound directly in eat-semi-char-mode-map (no exception-list plus rebuild dance). Buffer detection was already name-based, so the dispatch, next, and cycle logic is unchanged. Dropped the now-unused suppress-tmux variable. Tests updated to mock eat.
* chore(theme): save WIP theme stateCraig Jennings3 days2-8/+207
|
* feat(eshell): zsh-parity prompt segments and zoxideCraig Jennings3 days2-0/+134
| | | | Bring eshell closer to the zsh terminal it replaces. The prompt now shows the git branch (read from .git/HEAD, no subprocess, skipped on remote so TRAMP stays fast) and a [N] exit-status segment when the last command failed, matching the zsh prompt's info. Add a zoxide z command and an eshell-directory-change hook that feeds zoxide add, sharing the same frecency database as the zsh shell. New tests cover the pure prompt helpers.
* refactor(term): F12 opens eshell-through-EAT, retire eshell-toggle and ↵Craig Jennings3 days4-76/+62
| | | | | | xterm-color Point the F12 dock-and-remember toggle at eshell instead of a standalone EAT zsh shell, so the primary terminal is eshell running through EAT (eat-eshell-mode): elisp functions as commands, TRAMP transparency, and EAT rendering visual commands. Drop the eshell-toggle package and its C-<f12> binding, since F12 covers it now. Drop xterm-color from eshell, since EAT handles ANSI color natively and its TERM=xterm-256color fought EAT's own. The toggle's buffer predicate now matches eshell-mode; the toggle tests and fixture are updated.
* feat(eshell): run eshell commands through EAT via eat-eshell-modeCraig Jennings3 days1-0/+9
| | | | Enable eat-eshell-mode so eshell's external commands run in a real EAT terminal: visual commands (vim, htop, less) render properly and ANSI output is faithful, while eshell stays the shell (elisp functions as commands, TRAMP transparency). Activated when eshell loads. EAT handles color natively, so it likely supersedes xterm-color for eshell -- left in place pending an interactive color check.
* feat(eat): enable sixel inline images and the kill-while-running confirmCraig Jennings3 days1-0/+3
| | | | Set eat-sixel-render-formats and eat-query-before-killing-running-terminal explicitly. Both are EAT defaults; making them explicit documents that inline images and the safety prompt are wanted.
* chore(todo): file the EAT consolidation roadmap (phases 1-2 done)Craig Jennings3 days1-0/+8
|
* feat(eat): wire the EAT experience settingsCraig Jennings3 days1-0/+14
| | | | Set EAT's shell-integration and interaction options in eat-config.el. Enable yank-to-terminal (the one useful default that ships off), and affirm directory tracking, prompt annotations, command history, mouse, kill-from-terminal, and alt-screen explicitly so the config documents intent. Bump scrollback to 10MB to match the old ghostel. Truecolor is already on via the compiled eat-truecolor terminfo. Directory tracking, annotations, and history only activate once the shell sources EAT's integration script, added to the zsh rc separately.
* refactor(term): extract eat-config.el from term-config.elCraig Jennings3 days6-198/+223
| | | | Move the eat use-package, the F12/C-; keymap wiring, and the F12 dock-and-remember toggle out of term-config.el into a dedicated eat-config.el. term-config.el keeps ghostel (ai-term's backend) and requires eat-config for cj/term-toggle and cj/turn-off-chrome-for-term. Pure relocation, no behavior change. First step toward consolidating on EAT and retiring ghostel. The toggle tests now require eat-config.