| Age | Commit message (Collapse) | Author |
|
Resolved 6 checkdoc linting warnings:
- Added double spaces after periods in docstrings (Emacs convention)
- Changed "calls" to "call" in docstring (imperative form)
All linting checks now pass:
- checkdoc: β No warnings
- make lint: β Passes
- All 83 tests: β Still passing
Also updated docs/sessions/refactor.org to be more generic/reusable.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Added 83 test cases across 9 test files with 100% pass rate, covering
device detection, parsing, grouping, and complete workflow integration.
## What Was Done
### Refactoring for Testability
- Extracted `cj/recording--parse-pactl-output` from `cj/recording-parse-sources`
- Separated parsing logic from shell command execution
- Enables testing with fixture data instead of live system calls
### Test Fixtures Created
- `pactl-output-normal.txt` - All device types (built-in, USB, Bluetooth)
- `pactl-output-empty.txt` - Empty output
- `pactl-output-single.txt` - Single device
- `pactl-output-monitors-only.txt` - Only monitor devices
- `pactl-output-inputs-only.txt` - Only input devices
- `pactl-output-malformed.txt` - Invalid/malformed output
### Unit Tests (8 files, 78 test cases)
1. **test-video-audio-recording-friendly-state.el** (10 tests)
- State name conversion: SUSPENDEDβReady, RUNNINGβActive
2. **test-video-audio-recording-parse-pactl-output.el** (14 tests)
- Parse raw pactl output into structured data
- Handle empty, malformed, and mixed valid/invalid input
3. **test-video-audio-recording-parse-sources.el** (6 tests)
- Shell command wrapper testing with mocked output
4. **test-video-audio-recording-detect-mic-device.el** (13 tests)
- Documents bugs: Returns ID numbers instead of device names
- Doesn't filter monitors (legacy function, not actively used)
5. **test-video-audio-recording-detect-system-device.el** (13 tests)
- Works correctly: Returns full device names
- Tests monitor detection with various device types
6. **test-video-audio-recording-group-devices-by-hardware.el** (12 tests)
- CRITICAL: Bluetooth MAC address normalization (colons vs underscores)
- Device pairing logic (mic + monitor from same hardware)
- Friendly name assignment
- Filters incomplete devices
7. **test-video-audio-recording-check-ffmpeg.el** (3 tests)
- ffmpeg availability detection
8. **test-video-audio-recording-get-devices.el** (7 tests)
- Auto-detection fallback logic
- Error handling for incomplete detection
### Integration Tests (1 file, 5 test cases)
9. **test-integration-recording-device-workflow.el** (5 tests)
- Complete workflow: parse β group β friendly names
- Bluetooth MAC normalization end-to-end
- Incomplete device filtering across components
- Malformed data graceful handling
## Key Testing Insights
### Bugs Documented
- `cj/recording-detect-mic-device` has bugs (returns IDs, doesn't filter monitors)
- These functions appear to be legacy code not used by main workflow
- Tests document current behavior to catch regressions if fixed
### Critical Features Validated
- **Bluetooth MAC normalization**: Input uses colons (00:1B:66:C0:91:6D),
output uses underscores (00_1B_66_C0_91_6D), grouping normalizes correctly
- **Device pairing**: Only devices with BOTH mic and monitor are included
- **Friendly names**: USB/PCI/Bluetooth patterns correctly identified
### Test Coverage
- Normal cases: Valid inputs, typical workflows
- Boundary cases: Empty, single device, incomplete pairs
- Error cases: Malformed input, missing devices, partial detection
## Test Execution
All tests pass: 9/9 files, 83/83 test cases (100% pass rate)
```bash
make test-file FILE=test-video-audio-recording-*.el
# All pass individually
# Integration test also passes
make test-file FILE=test-integration-recording-device-workflow.el
```
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Users needed a faster way to configure audio for call recording. This adds
cj/recording-quick-setup-for-calls which automatically groups audio devices
by hardware and lets users pick one device for both mic and monitor.
Key improvements:
- Groups devices by hardware (USB, built-in, Bluetooth)
- Normalizes Bluetooth MAC addresses (handles colon/underscore formats)
- Shows friendly device names (e.g., "Jabra SPEAK 510 USB")
- Automatically pairs mic + monitor from same device
- Bound to C-; r c for quick access
Perfect for recording video calls where you need to capture both your voice
and the remote person's voice through the same audio device.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Replace technical state names with user-friendly labels:
- "SUSPENDED" β "Ready" (device available, will activate on use)
- "RUNNING" β "Active" (device currently in use)
- "IDLE" β "Ready"
Add explanatory note in device list buffer explaining that "Ready"
devices are normal and will activate automatically when recording starts.
Prevents user confusion - "SUSPENDED" sounds like something is wrong
when it's actually the normal idle state.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Add interactive device selection to fix recording with multiple audio devices.
New features:
- cj/recording-list-devices (C-; r d) - Show all available audio sources
- cj/recording-select-devices (C-; r s) - Interactively select mic/monitor
- cj/recording-parse-sources - Parse pactl output into structured data
- Enhanced cj/recording-get-devices with graceful fallback to manual selection
Improvements:
- Works with PulseAudio and PipeWire
- Supports USB devices (Jabra SPEAK 510)
- Supports Bluetooth devices
- Supports built-in laptop audio
- Shows device state (RUNNING, SUSPENDED) during selection
- Better error messages with actionable suggestions
- Device selection persists across recordings
Fixes recording breakage when plugging in external audio interfaces.
Addresses Method 1 (Make Using Emacs Frictionless) from V2MOM.
Closes #[#B] Fix video/audio recording module sub-tasks:
- Add diagnostic command
- Add device selection UI
- Improve error messages
- Make device detection more flexible
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Print operations are now safer and more intuitive:
Keybinding changes:
- C-; b p β copy file path (safe, common action)
- C-; b P β print to PostScript (dramatic, requires shift)
Print function improvements:
- Add y-or-n-p confirmation before printing
- C-u prefix skips confirmation and enables color printing
- Prevents accidental waste of paper/toner
Serves V2MOM Values:
- Intuitive: Dramatic actions require shift key
- Intuitive: Prevents muscle memory mistakes
- Simple: Reliability through confirmation
Also updated docs/NOTES.org with Makefile availability note.
Closes inbox items from emacs-inbox-zero session (2025-11-03).
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Add two new methods to copy buffer content regions:
- cj/copy-to-bottom-of-buffer: copies from point to end of buffer
- cj/copy-to-top-of-buffer: copies from beginning of buffer to point
Reorganize copy operations under C-; b c submenu:
- C-; b c w: copy whole buffer
- C-; b c t: copy to top (beginning to point)
- C-; b c b: copy to bottom (point to end)
Other copy operations (buffer name, file path, file link) remain at
C-; b base level for quick access.
Add comprehensive ERT tests (22 tests total):
- test-custom-buffer-file-copy-to-bottom-of-buffer.el (11 tests)
- test-custom-buffer-file-copy-to-top-of-buffer.el (11 tests)
- Tests cover normal, boundary, and error cases including unicode,
narrowing, whitespace, and read-only buffers
All tests pass.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Changes:
- Changed dashboard to :demand t (load immediately instead of defer)
- Reduced bookmark display from 15 to 10 items
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Updated chime configuration for severity refactor:
- Replaced chime-alert-time and chime-alert-severity with
chime-alert-intervals '((5 . medium) (0 . medium))
- Changed polling interval from 60s to 30s for faster response
- Added chime-day-wide-time "09:00" for all-day event notifications
- Removed settings that match defaults (play-sound, keyword filters, etc.)
- Changed chime-debug from t to nil
All notifications now use medium urgency.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Fixed two critical bugs preventing Emacs from launching after fresh clone:
1. prog-go.el: Moved go-ts-mode-map keybinding from :bind clause
- The :bind macro tried to reference go-ts-mode-map before it was loaded
- Moved "C-; f" gofmt binding into cj/go-mode-keybindings function
- Function executes via hook after mode loads, ensuring keymap exists
2. org-config.el: Moved function definitions before use-package block
- cj/org-general-settings, cj/org-appearance-settings, and
cj/org-todo-settings were called in :config but defined after
- Moved all three function definitions before (use-package org)
- Functions now defined before :config section tries to call them
Both fixes follow the pattern of ensuring dependencies exist before use.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Changed from bidirectional "org" mode to "gcal" mode to avoid sync conflicts.
This prevents HTTP 412 errors on recurring events and HTTP 400 errors on
modified events.
Google Calendar is now authoritative:
- org-gcal-managed-newly-fetched-mode: "gcal" (was "org")
- org-gcal-managed-update-existing-mode: "gcal" (was "org")
Benefits:
- No more version conflicts on recurring events
- Cleaner sync without errors
- Google Calendar changes always win
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
org-gcal-config.el:
- Add use-package declarations for deferred and oauth2-auto
- Ensures dependencies are automatically installed on fresh systems
- Fixes "Cannot open load file" errors when syncing
org-contacts-config.el:
- Add automatic birthday timestamp insertion via capture template
- Parse YYYY-MM-DD or MM-DD birthday formats
- Insert yearly repeating timestamps after properties drawer
- Add NICKNAME and NOTE fields to capture template
org-agenda-config.el:
- Enable chime-debug mode for troubleshooting
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Explicitly set chime-debug to nil in :init section.
Matches new chime.el default (changed from t to nil in recent commit).
Clean production setup - debug mode available by changing to t when needed.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
todo.org updates:
- Added 2 new inbox items about printing keybindings
- Reordered Method 1 tasks by priority
- Removed blank lines (linter formatting)
music-config.el improvements:
- Added validation checks to cj/music--valid-file-p and cj/music--valid-directory-p
- Fixed regex escaping in cj/music--m3u-file-tracks
- Added new cj/music--append-track-to-m3u-file function for testing
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
|
|
Fix inconsistent indentation in dired-mode section to improve code
readability. Enhance history persistence settings by configuring
'savehist' to include additional variables and set history length
limits, ensuring better session management.
|
|
Add `unpropertize-kill-ring` function to remove text properties from
the kill ring when Emacs is exiting. This improves performance by
reducing unnecessary data retention. The function is hooked into
`kill-emacs-hook`.
|
|
Set 'mu4e-headers-from-or-to-prefix' to use a custom arrow symbol as
a prefix in email headers, improving visual distinction for 'From'
or 'To' fields.
|
|
Set the environment variable PAGER to 'cat' to disable pagination in
eshell. Remove existing alias for 'clear' and introduce a new custom
'eshell/clear' function that clears the eshell buffer.
|
|
Introduce a new function `cj/diff-buffer-with-file` to compare
current buffer with saved file version using unified diff format.
Bind it to "C-; b D" for easy access. This enhances buffer
management capabilities by allowing users to view changes before
saving.
|
|
Add a new command `cj/consult-line-or-repeat` that calls
`consult-line` or repeats the last search if invoked consecutively.
Bind this command to "C-s". This enhances user experience by
providing a quick way to repeat search actions.
|
|
Change keybindings for counting words and characters to "# w" and "#
c" to improve mnemonic efficiency. Update the corresponding
which-key descriptions accordingly.
|
|
Add 'turn-on-gnus-dired-mode' to 'dired-mode-hook' to facilitate
marking files in Dirvish for attachment in mu4e emails.
|
|
Added new keybindings for marking the whole buffer and reverting the
buffer. Updated the descriptions to reflect these additions.
|
|
Introduce functions to count characters in a buffer or region. Bind
new character counting function to "C-; C" in custom keymap.
|
|
|
|
|
|
This commit fixes timing issues with chime.el startup and simplifies
configuration after chime.el's validation improvements.
## Changes
**1. Fixed org-agenda lazy loading issue**
- Added `:demand t` to org-agenda use-package
- Ensures org-agenda loads before chime tries to use it
- Prevents "org-agenda not available" errors
**2. Cleaned up duplicate rebuild hooks**
- Removed duplicate emacs-startup-hook with idle-timer
- Kept single emacs-startup-hook for rebuild
- Simpler, more maintainable configuration
**3. Simplified chime configuration**
- Restored `(chime-mode 1)` in use-package :config
- Removed conditional fboundp check (no longer needed)
- Works with chime.el's new deferred validation
- Fixed `:after` clause (removed org-agenda dependency)
**4. Fixed formatting issues**
- Removed stray 's' character in add-hook indentation
- Consistent indentation throughout
## Integration with chime.el v0.6.0
This commit pairs with chime.el's new features:
- chime-startup-delay (default 10 sec) gives rebuild hook time to run
- Validation moved to first check (no startup blocking)
- Clean user experience with no false warnings
## Timeline
```
Time 0s: Emacs starts
Time 0s: org-agenda loads (:demand t)
Time 0s: chime-mode 1 (starts timer, no validation)
Time 0.1s: emacs-startup-hook β rebuild org-agenda-files
Time 10s: First chime-check β validates, finds events
Time 24s: Modeline populated with events
```
**Result:** 24 second startup (vs previous 463 seconds - 95% improvement)
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
The previous commit incorrectly moved deadgrep to 'D', which conflicts
with the important dired-do-delete command (immediate delete of marked
files). This commit moves deadgrep to 'G' instead.
## Changes
**prog-general.el:**
- Move cj/deadgrep-here from 'D' to 'G' (was dired-do-chgrp, rarely used)
**dirvish-config.el:**
- Updated Commentary to document both 'D' and 'G' keybindings
- 'D' remains dired-do-delete (standard dired immediate delete)
- 'G' is now deadgrep search
## Final Keybinding Map
| Key | Binding | Purpose |
|-----|-------------------------------|--------------------------------|
| d | cj/dirvish-duplicate-file | Duplicate with "-copy" suffix |
| D | dired-do-delete | Delete marked files (standard) |
| g | dirvish-quick-access | Quick directory menu |
| G | cj/deadgrep-here | Search with deadgrep |
Capital G is mnemonic for "Grep" and doesn't conflict with important
dired commands. dired-do-chgrp is rarely used and not a loss.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
This commit adds a convenient file duplication function to dirvish and
reorganizes keybindings to avoid conflicts.
## Changes
**1. New function: cj/dirvish-duplicate-file (dirvish-config.el:150)**
Duplicates the file at point with "-copy" suffix before the extension:
- report.pdf β report-copy.pdf
- script.el β script-copy.el
- README β README-copy
Features:
- Prevents duplicating directories (files only)
- Checks if target exists and prompts to overwrite
- Refreshes buffer automatically after copying
- Shows clear message with old and new names
**2. Keybinding changes**
dirvish-config.el:
- Bound 'd' to cj/dirvish-duplicate-file (was dired-flag-file-deletion)
- Updated Commentary section to document new binding
prog-general.el:
- Moved cj/deadgrep-here from 'd' to 'D' (capital D)
- More mnemonic: D for Deadgrep
- Avoids conflict with new duplicate function
## Rationale
The 'd' key is prime real estate in file managers, and duplicating files
is a very common operation. The standard dired-flag-file-deletion is still
available via 'x' or the mark-and-delete workflow.
Deadgrep on 'D' is more discoverable (capital D for Deadgrep) and less
likely to be pressed accidentally.
## Usage
In dirvish, navigate to a file and press:
- 'd' - Duplicate file with "-copy" suffix
- 'D' - Search with deadgrep in current directory
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
This commit establishes a pattern for organizing debug code in separate
files that can be enabled/disabled via a central toggle.
## Changes
**1. Added debug toggle to user-constants.el**
New variable `cj/debug-modules` controls which modules load debug functions:
- Set to nil (default): No debug functions loaded
- Set to list of symbols: Load debug for specific modules
Example: (setq cj/debug-modules '(org-agenda mail))
- Set to t: Load all debug modules
Example: (setq cj/debug-modules t)
Placed early in user-constants.el so it's available before other modules load.
**2. Created org-agenda-config-debug.el**
New debug file contains:
- `cj/org-agenda-debug-dump-files` - Shows all org-agenda-files with status,
file sizes, and modification times
- `cj/org-agenda-debug-rebuild-timing` - Measures rebuild performance and
reports detailed timing statistics
- `cj/log-silently` - Helper function to write to *Messages* without echo
All functions use ;;;###autoload for easy invocation before explicit loading.
**3. Added conditional require to org-agenda-config.el**
Checks `cj/debug-modules` and conditionally loads org-agenda-config-debug.el:
```elisp
(when (or (eq cj/debug-modules t)
(memq 'org-agenda cj/debug-modules))
(require 'org-agenda-config-debug ...))
```
## Benefits
**Cleaner separation of concerns:**
- Production code stays in main config files
- Debug code isolated in *-debug.el files
- Easy to enable/disable debugging per module
**Reusable pattern:**
- Can be applied to any config module (mail, chime, etc.)
- Consistent naming: <module>-debug.el
- Consistent namespace: cj/<module>-debug-*
**Zero overhead when disabled:**
- Debug files not loaded unless explicitly enabled
- No performance impact on normal usage
## Usage
To enable org-agenda debug functions:
```elisp
;; In user-constants.el or early-init.el
(setq cj/debug-modules '(org-agenda))
```
Then restart Emacs and run:
- M-x cj/org-agenda-debug-dump-files
- M-x cj/org-agenda-debug-rebuild-timing
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Update configuration to use renamed chime variables:
- chime-modeline-lookahead β chime-modeline-lookahead-minutes
- Update comment referencing chime-tooltip-lookahead-hours
These variables were renamed in chime.el commit 2a89893
(feat: comprehensive test improvements and lookahead refactoring).
Fixes issue where modeline wasn't displaying after Emacs restart
because the old variable name had no effect.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Add a function to automatically save all org-gcal files after
synchronization completes. This ensures that any changes are
persisted, enhancing data consistency. Advise
`org-gcal--sync-unlock` to trigger auto-saving upon sync completion.
|
|
Remove unnecessary blank lines in function docstrings to enhance
readability. Update chime package settings to use a local version
instead of the latest from GitHub, and adjust modeline lookahead and
tooltip settings for better event visibility.
|
|
Add :ensure t to elisp-lint use-package declaration to guarantee
it's always installed. This supports chime.el development workflow
where 'make lint' provides comprehensive code quality checks.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Extended the modeline display lookahead to 2 hours and added new
formatting for modeline content, including a compact time-until
format and title truncation for long event titles. Disabled chime
sound notifications for a quieter experience.
|
|
|
|
Remove unused comment and fix consult-line keybinding override.
Update completion styles with 'basic' for better flexibility. Clean
up Yasnippet integration comments. Add more descriptive which-key
labels to improve usability.
|
|
This change defers the loading of the org-roam package by 1 second.
This is a workaround to org-roam not loading soon enough after launch
to have created the necessary capture templates. I'll fix that in an
upcoming org-roam refactor session.
|
|
Replace the `setq yas-snippet-dirs` with `list` function for better
readability and add `yas-reload-all` to ensure snippets are
reloaded. Remove `ivy-yasnippet` configuration as it is not
required.
|
|
Include the `*Async-native-compile-log*` buffer in the list of popup
rules for improved buffer management.
|
|
|
|
Renamed the module 'custom-file-buffer' to 'custom-buffer-file' to
ensure consistency across the codebase. This change affects module
imports and test files. Additionally, new module
'system-commands.el' has been created to handle system power and
session management commands, removing these functionalities from
'wip.el'.
|
|
Remove local load-path in favor of vc installation for wttrin to use
the source (latest revision).
|
|
Forward declare internal org-gcal variables and functions to improve
code clarity. Update use-package declaration with version control
information to use my fork of org-gcal (fixes, better testing).
|
|
Enhance which-key integration by providing detailed descriptions for
new key bindings across multiple modules. This improves the
usability of custom keymaps by clarifying the purpose of each
keybinding, making it easier for users to navigate and understand
different menus and options available within the configuration.
This update ensures that all custom keymaps now display a
descriptive label in the which-key popup to explain their
functionality, aiding users in identifying keymap purposes promptly.
|
|
Add comprehensive documentation and workflow details for the ERT
test runner, including integration with Projectile projects for
automatic test discovery.
Refactor code to support focus/unfocus workflows, allowing
developers to efficiently manage test execution by focusing on
specific test files.
Introduce internal utility functions `cj/test--do-*` to modularize
logic for file operations and focus management, improving code
maintainability.
Add new tests in `test-test-runner.el` to validate the enhanced
functionality, ensuring robust handling of focus operations and test
execution scenarios.
|
|
Add comprehensive documentation and workflow details for the ERT
test runner, including integration with Projectile projects for
automatic test discovery.
Refactor code to support focus/unfocus workflows, allowing
developers to efficiently manage test execution by focusing on
specific test files.
Introduce internal utility functions `cj/test--do-*` to modularize
logic for file operations and focus management, improving code
maintainability.
Add new tests in `test-test-runner.el` to validate the enhanced
functionality, ensuring robust handling of focus operations and test
execution scenarios.
|
|
Add comprehensive documentation and workflow details for the ERT
test runner, including integration with Projectile projects for
automatic test discovery.
Refactor code to support focus/unfocus workflows, allowing
developers to efficiently manage test execution by focusing on
specific test files.
Introduce internal utility functions `cj/test--do-*` to modularize
logic for file operations and focus management, improving code
maintainability.
Add new tests in `test-test-runner.el` to validate the enhanced
functionality, ensuring robust handling of focus operations and test
execution scenarios.
|
|
- Move `browser-config` from 'Modules In Test' to active modules
- Refactor browser handling functions for better error handling:
- Introduce `cj/--do-apply-browser-choice` and
- `cj/--do-choose-browser` Return status symbols for success and
- error cases Add comprehensive unit tests in
- `tests/test-browser-config.el` Focus on internal `cj/--do-*`
- functions and file I/O using temp files Validate return values and
- ensure isolated tests with setup/teardown functions Ensure
- consistent handling of browser configurations and improve
- initialization logic
|