Created
November 17, 2019 08:00
-
-
Save PierreKircher/9f157d50e86320c75c1b915f57535600 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include QMK_KEYBOARD_H | |
#if STENO_ENABLE | |
#include "keymap_steno.h" | |
#endif | |
#define CTRLESC MT(MOD_LGUI, KC_ESC) | |
#define ENT_SHI RSFT_T(KC_ENT) | |
#define ALTTAB MT(MOD_LALT, KC_TAB) | |
#define KC_MR1 DYN_REC_START1 | |
#define KC_MR2 DYN_REC_START2 | |
#define KC_MP1 DYN_MACRO_PLAY1 | |
#define KC_MP2 DYN_MACRO_PLAY2 | |
#define KC_MS DYN_REC_STOP | |
typedef struct { | |
bool is_press_action; | |
int state; | |
} tap; | |
enum { | |
SINGLE_TAP = 1, | |
SINGLE_HOLD = 2, | |
DOUBLE_TAP = 3, | |
DOUBLE_HOLD = 4, | |
DOUBLE_SINGLE_TAP = 5, //send two single taps | |
TRIPLE_TAP = 6, | |
TRIPLE_HOLD = 7 | |
}; | |
enum preonic_layers { | |
_COLEMAK, | |
_LOWER, | |
_RAISE, | |
_ADJUST, | |
_PLOVER | |
}; | |
enum preonic_keycodes { | |
COLEMAK = SAFE_RANGE, | |
LOWER, | |
RAISE, | |
PLOVER, | |
DYNAMIC_MACRO_RANGE | |
}; | |
//Tap dance enums | |
enum { | |
X_CTL = 0, | |
SOME_OTHER_DANCE | |
}; | |
#include "dynamic_macro.h" | |
int cur_dance (qk_tap_dance_state_t *state); | |
//for the x tap dance. Put it here so it can be used in any keymap | |
void x_finished (qk_tap_dance_state_t *state, void *user_data); | |
void x_reset (qk_tap_dance_state_t *state, void *user_data); | |
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |
/* COLEMAK | |
* ,-----------------------------------------------------------------------------------. | |
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | | |
* |------+------+------+------+------+------+------+------+------+------+------+------| | |
* | Tab | Q | W | E | R | T | Y | U | I | O | P | " | | |
* |------+------+------+------+------+-------------+------+------+------+------+------| | |
* | Esc | A | S | D | F | G | H | J | K | L | ; |Enter | | |
* |------+------+------+------+------+------|------+------+------+------+------+------| | |
* | Shift| Z | X | C | V | B | N | M | , | . | / | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------| | |
* | MEH | HYPR | GUI | |Lower |Leader|Space |Raise | Left | Down | Up |Right | | |
* `-----------------------------------------------------------------------------------' | |
*/ | |
[_COLEMAK] = LAYOUT_preonic_grid( \ | |
KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_BSPC, \ | |
ALTTAB , KC_Q , KC_W , KC_F , KC_P , KC_G , KC_J , KC_L , KC_U , KC_Y , KC_SCLN, KC_QUOT, \ | |
CTRLESC, KC_A , KC_R , KC_S , KC_T , KC_D , KC_H , KC_N , KC_E , KC_I , KC_O , ENT_SHI, \ | |
KC_LSFT, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_K , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_BSLS, \ | |
KC_MEH , KC_HYPR, KC_LCTRL, LT(1, KC_SPACE), LOWER , KC_LEAD, KC_SPC , RAISE , KC_LEFT, KC_DOWN, KC_UP , KC_RGHT \ | |
), | |
/* Lower | |
* ,-----------------------------------------------------------------------------------. | |
* | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | |
* |------+------+------+------+------+-------------+------+------+------+------+------| | |
* | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 | F21 | F22 | F23 | F24 | | |
* |------+------+------+------+------+-------------+------+------+------+------+------| | |
* | | | | | | | | | | | | | | |
* |------+------+------+------+------+------|------+------+------+------+------+------| | |
* | | | | | | | | | | | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------| | |
* | | | | | | | | | Next | Vol- | Vol+ | Play | | |
* `-----------------------------------------------------------------------------------' | |
*/ | |
[_LOWER] = LAYOUT_preonic_grid( \ | |
_______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , _______, \ | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MINS, KC_EQL , _______, \ | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LBRC, KC_RBRC, _______ \ | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LBRC, KC_RBRC, _______, \ | |
_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ | |
), | |
/* Raise | |
* ,-----------------------------------------------------------------------------------. | |
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | | |
* |------+------+------+------+------+------+------+------+------+------+------+------| | |
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | | |
* |------+------+------+------+------+-------------+------+------+------+------+------| | |
* | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | | |
* |------+------+------+------+------+------|------+------+------+------+------+------| | |
* | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------| | |
* | | | | | | | | Next | Vol- | Vol+ | Play | | |
* `-----------------------------------------------------------------------------------' | |
*/ | |
[_RAISE] = LAYOUT_preonic_grid( \ | |
_______, KC_F11 , KC_F12 , KC_F13 , KC_F14 , KC_F15 , KC_F16 , KC_F17 , KC_F18 , KC_F19 , KC_F20 , _______, \ | |
_______, KC_F21 , KC_F22 , KC_F23 , KC_F24 , _______, _______, _______, _______, _______, _______, _______, \ | |
_______, KC_MENU, KC_SLCT, KC_STOP, KC_AGIN, KC_UNDO, KC_CUT , KC_COPY, KC_PSTE, _______, _______, _______, \ | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ | |
_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ | |
), | |
/* Adjust (Lower + Raise) | |
* ,-----------------------------------------------------------------------------------. | |
* | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | |
* |------+------+------+------+------+------+------+------+------+------+------+------| | |
* | | Reset| | | | | | | | | | Del | | |
* |------+------+------+------+------+-------------+------+------+------+------+------| | |
* | | | |Aud on|AudOff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | | |
* |------+------+------+------+------+------|------+------+------+------+------+------| | |
* | |Voice-|Voice+|Mus on|MusOff|MidiOn|MidOff| | | | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------| | |
* | | | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------' | |
*/ | |
[_ADJUST] = LAYOUT_preonic_grid( \ | |
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ | |
KC_X, RESET, DEBUG, _______, _______, _______, _______, TERM_ON, TERM_OFF,_______, _______, KC_DEL, \ | |
_______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, KC_NO, COLEMAK, _______, _______, _______, \ | |
_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, \ | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ | |
), | |
/* Plover layer | |
* ,-----------------------------------------------------------------------------------. | |
* | # | # | # | # | # | # | # | # | # | # | # | # | | |
* |------+------+------+------+------+------+------+------+------+------+------+------| | |
* | | S | T | P | H | * | * | F | P | L | T | D | | |
* |------+------+------+------+------+-------------+------+------+------+------+------| | |
* | | S | K | W | R | * | * | R | B | G | S | Z | | |
* |------+------+------+------+------+------|------+------+------+------+------+------| | |
* | | | | A | O | | | E | U | | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------| | |
* | | | | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------' | |
*/ | |
[_PLOVER] = LAYOUT_preonic_grid( \ | |
KC_HASH, KC_HASH, KC_HASH, KC_HASH, KC_HASH, KC_HASH, KC_HASH, KC_HASH, KC_HASH, KC_HASH, KC_HASH, KC_HASH, \ | |
_______, KC_S , KC_T , KC_P , KC_H , KC_ASTR, KC_ASTR, KC_F , KC_P , KC_L , KC_T , KC_D , \ | |
_______, KC_S , KC_L , KC_W , KC_R , KC_ASTR, KC_ASTR, KC_R , KC_B , KC_G , KC_S , KC_Z , \ | |
_______, _______, _______, KC_A , KC_O , _______, _______, KC_E , KC_U , _______, _______, _______, \ | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ | |
) | |
}; | |
int cur_dance (qk_tap_dance_state_t *state) { | |
if (state->count == 1) { | |
if (state->interrupted || !state->pressed) return SINGLE_TAP; | |
//key has not been interrupted, but they key is still held. Means you want to send a 'HOLD'. | |
else return SINGLE_HOLD; | |
} | |
else if (state->count == 2) { | |
/* | |
* DOUBLE_SINGLE_TAP is to distinguish between typing "pepper", and actually wanting a double tap | |
* action when hitting 'pp'. Suggested use case for this return value is when you want to send two | |
* keystrokes of the key, and not the 'double tap' action/macro. | |
*/ | |
if (state->interrupted) return DOUBLE_SINGLE_TAP; | |
else if (state->pressed) return DOUBLE_HOLD; | |
else return DOUBLE_TAP; | |
} | |
//Assumes no one is trying to type the same letter three times (at least not quickly). | |
//If your tap dance key is 'KC_W', and you want to type "www." quickly - then you will need to add | |
//an exception here to return a 'TRIPLE_SINGLE_TAP', and define that enum just like 'DOUBLE_SINGLE_TAP' | |
if (state->count == 3) { | |
if (state->interrupted || !state->pressed) return TRIPLE_TAP; | |
else return TRIPLE_HOLD; | |
} | |
else return 8; //magic number. At some point this method will expand to work for more presses | |
} | |
//instanalize an instance of 'tap' for the 'x' tap dance. | |
static tap xtap_state = { | |
.is_press_action = true, | |
.state = 0 | |
}; | |
void x_finished (qk_tap_dance_state_t *state, void *user_data) { | |
xtap_state.state = cur_dance(state); | |
switch (xtap_state.state) { | |
case SINGLE_TAP: register_code(KC_X); break; | |
case SINGLE_HOLD: register_code(KC_LCTRL); break; | |
case DOUBLE_TAP: register_code(KC_ESC); break; | |
case DOUBLE_HOLD: register_code(KC_LALT); break; | |
case DOUBLE_SINGLE_TAP: register_code(KC_X); unregister_code(KC_X); register_code(KC_X); | |
//Last case is for fast typing. Assuming your key is `f`: | |
//For example, when typing the word `buffer`, and you want to make sure that you send `ff` and not `Esc`. | |
//In order to type `ff` when typing fast, the next character will have to be hit within the `TAPPING_TERM`, which by default is 200ms. | |
} | |
} | |
void x_reset (qk_tap_dance_state_t *state, void *user_data) { | |
switch (xtap_state.state) { | |
case SINGLE_TAP: unregister_code(KC_X); break; | |
case SINGLE_HOLD: unregister_code(KC_LCTRL); break; | |
case DOUBLE_TAP: unregister_code(KC_ESC); break; | |
case DOUBLE_HOLD: unregister_code(KC_LALT); | |
case DOUBLE_SINGLE_TAP: unregister_code(KC_X); | |
} | |
xtap_state.state = 0; | |
} | |
qk_tap_dance_action_t tap_dance_actions[] = { | |
[X_CTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL,x_finished, x_reset) | |
}; | |
LEADER_EXTERNS(); | |
void matrix_init_user(void) { | |
#ifdef STENO_ENABLE | |
steno_set_mode(STENO_MODE_GEMINI); | |
#endif | |
} | |
void matrix_scan_user(void) { | |
LEADER_DICTIONARY() { | |
leading = false; | |
leader_end(); | |
SEQ_ONE_KEY(KC_F) { | |
// Anything you can do in a macro. | |
SEND_STRING("QMK is awesome."); | |
} | |
SEQ_TWO_KEYS(KC_D, KC_D) { | |
SEND_STRING(SS_LCTRL("a")SS_LCTRL("c")); | |
} | |
SEQ_THREE_KEYS(KC_D, KC_D, KC_S) { | |
SEND_STRING("https://start.duckduckgo.com"SS_TAP(X_ENTER)); | |
} | |
SEQ_TWO_KEYS(KC_A, KC_S) { | |
register_code(KC_LGUI); | |
register_code(KC_S); | |
unregister_code(KC_S); | |
unregister_code(KC_LGUI); | |
} | |
} | |
} | |
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |
if (!process_record_dynamic_macro(keycode, record)) { | |
return false; | |
} | |
switch (keycode) { | |
case COLEMAK: | |
if (record->event.pressed) { | |
set_single_persistent_default_layer(_COLEMAK); | |
} | |
return false; | |
break; | |
case LOWER: | |
if (record->event.pressed) { | |
layer_on(_LOWER); | |
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |
} else { | |
layer_off(_LOWER); | |
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |
} | |
return false; | |
break; | |
case RAISE: | |
if (record->event.pressed) { | |
layer_on(_RAISE); | |
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |
} else { | |
layer_off(_RAISE); | |
update_tri_layer(_LOWER, _RAISE, _ADJUST); | |
} | |
return false; | |
break; | |
} | |
return true; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment