| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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).
|
| |
|
|
| |
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.
|
| |
|
|
| |
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).
|
| | |
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
Closer to the actual Calibre logo than the faicon book-open. Switches the launcher's icon function to nerd-icons-codicon, adds the matching declare-function, and adds nerd-icons-codicon to the test's icon mock.
|
| |
|
|
| |
Remove every hardcoded color from the config so nothing assigns a non-themeable value. Stripped: the org-faces defface defaults (28 hex foregrounds, which the theme overrides at runtime anyway), the hl-todo keyword colors, the eshell prompt gray/white, the org-noter and music active-window #1d1b19 bg tint (face-remap is now a no-op), the pdf-view midnight palette, and the calibredb/nov epub sepia. The config now renders with default/theme faces, which surfaces where theming support is missing. Those gaps are tracked in todo.org as the next phase. 0 hex colors remain; validate-modules clean and the org-faces/build-theme/face-diagnostic tests pass.
|
| |
|
|
| |
The popup's q (cj/dirvish-popup-quit) reaps the session's dired buffers, but closing the Hyprland float directly or letting it lose focus bypasses q and orphans them, which is the "leaves a load of buffers around" symptom. A delete-frame-functions hook scoped to the "dirvish" popup frame runs dirvish-quit on every close path. Regular C-x d sessions, where multiple dired buffers are wanted for mark-and-move, and the global dired-kill-when-opening-new-dired-buffer (deliberately off for that same reason) are both untouched. Verified: a navigated popup session drops back to baseline when the frame closes without q.
|
| |
|
|
| |
eww-config.el is lexical-binding and the User-Agent advice let-binds url.el's url-request-extra-headers, but the file never declared it special. The byte-compiler then bound it lexically, so the injected header never reached url-retrieve and the desktop User-Agent silently dropped in compiled production (eww kept working, just with the default UA). A top-level (defvar url-request-extra-headers) makes the compiler treat it as dynamic so the binding propagates. The advice tests, which exercise the compiled path, now pass.
|
| |
|
|
| |
The next-agent step (C-; a n / M-SPC) cycled only live agent buffers, so a detached session (alive in tmux, no Emacs buffer) was reachable only through the picker. Now the queue is every active agent, live buffer or live session, keyed on the project dir and ordered by buffer name. Stepping onto a detached one attaches it: show-or-create recreates the terminal, which reattaches the tmux session. The live-buffer swap path is unchanged. I replaced the buffer-rotation helper with a dir-based one and added an active-agent enumerator, with 10 tests.
|
| |
|
|
| |
The two clear wins from the package-list review. avy fills the in-buffer motion gap (C-: jump-to-char-timer, M-g w/l for word/line) that windmove and isearch leave open; wgrep turns a consult-grep / embark-export result into an editable, write-back-across-files refactor (C-c C-p to edit, C-c C-c to apply).
|
| |
|
|
| |
The elisp side of the Keep integration: a pure JSON-to-org core (parse, tag/heading/render helpers) kept free of .emacs.d specifics for later extraction, plus the IO runner cj/keep-refresh (async make-process + sentinel, atomic temp-then-rename write to keep-file, stderr-token to display-warning) and the glue (C-c k prefix, executable warning, require in init.el). 15 ERT tests over the core and the parse-render-write chain. Read-only v1; live fetch needs the one-time gkeepapi + token setup.
|
| |
|
|
| |
A recurring event declined for one occurrence still synced with :STATUS: accepted, because apply-single-exception merged the override attendees but never re-derived the user's status from them, so filter-declined never dropped it. Re-derive :status via find-user-status when the exception overrides :attendees, leaving the inherited status when the override doesn't name the user. Four new tests cover declined, accepted, no-attendee, and user-absent overrides.
|
| |
|
|
| |
The Wayland branch of cj/--wallpaper-program-for returned swww, but this system's wallpaper daemon is awww, so dirvish "bg" silently no-opped. Point it at the set-wallpaper script (on PATH via dotfiles), which wraps awww img and persists the choice to waypaper's config. X11 still uses feh. Updated the wallpaper-program test to match.
|
| |
|
|
| |
ledger-config.el was never required in init.el, so the whole module was dead code. I added the require (which installs ledger-mode, flycheck-ledger, and company-ledger via the global ensure) and rewrote the clean-on-save: instead of rebinding C-x C-s to a clean-then-save command, a buffer-local before-save-hook tidies the buffer on every save path, gated by cj/ledger-clean-on-save. The reports shell out to the ledger CLI, so a load-time check now warns when it isn't on PATH. Added ledger-highlight-xact-under-point.
|
| |
|
|
|
|
| |
Add declare-function/defvar declarations for lazily-loaded package symbols, reflow over-long docstrings, swap pdf-view-*-command interactive-only calls for their non-interactive twins, fix a malformed with-demoted-errors in ledger-config (the clean-buffer body was being read as the format string), and rename the unprefixed global wwwdir to cj/httpd-wwwdir (no external refs). No behavior change.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
|
|
| |
tramp, diff, chrono, auth)
Add declare-function/defvar declarations for lazily-loaded package functions and variables so each module compiles cleanly standalone; config-utilities wraps two lazy EmacSQL oref slot reads in with-no-warnings. No behavior change.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Move own-command bindings out of use-package :bind to keymap-global-set / with-eval-after-load (C-c C-a org-appear-toggle, R music radio-station, C-c n r/t roam recipe/topic) — same keys, verified live. Pull music-config helper defuns out of :config/with-eval-after-load to top level (their proper home; emms referenced only at call time via declare-function). Swap obsolete org-show-all for org-fold-show-all (9.6). Plus declare-function/defvar for lazy symbols. No behavior change; full suite + launch smoke green.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
The use-package :bind autoload stubs for own same-file commands collided with their defuns ("defined multiple times"). Move those bindings out of :bind to keymap-global-set / with-eval-after-load after the defun — same key, command, and map, verified live in the daemon. prog-general's case was instead a redundant same-file declare-function (removed). Plus declare-function/defvar for lazy package symbols, and mark-whole-buffer swapped for goto-char+push-mark in the elfeed tag helpers. No behavior change.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
|
|
| |
dirvish, org-contacts)
Add declare-function/defvar declarations for lazily-loaded package symbols and reflow over-long docstrings so these modules compile cleanly standalone. org-contacts keeps the diary special vars (date/entry/original-date) declared function-locally rather than file-wide, so the lexical `entry` parameter is unaffected. No behavior change.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Add declare-function/defvar declarations for lazily-loaded package functions and variables so each module compiles cleanly standalone, reflow over-long docstrings, and swap the obsolete erc-server-buffer-p for its named replacement erc-server-or-unjoined-channel-buffer-p (obsolete since 30.1). No behavior change. Two erc setq targets (erc-unique-buffers, erc-generate-buffer-name-function) appear not to be real ERC variables — declared to silence the warning with a NOTE flagging that the intended buffer-naming may not be taking effect.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Add :type and a containing :group to the three localrepo defcustoms (new localrepo defgroup) and to cj/org-agenda-window-height. Drop the unused `initial` local in the org-contacts completion-at-point function.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Byte-compile flagged three let-bindings of package vars as unused lexical variables — under lexical-binding they compiled to dead locals the package never saw, so the intended behavior silently never happened. Declare each var special so the binding is dynamic: music-config now actually suppresses the emms overwrite prompt on playlist save (emms-source-playlist-ask-before-overwrite) and turns off orderless smart-case for the music picker; org-roam copy-todo-to-today now actually applies its custom dailies capture template. Same class as the coverage-core json fix.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Stop scanning org-roam notes tagged "Project" for refile targets; keep the "Topic" scan. Behavior change by decision: roam Projects are no longer pulled in anywhere (the agenda never scanned them either — that was a stale doc claim, corrected separately). Refiling into Topic notes and into per-project todo.org files is unchanged. Test reworked to assert Topic is included and Project is not.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
cj/--org-agenda-base-files now drops files that do not exist (a fresh machine may lack the synced calendars or the inbox), and org-agenda-skip-unavailable-files is set as a backstop, so org-agenda never prompts to create a missing path — the interactive-prompt class that once hung the chime daemon. The filter lives in the one shared helper, so the agenda builders, single-project view, and the chime initializer all get the existence check. Also correct the docs: the commentary and docstrings claimed org-roam nodes tagged "Project" are agenda sources, but they were never scanned; roam Project/Topic notes are refile targets (org-refile-config.el), not agenda sources.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Add the three headless functions the rulesets wrap-it-up workflow calls via emacsclient -e, since this module owns the aiv- session naming, the agent buffer, and the geometry restore. cj/ai-term-quit kills a project's tmux session and agent buffer and restores the layout, idempotent and safe when already gone. cj/ai-term-live-count returns the integer count of live aiv- sessions for the shutdown safety gate. cj/ai-term-shutdown-countdown re-checks that gate, then runs an abort-able run-at-time countdown in the echo area and, uncancelled, runs the shutdown command (a defcustom so tests stub it). Reuses the existing kill/close helpers. 13 ERT tests cover the live-count parsing, the quit kill-and-idempotency, and the gate-abort/cancel/tick logic; the tmux and shutdown side effects are manual.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Remove cj/nerd-icons-tint-color, cj/--nerd-icons-color-faces, cj/nerd-icons-apply-tint and its two call sites, so the 34 nerd-icons color faces are no longer force-set to one darkgoldenrod foreground at load time. The WIP theme already owns those faces (theme-studio auto-discovered them), so with the tint gone their per-filetype colors come from the theme and are editable in theme-studio's new nerd-icons pane. The dir-icon advice (cj/--nerd-icons-color-dir) stays — it points at a theme-owned face now. Delete the apply-tint test, which covered removed code.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Today's modified-arrow work bound every C-arrow and M-arrow to copy-mode, which swallowed C-<left>/C-<right> — readline word-motion at the shell prompt. Bind only C-<up> (enter copy-mode and scroll up); the other arrows pass through to the terminal again. C-<up> pressed while already in copy-mode now just moves up: cj/term-copy-mode-up checks tmux pane_in_mode (and ghostel--input-mode without tmux) and skips re-entry, which would otherwise reset the cursor to the start of the line.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
The simplecov parse helpers let-bound json-object-type, json-array-type, and json-key-type around json-read-file to get string-keyed hash tables. Under lexical-binding the compiler hadn't seen json.el's defvars, so it compiled those as lexical bindings that never reached the reader; the compiled helpers got json.el's default symbol-keyed alist and then signaled wrong-type-argument hash-table-p in their maphash. Interpreted code happened to work because the in-function require made the vars special first. Add eval-when-compile (require 'json) so the compiler treats them as dynamic.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Two breaks kept latexmk from ever engaging. The :hook key TeX-mode-hook expanded to the unbound TeX-mode-hook-hook, since use-package appends -hook to any symbol not ending in -mode, so TeX-command-default was never set; name the mode TeX-mode instead. Separately auctex-latexmk was :defer t with no trigger, so auctex-latexmk-setup never ran and latexmk never joined TeX-command-list; load it :after tex.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Render each real face name in the Face Diagnosis report as a button that runs describe-face on it, carrying the face as button data; anonymous specs and non-faces stay plain text. Also add face-diagnostic to the module-header allowlist now that it is required in init.el and carries the header contract.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|