summaryrefslogtreecommitdiff
path: root/modules
AgeCommit message (Collapse)Author
22 hoursfix(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.
23 hoursfix(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
23 hoursstyle(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)
23 hoursrefactor(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.
23 hoursfeat(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
23 hoursfeat(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
44 hoursfix(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
44 hoursfix(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.
44 hoursfix(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
45 hoursperf(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)
45 hoursfeat(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.
45 hourschore(ai-config): switch default gptel backend to ClaudeCraig Jennings
45 hoursfeat(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.
3 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
4 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.
4 daysfix(dashboard): correct banner title centeringCraig Jennings
Override dashboard-insert-banner-title to allow manual offset adjustment. Fixes title not being centered under banner image.
4 daysfeat(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.
4 daysfeat(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.
4 daysfeat(music): add dirvish keybinding for EMMS playlistCraig Jennings
Bind + to cj/music-add-dired-selection in dirvish-mode-map.
4 daysstyle(font): increase default height to 140Craig Jennings
Better readability at current display scaling.
5 daysfix(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.
7 daysfix(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.
9 daysfeat(calendar-sync): re-enable auto-sync on startupCraig Jennings
Freeze bugs are fixed; safe to auto-sync again.
9 daysfix(calendar-sync): resolve freeze on DST transitions and large ICS filesCraig Jennings
Two bugs caused Emacs to freeze during calendar sync: 1. split-events used catastrophic regex (\(.\|\n\)*?) on multi-MB ICS data. Replaced with buffer-based search-forward (0.011s for 4.5MB). 2. add-days used midnight for date arithmetic. On DST fall-back days, adding 86400s to midnight CDT yields 11pm CST (same date), creating an infinite loop. Fixed by using noon so ±1h DST shift stays correct.
9 daysfix(org-drill): switch from local load-path to VC package installCraig Jennings
Use :vc to install org-drill from GitHub instead of :load-path to local clone. Add dupre color palette reference image.
10 daysfix(font-config): update font settings and fix env-gui-p callCraig Jennings
- Change default font to BerkeleyMono Nerd Font - Increase default height from 110 to 130 - Fix env-gui-p call (remove unused frame argument)
12 daysfix(ai-config): remove redundant autoload for cj/toggle-gptelCraig Jennings
12 daysfeat(system): start server for pinentry-emacs, exclude airootfs from recentfCraig Jennings
12 daysfix(org-roam): bind dailies keys after keymap existsCraig Jennings
12 daysfix(org-refile): skip airootfs directories to avoid permission errorsCraig Jennings
12 daysfix(chrono-tools): fix trailing paren in time-zones bindingCraig Jennings
12 daysfeat(email): add password decryption to setup scriptCraig Jennings
- Add password decryption loop to scripts/setup-email.sh - Decrypt .gpg files from assets/mail-passwords/ to ~/.config/ - Add encrypted password files (.gmailpass.gpg, .cmailpass.gpg) - Fix missing paren in text-config.el that broke config parsing - Clean up mail-config.el
12 daysfix(terminal): add console/mosh compatibilityCraig Jennings
- Create terminal-compat.el for arrow key escape sequences - Fix M-uppercase keybindings (M-O → M-S-o, etc.) that conflicted with terminal escape sequences ESC O A/B/C/D - Add GUI-only guards for emojify and icon rendering - 18 keybindings updated across 13 modules with override comments
2026-01-14fix(calendar-sync): disable auto-start to prevent freezeCraig Jennings
Proton calendar download causes Emacs to freeze. Disabled auto-sync by default until root cause is investigated. Manual sync still available via C-; g s keybinding.
2026-01-10feat(dirvish): update shortcuts for health and homelab projectsCraig Jennings
Changed ph to phl for homelab, added phx for new health project. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09feat(dirvish): add project shortcuts and remove scratch font overrideCraig Jennings
Added dirvish quick-access shortcuts for homelab, kit, and nextjob projects. Removed 16pt font size override from scratch buffer startup hook.
2025-12-02feat(calendar-sync): multi-calendar support with property testsCraig Jennings
Added multi-URL calendar sync supporting Google and Proton calendars. Each calendar syncs to separate file with per-calendar state tracking. Added 13 property-based tests for RRULE expansion. Total: 150 tests passing.
2025-11-24feat(dwim-shell): fix M-D menu binding and enhance audio extractionCraig Jennings
- Fix dwim-shell-commands-menu keybinding in dirvish/dired - Remove :after (dired dirvish) which prevented package loading - Add :demand t to load package immediately at startup - Move keybindings inside :config block after menu function definition - M-D now works immediately in dirvish without manual trigger - Enhance extract-audio-from-video function - Fix :extensions parameter (was regex string, now proper list) - Change from copy to AAC re-encoding for codec compatibility - Add interactive bitrate selection (64k/96k/128k/192k) - Fixes Opus codec compatibility issues with M4A containers - Remove conflicting keybindings - Remove music-config p binding in dirvish (was overriding path copy) - Clean up extraneous requires/hooks from troubleshooting - Add TODO for dwim-shell-command status dashboard [#D priority] 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24refactor(keybindings): reorganize time-zones and kill-buffer-and-window bindingsCraig Jennings
Move time-zones from C-x c to M-C for easier access. Move cj/kill-buffer-and-window from M-C to C-; b k to group with other buffer operations. Updated documentation and which-key labels. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21feat(org-noter): implement custom org-noter workflowCraig Jennings
Implemented custom org-noter workflow with F6 keybinding: - Creates notes files as org-roam nodes in org-roam-directory - Title prompt with pre-slugified default, notes-on-{slug}.org format - F6 toggles notes window visibility when session active - Preserves PDF fit setting on toggle - Deferred org-roam integration to prevent PDF open hang Also fixed: quick-sdcv quit binding, calendar-sync sentinel buffer error Added 30 ERT tests for title-to-slug and template generation functions
2025-11-21chore(weather): update location listCraig Jennings
- Add Huntington Beach, CA - Reorder locations 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21fix(org-noter): remove duplicate org-roam integration callCraig Jennings
- Removed duplicate org-noter-enable-org-roam-integration call - Fixed indentation in when block for pdftools integration 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21fix: add quick-sdcv quit binding and fix calendar-sync sentinelCraig Jennings
- Add 'q' keybinding in quick-sdcv-mode to quit-window for easier dictionary dismissal while reading epubs - Fix "Selecting deleted buffer" error in calendar-sync by checking buffer-live-p before accessing process buffer in sentinel 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18feat(dirvish): Add project clipper shortcut (pc)Craig Jennings
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18feat(calendar-sync): Add RRULE support and refactor expansion functionsCraig Jennings
Implements complete recurring event (RRULE) expansion for Google Calendar with rolling window approach and comprehensive test coverage. Features: - RRULE expansion for DAILY, WEEKLY, MONTHLY, YEARLY frequencies - Support for INTERVAL, BYDAY, UNTIL, and COUNT parameters - Rolling window: -3 months to +12 months from current date - Fixed COUNT parameter bug (events no longer appear beyond their limit) - Fixed TZID parameter parsing (supports timezone-specific timestamps) - Replaced debug messages with cj/log-silently Refactoring: - Extracted helper functions to eliminate code duplication: - calendar-sync--date-to-time: Date to time conversion - calendar-sync--before-date-p: Date comparison - calendar-sync--create-occurrence: Event occurrence creation - Refactored all expansion functions to use helper functions - Reduced code duplication across daily/weekly/monthly/yearly expansion Testing: - 68 tests total across 5 test files - Unit tests for RRULE parsing, property extraction, weekly expansion - Integration tests for complete RRULE workflow - Tests for helper functions validating refactored code - All tests passing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17feat: add org keymap under C-; O with cache clear bindingCraig Jennings
Created general org operations keymap at C-; O separate from specialized org-table and org-drill keymaps. Added C-; O c binding for clearing org-element cache to fix org-todo state change errors.
2025-11-17fix: increase calendar-sync curl timeout from 10 to 30 secondsCraig Jennings
10-second timeout was too aggressive for slower networks or delayed Google servers. Increased to 30 seconds to prevent timeout errors while still preventing indefinite hangs.
2025-11-17feat(calendar-sync): Make ICS fetching asynchronousCraig Jennings
Changed calendar-sync--fetch-ics from synchronous call-process to asynchronous make-process with callback pattern. This prevents Emacs from freezing during calendar syncs. Changes: - calendar-sync--fetch-ics now takes a callback parameter - Uses make-process with sentinel for async completion - calendar-sync-now updated to use callback pattern - Fetch completes in background without blocking Emacs All 56 tests pass. User confirmed improved responsiveness. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17chore(calendar-sync): Change default interval to 60 minutesCraig Jennings
Changed default sync interval from 15 minutes to 60 minutes (1 hour). Rationale: - Calendar events typically don't change that frequently - Reduces network requests and potential blocking events - Users can still manually sync or adjust interval as needed - More conservative default that balances freshness with performance 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17refactor(calendar-sync): Make interval configurable in minutesCraig Jennings
Changed calendar-sync-interval (seconds) to calendar-sync-interval-minutes for more user-friendly configuration. Changes: - Renamed: calendar-sync-interval → calendar-sync-interval-minutes - Units: seconds → minutes (default: 15) - Internal conversion to seconds happens in calendar-sync-start - Updated docstrings and messages to reference minutes Benefits: - More intuitive configuration (users think in minutes, not seconds) - Clearer variable name indicates units - No functional change, just better UX Example usage: (setq calendar-sync-interval-minutes 30) ; Sync every 30 minutes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>