Skip to content

Instantly share code, notes, and snippets.

@whaaaley
Created September 4, 2025 15:13
Show Gist options
  • Select an option

  • Save whaaaley/c39019f934a159ca5a0ba4fc44804da7 to your computer and use it in GitHub Desktop.

Select an option

Save whaaaley/c39019f934a159ca5a0ba4fc44804da7 to your computer and use it in GitHub Desktop.
#include QMK_KEYBOARD_H
#if __has_include("keymap.h")
# include "keymap.h"
#endif
#define ___ KC_TRNS
enum {
TD_CTRL_ALT,
TD_MO3_MO4,
TD_BOOT, TD_P, TD_O, TD_I, TD_U, TD_Y, TD_T, TD_R, TD_E, TD_W, TD_Q,
TD_QUOT, TD_SCLN, TD_L, TD_K, TD_J, TD_H, TD_G, TD_F, TD_D, TD_S, TD_A, TD_TAB,
TD_SLSH, TD_DOT, TD_COMM, TD_M, TD_N, TD_B, TD_V, TD_C, TD_X, TD_Z,
};
// Tap dance for Ctrl/Alt key
// Single tap: Ctrl tap, Hold: Ctrl + layer 1, Double tap: Alt + layer 2
void dance_ctrl_alt_finished(tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
if (state->pressed) {
// Hold: Ctrl + layer 1
register_code(KC_LCTL);
layer_on(1);
} else {
// Single tap: just Ctrl (no layer activation)
tap_code(KC_LCTL);
}
} else if (state->count >= 2) {
// Double tap: Alt + layer 2
register_code(KC_LALT);
layer_on(2);
}
}
void dance_ctrl_alt_reset(tap_dance_state_t *state, void *user_data) {
// Always clean up any active modifiers and layers
unregister_code(KC_LCTL);
unregister_code(KC_LALT);
layer_off(1);
layer_off(2);
}
// Tap dance for layer switching
// Single tap: layer 3 (symbols), Double tap: layer 5 (numbers)
void dance_mo3_mo4_finished(tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
// Single tap: Activate symbols layer (layer 3)
layer_on(3);
} else if (state->count >= 2) {
// Double tap: Activate numbers layer (layer 5)
layer_on(5);
}
}
void dance_mo3_mo4_reset(tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
// Release single tap: Deactivate symbols layer
layer_off(3);
} else if (state->count >= 2) {
// Release double tap: Deactivate numbers layer
layer_off(5);
}
}
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// Base layer
[0] = LAYOUT_split_3x6_3(
QK_BOOT, KC_P, KC_O, KC_I, KC_U, KC_Y, KC_T, KC_R, KC_E, KC_W, KC_Q, ___,
KC_QUOT, KC_SCLN, KC_L, KC_K, KC_J, KC_H, KC_G, KC_F, KC_D, KC_S, KC_A, KC_TAB,
___, KC_SLSH, KC_DOT, KC_COMM, KC_M, KC_N, KC_B, KC_V, KC_C, KC_X, KC_Z, ___,
TD(TD_MO3_MO4), KC_SPC, KC_ENT, KC_LSFT, TD(TD_CTRL_ALT), KC_BSPC
),
// Ctrl layer
[1] = LAYOUT_split_3x6_3(
___, TD(TD_P), TD(TD_O), TD(TD_I), TD(TD_U), TD(TD_Y), TD(TD_T), TD(TD_R), TD(TD_E), TD(TD_W), TD(TD_Q), ___,
TD(TD_QUOT), TD(TD_SCLN), TD(TD_L), TD(TD_K), TD(TD_J), TD(TD_H), TD(TD_G), TD(TD_F), TD(TD_D), TD(TD_S), TD(TD_A), TD(TD_TAB),
___, TD(TD_SLSH), TD(TD_DOT), TD(TD_COMM), TD(TD_M), TD(TD_N), TD(TD_B), TD(TD_V), TD(TD_C), TD(TD_X), TD(TD_Z), ___,
MO(4), ___, ___, ___, ___, ___
),
// Alt layer
[2] = LAYOUT_split_3x6_3(
___, ___, LSFT(KC_TAB), ___, ___, ___, ___, ___, ___, ___, ___, ___,
___, KC_TAB, ___, ___, ___, ___, ___, ___, ___, ___, ___, KC_LSFT,
___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___,
___, ___, ___, ___, ___, ___
),
// Symbols layer
[3] = LAYOUT_split_3x6_3(
___, KC_PLUS, KC_EQL, KC_MINS, KC_ASTR, KC_AMPR, KC_PIPE, KC_RCBR, KC_LCBR, KC_AT, KC_EXLM, ___,
___, KC_GT, KC_RGHT, KC_UP, KC_DOWN, KC_LEFT, KC_GRV, KC_RPRN, KC_LPRN, KC_DLR, MT(MOD_LSFT, KC_HASH), ___,
___, KC_DQUO, KC_QUOT, KC_BSLS, KC_LT, KC_UNDS, KC_TILD, KC_RBRC, KC_LBRC, KC_CIRC, KC_PERC, ___,
___, ___, ___, KC_ESC, MO(4), KC_DEL
),
// Navigation layer
[4] = LAYOUT_split_3x6_3(
___, KC_PGDN, KC_HOME, ___, ___, KC_PGUP, ___, ___, ___, ___, ___, ___,
___, KC_END, LCTL(KC_RGHT), LCTL(KC_UP), LCTL(KC_DOWN), LCTL(KC_LEFT), ___, ___, ___, ___, KC_LSFT, ___,
___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___,
___, ___, ___, ___, ___, ___
),
// Numbers layer
[5] = LAYOUT_split_3x6_3(
___, KC_0, KC_9, KC_8, KC_7, KC_6, KC_5, KC_4, KC_3, KC_2, KC_1, ___,
___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___,
___, KC_LALT, LGUI(KC_DOT), ___, ___, ___, ___, ___, LSG(KC_C), LSG(KC_S), ___, ___,
___, ___, ___, ___, ___, ___
)
};
tap_dance_action_t tap_dance_actions[] = {
[TD_CTRL_ALT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_ctrl_alt_finished, dance_ctrl_alt_reset),
[TD_MO3_MO4] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_mo3_mo4_finished, dance_mo3_mo4_reset),
[TD_P] = ACTION_TAP_DANCE_DOUBLE(KC_P, LSFT(KC_P)),
[TD_O] = ACTION_TAP_DANCE_DOUBLE(KC_O, LSFT(KC_O)),
[TD_I] = ACTION_TAP_DANCE_DOUBLE(KC_I, LSFT(KC_I)),
[TD_U] = ACTION_TAP_DANCE_DOUBLE(KC_U, LSFT(KC_U)),
[TD_Y] = ACTION_TAP_DANCE_DOUBLE(KC_Y, LSFT(KC_Y)),
[TD_T] = ACTION_TAP_DANCE_DOUBLE(KC_T, LSFT(KC_T)),
[TD_R] = ACTION_TAP_DANCE_DOUBLE(KC_R, LSFT(KC_R)),
[TD_E] = ACTION_TAP_DANCE_DOUBLE(KC_E, LSFT(KC_E)),
[TD_W] = ACTION_TAP_DANCE_DOUBLE(KC_W, LSFT(KC_W)),
[TD_Q] = ACTION_TAP_DANCE_DOUBLE(KC_Q, LSFT(KC_Q)),
[TD_QUOT] = ACTION_TAP_DANCE_DOUBLE(KC_QUOT, LSFT(KC_QUOT)),
[TD_SCLN] = ACTION_TAP_DANCE_DOUBLE(KC_SCLN, LSFT(KC_SCLN)),
[TD_L] = ACTION_TAP_DANCE_DOUBLE(KC_L, LSFT(KC_L)),
[TD_K] = ACTION_TAP_DANCE_DOUBLE(KC_K, LSFT(KC_K)),
[TD_J] = ACTION_TAP_DANCE_DOUBLE(KC_J, LSFT(KC_J)),
[TD_H] = ACTION_TAP_DANCE_DOUBLE(KC_H, LSFT(KC_H)),
[TD_G] = ACTION_TAP_DANCE_DOUBLE(KC_G, LSFT(KC_G)),
[TD_F] = ACTION_TAP_DANCE_DOUBLE(KC_F, LSFT(KC_F)),
[TD_D] = ACTION_TAP_DANCE_DOUBLE(KC_D, LSFT(KC_D)),
[TD_S] = ACTION_TAP_DANCE_DOUBLE(KC_S, LSFT(KC_S)),
[TD_A] = ACTION_TAP_DANCE_DOUBLE(KC_A, LSFT(KC_A)),
[TD_TAB] = ACTION_TAP_DANCE_DOUBLE(KC_TAB, LSFT(KC_TAB)),
[TD_SLSH] = ACTION_TAP_DANCE_DOUBLE(KC_SLSH, LSFT(KC_SLSH)),
[TD_DOT] = ACTION_TAP_DANCE_DOUBLE(KC_DOT, LSFT(KC_DOT)),
[TD_COMM] = ACTION_TAP_DANCE_DOUBLE(KC_COMM, LSFT(KC_COMM)),
[TD_M] = ACTION_TAP_DANCE_DOUBLE(KC_M, LSFT(KC_M)),
[TD_N] = ACTION_TAP_DANCE_DOUBLE(KC_N, LSFT(KC_N)),
[TD_B] = ACTION_TAP_DANCE_DOUBLE(KC_B, LSFT(KC_B)),
[TD_V] = ACTION_TAP_DANCE_DOUBLE(KC_V, LSFT(KC_V)),
[TD_C] = ACTION_TAP_DANCE_DOUBLE(KC_C, LSFT(KC_C)),
[TD_X] = ACTION_TAP_DANCE_DOUBLE(KC_X, LSFT(KC_X)),
[TD_Z] = ACTION_TAP_DANCE_DOUBLE(KC_Z, LSFT(KC_Z)),
};
#ifdef OTHER_KEYMAP_C
# include OTHER_KEYMAP_C
#endif // OTHER_KEYMAP_C
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment