Spec for CAPS_MOD custom keycode: tap=ESC, hold=Ctrl, Shift+tap=CapsLock, Alt+tap=CapsWord, GUI+tap=Autocorrect toggle. Includes RGB indicators and feature enablement plan.
3.1 KiB
Caps Lock Mod — Design Spec
Date: 2026-04-07
Keyboard: Keychron Q5 Max (ANSI Encoder)
Keymap: keyboards/keychron/q5_max/ansi_encoder/keymaps/via/
Summary
Replace the plain KC_CAPS key with a smart CAPS_MOD custom keycode that provides
tap-vs-hold behavior and modifier-aware tap actions. Enable Caps Word and Autocorrect
features with RGB indicators on the Caps Lock key (LED 55).
Behavior
| Action | Result |
|---|---|
| Tap | Escape |
| Hold (past tapping term) | Left Ctrl (held until release) |
| Shift + Tap | Toggle normal Caps Lock |
| Alt + Tap | Toggle Caps Word |
| GUI + Tap | Toggle Autocorrect |
Priority for modifier-aware taps: GUI → Alt → Shift → default (ESC).
Modifiers are checked via get_mods() at key release time (they remain held by the user).
Implementation
New custom keycode
CAPS_MOD // added to enum custom_keycodes, after existing entries
Replaces every KC_CAPS in all layers of keymap.c.
State variables
static bool caps_mod_held = false;
static bool caps_mod_ctrl_registered = false;
static uint16_t caps_mod_timer = 0;
process_record_user logic
On press:
caps_mod_held = true;
caps_mod_timer = timer_read();
On release:
if (caps_mod_ctrl_registered) {
unregister_code(KC_LCTL);
caps_mod_ctrl_registered = false;
} else {
uint8_t mods = get_mods();
if (mods & MOD_MASK_GUI) {
autocorrect_toggle();
} else if (mods & MOD_MASK_ALT) {
caps_word_toggle();
} else if (mods & MOD_MASK_SHIFT) {
tap_code(KC_CAPS);
} else {
tap_code(KC_ESC);
}
}
caps_mod_held = false;
matrix_scan_user addition
if (caps_mod_held && !caps_mod_ctrl_registered
&& timer_elapsed(caps_mod_timer) > TAPPING_TERM) {
caps_mod_ctrl_registered = true;
register_code(KC_LCTL);
}
RGB Indicators (LED 55 — Caps Lock physical position)
Added inside rgb_matrix_indicators_advanced_user, checked in priority order:
| State | Color |
|---|---|
| Caps Word on | Green (0, 200, 0) |
| Autocorrect on | Purple (150, 0, 255) |
| Normal Caps Lock on | White (255, 255, 255) |
| All off | Dark (0, 0, 0) |
Caps Word takes visual priority over host Caps Lock because both can technically be active simultaneously.
Feature Enablement
rules.mk additions
CAPS_WORD_ENABLE = yes
AUTOCORRECT_ENABLE = yes
config.h addition
#define AUTOCORRECT_MIN_LENGTH 4
autocorrect_data.h is already present in the keymap folder. QMK picks it up
automatically when AUTOCORRECT_ENABLE = yes — no manual #include needed.
Files Changed
| File | Change |
|---|---|
keymap.c |
Add CAPS_MOD to enum; add state vars; add press/release logic in process_record_user; add scan logic in matrix_scan_user; add LED 55 indicators in rgb_matrix_indicators_advanced_user; replace all KC_CAPS with CAPS_MOD |
rules.mk |
Add CAPS_WORD_ENABLE = yes and AUTOCORRECT_ENABLE = yes |
config.h |
Add AUTOCORRECT_MIN_LENGTH 4 |