aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* fix(theme): ansi-color-bright-magenta inherits magenta, not itselfCraig Jennings9 hours2-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 Jennings9 hours2-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 Jennings11 hours2-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 Jennings11 hours4-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 Jennings11 hours2-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 Jennings11 hours1-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 Jennings12 hours2-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 Jennings16 hours2-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 Jennings16 hours2-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 Jennings16 hours22-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 Jennings17 hours1-0/+7
|
* chore(theme): save WIP theme stateCraig Jennings17 hours2-86/+55
|
* chore(elfeed): add four podcasts, tag the last two untagged feedsCraig Jennings17 hours1-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 Jennings17 hours1-0/+3
|
* chore(media): default video player to mpvCraig Jennings17 hours1-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 Jennings19 hours2-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 Jennings21 hours2-3/+2
| | | | consolidation phase 4 done
* refactor(term): retire ghostel, migrate copy-mode and tmux-history to eat-configCraig Jennings21 hours10-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 Jennings22 hours1-10/+20
|
* feat(ai-term): run agents through EAT instead of ghostelCraig Jennings22 hours4-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 Jennings22 hours2-8/+207
|
* feat(eshell): zsh-parity prompt segments and zoxideCraig Jennings23 hours2-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 Jennings23 hours4-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 Jennings23 hours1-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 Jennings23 hours1-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 Jennings23 hours1-0/+8
|
* feat(eat): wire the EAT experience settingsCraig Jennings23 hours1-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 Jennings23 hours6-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.
* feat(theme-studio): make the EAT preview blocks representativeCraig Jennings25 hours2-32/+80
| | | | Expand each command's output to realistic length. The eza listing now shows a full directory of nine entries, git status shows staged, unstaged, deleted, and untracked files, git log shows nine commits with a merge graph, and make test shows seven results plus a failure detail and a totals line. One-line results read as toy output; this looks like a real terminal.
* feat(theme-studio): richer EAT preview with realistic terminal activityCraig Jennings25 hours2-19/+57
| | | | Replace the thin EAT preview with four realistic blocks above a reference key: an eza --color listing (the widest dircolors palette), git status, git log --oneline --decorate, and a make test run. Together they exercise all 16 ANSI colors in context plus the bold, faint, and prompt-annotation faces. The palette swatch, attribute, and annotation rows sit below as a key. All 24 exposed EAT faces now appear in the preview.
* chore(theme-studio): label the EMMS app and lowercase the expanded labelsCraig Jennings26 hours3-5/+12
| | | | Add a display-label override for the emms inventory app (emacs multimedia system), and lowercase all the acronym-expansion labels (eat, lsp, shr, emms) so they match the lowercase package-name labels and the package ids. The hovers keep normal capitalization since they are descriptions, not labels.
* feat(theme-studio): move reuse context from app labels into a hoverCraig Jennings27 hours4-8/+20
| | | | Clean the app labels and move the "what reuses this" context into the app dropdown's tooltip, so the labels stay short. The foundational face sets name their consumers on hover: ansi-color (vterm, eshell, compilation, ghostel, eat), shr (eww, nov, mu4e/message), gnus (mu4e article view), and dired (dirvish). Labels now carry only the name plus any acronym expansion. A small APP_HOVERS dict in face_data.py feeds an app "hover" field that sets the dropdown's title on selection.
* chore(theme-studio): spell out the LSP and SHR app namesCraig Jennings27 hours2-3/+3
| | | | Match the EAT format: lsp-mode -> Language Server Protocol (LSP), shr -> Simple HTML Renderer (SHR).
* feat(theme-studio): add EAT face docstrings to the studio hoversCraig Jennings27 hours2-2/+2
| | | | The EAT faces had no entries in face-docs.json, so their studio hovers showed nothing. Merge in the 24 exposed EAT faces' docstrings. The named color faces are aliases whose first docstring line is alias boilerplate, so this uses the descriptive line ("Face used to render red color text") instead. A full re-dump was avoided because it would drop 85 unrelated erc background-color entries not currently loaded; this is a targeted merge that only adds.
* chore(theme-studio): label the EAT app with its full name (EAT)Craig Jennings28 hours2-2/+2
|
* feat(term): close the EAT buffer when its shell exitsCraig Jennings28 hours1-0/+3
| | | | Set eat-kill-buffer-on-exit so exiting the shell (exit, C-d) kills the EAT buffer instead of leaving a dead terminal around, matching the ghostel-kill-buffer-on-exit behavior.
* chore(todo): close F12->EAT task, file the visual toggle checkCraig Jennings29 hours1-2/+11
|
* feat(theme-studio): expose EAT terminal faces with a previewCraig Jennings29 hours4-3/+40
| | | | Add EAT as a theme-studio app so its faces become editable in the studio: the 16 named ANSI palette faces, the SGR attribute faces (bold, faint, italic, slow/fast blink), and the three shell-prompt annotation faces. renderEatPreview draws a sample terminal with the palette rows, colored ls output, and the prompt annotations, so editing a face updates the preview live. No seed colors are set, so the faces sit at their own defaults until themed, consistent with the vanilla pass. Mirrors the existing ghostel terminal app.
* feat(term): toggle EAT instead of ghostel on F12Craig Jennings29 hours3-44/+96
| | | | F12 now creates and toggles a single EAT terminal (pure-elisp, fully themeable) instead of a ghostel one, reusing the existing dock-and-remember geometry toggle. ghostel stays for ai-term on M-SPC. The EAT terminal runs a plain shell with no tmux. F12 and C-; are bound in EAT's semi-char and mode keymaps so they reach Emacs from inside the terminal (EAT forwards unbound keys to the shell otherwise). Retargeted the toggle's buffer predicate and create-new path from ghostel to EAT, and updated the buffer-filter tests to the EAT semantics.
* docs(term): design for the F12 -> EAT terminal swapCraig Jennings29 hours1-0/+83
|
* chore(todo): add task to fix ai-term.el's stale F9 keybinding commentaryCraig Jennings29 hours1-0/+3
|
* chore(todo): close dashboard-theming task (heading icons + items themeable), ↵Craig Jennings30 hours1-4/+5
| | | | cancel first-f12 (not reproducible)
* feat(dashboard): enable nerd-icons on the section headingsCraig Jennings30 hours1-0/+1
| | | | dashboard-set-heading-icons t adds icons to Projects/Bookmarks/Recent titles, the last open piece of the dashboard-theming fix (file icons and the font-lock fix already landed). Renders colored now that the dashboard is out of global font-lock.
* chore(todo): transcription path half done; stderr half remains (live-run ↵Craig Jennings31 hours1-6/+4
| | | | pending)
* fix(transcription): land video transcripts beside the source, not in /tmpCraig Jennings31 hours2-4/+32
| | | | The video flow extracts audio to a temp .mp3 in /tmp, then derived the .txt/.log from that temp path, so transcripts landed in /tmp and died on reboot, contradicting the "alongside the source" docstring. Thread the source video through cj/--start-transcription-process as an optional output base so the outputs derive from it (talk.mp4 -> talk.txt beside the video). Audio is unchanged. New regression test pins the output base to the source video.
* chore(todo): close dashboard preview icons/items task (font embedded, items ↵Craig Jennings31 hours1-5/+2
| | | | themeable)
* feat(theme-studio): bind dashboard preview list items to dashboard-items-faceCraig Jennings31 hours2-22/+22
| | | | The dashboard preview rendered the project/bookmark/recent rows as plain text, so editing dashboard-items-face didn't recolor them. Wrap those rows in dashboard-items-face so the preview reflects the face. It inherits widget-button (unspecified) while unset, so the rows stay bare until the face is themed -- this only makes the preview responsive. Completes the dashboard preview's face coverage.
* chore(todo): close calendar-sync robustness + org-roam refile-freeze bugsCraig Jennings32 hours1-9/+6
|
* fix(calendar-sync): atomic writes, curl --fail, and zero-event vs garbageCraig Jennings32 hours3-17/+104
| | | | Three robustness fixes from the config audit. (1) calendar-sync--write-file and --save-state now write a temp file in the same directory and rename it into place, so org-agenda or chime reading mid-write never sees a half-written calendar. (2) The two curl fetches gain --fail, so an HTTP 404/500 error page exits non-zero instead of flowing its HTML into conversion. (3) calendar-sync--parse-ics distinguishes a healthy zero-event calendar (a real iCalendar with BEGIN:VCALENDAR and no in-window events returns the header) from garbage (no VCALENDAR returns nil), so a near-empty calendar no longer reports "parse failed". New robustness tests; the empty-calendar boundary test updated to the corrected behavior. Verified against the live feed: all three calendars fetch and write cleanly.
* fix(org-roam): drop the redundant refile-targets build that froze first idleCraig Jennings32 hours1-2/+4
| | | | org-roam is :defer 1, and its :config called cj/build-org-refile-targets, running the multi-file refile scan synchronously at the 1s idle on a cold cache, which froze Emacs at first idle. org-refile-config already schedules the same build on a 5s idle timer, so the org-roam call was a duplicate. Removed it; the 5s timer covers it.