| Age | Commit message (Collapse) | Author |
|
- 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
|
|
- Convert tabs to spaces for consistent formatting
- Add quick-access entries for truenas.local and truenas (tailscale)
|
|
Consolidate calendar configuration within the module itself rather
than requiring setup in init.el. Improves module encapsulation.
|
|
- 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
|
|
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
|
|
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
|
|
Renamed 'Built-in Laptop Audio' to 'Built-in Audio' since PCI audio
devices are used on both laptops and desktops.
|
|
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
|
|
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)
|
|
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.
|
|
|
|
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.
|
|
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
|
|
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.
|
|
Override dashboard-insert-banner-title to allow manual offset adjustment.
Fixes title not being centered under banner image.
|
|
cj/set-wallpaper uses feh on X11, swww on Wayland.
Replaces nitrogen-based lambda with proper function.
|
|
env-x11-p returns t when on X11 (not Wayland).
env-wayland-p checks WAYLAND_DISPLAY env var, works with XWayland.
|
|
Bind + to cj/music-add-dired-selection in dirvish-mode-map.
|
|
Better readability at current display scaling.
|
|
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.
|
|
Dirvish uses its own keymap rather than inheriting from dired-mode-map,
so the transcription keybinding needs to be explicitly added.
|
|
Freeze bugs are fixed; safe to auto-sync again.
|
|
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.
|
|
Use :vc to install org-drill from GitHub instead of :load-path to
local clone. Add dupre color palette reference image.
|
|
- Change default font to BerkeleyMono Nerd Font
- Increase default height from 110 to 130
- Fix env-gui-p call (remove unused frame argument)
|
|
|
|
|
|
|
|
|
|
|
|
- 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
|
|
- 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
|
|
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.
|
|
Changed ph to phl for homelab, added phx for new health project.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Added dirvish quick-access shortcuts for homelab, kit, and nextjob projects.
Removed 16pt font size override from scratch buffer startup hook.
|
|
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.
|
|
- 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>
|
|
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>
|
|
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
|
|
- Add Huntington Beach, CA
- Reorder locations
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- 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>
|
|
- 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>
|
|
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
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>
|
|
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.
|
|
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.
|
|
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>
|
|
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>
|
|
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>
|
|
Changes:
1. Converted defcustom → defvar (3 variables):
- calendar-sync-ics-url
- calendar-sync-interval
- calendar-sync-file
- Removed defgroup (not using customize system)
2. Added calendar-sync-auto-start variable (default: t)
- Controls whether auto-sync starts when module loads
- Set to nil to disable automatic startup
3. Updated initialization to check auto-start flag
- Auto-sync only starts if both auto-start and URL are non-nil
- Provides user control over automatic behavior
Rationale:
- Auto-sync is convenient but should be toggleable
- defvar is simpler and more direct than defcustom
- Consistent with project style (no customize interface)
Default behavior: Auto-sync enabled (backwards compatible with user expectation)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|