aboutsummaryrefslogtreecommitdiff
path: root/modules
Commit message (Collapse)AuthorAgeFilesLines
* fix(email): require mm-decode at load time for macro availabilityCraig Jennings2026-02-041-6/+2
| | | | | 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.
* fix(email): improve MIME handle parsing for email viewerCraig Jennings2026-02-041-6/+45
| | | | | | | | - 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
* style(dirvish): normalize indentation and add TrueNAS shortcutsCraig Jennings2026-02-041-192/+194
| | | | | - Convert tabs to spaces for consistent formatting - Add quick-access entries for truenas.local and truenas (tailscale)
* refactor(calendar): move calendar URLs into calendar-sync.elCraig Jennings2026-02-041-0/+12
| | | | | Consolidate calendar configuration within the module itself rather than requiring setup in init.el. Improves module encapsulation.
* feat(buffer): add EWW and email viewing functionsCraig Jennings2026-02-041-5/+73
| | | | | | | - 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
* feat(lsp): disable LSP on remote/TRAMP filesCraig Jennings2026-02-042-2/+5
| | | | | | | | 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
* fix(video-recording): kill orphan wf-recorder on WaylandCraig Jennings2026-02-031-1/+10
| | | | | | | | | | | 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
* fix(video-recording): use generic 'Built-in Audio' labelCraig Jennings2026-02-031-1/+1
| | | | | Renamed 'Built-in Laptop Audio' to 'Built-in Audio' since PCI audio devices are used on both laptops and desktops.
* fix(video-recording): correct wf-recorder flags for Wayland pipelineCraig Jennings2026-02-031-1/+1
| | | | | | | | | | | | | 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
* perf(lorem-optimum): fix O(n²) tokenization algorithmCraig Jennings2026-02-031-17/+23
| | | | | | | | | | | | | | | | 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)
* feat(calendar-sync): add EXDATE support for excluded recurring event datesCraig Jennings2026-02-031-10/+135
| | | | | | | | | | | | | | | | | | | | | 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.
* chore(ai-config): switch default gptel backend to ClaudeCraig Jennings2026-02-031-5/+4
|
* feat(calendar-sync): add RECURRENCE-ID exception handling for recurring eventsCraig Jennings2026-02-033-12/+184
| | | | | | | | | | | | | | | | | | | | | 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.
* feat(keyboard): add GUI key translation for M-S- bindingsCraig Jennings2026-02-022-54/+170
| | | | | | | | | | | | | | | 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
* feat(calendar-sync): add timezone conversion for TZID-qualified eventsCraig Jennings2026-02-011-12/+79
| | | | | | | | | | | | 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.
* fix(dashboard): correct banner title centeringCraig Jennings2026-02-011-0/+24
| | | | | Override dashboard-insert-banner-title to allow manual offset adjustment. Fixes title not being centered under banner image.
* feat(dirvish): add wallpaper setter with X11/Wayland supportCraig Jennings2026-02-011-4/+23
| | | | | cj/set-wallpaper uses feh on X11, swww on Wayland. Replaces nitrogen-based lambda with proper function.
* feat(env): add X11 and Wayland detection functionsCraig Jennings2026-02-011-0/+11
| | | | | env-x11-p returns t when on X11 (not Wayland). env-wayland-p checks WAYLAND_DISPLAY env var, works with XWayland.
* feat(music): add dirvish keybinding for EMMS playlistCraig Jennings2026-02-011-1/+3
| | | | Bind + to cj/music-add-dired-selection in dirvish-mode-map.
* style(font): increase default height to 140Craig Jennings2026-02-011-1/+1
| | | | Better readability at current display scaling.
* fix(recording): add Wayland support using wf-recorderCraig Jennings2026-01-311-31/+66
| | | | | | 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.
* fix(transcription): add T keybinding to dirvish-mode-mapCraig Jennings2026-01-291-1/+3
| | | | | Dirvish uses its own keymap rather than inheriting from dired-mode-map, so the transcription keybinding needs to be explicitly added.
* feat(calendar-sync): re-enable auto-sync on startupCraig Jennings2026-01-271-1/+1
| | | | Freeze bugs are fixed; safe to auto-sync again.
* fix(calendar-sync): resolve freeze on DST transitions and large ICS filesCraig Jennings2026-01-271-7/+13
| | | | | | | | | | | 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.
* fix(org-drill): switch from local load-path to VC package installCraig Jennings2026-01-271-5/+3
| | | | | Use :vc to install org-drill from GitHub instead of :load-path to local clone. Add dupre color palette reference image.
* fix(font-config): update font settings and fix env-gui-p callCraig Jennings2026-01-261-3/+3
| | | | | | - Change default font to BerkeleyMono Nerd Font - Increase default height from 110 to 130 - Fix env-gui-p call (remove unused frame argument)
* fix(ai-config): remove redundant autoload for cj/toggle-gptelCraig Jennings2026-01-241-2/+0
|
* feat(system): start server for pinentry-emacs, exclude airootfs from recentfCraig Jennings2026-01-241-1/+8
|
* fix(org-roam): bind dailies keys after keymap existsCraig Jennings2026-01-241-9/+5
|
* fix(org-refile): skip airootfs directories to avoid permission errorsCraig Jennings2026-01-241-6/+11
|
* fix(chrono-tools): fix trailing paren in time-zones bindingCraig Jennings2026-01-241-1/+1
|
* feat(email): add password decryption to setup scriptCraig Jennings2026-01-242-9/+11
| | | | | | | | - 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
* fix(terminal): add console/mosh compatibilityCraig Jennings2026-01-2314-33/+90
| | | | | | | | - 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
* fix(calendar-sync): disable auto-start to prevent freezeCraig Jennings2026-01-141-1/+1
| | | | | | 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.
* feat(dirvish): update shortcuts for health and homelab projectsCraig Jennings2026-01-101-1/+2
| | | | Changed ph to phl for homelab, added phx for new health project.
* feat(dirvish): add project shortcuts and remove scratch font overrideCraig Jennings2026-01-092-2/+4
| | | | | Added dirvish quick-access shortcuts for homelab, kit, and nextjob projects. Removed 16pt font size override from scratch buffer startup hook.
* feat(calendar-sync): multi-calendar support with property testsCraig Jennings2025-12-023-75/+185
| | | | | | 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.
* feat(dwim-shell): fix M-D menu binding and enhance audio extractionCraig Jennings2025-11-243-22/+25
| | | | | | | | | | | | | | | | | | | | - 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]
* refactor(keybindings): reorganize time-zones and kill-buffer-and-window bindingsCraig Jennings2025-11-243-4/+7
| | | | | | 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.
* feat(org-noter): implement custom org-noter workflowCraig Jennings2025-11-211-33/+221
| | | | | | | | | | | | 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
* chore(weather): update location listCraig Jennings2025-11-211-3/+4
| | | | | - Add Huntington Beach, CA - Reorder locations
* fix(org-noter): remove duplicate org-roam integration callCraig Jennings2025-11-211-4/+3
| | | | | - Removed duplicate org-noter-enable-org-roam-integration call - Fixed indentation in when block for pdftools integration
* fix: add quick-sdcv quit binding and fix calendar-sync sentinelCraig Jennings2025-11-212-11/+15
| | | | | | | - 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
* feat(dirvish): Add project clipper shortcut (pc)Craig Jennings2025-11-181-0/+1
|
* feat(calendar-sync): Add RRULE support and refactor expansion functionsCraig Jennings2025-11-181-35/+385
| | | | | | | | | | | | | | | | | | | | | | | | | | | | 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
* feat: add org keymap under C-; O with cache clear bindingCraig Jennings2025-11-171-1/+12
| | | | | | 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.
* fix: increase calendar-sync curl timeout from 10 to 30 secondsCraig Jennings2025-11-171-1/+1
| | | | | | 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.
* feat(calendar-sync): Make ICS fetching asynchronousCraig Jennings2025-11-171-29/+42
| | | | | | | | | | | | | | 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.
* chore(calendar-sync): Change default interval to 60 minutesCraig Jennings2025-11-171-3/+3
| | | | | | | | | | 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
* refactor(calendar-sync): Make interval configurable in minutesCraig Jennings2025-11-171-11/+12
| | | | | | | | | | | | | | | | | | | 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