| Age | Commit message (Collapse) | Author |
|
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.
|
|
Added session notes for 2025-11-24 DWIM shell command work.
Added detailed TODO for org-noter workflow continuation with known issues and testing requirements.
Added TODO for dwim-shell-command status dashboard with implementation approaches.
|
|
- 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>
|
|
- Updated gcal.org with 377 events from successful RRULE expansion
- Updated sync state with latest sync timestamp
- Updated command history
🤖 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.
|
|
|
|
Implemented async calendar fetching to prevent UI freezes. Tested sync
functionality and confirmed improved responsiveness. Updated calendar
state and data files from sync testing.
|
|
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>
|
|
Problem:
Google Calendar .ics files use CRLF line endings (RFC 5545 spec), which
resulted in 11,685 ^M (CR) characters appearing in gcal.org, particularly
at the end of org header lines.
Solution:
- Created calendar-sync--normalize-line-endings function to strip all \r
characters from .ics content
- Integrated into calendar-sync--fetch-ics immediately after curl download
- Ensures clean Unix LF-only line endings throughout parsing pipeline
Testing:
- Added comprehensive test suite: test-calendar-sync--normalize-line-endings.el
- 16 tests covering Normal, Boundary, and Error cases
- All 56 existing calendar-sync tests still pass (no regressions)
- Verified: gcal.org now has 0 CR characters (was 11,685)
Files modified:
- modules/calendar-sync.el: Added normalize function, updated fetch function
- tests/test-calendar-sync--normalize-line-endings.el: New comprehensive test suite
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Completed implementation of cj/org-appear-toggle with C-c C-a keybinding.
🤖 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>
|
|
Implemented cj/org-appear-toggle to control when emphasis markers and
link URLs are revealed. Useful for editing links while keeping tables
readable when long URLs would otherwise expand and break layout.
Changes:
- Enabled org-appear package (removed :disabled flag)
- Removed auto-enable hook (default: OFF for cleaner reading)
- Added cj/org-appear-toggle function with clear user feedback
- Bound to C-c C-a in org-mode-map
- C-c C-a was unbound (no conflict with org-attach or other commands)
Usage:
- Default: OFF (links and emphasis markers stay hidden)
- Press C-c C-a: Turn ON (markers show when cursor is on them)
- Press C-c C-a again: Turn OFF (back to hidden)
Closes todo.org line 29: "Toggle org-appear on/off"
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Converted debug/informational messages to use cj/log-silently instead of
message across multiple modules. These are automatic initialization or
background task messages that don't need minibuffer display but should
still be logged to *Messages* buffer.
Changes:
- org-agenda-config.el: Cache build/hit messages (4 messages)
- org-refile-config.el: Cache build/hit + mode switching (5 messages)
- org-export-config.el: reveal.js download message (1 message)
- auth-config.el: oauth2-auto cache fix message (1 message)
- quick-video-capture.el: initialization message (1 message)
All modules now require system-lib for cj/log-silently function.
Keeps UI clean while maintaining debuggability.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Added 5 dedicated unit tests for calendar-sync--convert-utc-to-local
function that was extracted during refactoring:
- test-calendar-sync--convert-utc-to-local-basic-conversion
Tests standard UTC to local time conversion
- test-calendar-sync--convert-utc-to-local-midnight-boundary
Tests day boundary handling (UTC midnight → previous day in some timezones)
- test-calendar-sync--convert-utc-to-local-preserves-minutes
Verifies minute component preservation during conversion
- test-calendar-sync--convert-utc-to-local-returns-five-elements
Validates return format and element types
- test-calendar-sync--convert-utc-to-local-end-of-day
Tests near end-of-day conversion (potential rollover to next day)
Test coverage increased from 51 to 56 tests, all passing.
The extracted function now has both direct unit tests (isolation)
and indirect integration tests (via calendar-sync--parse-timestamp).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Implemented calendar-sync.el as a complete replacement for org-gcal, featuring:
**Core Functionality:**
- One-way sync from Google Calendar to Org (via .ics URL)
- UTC to local timezone conversion for all event timestamps
- Chronological event sorting (past → present → future)
- Non-blocking sync using curl (works reliably in daemon mode)
**Automatic Timezone Detection:**
- Detects timezone changes when traveling between timezones
- Tracks timezone offset in seconds (-21600 for CST, -28800 for PST, etc.)
- Triggers automatic re-sync when timezone changes detected
- Shows informative messages: "Timezone change detected (UTC-6 → UTC-8)"
**State Persistence:**
- Saves sync state to ~/.emacs.d/data/calendar-sync-state.el
- Persists timezone and last sync time across Emacs sessions
- Enables detection even after closing Emacs before traveling
**User Features:**
- Interactive commands: calendar-sync-now, calendar-sync-start/stop
- Keybindings: C-; g s (sync), C-; g a (start auto-sync), C-; g x (stop)
- Optional auto-sync every 15 minutes (disabled by default)
- Clear status messages for all operations
**Code Quality:**
- Comprehensive test coverage: 51 ERT tests (100% passing)
- Refactored UTC conversion into separate function
- Clean separation of concerns (parsing, conversion, formatting, sorting)
- Well-documented with timezone behavior guide and changelog
**Migration:**
- Removed org-gcal-config.el (archived in modules/archived/)
- Updated init.el to use calendar-sync
- Moved gcal.org to .emacs.d/data/ for machine-independent syncing
- Removed org-gcal appointment capture template
Files modified: modules/calendar-sync.el:442, tests/test-calendar-sync.el:577
Files created: data/calendar-sync-state.el, tests/testutil-calendar-sync.el
Documentation: docs/calendar-sync-timezones.md, docs/calendar-sync-changelog.md
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Fixed mbsync IMAP APPEND errors caused by 8 non-email files (PDFs and
PNGs) in maildir folders. Removed corrupted files to recovery directory
for user review. Successfully verified fix with clean mbsync run.
Third occurrence of this pattern - may need investigation into attachment
handling or file operations targeting maildir.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Changed from merge strategy to rebase strategy when pulling updates
in the multi-repo reconciliation workflow. This avoids creating
unnecessary merge commits and maintains linear history.
Changes:
- Line 54: git pull --quiet → git pull --rebase --quiet (clean repos)
- Line 64: git pull --quiet → git pull --rebase --quiet (dirty repos)
Benefits:
- Cleaner git history (no merge commits for simple pulls)
- Consistent with best practices for personal development
- Aligns with git pull --rebase --autostash used elsewhere
The workflow still maintains its error handling and Magit integration
for conflict resolution.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Consolidated cj/log-silently function to system-lib.el as the canonical
location for low-level utility functions. This fixes 4 failing tests in
video-audio-recording that couldn't find the function.
Changes:
- Move cj/log-silently to system-lib.el (from system-utils.el)
- Remove duplicate definition from org-agenda-config-debug.el
- Remove duplicate definition from system-utils.el
- Add (require 'system-lib) to all modules using cj/log-silently:
- video-audio-recording.el
- org-agenda-config-debug.el
- media-utils.el (also removed declare-function)
- elfeed-config.el (replaced system-utils with system-lib)
- wrap-up.el
Test Results:
- Before: 112/113 passing (4 video-audio-recording tests failing)
- After: 113/113 passing ✓
All tests now pass with zero failures.
Fixes TODO #809-895 (move cj/log-silently to system-lib.el)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
The test expected 'primary-click' but the actual configuration maps
dashboard-mode to 'scroll+primary' (mousetrap-mode.el line 69).
Updated test to expect 'scroll+primary' to match current config.
Before: Test expected primary-click (outdated)
After: Test expects scroll+primary (matches config)
All 11 mousetrap profile tests now passing.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Major improvements to test output clarity and failure diagnostics:
Output Improvements:
- Clean aligned output showing test file + pass/fail status
- Show test count for passing files: "✓ (11 tests)"
- Clear "✗ FAILED" marker for failures (no verbose noise)
- Suppress passing test details (reduces output by ~95%)
Failure Summary:
- Clear visual separator box for failures
- List all failed files with bullet points
- Show specific failed test names with line numbers
- Provide copy-paste commands to re-run failures
Technical Changes:
- Capture test output and only display on failure
- Extract test count from ERT output for passing tests
- Save failure details to temp files for summary
- Apply same improvements to both unit and integration tests
Benefits:
- Instantly see which tests failed (no scrolling)
- Know exactly which test names failed
- Get line numbers for debugging
- Copy-paste commands to re-run specific failures
- Dramatically reduced output verbosity
Example summary:
Failed test files:
• test-mousetrap-mode--get-profile-for-mode.el
Errors:
FAILED test-foo (line 15)
Run individual failing tests with:
make test-file FILE=test-mousetrap-mode--get-profile-for-mode.el
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Major improvements to music player configuration:
Backend Changes:
- Switch from emms-player-mpd to emms-player-mpv
- Remove MPD daemon dependency (no service management required)
- Configure MPV with --quiet, --no-video, --audio-display flags
- Support both local files and streaming URLs (http/https/mms)
Keybinding Enhancements:
- Add C-; m n → next track
- Add C-; m p → previous track
- Add C-; m g → go to playlist
- In playlist: n/P for next/prev, f/b for seek forward/backward
- Update which-key descriptions
Code Quality:
- Use music-dir constant from user-constants.el (not hardcoded path)
- Add (require 'user-constants) for proper dependency
- Update commentary to reflect MPV backend
Test Fixes:
- Fix 8 failing append-track tests
- Update test mock data to use cj/music-root for portability
- All 104 music-config tests now passing
Benefits:
- No daemon to start/stop/manage
- Simpler architecture (one process vs MPD+EMMS)
- Streaming radio URLs work out of the box
- Better path consistency across codebase
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- Rename "pD" to "pdx" for ~/projects/documents/
- Rename "pd" to "pdl" for ~/projects/danneel/
Uses consistent naming: pdx (documents), pdl (danneel), pl (elibrary),
pf (finances), pjr (jr-estate).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- Add "db" shortcut for ~/documents/dropbox/
- Update "lx" path from ~/lectures/ to ~/archive/lectures/
- Rename "sv" to "spv" and update path to ~/sync/phone/videos/
- Fix "tg" path to use org-dir instead of sync-dir
All shortcuts now point to existing directories.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- Add single-key navigation (e, c, a, b, f, r, i, t, d) for all dashboard items
- Add new navigator buttons: Code (projects), Agenda, Terminal
- Reorganize buttons into two balanced rows (5 top, 4 bottom)
- Remove bracket decoration around buttons for cleaner look
- Add proper spacing between buttons for better readability
- Rename labels: "Feeds" → "RSS/Feeds", "Files" → "Directory/Files"
- Disable package count and startup time display
- Disable 'q' keybinding to prevent accidental dashboard quit
Navigator buttons now include:
Row 1: Code, Email, Agenda, Flashcards, Books
Row 2: RSS/Feeds, IRC, Terminal, Directory/Files
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Change mode-line-right-align-edge from 'right-margin to 'window.
This fixes an issue where centered text modes (nov-mode for EPUBs, etc.)
with wide buffer margins would cause the right-aligned modeline elements
(VC branch, weather, etc.) to have large gaps on the right side.
Now the modeline always aligns to the window edge regardless of buffer
margin settings.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- Change dashboard profile from primary-click to scroll+primary
(allows both scrolling and left-clicking in dashboard)
- Remove incorrect manual manipulation of minor-mode-map-alist
(define-minor-mode handles this automatically via mouse-trap-mode-map)
- Simplify disable logic to just clear the buffer-local keymap
The bug was that manually prepending to minor-mode-map-alist interfered
with Emacs' automatic buffer-local keymap lookup. Now each buffer gets
its own keymap based on major mode, and Emacs handles the lookup correctly.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Updated minibuffer and command history from recent session.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- Add missing scratch-greet variable definition
- Set scratch buffer font height to 16pt for better readability
- Fix buffer targeting using with-current-buffer for reliability
- Simplify scratch greeting message
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- Reduce variable-pitch font from 1.8x to 1.0x for normal reading size
- Add configurable margin percentage (cj/nov-margin-percent, default 25%)
- Calculate text width dynamically based on window size and margins
- Text now uses 50% of window width with 25% margins on each side
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
|
|
|
|
Phone calls were not capturing the remote person's voice due to severe
volume loss (44 dB) when using the amerge+pan FFmpeg filter combination.
Changes:
- Replace amerge+pan with amix filter (provides 44 dB volume improvement)
- Increase default system volume from 0.5 to 2.0 for better capture levels
- Add diagnostic tool to show active audio playback (C-; r w)
- Add integration test with real voice recording
- Fix batch mode compatibility for test execution
The amix filter properly mixes microphone and system monitor inputs without
the massive volume loss that amerge+pan caused. Verified with automated
integration test showing perfect transcription of test audio.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- dashboard-config.el: Change "Ebooks" to "Books" label
- weather-config.el: Fix variable name to wttrin-favorite-location
- todo.org: Add music player and mousetrap investigation tasks
- history: Update command history
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
This reverts commit 9d55ed149e100b4fb3ef6f5a79d263dcb26ce835.
|
|
|
|
The cursor color was not updating correctly when switching buffers
or modifying files. The original implementation used window-buffer-change
and other specific hooks, but these were insufficient and internal
buffers were interfering with cursor color updates.
Root cause:
- Cursor color is global (one cursor for all of Emacs)
- Previous hooks fired in internal buffer contexts (*Echo Area*, *temp*)
- This caused cursor to be set to white (unmodified) even when in
read-only buffers like dashboard
Solution:
- Use post-command-hook which runs after every command in current buffer
- Ignore internal buffers (names starting with space)
- Cache optimization prevents redundant set-cursor-color calls
Behavior now:
- Dashboard (read-only): Red cursor
- Unmodified file: White cursor
- Modified file: Green cursor
- After save: White cursor
Tests:
- Added 9 integration tests in test-ui-cursor-color-integration.el
- Tests verify hook installation, buffer switching, modification tracking
- All 27 tests passing (18 unit + 9 integration)
Integration tests catch issues that unit tests miss:
- Unit tests verified state detection logic (✓)
- Integration tests verify hooks fire at right times (✓ now)
- Integration tests verify real buffer switching behavior (✓ now)
Cleanup:
- Removed debug code from init.el
- Removed debug-cursor-color.el temporary file
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Change modeline filename and cursor colors to indicate buffer
modification status, not just read-only/overwrite state.
Color scheme changes:
- White (#ffffff): Unmodified writeable buffer
- Green (#64aa0f): Modified writeable buffer (unsaved changes)
- Red (#f06a3f): Read-only buffer
- Gold (#c48702): Overwrite mode active
Previously: All writeable buffers were green regardless of modification
Now: White when clean, green when dirty (better visual feedback)
Implementation:
- Updated cj/buffer-status-colors in user-constants.el:
- Changed 'normal' → 'unmodified' (white)
- Added new 'modified' state (green)
- Updated state detection in modeline-config.el:
- Now checks (buffer-modified-p) before defaulting to unmodified
- Updated cursor color logic in ui-config.el:
- Same state detection as modeline for consistency
- Added after-change-functions hook for real-time updates
- Added after-save-hook to update on save
Priority order (highest to lowest):
1. Read-only (red) - takes precedence over everything
2. Overwrite mode (gold) - takes precedence over modified state
3. Modified (green) - buffer has unsaved changes
4. Unmodified (white) - default for clean writeable buffers
Tests:
- 18 comprehensive tests in test-ui-buffer-status-colors.el
- Tests state detection logic and priority order
- Tests color constant definitions and mappings
- Tests integration with cursor and modeline
- All tests passing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Implement comprehensive profile-based system for selective mouse event
control with dynamic lighter and interactive toggling.
Features:
- Profile-based architecture (7 profiles: disabled, scroll-only,
primary-click, scroll+primary, read-only, interactive, full)
- Mode-specific configuration (dashboard, pdf-view, nov)
- Dynamic keymap building based on current major mode
- Clickable modeline lighter (🐭 when off, 🪤 when on)
- Dynamic reconfiguration without Emacs reload
- Mode inheritance support via derived-mode-p
Profiles define which event categories are allowed:
- primary-click: Left mouse button only
- secondary-click: Middle and right buttons
- drags: Drag selections
- multi-clicks: Double and triple clicks
- scroll: Mouse wheel/trackpad scrolling
Default configuration:
- dashboard-mode: primary-click (left-click only)
- pdf-view-mode: full (all events)
- nov-mode: full (all events)
- Other modes: disabled (all events blocked)
Tests:
- 66 comprehensive tests across 5 test files
- Unit tests for profile lookup and keymap building
- Integration tests for mode switching and dynamic config
- Lighter functionality and click interaction tests
- All tests passing
Known issue:
- Dashboard-mode clicks blocked despite primary-click profile
- Documented in todo.org for investigation
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Added `mouse-trap-enable-scrolling` variable to allow mouse wheel
scrolling while still blocking clicks and drags. Defaults to enabled
for better usability - users can still scroll with mouse/trackpad
but accidental clicks are prevented.
- Added defvar mouse-trap-enable-scrolling (default: t)
- Conditionally bind wheel events based on variable
- Updated docstrings to reflect new behavior
- Works for both mouse wheel and trackpad two-finger scrolling
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|