Feels good man

This commit is contained in:
Drew Whitney 2025-11-20 20:19:36 -07:00
commit 204f9e724e
9 changed files with 131 additions and 70 deletions

View file

@ -6,7 +6,6 @@
/// @brief Custom keycodes.
enum CustomKeycodes {
WIN_SWAP = SAFE_RANGE, // custom alt-tabbing
PH_P, // placeholder key that passes through to P when Ctrl is held
};
#define TD_CLS TD(TD_CAD_LOCK_SLEEP)
@ -21,12 +20,10 @@ enum CustomKeycodes {
#define ZOOM_IN C(KC_EQL)
#define ZOOM_OUT C(KC_MINS)
#define SFT_BSPC SFT_T(KC_BSPC)
// layers
#define SYM_ENT LT(_SYM, KC_ENT)
#define NUM MO(_NUM)
#define SYM_BSPC LT(_SYM, KC_BSPC)
#define NAV_TAB LT(_NAV, KC_TAB)
#define NUM_SPC LT(_NUM, KC_SPC)
#define FN_LAUNCH LT(_FUNC, LAUNCH)
#define FN_ESC LT(_FUNC, KC_ESC)
#define ARROW MO(_SH_ARROW)

View file

@ -2,11 +2,41 @@
#include "../alias.h"
#include "../layers/layers.h"
uint16_t get_combo_term(uint16_t combo_index, combo_t* combo) {
switch (combo_index) {
case NumCombo:
return 75; // make a larger window for triggering the combo
break;
}
return COMBO_TERM;
}
bool process_combo_key_release(
uint16_t combo_index, combo_t* combo, uint8_t key_index, uint16_t keycode
) {
switch (combo_index) {
case NumCombo:
// whenever one of the layer keys is released, turn off that layer (this will
// automatically turn off the NUM layer because of the layer_state_set_user() callback)
switch (keycode) {
case SYM_BSPC:
layer_off(_SYM);
break;
case NAV_TAB:
layer_off(_NAV);
break;
}
break;
}
return false;
}
bool process_combo_key_repress(
uint16_t combo_index, combo_t* combo, uint8_t key_index, uint16_t keycode
) {
switch (combo_index) {
case WinSwapCombo:
// implement the tab left and tab right part of alt-tab
switch (keycode) {
case TAB_LEFT:
tap_code16(S(KC_TAB));

View file

@ -3,5 +3,6 @@
#include QMK_KEYBOARD_H
enum Combos {
NumCombo,
WinSwapCombo,
};

View file

@ -4,14 +4,14 @@
// tap-hold
#define QUICK_TAP_TERM_PER_KEY
// #define HOLD_ON_OTHER_KEY_PRESS
#define HOLD_ON_OTHER_KEY_PRESS_PER_KEY
#define PERMISSIVE_HOLD_PER_KEY
#define HOLD_ON_OTHER_KEY_PRESS
// #define HOLD_ON_OTHER_KEY_PRESS_PER_KEY
// #define PERMISSIVE_HOLD_PER_KEY
// combos
// #define COMBO_PROCESS_KEY_RELEASE
#define COMBO_PROCESS_KEY_RELEASE
#define COMBO_PROCESS_KEY_REPRESS
// #define COMBO_TERM_PER_COMBO
#define COMBO_TERM_PER_COMBO
#define CAPS_WORD_IDLE_TIMEOUT 0

View file

@ -17,9 +17,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
//├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤ ├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
KC_NO, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_NO,
//├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┐ ┌───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, TD_CLS, GAME, KC_N, KC_M, KC_COMM, KC_DOT, KC_SCLN, KC_NO,
KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, TD_CLS, GAME, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO,
//└───────────┴───────────┴───────────┴─────┬─────┴─────┬─────┴─────┬─────┴────┬──────┘ └─────┬─────┴─────┬─────┴─────┬─────┴─────┬─────┴───────────┴───────────┴───────────┘
FN_LAUNCH, NAV_TAB, NUM_SPC, SFT_BSPC, SYM_ENT, ARROW
FN_LAUNCH, NAV_TAB, KC_SPC, OS_LSFT, SYM_BSPC, ARROW
// └───────────┴───────────┴──────────┘ └───────────┴───────────┴───────────┘
),
@ -33,21 +33,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
//├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┐ ┌───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
KC_TRNS, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_TRNS, TG(_GAME), KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_TRNS,
//└───────────┴───────────┴───────────┴─────┬─────┴─────┬─────┴─────┬─────┴────┬──────┘ └─────┬─────┴─────┬─────┴─────┬─────┴─────┬─────┴───────────┴───────────┴───────────┘
FN_ESC, KC_I, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS
// └───────────┴───────────┴──────────┘ └───────────┴───────────┴───────────┘
),
[_NUM] = LAYOUT(
//┌───────────┬───────────┬───────────┬───────────┬───────────┬───────────┐ ┌───────────┬───────────┬───────────┬───────────┬───────────┬───────────┐
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
//├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤ ├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
KC_TRNS, KC_SLSH, KC_E, KC_ASTR, KC_MINS, KC_PLUS, KC_CIRC, KC_NO, KC_NO, KC_LPRN, KC_RPRN, KC_TRNS,
//├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤ ├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS,
//├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┐ ┌───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DOT, QK_BOOT, KC_NO, KC_COLN, KC_COMM, KC_DOT, KC_SCLN, KC_TRNS,
//└───────────┴───────────┴───────────┴─────┬─────┴─────┬─────┴─────┬─────┴────┬──────┘ └─────┬─────┴─────┬─────┴─────┬─────┴─────┬─────┴───────────┴───────────┴───────────┘
FN_LAUNCH, NAV_TAB, NUM_SPC, KC_TRNS, KC_TRNS, KC_TRNS
FN_ESC, KC_I, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
// └───────────┴───────────┴──────────┘ └───────────┴───────────┴───────────┘
),
@ -57,11 +43,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
//├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤ ├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
KC_TRNS, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_TRNS,
//├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤ ├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
KC_TRNS, KC_BSLS, KC_LBRC, KC_RBRC, KC_MINS, KC_EQL, KC_PLUS, OS_RSFT, OS_RCTL, OS_RALT, OS_RGUI, KC_TRNS,
KC_TRNS, KC_BSLS, KC_LBRC, KC_RBRC, KC_MINS, KC_EQL, KC_GRV, OS_LSFT, OS_LCTL, OS_LALT, OS_LGUI, KC_TRNS,
//├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┐ ┌───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
KC_CAPS, KC_PIPE, KC_LCBR, KC_RCBR, KC_UNDS, KC_GRV, TD_CLS, QK_BOOT, KC_TILD, KC_QUES, KC_LABK, KC_RABK, KC_SLSH, KC_TRNS,
KC_CAPS, KC_PIPE, KC_LCBR, KC_RCBR, KC_UNDS, KC_PLUS, TD_CLS, QK_BOOT, KC_TILD, KC_COLN, KC_LABK, KC_RABK, KC_SCLN, KC_TRNS,
//└───────────┴───────────┴───────────┴─────┬─────┴─────┬─────┴─────┬─────┴────┬──────┘ └─────┬─────┴─────┬─────┴─────┬─────┴─────┬─────┴───────────┴───────────┴───────────┘
FN_LAUNCH, NAV_TAB, NUM_SPC, KC_TRNS, KC_TRNS, KC_TRNS
FN_LAUNCH, NAV_TAB, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
// └───────────┴───────────┴──────────┘ └───────────┴───────────┴───────────┘
),
@ -69,13 +55,27 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
//┌───────────┬───────────┬───────────┬───────────┬───────────┬───────────┐ ┌───────────┬───────────┬───────────┬───────────┬───────────┬───────────┐
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
//├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤ ├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
KC_TRNS, KC_ESC, KC_NO, TAB_LEFT, TAB_RIGHT, LAUNCH, KC_NO, KC_HOME, KC_UP, KC_END, KC_DEL, KC_TRNS,
KC_TRNS, KC_ESC, LAUNCH, TAB_LEFT, TAB_RIGHT, C(KC_Y), KC_NO, KC_HOME, KC_UP, KC_END, KC_SCLN, KC_TRNS,
//├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤ ├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
KC_TRNS, OS_LGUI, OS_LALT, OS_LCTL, OS_LSFT, CW_TOGG, COMPOSE, KC_LEFT, KC_DOWN, KC_RGHT, KC_SLSH, KC_TRNS,
KC_TRNS, OS_LGUI, OS_LALT, OS_LCTL, OS_LSFT, CW_TOGG, KC_CAPS, KC_LEFT, KC_DOWN, KC_RGHT, KC_ENT, KC_TRNS,
//├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┐ ┌───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
KC_TRNS, C(KC_Z), C(KC_X), C(KC_C), C(KC_V), C(KC_Y), TD_CLS, QK_BOOT, KC_F2, KC_CAPS, KC_COMM, KC_DOT, KC_SCLN, KC_TRNS,
KC_TRNS, C(KC_Z), C(KC_X), C(KC_C), KC_SPC, C(KC_V), TD_CLS, QK_BOOT, COMPOSE, KC_F2, KC_COMM, KC_DOT, KC_DEL, KC_TRNS,
//└───────────┴───────────┴───────────┴─────┬─────┴─────┬─────┴─────┬─────┴────┬──────┘ └─────┬─────┴─────┬─────┴─────┬─────┴─────┬─────┴───────────┴───────────┴───────────┘
FN_LAUNCH, NAV_TAB, NUM_SPC, KC_TRNS, KC_TRNS, KC_TRNS
FN_LAUNCH, NAV_TAB, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
// └───────────┴───────────┴──────────┘ └───────────┴───────────┴───────────┘
),
[_NUM] = LAYOUT(
//┌───────────┬───────────┬───────────┬───────────┬───────────┬───────────┐ ┌───────────┬───────────┬───────────┬───────────┬───────────┬───────────┐
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
//├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤ ├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
KC_TRNS, KC_SLSH, KC_E, KC_ASTR, KC_MINS, KC_PLUS, KC_CIRC, KC_NO, KC_ASTR, KC_LPRN, KC_RPRN, KC_TRNS,
//├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤ ├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS,
//├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┐ ┌───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
KC_TRNS, KC_NO, KC_NO, KC_NO, KC_SPC, KC_NO, KC_DOT, QK_BOOT, KC_SCLN, KC_COLN, KC_COMM, KC_DOT, KC_SLSH, KC_TRNS,
//└───────────┴───────────┴───────────┴─────┬─────┴─────┬─────┴─────┬─────┴────┬──────┘ └─────┬─────┴─────┬─────┴─────┬─────┴─────┬─────┴───────────┴───────────┴───────────┘
FN_LAUNCH, NAV_TAB, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
// └───────────┴───────────┴──────────┘ └───────────┴───────────┴───────────┘
),
@ -89,7 +89,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
//├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┐ ┌───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
KC_TRNS, KC_BRID, KC_BRIU, KC_WBAK, KC_WFWD, KC_MUTE, TD_CLS, QK_BOOT, KC_NO, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS,
//└───────────┴───────────┴───────────┴─────┬─────┴─────┬─────┴─────┬─────┴────┬──────┘ └─────┬─────┴─────┬─────┴─────┬─────┴─────┬─────┴───────────┴───────────┴───────────┘
FN_LAUNCH, NAV_TAB, NUM_SPC, KC_TRNS, KC_TRNS, KC_TRNS
FN_LAUNCH, NAV_TAB, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
// └───────────┴───────────┴──────────┘ └───────────┴───────────┴───────────┘
),
@ -103,7 +103,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
//├───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┐ ┌───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, TD_CLS, QK_BOOT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS,
//└───────────┴───────────┴───────────┴─────┬─────┴─────┬─────┴─────┬─────┴────┬──────┘ └─────┬─────┴─────┬─────┴─────┬─────┴─────┬─────┴───────────┴───────────┴───────────┘
FN_LAUNCH, NAV_TAB, NUM_SPC, KC_TRNS, KC_TRNS, KC_TRNS
FN_LAUNCH, NAV_TAB, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
// └───────────┴───────────┴──────────┘ └───────────┴───────────┴───────────┘
),
@ -115,10 +115,11 @@ tap_dance_action_t tap_dance_actions[] = {
[TD_GAMER_MODE] = ACTION_TAP_DANCE_FN(enter_gamer_mode),
};
// const uint16_t PROGMEM num_layer_combo[] = {NAV_SPC, SYM_ENT, COMBO_END};
const uint16_t PROGMEM num_layer_combo[] = {NAV_TAB, SYM_BSPC, COMBO_END};
const uint16_t PROGMEM win_swap_combo[] = {TAB_LEFT, TAB_RIGHT, COMBO_END};
combo_t key_combos[] = {
[NumCombo] = COMBO(num_layer_combo, NUM),
[WinSwapCombo] = COMBO(win_swap_combo, WIN_SWAP),
};
@ -127,10 +128,27 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) {
switch (keycode) {
// allow NAV and SYM to override each other
case SYM_ENT:
case SYM_BSPC:
if (!record->tap.count) {
// if NAV is on, turn it off when SYM is turned on, then restore it when SYM is
// turned off
// if we're NUM-latched, don't interfere with the states
if (NAV_is_on) {
record->event.pressed ? layer_off(_NAV) : layer_on(_NAV);
record->event.pressed && !NUM_latched ? layer_off(_NAV) : layer_on(_NAV);
}
} else {
// backspace -> obliterate line
if (record->event.pressed) {
uint8_t mods = get_mods();
if ((mods | get_oneshot_mods()) & OBLITERATE_TRIGGER_MODS) {
tap_code(DUMMY_MOD_NEUTRALIZER_KEYCODE);
unregister_mods(OBLITERATE_TRIGGER_MODS);
clear_oneshot_mods();
tap_code16(S(KC_HOME));
register_code(KC_BSPC);
set_mods(mods);
return false;
}
}
}
break;
@ -159,23 +177,13 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) {
}
break;
case SFT_BSPC: // obliterate line backwards
if (record->tap.count && record->event.pressed) {
uint8_t mods = get_mods();
if ((mods | get_oneshot_mods()) & OBLITERATE_TRIGGER_MODS) {
tap_code(DUMMY_MOD_NEUTRALIZER_KEYCODE);
unregister_mods(OBLITERATE_TRIGGER_MODS);
clear_oneshot_mods();
tap_code16(S(KC_HOME));
register_code(KC_BSPC);
set_mods(mods);
return false;
}
case KC_SPC:
if (get_highest_layer(layer_state) == _GAME) {
return true; // return early
}
break;
case NUM_SPC: // menu shortcut
if (record->tap.count && record->event.pressed) {
// have to implement this here instead of as a key override because it was acting
// weird with layers as a key override
if (record->event.pressed) {
uint8_t mods = get_mods();
if ((mods | get_oneshot_mods()) & MOD_MASK_CTRL) {
del_mods(MOD_MASK_CTRL);
@ -232,6 +240,7 @@ const key_override_t GRV_NOSHIFT = ko_make_basic(MOD_MASK_SHIFT, KC_GRV, KC_GRV)
// this globally defines all key overrides to be used
const key_override_t* key_overrides[] = {
&Q_TO_KILL,
// blocking formatting with this line
&DEL_TO_OBLITERATE,

View file

@ -0,0 +1,24 @@
#include "./layers.h"
bool NUM_latched = false;
layer_state_t layer_state_set_user(layer_state_t state) {
// NUM latching
if (NUM_latched) {
if (IS_LAYER_ON_STATE(state, _SYM) && IS_LAYER_ON_STATE(state, _NAV)) {
state |= 1 << _NUM; // turn on NUM
} else {
// if both NAV and SYM are off, de-latch NUM
if (!IS_LAYER_ON_STATE(state, _SYM) && !IS_LAYER_ON_STATE(state, _NAV)) {
NUM_latched = false;
}
// since both layers aren't held, turn off NUM
state &= ~(1 << _NUM);
}
} else if (IS_LAYER_ON_STATE(state, _NUM)) {
NUM_latched = true;
state |= 1 << _NAV | 1 << _SYM; // turn on NAV and SYM too
}
return state;
}

View file

@ -6,10 +6,11 @@
enum {
_BASE,
_GAME,
_NUM,
_SYM,
_NAV,
_NUM,
_FUNC,
_SH_ARROW,
};
extern bool NUM_latched;

View file

@ -2,6 +2,7 @@ BOOTLOADER = stm32-dfu
SRC += caps_word/caps_word.c
SRC += tap_dance/tap_dance.c
SRC += layers/layers.c
SRC += combos/combos.c
SRC += taphold/taphold_options.c
SRC += utils/utils.c

View file

@ -6,29 +6,27 @@
uint16_t get_quick_tap_term(uint16_t keycode, keyrecord_t* record) {
switch (keycode) {
case NAV_TAB:
case NUM_SPC:
case SFT_BSPC:
case SYM_ENT:
case SYM_BSPC:
return 0;
break;
}
return QUICK_TAP_TERM;
}
bool get_hold_on_other_key_press(uint16_t keycode, keyrecord_t* record) {
switch (keycode) {
case NUM_SPC:
return false;
break;
}
return true;
}
// bool get_hold_on_other_key_press(uint16_t keycode, keyrecord_t* record) {
// switch (keycode) {
// case NUM_SPC:
// return false;
// break;
// }
// return true;
// }
bool get_permissive_hold(uint16_t keycode, keyrecord_t* record) {
switch (keycode) {
case NUM_SPC:
return true;
break;
}
return false;
}
// bool get_permissive_hold(uint16_t keycode, keyrecord_t* record) {
// switch (keycode) {
// case NUM_SPC:
// return true;
// break;
// }
// return false;
// }