summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
8 hoursdocs(music): add ncmpcpp keybinding comparison table to commentaryHEADmainCraig Jennings
Document playlist-mode keybindings with ncmpcpp default alignment status (83% match). Note intentional divergences (SPC/p swap, x=consume vs crossfade) and EMMS-only features.
8 hoursfeat(music): align EMMS keybindings with ncmpcpp, add consume modeCraig Jennings
Reconcile playlist-mode bindings with ncmpcpp defaults: add ncmpcpp- compatible aliases (>/<, +, S-up/S-down, c), new toggles (r repeat, t repeat-track, z random, x consume), info keys (i, o), and relocate radio (r→R), reload (R→g), shuffle (x→Z). Add consume mode that removes tracks from playlist after playback via emms-player-finished- hook. Fix buffer-local bug where emms-playlist-selected-marker was checked outside with-current-buffer. 13 ERT tests.
10 hoursfeat(dashboard): add recent files section to startup dashboardCraig Jennings
Added 5 most recent files below projects and bookmarks using dashboard's built-in recentf integration.
16 hoursperf(calendar-sync): replace shell-out timezone conversion with pure ElispCraig Jennings
convert-tz-to-local was spawning a `date` subprocess per timestamp, causing ~15s parse freezes on Proton (223 events) and ~10s on Google (1543 events). Replaced with encode-time/decode-time ZONE argument — same TZ database, no subprocess overhead. Parse times now 0.2-2.8s. Also adds phase timing instrumentation behind cj/debug-modules flag.
20 hoursrefactor(tasks): migrate todo.org to Open Work / Resolved formatCraig Jennings
Decouple task tracking from V2MOM strategic framework. Archive full V2MOM history to v2mom.org, replace todo.org with flat task list under Emacs Open Work / Emacs Resolved headings. Merge duplicate tasks (org-noter, buttercup, localrepo, lorem-optimum). 29 open tasks, no method grouping.
30 hoursfeat(reveal): add org-reveal presentation workflow with ERT testsCraig Jennings
Replaced pandoc-based reveal.js export with native ox-reveal integration. New org-reveal-config.el module provides offline, self-contained HTML export with keybindings under C-; p. Includes setup script for reveal.js 5.1.0 and 34 ERT tests covering header template and title-to-filename helpers.
33 hourstest: add ERT coverage for modeline-config and hugo-configCraig Jennings
Add 67 tests across 6 new test files for modeline and hugo modules. Refactor hugo-config: extract post-file-path and post-template helpers from interactive new-post function for testability. Update todo.org with test audit (31 modules), priority adjustments, and task cleanup.
33 hoursfeat(hugo): extract hugo-config module with C-; h keybindingsCraig Jennings
Standalone module for ox-hugo blog workflow. One-file-per-post structure with keybindings for new post, export, open dir (dirvish and system file manager), and toggle draft.
34 hoursfeat(export): add ox-hugo config with capture templateCraig Jennings
Enable ox-hugo for Hugo blog workflow. Adds C-c c h capture template for quick post creation with auto-generated slug and date.
45 hoursfix(agenda): scope file scan to immediate subdirs of ~/projectsCraig Jennings
Replace recursive directory-files-recursively with shallow scan that only checks ~/projects/*/todo.org. Excludes nested archive todo.org files and keeps ~/code and ~/.emacs.d out of agenda.
6 daysfix(keyboard): support daemon mode for M-S- key translationsCraig Jennings
GUI key translations (M-O → M-S-o, etc.) were never installed in daemon mode because env-gui-p returns nil at startup with no frame. Use server-after-make-frame-hook for daemon, emacs-startup-hook otherwise. Also adds timestamps to assemblyai-transcribe output.
6 daysfix(font): prevent HarfBuzz SIGSEGV crash on emoji in mu4e headersCraig Jennings
Emacs 30.2 + HarfBuzz 12.3.2 segfaults when arabic-shape-gstring is called on emoji characters during mu4e header rendering. Disable Arabic composition ranges, set inhibit-compacting-font-caches, and disable auto-composition in mu4e-headers-mode. Remove duplicate bidi settings from system-defaults.el (already in early-init.el).
7 dayschore: sync templates, rename NOTES.org to notes.orgCraig Jennings
Execute cross-project announcements: delete old workflow files, remove templates cache, rename NOTES.org to lowercase notes.org.
9 daysfix(test): add missing testutil require for sanitize-org-body testsCraig Jennings
9 daysfeat(recording): rewrite device setup, fix video stop, update modeline iconsCraig Jennings
Video stop fix: kill wf-recorder (producer) first on Wayland so ffmpeg gets clean EOF, then signal process group. Replaces sit-for with poll-based wait-for-exit. Fixes zero-byte output files. Device selection: rewrite quick setup to show all available mics with PulseAudio descriptions, auto-detect default sink monitor for system audio. Skip confirmation dialog, add Cancel option to mic list. Modeline: replace red dot emoji with nerd font icons (mic/camcorder). Rename quick-setup-for-calls to quick-setup, rebind C-; r s / C-; r S. 173 recording tests pass (was 165).
9 daysfix(calendar-sync): increase fetch timeout for large calendarsCraig Jennings
Google calendar (7k+ events, 4.5MB) was hitting the 30s hard-coded curl timeout. Use configurable calendar-sync-fetch-timeout (default 120s) with a separate 10s connect-timeout for fast failure on unreachable hosts.
9 daysfix(calendar-sync): sanitize description text to prevent org heading corruptionCraig Jennings
Event descriptions containing lines starting with * were being interpreted as org headings, breaking file structure. Replace leading asterisks with dashes before writing descriptions.
10 daysfix(calendar-sync): fix heading order, continuation lines, and exception ↵Craig Jennings
text cleaning Three bugs found during manual verification of calendar sync output: 1. Heading/timestamp order reversed in event-to-org — nreverse pattern put timestamp before the org heading. Swap initial list order. 2. get-property continuation line regex broken — the ^ anchor in "^\n[ \t]" prevented matching at the correct position, truncating long DESCRIPTION values at the first ICS line fold. Remove anchor, add explicit position check (matching get-all-property-lines pattern). 3. collect-recurrence-exceptions didn't clean text — exception instances got raw ICS text (literal \n, HTML tags) replacing the cleaned base event text. Wrap summary/description/location in clean-text.
10 daysfeat(calendar-sync): add event details — attendees, organizer, status, URLCraig Jennings
Add ICS text unescaping (RFC 5545), HTML stripping, and new fields (attendees/status, organizer, meeting URL) to calendar-sync.el. event-to-org now outputs org property drawers. 88 new tests across 10 test files, 146/146 pass. Also fix pre-existing test require order and keymap guard issues.
10 dayschore(todo): add TRAMP/dirvish timestamp investigation taskCraig Jennings
Document attempted fixes and resources for future investigation of question marks appearing instead of file dates in remote directories.
10 daysfeat(dirvish): add TrueNAS backups quick access shortcutCraig Jennings
Add rbk shortcut to access /mnt/vault/backups on truenas.local
11 dayschore: minor housekeeping updatesCraig Jennings
- Add typo correction: should't -> shouldn't - Add dirvish shortcut pcr for career project - Rename pc -> pcl for clipper project - Minor whitespace cleanup in init.el
11 dayschore: add new typo corrections to abbrev_defsCraig Jennings
11 daysfix(email): require mm-decode at load time for macro availabilityCraig Jennings
mm-handle-type is a macro that must be available when the code is read, not just at runtime. Changed from declare-function to require.
11 daysfix(email): improve MIME handle parsing for email viewerCraig Jennings
- Add helper functions for robust MIME structure navigation - cj/--email-handle-is-type-p: check handle content type - cj/--email-find-displayable-part: recursively find HTML/plain text - Handle both leaf handles and nested multipart structures - Add 9 unit tests covering normal, boundary, and error cases
11 daysstyle(dirvish): normalize indentation and add TrueNAS shortcutsCraig Jennings
- Convert tabs to spaces for consistent formatting - Add quick-access entries for truenas.local and truenas (tailscale)
11 daysrefactor(calendar): move calendar URLs into calendar-sync.elCraig Jennings
Consolidate calendar configuration within the module itself rather than requiring setup in init.el. Improves module encapsulation.
11 daysfeat(buffer): add EWW and email viewing functionsCraig Jennings
- cj/view-buffer-in-eww (C-; b w): render HTML files in EWW - cj/view-email-in-buffer (C-; b e): parse MIME and render .eml files - Add forward declarations for mm-decode functions - Fix wide docstring in cj/diff-buffer-with-file
11 daysfeat(lsp): disable LSP on remote/TRAMP filesCraig Jennings
Prevents slow startup and project root prompts when editing files over TRAMP connections. - Add lsp-enable-remote nil in :init (before lsp-mode loads) - Add explicit remote check in shell script setup hook
12 daystest(video-recording): add process cleanup testsCraig Jennings
Unit tests verify pkill wf-recorder is called: - On Wayland video stop (to kill orphan wf-recorder) - On Wayland video start (to clean previous orphans) - NOT called on X11 (only relevant for Wayland pipeline) Integration tests (tagged :integration :wayland) verify actual cleanup: - No orphan processes after stop - Start cleans up existing orphans - Multiple start/stop cycles don't accumulate orphans
12 daysfix(video-recording): kill orphan wf-recorder on WaylandCraig Jennings
On Wayland, video recording uses a shell pipeline: wf-recorder | ffmpeg. When stopping, SIGINT only reaches ffmpeg, leaving wf-recorder running as an orphan. This blocks subsequent recordings (0-byte files or no file). Fix: - On stop: explicitly pkill wf-recorder before interrupting ffmpeg - On start: kill any orphan wf-recorder from previous crashes - Increase finalization wait from 0.2s to 0.5s for proper cleanup
12 daysfix(video-recording): use generic 'Built-in Audio' labelCraig Jennings
Renamed 'Built-in Laptop Audio' to 'Built-in Audio' since PCI audio devices are used on both laptops and desktops.
12 daystest(video-recording): add command structure validation testsCraig Jennings
These tests verify the syntax and flags of shell commands generated for video/audio recording. They catch issues like: - Invalid wf-recorder flags (e.g., --no-audio doesn't exist) - Wrong encoder names (h264 vs libx264) - Incorrect stdout output syntax (-o - vs -f /dev/stdout) - Missing required flags (-y for auto-confirm) 18 new tests covering Wayland, X11, and audio recording command structure.
12 daysfix(video-recording): correct wf-recorder flags for Wayland pipelineCraig Jennings
The wf-recorder command had several incorrect flags: - `--no-audio`: not a valid option (wf-recorder doesn't record audio by default) - `-c h264`: wrong encoder name, should be `libx264` - `-f matroska -o -`: `-o` is for selecting monitor, `-f` is for output file Fixed to use: `-y -c libx264 -m matroska -f /dev/stdout` - `-y`: auto-confirm overwrite (avoids prompt for /dev/stdout) - `-c libx264`: correct encoder name - `-m matroska`: set container format - `-f /dev/stdout`: output file to stdout for piping to ffmpeg
12 daysfix(tests): correct flaky test assertionsCraig Jennings
- calendar-sync: fix GTFO count bounds to match 15-month window (was incorrectly assuming 12-month/52-week window) - video-recording: add process-status mock to prevent race condition where process hadn't exited yet when sentinel was manually called
12 daysperf(lorem-optimum): fix O(n²) tokenization algorithmCraig Jennings
The tokenizer was creating substring copies on every iteration: - (substring text pos (1+ pos)) for whitespace check - (substring text pos) for regex matching - copies ALL remaining text This caused 10K word tokenization to take 727ms instead of 6ms. Fix: Use string-match with start position parameter and check characters directly with aref instead of creating substrings. Performance improvement: - Tokenize 10K words: 727ms → 6ms (120x faster) - Learn 10K words: 873ms → 15ms (59x faster) - Learn 100K words: 70s → 208ms (341x faster)
12 daysfeat(calendar-sync): add EXDATE support for excluded recurring event datesCraig Jennings
When someone deletes a single instance of a recurring meeting in Google Calendar, the calendar exports an EXDATE property marking that date as excluded. Previously, calendar-sync expanded the RRULE without filtering out these excluded dates, causing deleted instances to appear in org output. New functions: - calendar-sync--get-exdates: Extract all EXDATE values from event - calendar-sync--get-exdate-line: Get full EXDATE line with parameters - calendar-sync--parse-exdate: Parse EXDATE into datetime list - calendar-sync--collect-exdates: Collect excluded dates with TZ conversion - calendar-sync--exdate-matches-p: Check if occurrence matches an EXDATE - calendar-sync--filter-exdates: Filter out excluded dates from occurrences Modified calendar-sync--expand-recurring-event to collect and filter EXDATEs after RRULE expansion. Includes 47 new tests covering extraction, parsing, collection, filtering, and integration with RECURRENCE-ID exceptions.
12 dayschore(ai-config): switch default gptel backend to ClaudeCraig Jennings
12 daysfeat(calendar-sync): add RECURRENCE-ID exception handling for recurring eventsCraig Jennings
Handle rescheduled instances of recurring calendar events by processing RECURRENCE-ID properties from ICS files. When someone reschedules a single instance of a recurring meeting in Google Calendar, the calendar-sync module now shows the rescheduled time instead of the original RRULE time. New functions: - calendar-sync--get-recurrence-id: Extract RECURRENCE-ID from event - calendar-sync--get-recurrence-id-line: Get full line with TZID params - calendar-sync--parse-recurrence-id: Parse into (year month day hour minute) - calendar-sync--collect-recurrence-exceptions: Collect all exceptions by UID - calendar-sync--occurrence-matches-exception-p: Match occurrences to exceptions - calendar-sync--apply-single-exception: Apply exception data to occurrence - calendar-sync--apply-recurrence-exceptions: Apply all exceptions to occurrences Also adds DeepSat calendar configuration (dcal-file) to user-constants, init.el, and org-agenda-config. 48 unit and integration tests added covering normal, boundary, and error cases.
13 daysfeat(keyboard): add GUI key translation for M-S- bindingsCraig Jennings
Rename terminal-compat.el to keyboard-compat.el and add GUI support. Problem: M-S-o and other Meta+Shift bindings didn't work in GUI mode. GUI Emacs receives M-O (uppercase) but bindings use M-S-o syntax. Terminal can't use M-O due to arrow key escape sequence conflicts. Solution: Use key-translation-map in GUI mode to translate M-O -> M-S-o for all 18 Meta+Shift keybindings. Terminal fixes unchanged. Also fix two test issues: - Remove expected-fail from expand-weekly test (timezone fix resolved it) - Add helpful install messages to dependency-checking tests
14 daysfeat(calendar-sync): add timezone conversion for TZID-qualified eventsCraig Jennings
Events with TZID parameters (e.g., DTSTART;TZID=Europe/Lisbon) were displaying in the source timezone instead of local time. Added: - calendar-sync--extract-tzid: extracts TZID from property lines - calendar-sync--convert-tz-to-local: converts using date command - Modified parse-timestamp to accept optional TZID parameter - Modified parse-event to extract and pass TZID through pipeline Includes 40 new tests covering extraction, conversion, and integration.
2026-02-01fix(dashboard): correct banner title centeringCraig Jennings
Override dashboard-insert-banner-title to allow manual offset adjustment. Fixes title not being centered under banner image.
2026-02-01feat(dirvish): add wallpaper setter with X11/Wayland supportCraig Jennings
cj/set-wallpaper uses feh on X11, swww on Wayland. Replaces nitrogen-based lambda with proper function.
2026-02-01feat(env): add X11 and Wayland detection functionsCraig Jennings
env-x11-p returns t when on X11 (not Wayland). env-wayland-p checks WAYLAND_DISPLAY env var, works with XWayland.
2026-02-01feat(music): add dirvish keybinding for EMMS playlistCraig Jennings
Bind + to cj/music-add-dired-selection in dirvish-mode-map.
2026-02-01style(font): increase default height to 140Craig Jennings
Better readability at current display scaling.
2026-01-31fix(recording): add Wayland support using wf-recorderCraig Jennings
x11grab produces black video on Wayland. Now detects session type and uses wf-recorder for screen capture on Wayland, falling back to x11grab on X11. wf-recorder pipes H264 to ffmpeg for audio mixing.
2026-01-29fix(transcription): add T keybinding to dirvish-mode-mapCraig Jennings
Dirvish uses its own keymap rather than inheriting from dired-mode-map, so the transcription keybinding needs to be explicitly added.
2026-01-27chore(todo): adjust task priorities based on V2MOM alignmentCraig Jennings
Promoted org-capture perf to [#A] (daily bottleneck). Demoted ERT tests to [#B], and 5 non-urgent items to [#C].
2026-01-27chore: untrack calendar sync generated dataCraig Jennings
These files change every sync and don't belong in version control.