Made caps word/caps lock a tap dance that can be overridden by alt

This commit is contained in:
Drew Whitney 2025-11-03 09:50:34 -07:00
commit 675c9787eb
6 changed files with 30 additions and 38 deletions

View file

@ -27,9 +27,6 @@ enum CustomKeycodes {
#define TAB_FORWARD C(KC_TAB) #define TAB_FORWARD C(KC_TAB)
#define TAB_BACKWARD (C(S(KC_TAB))) #define TAB_BACKWARD (C(S(KC_TAB)))
// weird tap holds
#define CW_CL SFT_T(CAPS_WORD)
// layers // layers
#define NUM_SPC LT(_NUM, KC_SPC) #define NUM_SPC LT(_NUM, KC_SPC)
#define NAV_ENT LT(_NAV, KC_ENT) #define NAV_ENT LT(_NAV, KC_ENT)

View file

@ -1,6 +1,7 @@
#include QMK_KEYBOARD_H #include QMK_KEYBOARD_H
#include "caps_word.h" #include "caps_word.h"
#include "../alias.h" #include "../alias.h"
#include "../tap_dance/tap_dance.h"
bool caps_word_press_user(uint16_t keycode) { bool caps_word_press_user(uint16_t keycode) {
switch (keycode) { switch (keycode) {
@ -18,6 +19,7 @@ bool caps_word_press_user(uint16_t keycode) {
case KC_RGHT: case KC_RGHT:
case KC_MINS: case KC_MINS:
case KC_UNDS: case KC_UNDS:
case TD(TD_CW_CL): // this makes toggling work
return true; return true;
break; break;
default: default:

View file

@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_ortho_4x12( [_BASE] = LAYOUT_ortho_4x12(
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
KC_TAB, GUI_A, ALT_S, SFT_D, CTL_F, CTL_G, CTL_H, CTL_J, SFT_K, ALT_L, GUI_SCLN, KC_QUOT, KC_TAB, GUI_A, ALT_S, SFT_D, CTL_F, CTL_G, CTL_H, CTL_J, SFT_K, ALT_L, GUI_SCLN, KC_QUOT,
CW_CL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_DEL, TD(TD_CW_CL), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_DEL,
KC_NO, FUNC_PLAY, KC_LALT, TD(TD_CAD_LOCK_SLEEP), LAUNCH, NUM_SPC, NAV_ENT, KC_RALT, KC_LEFT, DOWN, UP, KC_RGHT KC_NO, FUNC_PLAY, KC_LALT, TD(TD_CAD_LOCK_SLEEP), LAUNCH, NUM_SPC, NAV_ENT, KC_RALT, KC_LEFT, DOWN, UP, KC_RGHT
), ),
// gamer // gamer
@ -61,35 +61,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
bool process_record_user(uint16_t keycode, keyrecord_t* record) { bool process_record_user(uint16_t keycode, keyrecord_t* record) {
switch (keycode) { switch (keycode) {
case CW_CL: { // caps word is really complicated, eek
static bool tab_backward_held = false;
if (record->tap.count) {
if (record->event.pressed) {
uint8_t mods = get_mods();
if (mods & TABBING_TRIGGER_MODS) { // tabbing
del_mods(TABBING_TRIGGER_MODS);
register_code16(TAB_BACKWARD);
set_mods(mods);
tab_backward_held = true; // set the flag
} else { // caps word
caps_word_toggle();
}
} else {
if (tab_backward_held) {
tab_backward_held = false; // clear the flag
unregister_code16(TAB_BACKWARD);
neutralize_flashing_mods();
}
}
} else { // hold; caps lock
if (record->event.pressed) {
tap_code(KC_CAPS);
}
}
return false;
break;
}
// make it possible to go from layer 3 to layer 2 // make it possible to go from layer 3 to layer 2
case NUM_SPC: case NUM_SPC:
if (!record->tap.count) { if (!record->tap.count) {
@ -235,6 +206,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) {
return true; return true;
} }
const key_override_t CW_CL_TO_TAB_BACKWARDS =
ko_make_basic(TABBING_TRIGGER_MODS, TD(TD_CW_CL), TAB_BACKWARD);
const key_override_t Q_TO_KILL = ko_make_with_layers(MOD_MASK_GUI, KC_Q, A(KC_F4), 1 << _BASE); const key_override_t Q_TO_KILL = ko_make_with_layers(MOD_MASK_GUI, KC_Q, A(KC_F4), 1 << _BASE);
const key_override_t COMM_TO_TAB_BACKWARDS = const key_override_t COMM_TO_TAB_BACKWARDS =
@ -328,6 +302,7 @@ const key_override_t F2_TO_M = ko_make_with_layers(MOD_MASK_CTRL, KC_F2, C(KC_M)
// this globally defines all key overrides to be used // this globally defines all key overrides to be used
const key_override_t* key_overrides[] = { const key_override_t* key_overrides[] = {
&CW_CL_TO_TAB_BACKWARDS,
&COMM_TO_TAB_BACKWARDS, &COMM_TO_TAB_BACKWARDS,
&TILDE_TO_TAB_BACKWARDS, &TILDE_TO_TAB_BACKWARDS,
&Q_TO_KILL, &Q_TO_KILL,

View file

@ -2,7 +2,7 @@
#include "./tap_dance.h" #include "./tap_dance.h"
#include "../alias.h" #include "../alias.h"
void CAD_lock_sleep(tap_dance_state_t* state, void* user_data) { void CAD_lock_sleep(tap_dance_state_t* state, void*) {
switch (state->count) { switch (state->count) {
case 1: case 1:
tap_code16(CAD); tap_code16(CAD);
@ -18,6 +18,27 @@ void CAD_lock_sleep(tap_dance_state_t* state, void* user_data) {
} }
} }
void caps_lock_caps_word_on_tap(tap_dance_state_t* state, void*) {
switch (state->count) {
case 1: // do nothing for the first tap
break;
default:
tap_code(KC_CAPS);
break;
}
}
void caps_lock_caps_word_on_finish(tap_dance_state_t* state, void*) {
switch (state->count) {
case 1:
caps_word_toggle();
break;
}
}
tap_dance_action_t tap_dance_actions[] = { tap_dance_action_t tap_dance_actions[] = {
[TD_CAD_LOCK_SLEEP] = ACTION_TAP_DANCE_FN(CAD_lock_sleep), [TD_CAD_LOCK_SLEEP] = ACTION_TAP_DANCE_FN(CAD_lock_sleep),
[TD_CW_CL] = ACTION_TAP_DANCE_FN_ADVANCED(
caps_lock_caps_word_on_tap, caps_lock_caps_word_on_finish, NULL
),
}; };

View file

@ -2,4 +2,5 @@
enum { enum {
TD_CAD_LOCK_SLEEP, TD_CAD_LOCK_SLEEP,
TD_CW_CL,
}; };

View file

@ -137,10 +137,6 @@ uint16_t get_tapping_term(uint16_t keycode, keyrecord_t* record) {
case ALT_UP: case ALT_UP:
return 400; return 400;
break; break;
case CW_CL: // have to hold for caps lock a little longer
return 300;
break;
} }
return TAPPING_TERM; return TAPPING_TERM;
} }