From 28ddd6c1f97782bf47a77ff9d5c6fe5a5943bd5e Mon Sep 17 00:00:00 2001 From: obosob Date: Thu, 6 Feb 2020 17:04:16 +0000 Subject: [PATCH] Fix behaviour of shift for ginny plus keymap fixes Keymap fixes like: - ?/, ([, )], !@ - Make space part of word chords Shift can now be held between chifted chords, words have only first char shifted. Shift and chord order no longer produce different results (i.e. they will always end up shifted) Code should be transferable to other mods allowing them to be held and apply to chords *or* be used in a chord definition to override. Hold behavior doesn't repeat presses, processes chord, doesn't clear keyboard until release; this allows the OS to define repeat behaviour after hold is initialised. --- keyboards/gboards/engine/engine.c | 591 +++++++++--------- keyboards/gboards/engine/engine.h | 3 +- keyboards/ginny/config.h | 2 +- keyboards/ginny/config_engine.h | 56 +- keyboards/ginny/keymaps/default/dicts.def | 2 +- .../keymaps/default/dicts/aset/en-keymap.def | 417 ++++++------ .../default/dicts/aset/layer-keymap.def | 28 +- .../keymaps/default/dicts/aset/num-keymap.def | 6 +- keyboards/ginny/rules.mk | 32 +- 9 files changed, 576 insertions(+), 561 deletions(-) diff --git a/keyboards/gboards/engine/engine.c b/keyboards/gboards/engine/engine.c index 6e0c6a7a56f4..23c8c3041d45 100755 --- a/keyboards/gboards/engine/engine.c +++ b/keyboards/gboards/engine/engine.c @@ -1,32 +1,32 @@ -/* This is a stripped down version of the Georgi engine meant for use with - * Ginni. As such serial-Steno features are disabled, chords are 16bits and - * crap is removed where possible +/* This is a stripped down version of the Georgi engine meant for use with + * Ginni. As such serial-Steno features are disabled, chords are 16bits and + * crap is removed where possible * - * Do not use this on anything other then Ginny if you want to be sane + * Do not use this on anything other then Ginny if you want to be sane */ #include "engine.h" // Chord state -C_SIZE cChord = 0; // Current Chord -int chordIndex = 0; // Keys in previousachord -int pressed = 0; // number of held keys -C_SIZE chordState[32]; // Full Chord history -#define QWERBUF 24 // Size of chords to buffer for output - -bool repeatFlag = false; // Should we repeat? -C_SIZE pChord = 0; // Previous Chord -C_SIZE stickyBits = 0; // Or'd with every incoming press -int pChordIndex = 0; // Keys in previousachord -C_SIZE pChordState[32]; // Previous chord sate +C_SIZE cChord = 0; // Current Chord +int chordIndex = 0; // Keys in previousachord +C_SIZE pressed = 0; // number of held keys +C_SIZE chordState[32]; // Full Chord history +#define QWERBUF 24 // Size of chords to buffer for output + +bool repeatFlag = false; // Should we repeat? +C_SIZE pChord = 0; // Previous Chord +C_SIZE stickyBits = 0; // Or'd with every incoming press +int pChordIndex = 0; // Keys in previousachord +C_SIZE pChordState[32]; // Previous chord sate // Key Dicts -extern const struct keyEntry keyDict[]; +extern const struct keyEntry keyDict[]; extern size_t keyLen; -extern const struct comboEntry cmbDict[]; +extern const struct comboEntry cmbDict[]; extern size_t comboLen; -extern const struct funcEntry funDict[]; +extern const struct funcEntry funDict[]; extern size_t funcsLen; -extern const struct stringEntry strDict[]; +extern const struct stringEntry strDict[]; extern size_t stringLen; extern const struct specialEntry spcDict[]; extern size_t specialLen; @@ -38,354 +38,365 @@ enum MODE cMode = QWERTY; // Command State #define MAX_CMD_BUF 20 -uint8_t CMDLEN = 0; -uint8_t CMDBUF[MAX_CMD_BUF]; +uint8_t CMDLEN = 0; +uint8_t CMDBUF[MAX_CMD_BUF]; // Key Repeat state -bool inChord = false; -bool repEngaged = false; -uint16_t repTimer = 0; +bool inChord = false; +bool repEngaged = false; +uint16_t repTimer = 0; #define REP_INIT_DELAY 750 -#define REP_DELAY 25 +#define REP_DELAY 25 // Mousekeys state -bool inMouse = false; -int8_t mousePress; +bool inMouse = false; +int8_t mousePress; // All processing done at chordUp goes through here void processKeysUp() { - // Check for mousekeys, this is release + // Check for mousekeys, this is release #ifdef MOUSEKEY_ENABLE - if (inMouse) { - inMouse = false; - mousekey_off(mousePress); - mousekey_send(); - } + if (inMouse) { + inMouse = false; + mousekey_off(mousePress); + mousekey_send(); + } #endif - // handle command mode - if (cChord == COMMAND_MODE) { + // handle command mode + if (cChord == COMMAND_MODE) { #ifndef NO_DEBUG - uprintf("COMMAND Toggle\n"); + uprintf("COMMAND Toggle\n"); #endif - if (cMode != COMMAND) { // Entering Command Mode - CMDLEN = 0; - pMode = cMode; - cMode = COMMAND; - } else { // Exiting Command Mode - cMode = pMode; - - // Press all and release all - for (int i = 0; i < CMDLEN; i++) { - register_code(CMDBUF[i]); - } - clear_keyboard(); - } - } - - // Process and reset state - processChord(); - cChord = 0; - inChord = false; - chordIndex = 0; - clear_keyboard(); - repEngaged = false; - for (int i = 0; i < 32; i++) - chordState[i] = 0xFFFF; + if (cMode != COMMAND) { // Entering Command Mode + CMDLEN = 0; + pMode = cMode; + cMode = COMMAND; + } else { // Exiting Command Mode + cMode = pMode; + + // Press all and release all + for (int i = 0; i < CMDLEN; i++) { + register_code(CMDBUF[i]); + } + clear_keyboard(); + } + } + + // Process and reset state + processChord(); + cChord = pressed; + inChord = false; + chordIndex = 0; + clear_keyboard(); + repEngaged = false; + for (int i = 0; i < 32; i++) + chordState[i] = 0xFFFF; } // Update Chord State bool process_record_kb(uint16_t keycode, keyrecord_t *record) { - // Everything happens in here when steno keys come in. - // Bail on keyup - bool pr = record->event.pressed; - if (record->event.pressed) { - pressed++; - } else { - pressed--; - } - - // All keys up, send it! - if (pressed == 0) { - processKeysUp(); - repEngaged = false; - return false; - } - - // Update key repeat timers - repTimer = timer_read(); - inChord = true; - - // Switch on the press adding to chord - switch (keycode) { - ENGINE_CONFIG - default: return true; - } - - // Store previous state for fastQWER - if (pr) { - chordState[chordIndex] = cChord; - chordIndex++; - } + // Everything happens in here when steno keys come in. + // Bail on keyup + + // Update key repeat timers + repTimer = timer_read(); + bool pr = record->event.pressed; + // Switch on the press adding to chord + switch (keycode) { + ENGINE_CONFIG + default: return true; + } + + // All keys up, send it! + if (inChord && !pr && (pressed & IN_CHORD_MASK) == 0) { + processKeysUp(); + return false; + } + if(pressed == 0 && !pr) { + processKeysUp(); + return false; + } + + cChord |= pressed; + + inChord = (cChord & IN_CHORD_MASK) != 0; + + // Store previous state for fastQWER + if (pr) { + chordState[chordIndex] = cChord; + chordIndex++; + } #ifndef NO_DEBUG - uprintf("Chord: %u\n", cChord); + uprintf("Chord: %u\n", cChord); #endif - return false; + return false; } void matrix_scan_user(void) { - // We abuse this for early sending of key - // Key repeat only on QWER/SYMB layers - if (cMode != QWERTY || !inChord) return; - - // Check timers -#ifndef NO_REPEAT - if (repEngaged && timer_elapsed(repTimer) > REP_DELAY) { - // Process Key for report - processChord(); - - // Send report to host - send_keyboard_report(); - clear_keyboard(); - repTimer = timer_read(); - } - - if (!repEngaged && timer_elapsed(repTimer) > REP_INIT_DELAY) { - repEngaged = true; - } + // We abuse this for early sending of key + // Key repeat only on QWER/SYMB layers + if (cMode != QWERTY || !inChord) return; + + // Check timers +#ifndef NO_HOLD + if (!repEngaged && timer_elapsed(repTimer) > REP_INIT_DELAY) { + // Process Key for report + processChord(); + + // Send report to host + send_keyboard_report(); + repEngaged = true; + } #endif }; // Try and match cChord -C_SIZE mapKeys(bool lookup) { +C_SIZE mapKeys(C_SIZE chord, bool lookup) { + lookup = lookup || repEngaged; #ifndef NO_DEBUG - if (!lookup) uprint("SENT!"); + if (!lookup) uprint("SENT!\n"); #endif - // Single key chords - for (int i = 0; i < keyLen; i++) { - if (keyDict[i].chord == cChord) { - if (!lookup) SEND(keyDict[i].key); - return cChord; - } - } - - // strings - for (int i = 0; i < stringLen; i++) { - struct stringEntry fromPgm; - memcpy_P(&fromPgm, &strDict[i], sizeof(stringEntry_t)); - if (fromPgm.chord == cChord) { - if (!lookup) send_string_P((PGM_P)(fromPgm.str)); - return cChord; - } - } - - // combos - for (int i = 0; i < comboLen; i++) { - struct comboEntry fromPgm; - memcpy_P(&fromPgm, &cmbDict[i], sizeof(comboEntry_t)); - if (fromPgm.chord == cChord) { + // Single key chords + for (int i = 0; i < keyLen; i++) { + if (keyDict[i].chord == chord) { + if (!lookup) SEND(keyDict[i].key); + return chord; + } + } + + // strings + for (int i = 0; i < stringLen; i++) { + struct stringEntry fromPgm; + memcpy_P(&fromPgm, &strDict[i], sizeof(stringEntry_t)); + if (fromPgm.chord == chord) { + if (!lookup) { + if(get_mods() & (MOD_LSFT | MOD_RSFT)) { + set_mods(get_mods() & ~(MOD_LSFT | MOD_RSFT)); + set_oneshot_mods(MOD_LSFT); + } + send_string_P((PGM_P)(fromPgm.str)); + } + return chord; + } + } + + // combos + for (int i = 0; i < comboLen; i++) { + struct comboEntry fromPgm; + memcpy_P(&fromPgm, &cmbDict[i], sizeof(comboEntry_t)); + if (fromPgm.chord == chord) { #ifndef NO_DEBUG - uprintf("%d found combo\n", i); + uprintf("%d found combo\n", i); #endif - if (!lookup) { - uint8_t comboKeys[COMBO_MAX]; - memcpy_P(&comboKeys, fromPgm.keys, sizeof(uint8_t)*COMBO_MAX); - for (int j = 0; j < COMBO_MAX; j++) + if (!lookup) { + uint8_t comboKeys[COMBO_MAX]; + memcpy_P(&comboKeys, fromPgm.keys, sizeof(uint8_t)*COMBO_MAX); + for (int j = 0; j < COMBO_MAX; j++) #ifndef NO_DEBUG - uprintf("Combo [%u]: %u\n", j, comboKeys[j]); + uprintf("Combo [%u]: %u\n", j, comboKeys[j]); #endif - for (int j = 0; (j < COMBO_MAX) && (comboKeys[j] != COMBO_END); j++) { + for (int j = 0; (j < COMBO_MAX) && (comboKeys[j] != COMBO_END); j++) { #ifndef NO_DEBUG - uprintf("Combo [%u]: %u\n", j, comboKeys[j]); + uprintf("Combo [%u]: %u\n", j, comboKeys[j]); #endif - SEND(comboKeys[j]); - } - } - return cChord; - } - } - - // functions - for (int i = 0; i < funcsLen; i++) { - if (funDict[i].chord == cChord) { - if (!lookup) funDict[i].act(); - return cChord; - } - } - - // Special handling - for (int i = 0; i < specialLen; i++) { - if (spcDict[i].chord == cChord) { - if (!lookup) { - uint16_t arg = spcDict[i].arg; - switch (spcDict[i].action) { - case SPEC_STICKY: - SET_STICKY(arg); - break; - case SPEC_REPEAT: - REPEAT(); - break; - case SPEC_CLICK: - CLICK_MOUSE((uint8_t)arg); - break; - case SPEC_SWITCH: - SWITCH_LAYER(arg); - break; - default: - SEND_STRING("Invalid Special in Keymap"); - } - } - return cChord; - } - } - + SEND(comboKeys[j]); + } + } + return chord; + } + } + + // functions + for (int i = 0; i < funcsLen; i++) { + if (funDict[i].chord == chord) { + if (!lookup) funDict[i].act(); + return chord; + } + } + + // Special handling + for (int i = 0; i < specialLen; i++) { + if (spcDict[i].chord == chord) { + if (!lookup) { + uint16_t arg = spcDict[i].arg; + switch (spcDict[i].action) { + case SPEC_STICKY: + SET_STICKY(arg); + break; + case SPEC_REPEAT: + REPEAT(); + break; + case SPEC_CLICK: + CLICK_MOUSE((uint8_t)arg); + break; + case SPEC_SWITCH: + SWITCH_LAYER(arg); + break; + default: + SEND_STRING("Invalid Special in Keymap"); + } + } + return chord; + } + } + + if ((chord & IN_CHORD_MASK) != chord && mapKeys((chord & IN_CHORD_MASK), true) == (chord & IN_CHORD_MASK)) { +#ifndef NO_DEBUG + uprintf("Try with ignore mask\n"); +#endif + mapKeys((chord & ~IN_CHORD_MASK), lookup); + mapKeys((chord & IN_CHORD_MASK), lookup); + return chord; + } #ifndef NO_DEBUG - uprintf("Reached end\n"); + uprintf("Reached end\n"); #endif - return 0; + return 0; } // Traverse the chord history to a given point // Returns the mask to use void processChord(void) { - // Save the clean chord state - C_SIZE savedChord = cChord; - - // Apply Stick Bits if needed - if (stickyBits != 0) { - cChord |= stickyBits; - for (int i = 0; i <= chordIndex; i++) - chordState[i] |= stickyBits; - } - - // First we test if a whole chord was passsed - // If so we just run it handling repeat logic - if (mapKeys(true) == cChord) { - mapKeys(false); - // Repeat logic - if (repeatFlag) { + // Save the clean chord state + C_SIZE savedChord = cChord; + + // Apply Stick Bits if needed + if (stickyBits != 0) { + cChord |= stickyBits; + for (int i = 0; i <= chordIndex; i++) + chordState[i] |= stickyBits; + } + + // First we test if a whole chord was passsed + // If so we just run it handling repeat logic + if (mapKeys(cChord, true) == cChord) { + mapKeys(cChord, false); + // Repeat logic + if (repeatFlag) { #ifndef NO_DEBUG - uprintf("repeating?\n"); + uprintf("repeating?\n"); #endif - restoreState(); - repeatFlag = false; - processChord(); - } else { - saveState(cChord); - } - return; - } + restoreState(); + repeatFlag = false; + processChord(); + } else { + saveState(cChord); + } + return; + } + #ifndef NO_DEBUG - uprintf("made it past the maw"); + uprintf("made it past the maw"); #endif - // Iterate through chord picking out the individual - // and longest chords - C_SIZE bufChords[QWERBUF]; - int bufLen = 0; - C_SIZE mask = 0; - - // We iterate over it multiple times to catch the longest - // chord. Then that gets addded to the mask and re run. - while (savedChord != mask) { - C_SIZE test = 0; - C_SIZE longestChord = 0; - - for (int i = 0; i <= chordIndex; i++) { - cChord = chordState[i] & ~mask; - if (cChord == 0) - continue; - - test = mapKeys(true); - if (test != 0) { - longestChord = test; - } - } - - mask |= longestChord; - bufChords[bufLen] = longestChord; - bufLen++; - - // That's a loop of sorts, halt processing - if (bufLen >= QWERBUF) { + // Iterate through chord picking out the individual + // and longest chords + C_SIZE bufChords[QWERBUF]; + int bufLen = 0; + C_SIZE mask = 0; + + // We iterate over it multiple times to catch the longest + // chord. Then that gets addded to the mask and re run. + while (savedChord != mask) { + C_SIZE test = 0; + C_SIZE longestChord = 0; + + for (int i = 0; i <= chordIndex; i++) { + cChord = chordState[i] & ~mask; + if (cChord == 0) + continue; + + test = mapKeys(cChord, true); + if (test != 0) { + longestChord = test; + } + } + + mask |= longestChord; + bufChords[bufLen] = longestChord; + bufLen++; + + // That's a loop of sorts, halt processing + if (bufLen >= QWERBUF) { #ifndef NO_DEBUG - uprintf("looped. exiting"); + uprintf("looped. exiting"); #endif - return; - } - } - - // Now that the buffer is populated, we run it - for (int i = 0; i < bufLen ; i++) { - cChord = bufChords[i]; + return; + } + } + + // Now that the buffer is populated, we run it + for (int i = 0; i < bufLen ; i++) { + cChord = bufChords[i]; #ifndef NO_DEBUG - uprintf("sending: %x\n", cChord); + uprintf("sending: %u\n", cChord); #endif - mapKeys(false); - } + mapKeys(cChord, false); + } - // Save state in case of repeat - if (!repeatFlag) { - saveState(savedChord); - } + // Save state in case of repeat + if (!repeatFlag) { + saveState(savedChord); + } - // Restore cChord for held repeat - cChord = savedChord; - return; + // Restore cChord for held repeat + cChord = savedChord; + return; } void saveState(C_SIZE cleanChord) { - pChord = cleanChord; - pChordIndex = chordIndex; - for (int i = 0; i < 32; i++) - pChordState[i] = chordState[i]; + pChord = cleanChord; + pChordIndex = chordIndex; + for (int i = 0; i < 32; i++) + pChordState[i] = chordState[i]; } void restoreState() { - cChord = pChord; - chordIndex = pChordIndex; - for (int i = 0; i < 32; i++) - chordState[i] = pChordState[i]; + cChord = pChord; + chordIndex = pChordIndex; + for (int i = 0; i < 32; i++) + chordState[i] = pChordState[i]; } // Macros for calling from keymap.c void SEND(uint8_t kc) { - // Send Keycode, Does not work for Quantum Codes - if (cMode == COMMAND && CMDLEN < MAX_CMD_BUF) { + // Send Keycode, Does not work for Quantum Codes + if (cMode == COMMAND && CMDLEN < MAX_CMD_BUF) { #ifndef NO_DEBUG - uprintf("CMD LEN: %d BUF: %d\n", CMDLEN, MAX_CMD_BUF); + uprintf("CMD LEN: %d BUF: %d\n", CMDLEN, MAX_CMD_BUF); #endif - CMDBUF[CMDLEN] = kc; - CMDLEN++; - } + CMDBUF[CMDLEN] = kc; + CMDLEN++; + } - if (cMode != COMMAND) register_code(kc); - return; + if (cMode != COMMAND) register_code(kc); + return; } void REPEAT(void) { - if (cMode != QWERTY) - return; + if (cMode != QWERTY) + return; - repeatFlag = true; - return; + repeatFlag = true; + return; } void SET_STICKY(C_SIZE stick) { - stickyBits ^= stick; - return; + stickyBits ^= stick; + return; } void CLICK_MOUSE(uint8_t kc) { #ifdef MOUSEKEY_ENABLE - mousekey_on(kc); - mousekey_send(); + mousekey_on(kc); + mousekey_send(); - // Store state for later use - inMouse = true; - mousePress = kc; + // Store state for later use + inMouse = true; + mousePress = kc; #endif } void SWITCH_LAYER(int layer) { #ifndef NO_ACTION_LAYER - if (keymapsCount >= layer) - layer_on(layer); + if (keymapsCount >= layer) + layer_on(layer); #endif } diff --git a/keyboards/gboards/engine/engine.h b/keyboards/gboards/engine/engine.h index 36249194792b..fb91a6326d40 100755 --- a/keyboards/gboards/engine/engine.h +++ b/keyboards/gboards/engine/engine.h @@ -96,5 +96,4 @@ void CLICK_MOUSE(uint8_t); // Shift to internal representation // i.e) S(teno)R(ight)F #define STN(n) ((C_SIZE)1<. // Space saving jazz #define NO_ACTION_LAYER #define NO_ACTION_TAPPING -#define NO_ACTION_ONESHOT +//#define NO_ACTION_ONESHOT // General keyboard configs #define BOOTMAGIC_LITE_ROW 9 diff --git a/keyboards/ginny/config_engine.h b/keyboards/ginny/config_engine.h index f7cb98d05457..3c9373eaaea5 100644 --- a/keyboards/ginny/config_engine.h +++ b/keyboards/ginny/config_engine.h @@ -2,37 +2,39 @@ // Configuration options for the engine -#define C_SIZE uint16_t // type for chord -#define COMBO_MAX 4 // Longest Combo +#define C_SIZE uint16_t // type for chord +#define COMBO_MAX 4 // Longest Combo // Key Aliases, must fit within C_SIZE! // These are for Ginni + Asetniop -#define AA STN(0) -#define AS STN(1) -#define AE STN(2) -#define AT STN(3) -#define AN STN(4) -#define AI STN(5) -#define AO STN(6) -#define AP STN(7) -#define AL STN(8) // Left/Right thumbs -#define AR STN(9) -#define NUM STN(10) // Sticky Layer 1 -#define USR STN(11) // Sticky Layer 2 -#define CMD STN(12) // Sticky Layer 3 +#define AA STN(0) +#define AS STN(1) +#define AE STN(2) +#define AT STN(3) +#define AN STN(4) +#define AI STN(5) +#define AO STN(6) +#define AP STN(7) +#define AL STN(8) // Left/Right thumbs +#define AR STN(9) +#define NUM STN(10) // Sticky Layer 1 +#define USR STN(11) // Sticky Layer 2 +#define CMD STN(12) // Sticky Layer 3 // Chord to start buffering strokes -#define COMMAND_MODE (AI | AN | AT | AE) +#define COMMAND_MODE (AI | AN | AT | AE) // Mapping of QMK Keycodes to chord positions -#define ENGINE_CONFIG \ - ENGINE_HOOK(KC_A, AA) \ - ENGINE_HOOK(KC_S, AS) \ - ENGINE_HOOK(KC_E, AE) \ - ENGINE_HOOK(KC_T, AT) \ - ENGINE_HOOK(KC_N, AN) \ - ENGINE_HOOK(KC_I, AI) \ - ENGINE_HOOK(KC_O, AO) \ - ENGINE_HOOK(KC_P, AP) \ - ENGINE_HOOK(KC_L, AL) \ - ENGINE_HOOK(KC_R, AR) +#define ENGINE_CONFIG \ + ENGINE_HOOK(KC_A, AA) \ + ENGINE_HOOK(KC_S, AS) \ + ENGINE_HOOK(KC_E, AE) \ + ENGINE_HOOK(KC_T, AT) \ + ENGINE_HOOK(KC_N, AN) \ + ENGINE_HOOK(KC_I, AI) \ + ENGINE_HOOK(KC_O, AO) \ + ENGINE_HOOK(KC_P, AP) \ + ENGINE_HOOK(KC_L, AL) \ + ENGINE_HOOK(KC_R, AR) + +#define IN_CHORD_MASK (0xFFFF ^ AL) diff --git a/keyboards/ginny/keymaps/default/dicts.def b/keyboards/ginny/keymaps/default/dicts.def index a408e3484a2c..624f377712f2 100644 --- a/keyboards/ginny/keymaps/default/dicts.def +++ b/keyboards/ginny/keymaps/default/dicts.def @@ -16,4 +16,4 @@ #include "user.def" // For Debugging -#include "dicts/testing/test.def" +//#include "dicts/testing/test.def" diff --git a/keyboards/ginny/keymaps/default/dicts/aset/en-keymap.def b/keyboards/ginny/keymaps/default/dicts/aset/en-keymap.def index 6d12cd171639..16494b0285d1 100755 --- a/keyboards/ginny/keymaps/default/dicts/aset/en-keymap.def +++ b/keyboards/ginny/keymaps/default/dicts/aset/en-keymap.def @@ -30,213 +30,218 @@ PRES(AE|AP, PRES(AO|AP, KC_SCLN) PRES(AE|AO, KC_MINS) PRES(AT|AP, KC_BSPC) -PRES(AA|AP, KC_QUOT) +KEYS(AA|AP, cmb_81e9e9a3de9d1216, {KC_LSFT, KC_SLSH, COMBO_END}) +PRES(AA|AP|AL, KC_SLSH) PRES(AN|AI|AO|AP, KC_ENT) -SUBS(AN|AI|AO, str_c7cd45d62ba33f37, "oh ") -SUBS(AE|AN|AI, str_c4d48e3111a94bab, "he ") -SUBS(AE|AI|AP, str_e5d0dbf6833c9487, "'i ") -SUBS(AE|AT|AO, str_b97355b02dce4543, "or ") -SUBS(AE|AN|AP, str_a0aa5b74c096e40b, "my ") -SUBS(AS|AE|AO, str_16ae4be38d2f26c0, "do ") -SUBS(AA|AT|AO, str_bf38370c83727d39, "of ") -SUBS(AS|AN|AO, str_93e9ac18af76041f, "us ") -SUBS(AN|AO|AP, str_d443d6f10491fb2b, "up ") -SUBS(AA|AN|AI, str_bf40c27e59daac7b, "ah ") -SUBS(AS|AN|AP, str_a38fea2a97c8f836, "ms ") -SUBS(AA|AE|AI, str_d2f95ea81f7c61d5, "ix ") -SUBS(AA|AT|AI, str_d7978d4ae69e4592, "if ") -SUBS(AA|AS|AE, str_c8f40bd7102b7e24, "we ") -SUBS(AE|AT|AN, str_7d2440fbbf9d0256, "be ") -SUBS(AS|AT|AN, str_f270b528e852fc3e, "bc ") -SUBS(AT|AO|AP, str_8574f11beb82545c, "top ") -SUBS(AS|AE|AT, str_fa675aa04c2e42e3, "set ") -SUBS(AA|AT|AN, str_538f2d3a0a77d97b, "fan ") -SUBS(AN|AI|AP, str_ecb888fdf52591cf, "him ") -SUBS(AT|AI|AO, str_412cdd1e78ea9b08, "lot ") -SUBS(AA|AT|AP, str_7a06301d23dd2e0f, "pat ") -SUBS(AT|AI|AP, str_eddb4b5d8e6e6cf7, "tip ") -SUBS(AS|AI|AP, str_50e8eda878796d86, "sip ") -SUBS(AE|AI|AO, str_e7368ade4f929a85, "lie ") -SUBS(AS|AT|AI, str_732fcc97258e0fd6, "its ") -SUBS(AT|AN|AI, str_c13c85985e26bfc4, "bit ") -SUBS(AE|AT|AP, str_342f8caca85f0ad6, "per ") -SUBS(AS|AE|AI, str_3e9f631f6868b537, "did ") -SUBS(AA|AI|AO, str_9f8eb086c328f80a, "all ") -SUBS(AA|AS|AO, str_f8126ba90c544306, "wow ") -SUBS(AA|AS|AI, str_afd48c0d96c26c82, "ask ") -SUBS(AA|AN|AP, str_7814ab9a9d941ffb, "man ") -SUBS(AA|AE|AN, str_83396da0d7927d05, "any ") -SUBS(AS|AN|AI, str_e9d65b1f0cc7b588, "his ") -SUBS(AA|AS|AN, str_45a403a4960ee226, "san ") -SUBS(AT|AN|AO, str_30278ac8bad5995c, "but ") -SUBS(AA|AE|AT, str_83c8874562c3df81, "are ") -SUBS(AE|AN|AO, str_e429bf3ee734ff3a, "you ") -SUBS(AS|AI|AO, str_a9a527945928efb, "look ") -SUBS(AS|AT|AO, str_f33c271ea486b8bf, "cost ") -SUBS(AS|AE|AN, str_9cfd6f6c59053f15, "eyes ") -SUBS(AA|AS|AP, str_4dfae898587fe4fe, "pass ") -SUBS(AE|AO|AP, str_aab1d405f8d273af, "pope ") -SUBS(AI|AO|AP, str_e21e9a5405e9a529, "pool ") -SUBS(AE|AT|AI, str_f867205888e811d6, "ever ") -SUBS(AS|AE|AP, str_851ef570f98047b6, "deep ") -SUBS(AA|AS|AT, str_51931d246213d5ba, "fact ") -SUBS(AE|AT|AN|AP, str_10a1a694946fa759, "mr ") -SUBS(AA|AI|AP, str_9effc1ea3eea7dcb, "pizza ") -SUBS(AA|AE|AT|AO, str_dae84f2729acce2b, "for ") -SUBS(AS|AE|AN|AI, str_b164ba3889b2fb9e, "she ") -SUBS(AT|AN|AO|AP, str_9b3f02a3d0bba370, "put ") -SUBS(AA|AS|AT|AN, str_90ab495adeb4039c, "can ") -SUBS(AA|AT|AN|AP, str_4ef41f48d393118d, "mba ") -SUBS(AA|AT|AO|AP, str_69ea1f9262ff90f7, "gap ") -SUBS(AA|AS|AE|AN, str_c1fdc4ab8597a676, "and ") -SUBS(AT|AN|AI|AP, str_af1fe256dc6bb784, "tim ") -SUBS(AA|AS|AN|AI, str_f9f466f11b521e6f, "has ") -SUBS(AE|AT|AN|AI, str_c571ccd7fa5faef, "the ") -SUBS(AA|AS|AT|AO, str_35228752979d35d, "two ") -SUBS(AA|AI|AO|AP, str_42719932f51c5677, "lap ") -SUBS(AE|AN|AI|AP, str_2a2f016faa9b3070, "i'm ") -SUBS(AA|AN|AO|AP, str_cb3ae7249e334094, "mao ") -SUBS(AA|AS|AN|AO, str_78916562f1d9bfaa, "now ") -SUBS(AE|AT|AI|AP, str_67bf6cf47b192c42, "i've ") -SUBS(AS|AN|AI|AO, str_b24523534c6d82c9, "john ") -SUBS(AE|AT|AI|AO, str_2cce6615ddd45c8e, "over ") -SUBS(AA|AT|AI|AO, str_f7cdc52fe2976dd4, "fall ") -SUBS(AS|AE|AN|AO, str_c9f20bc0a0f63318, "done ") -SUBS(AS|AN|AI|AP, str_ee6db6f94a1dbf2a, "miss ") -SUBS(AA|AN|AI|AP, str_968af4858b6521be, "pain ") -SUBS(AS|AT|AN|AO, str_c039d2a5d9fc5d72, "just ") -SUBS(AE|AT|AO|AP, str_e77049b6fc0b816e, "poor ") -SUBS(AA|AE|AT|AP, str_2569286750c7b4f4, "part ") -SUBS(AS|AE|AT|AP, str_72a3e3974353ad96, "step ") -SUBS(AA|AS|AO|AP, str_4d4a66ab4047501d, "soap ") -SUBS(AA|AE|AN|AI, str_749613dbddf6c21, "yeah ") -SUBS(AE|AT|AN|AO, str_8c5e240f4e5d3061, "your ") -SUBS(AS|AE|AT|AN, str_fa42caaa8023b228, "best ") -SUBS(AE|AN|AI|AO, str_67863008ae8fd451, "only ") -SUBS(AA|AT|AN|AI, str_da20b440a7186a4b, "that ") -SUBS(AA|AE|AN|AP, str_223dd41a813d045f, "many ") -SUBS(AA|AE|AT|AN, str_8f95067beb108348, "next ") -SUBS(AS|AT|AI|AP, str_8d03100afd2419c2, "pick ") -SUBS(AA|AN|AI|AO, str_54deaa1a3f19a7fc, "hall ") -SUBS(AA|AS|AE|AI, str_b39cdb39ba4edfe7, "said ") -SUBS(AS|AT|AN|AI, str_f67830c3e4e560ab, "this ") -SUBS(AA|AS|AE|AO, str_4436aac714307c5b, "wood ") -SUBS(AS|AI|AO|AP, str_eb8b6118d400de1, "lips ") -SUBS(AS|AE|AI|AP, str_3be3101b06222c42, "keep ") -SUBS(AA|AS|AN|AP, str_84ea13866e40cff7, "mass ") -SUBS(AA|AS|AT|AP, str_718051f50c1745f9, "past ") -SUBS(AA|AS|AE|AT, str_467af751a93d5fea, "were ") -SUBS(AS|AT|AO|AP, str_cb532d5ded67e46b, "stop ") -SUBS(AS|AE|AT|AO, str_806a00e99f47f1e, "good ") -SUBS(AS|AE|AI|AO, str_312a2e7e56737afe, "like ") -SUBS(AA|AS|AI|AO, str_cc94e0c76922bf90, "will ") -SUBS(AS|AN|AO|AP, str_e320ed557b21c7c3, "jump ") -SUBS(AA|AE|AI|AO, str_4d67956a1937c06a, "alex ") -SUBS(AT|AN|AI|AO, str_e9481f155c267491, "into ") -SUBS(AA|AE|AT|AI, str_40711ef1bb6ce033, "five ") -SUBS(AA|AS|AT|AI, str_b9bd537963cf3ede, "wait ") -SUBS(AA|AT|AN|AO, str_28bb10c5bb93cde6, "about ") -SUBS(AT|AI|AO|AP, str_c97da9851380ebac, "pilot ") -SUBS(AE|AN|AO|AP, str_39e44b61b232dc17, "money ") -SUBS(AS|AT|AI|AO, str_503f03dcee6cb398, "still ") -SUBS(AS|AE|AT|AI, str_a9281666a28e6ec3, "tried ") -SUBS(AA|AS|AE|AP, str_d6daeab665ce4271, "passed ") -SUBS(AS|AE|AT|AN|AP, str_e7aff3fb05cb8051, "mrs ") -SUBS(AA|AE|AN|AO, str_7d50a0c65c92712f, "anyone ") -SUBS(AS|AE|AN|AP, str_abdd78cfd9534f96, "seemed ") -SUBS(AA|AS|AN|AI|AO, str_4e6e8e4c9b45508f, "who ") -SUBS(AA|AS|AE|AN|AI, str_b8157ea41e09d921, "had ") -SUBS(AE|AI|AO|AP, str_56b0c240ea9fe481, "people ") -SUBS(AS|AE|AT|AN|AO, str_ba082b87d184320c, "once ") -SUBS(AA|AS|AE|AN|AP, str_6a27ff657eabc9be, "made ") -SUBS(AE|AT|AN|AO|AP, str_ca73dc3f774cbabc, "more ") -SUBS(AA|AT|AN|AI|AP, str_bc2c779464890843, "path ") -SUBS(AE|AT|AN|AI|AP, str_224997add6df35ba, "them ") -SUBS(AA|AS|AT|AI|AP, str_e784b575d979691f, "pack ") -SUBS(AA|AS|AT|AN|AP, str_389afa2e457b3e69, "camp ") -SUBS(AS|AN|AI|AO|AP, str_88f447f6c429c220, "shop ") -SUBS(AA|AS|AT|AO|AP, str_ad78df7dde0d91b8, "gaps ") -SUBS(AS|AE|AT|AI|AP, str_8553c9ae3540a19d, "it's ") -SUBS(AA|AE|AT|AO|AP, str_5e0c8ecdade5f1a0, "page ") -SUBS(AE|AN|AI|AO|AP, str_ac07faffdc50a99f, "home ") -SUBS(AA|AS|AE|AN|AO, str_1d76c98090617d6e, "down ") -SUBS(AA|AS|AT|AN|AO, str_5146c3491da57e2b, "town ") -SUBS(AS|AE|AN|AO|AP, str_29703c252684465e, "some ") -SUBS(AS|AE|AN|AI|AP, str_a7ed86ef765aff1, "mind ") -SUBS(AA|AS|AE|AI|AO, str_5a3cc09208d67861, "well ") -SUBS(AA|AE|AT|AI|AO, str_b49c2360c17bfaa5, "life ") -SUBS(AS|AT|AN|AO|AP, str_502f482b79087297, "most ") -SUBS(AA|AS|AT|AN|AI, str_87226571ae131d8a, "with ") -SUBS(AA|AE|AT|AN|AI, str_89e5d4bb42bf5ac6, "have ") -SUBS(AS|AT|AN|AI|AO, str_af3d9eaa19f822d9, "such ") -SUBS(AA|AS|AT|AI|AO, str_a57e20b51804cf2c, "last ") -SUBS(AS|AE|AT|AI|AO, str_9f3ebe9397348d28, "told ") -SUBS(AA|AS|AE|AT|AI, str_f3e5067a2519ad56, "first ") -SUBS(AA|AT|AI|AO|AP, str_a475be09185ad1f, "plato ") -SUBS(AA|AE|AN|AI|AP, str_acd7c28d984a2833, "happy ") -SUBS(AA|AS|AE|AT|AP, str_66f9514dbfa60ef2, "we're ") -SUBS(AA|AS|AE|AT|AO, str_6fd3d941462f3451, "words ") -SUBS(AA|AT|AN|AI|AO, str_25f54e15b0b3abc1, "again ") -SUBS(AE|AT|AN|AI|AO, str_36fad9241cea5c82, "other ") -SUBS(AA|AE|AI|AO|AP, str_f7d795e2de04290f, "apple ") -SUBS(AS|AE|AT|AN|AI, str_5cdcf79352e2d725, "these ") -SUBS(AA|AE|AN|AI|AO, str_88405ef2e946d1d6, "alone ") -SUBS(AA|AS|AE|AT|AN, str_6bb7e1a1ca75bfb5, "years ") -SUBS(AA|AS|AN|AO|AP, str_ba3809ce0e475488, "woman ") -SUBS(AE|AT|AI|AO|AP, str_a72c9ea66c108632, "prove ") -SUBS(AS|AE|AI|AO|AP, str_dd746578c42672fd, "spoke ") -SUBS(AT|AN|AI|AO|AP, str_9ae637bd5fd038a8, "might ") -SUBS(AS|AT|AN|AI|AP, str_a523540c97d0bdfb, "smith ") -SUBS(AA|AT|AN|AO|AP, str_612ae2fb632ad051, "among ") -SUBS(AA|AN|AI|AO|AP, str_debd70c653b8860b, "human ") -SUBS(AA|AS|AE|AI|AP, str_8e1be82c44ad245, "speak ") -SUBS(AA|AS|AI|AO|AP, str_f36f1306b68b4b29, "pillow ") -SUBS(AA|AE|AT|AN|AP, str_c7589dce3d265d20, "matter ") -SUBS(AS|AE|AN|AI|AO, str_6c75dac99724579f, "should ") -SUBS(AS|AE|AO|AP, str_329f2d4d4e320928, "possessed ") -SUBS(AA|AE|AT|AN|AO, str_6e7eec08674ed6d1, "before ") -SUBS(AA|AE|AN|AI|AO|AP, str_6eea10216935e72d, "play ") -SUBS(AA|AS|AE|AN|AI|AP, str_4643015f5002abff, "make ") -SUBS(AA|AS|AE|AO|AP, str_b2bf1dd0344af8af, "exposed ") -SUBS(AA|AE|AT|AN|AO|AP, str_2dcb6a06ff45764b, "from ") -SUBS(AS|AE|AT|AO|AP, str_5204c59b3bf29e2f, "process ") -SUBS(AA|AS|AE|AT|AI|AO, str_2a1fe2610765b6af, "work ") -SUBS(AA|AE|AT|AI|AP, str_1cf1e20a6157822c, "private ") -SUBS(AA|AS|AN|AI|AP, str_2411238235bdc80f, "spanish ") -SUBS(AS|AT|AN|AI|AO|AP, str_401efb5649b2ebb4, "much ") -SUBS(AA|AS|AE|AT|AN|AP, str_8dffd42ce860597c, "came ") -SUBS(AA|AS|AE|AN|AI|AO, str_83235a0fa2f65989, "would ") -SUBS(AA|AS|AN|AI|AO|AP, str_841274c574bc6f3c, "small ") -SUBS(AS|AE|AT|AN|AO|AP, str_2457621be8ffdd2e, "don't ") -SUBS(AS|AT|AI|AO|AP, str_c319bffa441d1ba3, "politics ") -SUBS(AA|AS|AE|AT|AI|AP, str_4f6c506138fb813d, "paris ") -SUBS(AA|AE|AT|AI|AO|AP, str_58dbac3080f43a2c, "april ") -SUBS(AA|AS|AE|AN|AO|AP, str_7b4540acd20a8e39, "women ") -SUBS(AA|AS|AE|AT|AO|AP, str_4d2a6306f9c9bfcb, "power ") -SUBS(AA|AS|AE|AT|AN|AI, str_ec4217a15a7e46ca, "where ") -SUBS(AS|AE|AT|AN|AI|AO, str_cd4abc5e1c8e848a, "could ") -SUBS(AA|AS|AE|AI|AO|AP, str_6e1297423b061106, "please ") -SUBS(AA|AS|AT|AN|AO|AP, str_9f163fd928c775b2, "famous ") -SUBS(AS|AE|AT|AN|AI|AP, str_f371381a7fbc125d, "didn't ") -SUBS(AA|AE|AT|AN|AI|AP, str_61ff1ae647568c2a, "remain ") -SUBS(AE|AT|AN|AI|AO|AP, str_88ca21737ccd8555, "mother ") -SUBS(AS|AE|AN|AI|AO|AP, str_8a65747e667f35ed, "simply ") -SUBS(AA|AE|AT|AN|AI|AO, str_c8defae65fa4ef3e, "another ") -SUBS(AA|AS|AE|AT|AN|AO, str_c358a55785d991ba, "because ") -SUBS(AA|AS|AT|AN|AI|AO, str_f1cf6af5d5bfd0af, "without ") -SUBS(AS|AE|AT|AI|AO|AP, str_2ff09aba6aa2e0e4, "replied ") -SUBS(AA|AS|AT|AN|AI|AP, str_9bf471cfa3e278c9, "captain ") -SUBS(AA|AS|AE|AT|AI|AO|AP, str_156052b6d0cc2f4a, "place ") -SUBS(AA|AS|AE|AT|AN|AI|AP, str_6bc2917c61a3f92d, "that's ") -SUBS(AA|AS|AT|AN|AI|AO|AP, str_95c7f6f3d4db5b15, "almost ") -SUBS(AA|AS|AT|AI|AO|AP, str_f0f9720f9f9b0214, "political ") -SUBS(AA|AE|AT|AN|AI|AO|AP, str_7a84f6987c8a0811, "family ") -SUBS(AA|AS|AE|AN|AI|AO|AP, str_5de5dc9f9633371b, "played ") -SUBS(AA|AS|AE|AT|AN|AO|AP, str_2bfafc3eb8546058, "company ") -SUBS(AA|AS|AE|AT|AN|AI|AO, str_af21cbc44bf9f140, "already ") +PRES(AA|AS|AE|AT, KC_TAB) +SUBS(AN|AI|AO|AR, str_c7cd45d62ba33f37, "oh ") +SUBS(AE|AN|AI|AR, str_c4d48e3111a94bab, "he ") +SUBS(AE|AI|AP|AR, str_e5d0dbf6833c9487, "'i ") +SUBS(AE|AT|AO|AR, str_b97355b02dce4543, "or ") +SUBS(AE|AN|AP|AR, str_a0aa5b74c096e40b, "my ") +SUBS(AS|AE|AO|AR, str_16ae4be38d2f26c0, "do ") +SUBS(AA|AT|AO|AR, str_bf38370c83727d39, "of ") +SUBS(AS|AN|AO|AR, str_93e9ac18af76041f, "us ") +SUBS(AN|AO|AP|AR, str_d443d6f10491fb2b, "up ") +SUBS(AA|AN|AI|AR, str_bf40c27e59daac7b, "ah ") +SUBS(AS|AN|AP|AR, str_a38fea2a97c8f836, "ms ") +SUBS(AA|AE|AI|AR, str_d2f95ea81f7c61d5, "ix ") +SUBS(AA|AT|AI|AR, str_d7978d4ae69e4592, "if ") +SUBS(AA|AS|AE|AR, str_c8f40bd7102b7e24, "we ") +SUBS(AE|AT|AN|AR, str_7d2440fbbf9d0256, "be ") +SUBS(AS|AT|AN|AR, str_f270b528e852fc3e, "bc ") +SUBS(AT|AO|AP|AR, str_8574f11beb82545c, "top ") +SUBS(AS|AE|AT|AR, str_fa675aa04c2e42e3, "set ") +SUBS(AA|AT|AN|AR, str_538f2d3a0a77d97b, "fan ") +SUBS(AN|AI|AP|AR, str_ecb888fdf52591cf, "him ") +SUBS(AT|AI|AO|AR, str_412cdd1e78ea9b08, "lot ") +SUBS(AA|AT|AP|AR, str_7a06301d23dd2e0f, "pat ") +SUBS(AT|AI|AP|AR, str_eddb4b5d8e6e6cf7, "tip ") +SUBS(AS|AI|AP|AR, str_50e8eda878796d86, "sip ") +SUBS(AE|AI|AO|AR, str_e7368ade4f929a85, "lie ") +SUBS(AS|AT|AI|AR, str_732fcc97258e0fd6, "its ") +SUBS(AT|AN|AI|AR, str_c13c85985e26bfc4, "bit ") +SUBS(AE|AT|AP|AR, str_342f8caca85f0ad6, "per ") +SUBS(AS|AE|AI|AR, str_3e9f631f6868b537, "did ") +SUBS(AA|AI|AO|AR, str_9f8eb086c328f80a, "all ") +SUBS(AA|AS|AO|AR, str_f8126ba90c544306, "wow ") +SUBS(AA|AS|AI|AR, str_afd48c0d96c26c82, "ask ") +SUBS(AA|AN|AP|AR, str_7814ab9a9d941ffb, "man ") +SUBS(AA|AE|AN|AR, str_83396da0d7927d05, "any ") +SUBS(AS|AN|AI|AR, str_e9d65b1f0cc7b588, "his ") +SUBS(AA|AS|AN|AR, str_45a403a4960ee226, "san ") +SUBS(AT|AN|AO|AR, str_30278ac8bad5995c, "but ") +SUBS(AA|AE|AT|AR, str_83c8874562c3df81, "are ") +SUBS(AE|AN|AO|AR, str_e429bf3ee734ff3a, "you ") +SUBS(AS|AI|AO|AR, str_a9a527945928efb, "look ") +SUBS(AS|AT|AO|AR, str_f33c271ea486b8bf, "cost ") +SUBS(AS|AE|AN|AR, str_9cfd6f6c59053f15, "eyes ") +SUBS(AA|AS|AP|AR, str_4dfae898587fe4fe, "pass ") +SUBS(AE|AO|AP|AR, str_aab1d405f8d273af, "pope ") +SUBS(AI|AO|AP|AR, str_e21e9a5405e9a529, "pool ") +SUBS(AE|AT|AI|AR, str_f867205888e811d6, "ever ") +SUBS(AS|AE|AP|AR, str_851ef570f98047b6, "deep ") +SUBS(AA|AS|AT|AR, str_51931d246213d5ba, "fact ") +SUBS(AE|AT|AN|AP|AR, str_10a1a694946fa759, "mr ") +SUBS(AA|AI|AP|AR, str_9effc1ea3eea7dcb, "pizza ") +SUBS(AA|AE|AT|AO|AR, str_dae84f2729acce2b, "for ") +SUBS(AS|AE|AN|AI|AR, str_b164ba3889b2fb9e, "she ") +SUBS(AT|AN|AO|AP|AR, str_9b3f02a3d0bba370, "put ") +SUBS(AA|AS|AT|AN|AR, str_90ab495adeb4039c, "can ") +SUBS(AA|AT|AN|AP|AR, str_4ef41f48d393118d, "mba ") +SUBS(AA|AT|AO|AP|AR, str_69ea1f9262ff90f7, "gap ") +SUBS(AA|AS|AE|AN|AR, str_c1fdc4ab8597a676, "and ") +SUBS(AT|AN|AI|AP|AR, str_af1fe256dc6bb784, "tim ") +SUBS(AA|AS|AN|AI|AR, str_f9f466f11b521e6f, "has ") +SUBS(AE|AT|AN|AI|AR, str_c571ccd7fa5faef, "the ") +SUBS(AA|AS|AT|AO|AR, str_35228752979d35d, "two ") +SUBS(AA|AI|AO|AP|AR, str_42719932f51c5677, "lap ") +SUBS(AE|AN|AI|AP|AR, str_2a2f016faa9b3070, "i'm ") +SUBS(AA|AN|AO|AP|AR, str_cb3ae7249e334094, "mao ") +SUBS(AA|AS|AN|AO|AR, str_78916562f1d9bfaa, "now ") +SUBS(AE|AT|AI|AP|AR, str_67bf6cf47b192c42, "i've ") +SUBS(AS|AN|AI|AO|AR, str_b24523534c6d82c9, "john ") +SUBS(AE|AT|AI|AO|AR, str_2cce6615ddd45c8e, "over ") +SUBS(AA|AT|AI|AO|AR, str_f7cdc52fe2976dd4, "fall ") +SUBS(AS|AE|AN|AO|AR, str_c9f20bc0a0f63318, "done ") +SUBS(AS|AN|AI|AP|AR, str_ee6db6f94a1dbf2a, "miss ") +SUBS(AA|AN|AI|AP|AR, str_968af4858b6521be, "pain ") +SUBS(AS|AT|AN|AO|AR, str_c039d2a5d9fc5d72, "just ") +SUBS(AE|AT|AO|AP|AR, str_e77049b6fc0b816e, "poor ") +SUBS(AA|AE|AT|AP|AR, str_2569286750c7b4f4, "part ") +SUBS(AS|AE|AT|AP|AR, str_72a3e3974353ad96, "step ") +SUBS(AA|AS|AO|AP|AR, str_4d4a66ab4047501d, "soap ") +SUBS(AA|AE|AN|AI|AR, str_749613dbddf6c21, "yeah ") +SUBS(AE|AT|AN|AO|AR, str_8c5e240f4e5d3061, "your ") +SUBS(AS|AE|AT|AN|AR, str_fa42caaa8023b228, "best ") +SUBS(AE|AN|AI|AO|AR, str_67863008ae8fd451, "only ") +SUBS(AA|AT|AN|AI|AR, str_da20b440a7186a4b, "that ") +SUBS(AA|AE|AN|AP|AR, str_223dd41a813d045f, "many ") +SUBS(AA|AE|AT|AN|AR, str_8f95067beb108348, "next ") +SUBS(AS|AT|AI|AP|AR, str_8d03100afd2419c2, "pick ") +SUBS(AA|AN|AI|AO|AR, str_54deaa1a3f19a7fc, "hall ") +SUBS(AA|AS|AE|AI|AR, str_b39cdb39ba4edfe7, "said ") +SUBS(AS|AT|AN|AI|AR, str_f67830c3e4e560ab, "this ") +SUBS(AA|AS|AE|AO|AR, str_4436aac714307c5b, "wood ") +SUBS(AS|AI|AO|AP|AR, str_eb8b6118d400de1, "lips ") +SUBS(AS|AE|AI|AP|AR, str_3be3101b06222c42, "keep ") +SUBS(AA|AS|AN|AP|AR, str_84ea13866e40cff7, "mass ") +SUBS(AA|AS|AT|AP|AR, str_718051f50c1745f9, "past ") +SUBS(AA|AS|AE|AT|AR, str_467af751a93d5fea, "were ") +SUBS(AS|AT|AO|AP|AR, str_cb532d5ded67e46b, "stop ") +SUBS(AS|AE|AT|AO|AR, str_806a00e99f47f1e, "good ") +SUBS(AS|AE|AI|AO|AR, str_312a2e7e56737afe, "like ") +SUBS(AA|AS|AI|AO|AR, str_cc94e0c76922bf90, "will ") +SUBS(AS|AN|AO|AP|AR, str_e320ed557b21c7c3, "jump ") +SUBS(AA|AE|AI|AO|AR, str_4d67956a1937c06a, "alex ") +SUBS(AT|AN|AI|AO|AR, str_e9481f155c267491, "into ") +SUBS(AA|AE|AT|AI|AR, str_40711ef1bb6ce033, "five ") +SUBS(AA|AS|AT|AI|AR, str_b9bd537963cf3ede, "wait ") +SUBS(AA|AT|AN|AO|AR, str_28bb10c5bb93cde6, "about ") +SUBS(AT|AI|AO|AP|AR, str_c97da9851380ebac, "pilot ") +SUBS(AE|AN|AO|AP|AR, str_39e44b61b232dc17, "money ") +SUBS(AS|AT|AI|AO|AR, str_503f03dcee6cb398, "still ") +SUBS(AS|AE|AT|AI|AR, str_a9281666a28e6ec3, "tried ") +SUBS(AA|AS|AE|AP|AR, str_d6daeab665ce4271, "passed ") +SUBS(AS|AE|AT|AN|AP|AR, str_e7aff3fb05cb8051, "mrs ") +SUBS(AA|AE|AN|AO|AR, str_7d50a0c65c92712f, "anyone ") +SUBS(AS|AE|AN|AP|AR, str_abdd78cfd9534f96, "seemed ") +SUBS(AA|AS|AN|AI|AO|AR, str_4e6e8e4c9b45508f, "who ") +SUBS(AA|AS|AE|AN|AI|AR, str_b8157ea41e09d921, "had ") +SUBS(AE|AI|AO|AP|AR, str_56b0c240ea9fe481, "people ") +SUBS(AS|AE|AT|AN|AO|AR, str_ba082b87d184320c, "once ") +SUBS(AA|AS|AE|AN|AP|AR, str_6a27ff657eabc9be, "made ") +SUBS(AE|AT|AN|AO|AP|AR, str_ca73dc3f774cbabc, "more ") +SUBS(AA|AT|AN|AI|AP|AR, str_bc2c779464890843, "path ") +SUBS(AE|AT|AN|AI|AP|AR, str_224997add6df35ba, "them ") +SUBS(AA|AS|AT|AI|AP|AR, str_e784b575d979691f, "pack ") +SUBS(AA|AS|AT|AN|AP|AR, str_389afa2e457b3e69, "camp ") +SUBS(AS|AN|AI|AO|AP|AR, str_88f447f6c429c220, "shop ") +SUBS(AA|AS|AT|AO|AP|AR, str_ad78df7dde0d91b8, "gaps ") +SUBS(AS|AE|AT|AI|AP|AR, str_8553c9ae3540a19d, "it's ") +SUBS(AA|AE|AT|AO|AP|AR, str_5e0c8ecdade5f1a0, "page ") +SUBS(AE|AN|AI|AO|AP|AR, str_ac07faffdc50a99f, "home ") +SUBS(AA|AS|AE|AN|AO|AR, str_1d76c98090617d6e, "down ") +SUBS(AA|AS|AT|AN|AO|AR, str_5146c3491da57e2b, "town ") +SUBS(AS|AE|AN|AO|AP|AR, str_29703c252684465e, "some ") +SUBS(AS|AE|AN|AI|AP|AR, str_a7ed86ef765aff1, "mind ") +SUBS(AA|AS|AE|AI|AO|AR, str_5a3cc09208d67861, "well ") +SUBS(AA|AE|AT|AI|AO|AR, str_b49c2360c17bfaa5, "life ") +SUBS(AS|AT|AN|AO|AP|AR, str_502f482b79087297, "most ") +SUBS(AA|AS|AT|AN|AI|AR, str_87226571ae131d8a, "with ") +SUBS(AA|AE|AT|AN|AI|AR, str_89e5d4bb42bf5ac6, "have ") +SUBS(AS|AT|AN|AI|AO|AR, str_af3d9eaa19f822d9, "such ") +SUBS(AA|AS|AT|AI|AO|AR, str_a57e20b51804cf2c, "last ") +SUBS(AS|AE|AT|AI|AO|AR, str_9f3ebe9397348d28, "told ") +SUBS(AA|AS|AE|AT|AI|AR, str_f3e5067a2519ad56, "first ") +SUBS(AA|AT|AI|AO|AP|AR, str_a475be09185ad1f, "plato ") +SUBS(AA|AE|AN|AI|AP|AR, str_acd7c28d984a2833, "happy ") +SUBS(AA|AS|AE|AT|AP|AR, str_66f9514dbfa60ef2, "we're ") +SUBS(AA|AS|AE|AT|AO|AR, str_6fd3d941462f3451, "words ") +SUBS(AA|AT|AN|AI|AO|AR, str_25f54e15b0b3abc1, "again ") +SUBS(AE|AT|AN|AI|AO|AR, str_36fad9241cea5c82, "other ") +SUBS(AA|AE|AI|AO|AP|AR, str_f7d795e2de04290f, "apple ") +SUBS(AS|AE|AT|AN|AI|AR, str_5cdcf79352e2d725, "these ") +SUBS(AA|AE|AN|AI|AO|AR, str_88405ef2e946d1d6, "alone ") +SUBS(AA|AS|AE|AT|AN|AR, str_6bb7e1a1ca75bfb5, "years ") +SUBS(AA|AS|AN|AO|AP|AR, str_ba3809ce0e475488, "woman ") +SUBS(AE|AT|AI|AO|AP|AR, str_a72c9ea66c108632, "prove ") +SUBS(AS|AE|AI|AO|AP|AR, str_dd746578c42672fd, "spoke ") +SUBS(AT|AN|AI|AO|AP|AR, str_9ae637bd5fd038a8, "might ") +SUBS(AS|AT|AN|AI|AP|AR, str_a523540c97d0bdfb, "smith ") +SUBS(AA|AT|AN|AO|AP|AR, str_612ae2fb632ad051, "among ") +SUBS(AA|AN|AI|AO|AP|AR, str_debd70c653b8860b, "human ") +SUBS(AA|AS|AE|AI|AP|AR, str_8e1be82c44ad245, "speak ") +SUBS(AA|AS|AI|AO|AP|AR, str_f36f1306b68b4b29, "pillow ") +SUBS(AA|AE|AT|AN|AP|AR, str_c7589dce3d265d20, "matter ") +SUBS(AS|AE|AN|AI|AO|AR, str_6c75dac99724579f, "should ") +SUBS(AS|AE|AO|AP|AR, str_329f2d4d4e320928, "possessed ") +SUBS(AA|AE|AT|AN|AO|AR, str_6e7eec08674ed6d1, "before ") +SUBS(AA|AE|AN|AI|AO|AP|AR, str_6eea10216935e72d, "play ") +SUBS(AA|AS|AE|AN|AI|AP|AR, str_4643015f5002abff, "make ") +SUBS(AA|AS|AE|AO|AP|AR, str_b2bf1dd0344af8af, "exposed ") +SUBS(AA|AE|AT|AN|AO|AP|AR, str_2dcb6a06ff45764b, "from ") +SUBS(AS|AE|AT|AO|AP|AR, str_5204c59b3bf29e2f, "process ") +SUBS(AA|AS|AE|AT|AI|AO|AR, str_2a1fe2610765b6af, "work ") +SUBS(AA|AE|AT|AI|AP|AR, str_1cf1e20a6157822c, "private ") +SUBS(AA|AS|AN|AI|AP|AR, str_2411238235bdc80f, "spanish ") +SUBS(AS|AT|AN|AI|AO|AP|AR, str_401efb5649b2ebb4, "much ") +SUBS(AA|AS|AE|AT|AN|AP|AR, str_8dffd42ce860597c, "came ") +SUBS(AA|AS|AE|AN|AI|AO|AR, str_83235a0fa2f65989, "would ") +SUBS(AA|AS|AN|AI|AO|AP|AR, str_841274c574bc6f3c, "small ") +SUBS(AS|AE|AT|AN|AO|AP|AR, str_2457621be8ffdd2e, "don't ") +SUBS(AS|AT|AI|AO|AP|AR, str_c319bffa441d1ba3, "politics ") +SUBS(AA|AS|AE|AT|AI|AP|AR, str_4f6c506138fb813d, "paris ") +SUBS(AA|AE|AT|AI|AO|AP|AR, str_58dbac3080f43a2c, "april ") +SUBS(AA|AS|AE|AN|AO|AP|AR, str_7b4540acd20a8e39, "women ") +SUBS(AA|AS|AE|AT|AO|AP|AR, str_4d2a6306f9c9bfcb, "power ") +SUBS(AA|AS|AE|AT|AN|AI|AR, str_ec4217a15a7e46ca, "where ") +SUBS(AS|AE|AT|AN|AI|AO|AR, str_cd4abc5e1c8e848a, "could ") +SUBS(AA|AS|AE|AI|AO|AP|AR, str_6e1297423b061106, "please ") +SUBS(AA|AS|AT|AN|AO|AP|AR, str_9f163fd928c775b2, "famous ") +SUBS(AS|AE|AT|AN|AI|AP|AR, str_f371381a7fbc125d, "didn't ") +SUBS(AA|AE|AT|AN|AI|AP|AR, str_61ff1ae647568c2a, "remain ") +SUBS(AE|AT|AN|AI|AO|AP|AR, str_88ca21737ccd8555, "mother ") +SUBS(AS|AE|AN|AI|AO|AP|AR, str_8a65747e667f35ed, "simply ") +SUBS(AA|AE|AT|AN|AI|AO|AR, str_c8defae65fa4ef3e, "another ") +SUBS(AA|AS|AE|AT|AN|AO|AR, str_c358a55785d991ba, "because ") +SUBS(AA|AS|AT|AN|AI|AO|AR, str_f1cf6af5d5bfd0af, "without ") +SUBS(AS|AE|AT|AI|AO|AP|AR, str_2ff09aba6aa2e0e4, "replied ") +SUBS(AA|AS|AT|AN|AI|AP|AR, str_9bf471cfa3e278c9, "captain ") +SUBS(AA|AS|AE|AT|AI|AO|AP|AR, str_156052b6d0cc2f4a, "place ") +SUBS(AA|AS|AE|AT|AN|AI|AP|AR, str_6bc2917c61a3f92d, "that's ") +SUBS(AA|AS|AT|AN|AI|AO|AP|AR, str_95c7f6f3d4db5b15, "almost ") +SUBS(AA|AS|AT|AI|AO|AP|AR, str_f0f9720f9f9b0214, "political ") +SUBS(AA|AE|AT|AN|AI|AO|AP|AR, str_7a84f6987c8a0811, "family ") +SUBS(AA|AS|AE|AN|AI|AO|AP|AR, str_5de5dc9f9633371b, "played ") +SUBS(AA|AS|AE|AT|AN|AO|AP|AR, str_2bfafc3eb8546058, "company ") +SUBS(AA|AS|AE|AT|AN|AI|AO|AR, str_af21cbc44bf9f140, "already ") KEYS(AA|AO, cmb_9df323cdb026f7ce, {KC_LSFT, KC_9, COMBO_END}) KEYS(AS|AP, cmb_e57ca193d8778bdc, {KC_LSFT, KC_0, COMBO_END}) KEYS(AI|AP, cmb_68737f3c98f133fe, {KC_LSFT, KC_1, COMBO_END}) -SUBS(AA|AT|AN|AI|AO|AP, str_ed3d57e7a6cc9262, "imagination ") -SUBS(AS|AE|AT|AN|AI|AO|AP, str_d6ee20239053ced9, "something ") -SUBS(AA|AS|AE|AT|AN|AI|AO|AP, str_db27096f0ec176e2, "himself ") +KEYS(AI|AP|AL, cmb_78737f3c98f133fe, {KC_LSFT, KC_2, COMBO_END}) +PRES(AA|AO|AL, KC_LBRC) +PRES(AS|AP|AL, KC_RBRC) +SUBS(AA|AT|AN|AI|AO|AP|AR, str_ed3d57e7a6cc9262, "imagination ") +SUBS(AS|AE|AT|AN|AI|AO|AP|AR, str_d6ee20239053ced9, "something ") +SUBS(AA|AS|AE|AT|AN|AI|AO|AP|AR, str_db27096f0ec176e2, "himself ") diff --git a/keyboards/ginny/keymaps/default/dicts/aset/layer-keymap.def b/keyboards/ginny/keymaps/default/dicts/aset/layer-keymap.def index 038bc19ecd02..8af082f8d368 100644 --- a/keyboards/ginny/keymaps/default/dicts/aset/layer-keymap.def +++ b/keyboards/ginny/keymaps/default/dicts/aset/layer-keymap.def @@ -1,22 +1,22 @@ // Thumb Keys -PRES(AL, KC_LSFT) -PRES(AR, KC_SPC) +PRES(AL, KC_LSFT) +PRES(AR, KC_SPC) // Layer Switches // To Number -SPEC( AR | AA | AT | AN | AP, SPEC_STICKY, NUM) -SPEC(NUM | AR | AA | AT | AN | AP, SPEC_STICKY, NUM) -SPEC(CMD | AR | AA | AT | AN | AP, SPEC_STICKY, NUM) -SPEC(USR | AR | AA | AT | AN | AP, SPEC_STICKY, NUM) +SPEC( AA | AT | AN | AP, SPEC_STICKY, NUM) +SPEC(NUM | AA | AT | AN | AP, SPEC_STICKY, NUM) +SPEC(CMD | AA | AT | AN | AP, SPEC_STICKY, NUM) +SPEC(USR | AA | AT | AN | AP, SPEC_STICKY, NUM) // To Command -SPEC( AR | AS | AE | AI | AO, SPEC_STICKY, CMD) -SPEC(NUM | AR | AS | AE | AI | AO, SPEC_STICKY, CMD) -SPEC(CMD | AR | AE | AI | AO, SPEC_STICKY, NUM) -SPEC(USR | AR | AE | AI | AO, SPEC_STICKY, CMD) +SPEC( AS | AE | AI | AO, SPEC_STICKY, CMD) +SPEC(NUM | AS | AE | AI | AO, SPEC_STICKY, CMD) +SPEC(CMD | AS | AE | AI | AO, SPEC_STICKY, CMD) +SPEC(USR | AS | AE | AI | AO, SPEC_STICKY, CMD) // To User -SPEC( AA | AS | AE | AT | AN | AI | AO | AP | AL | AR, SPEC_STICKY, USR) -SPEC(NUM | AA | AS | AE | AT | AN | AI | AO | AP | AL | AR, SPEC_STICKY, USR) -SPEC(CMD | AA | AS | AE | AT | AN | AI | AO | AP | AL | AR, SPEC_STICKY, USR) -SPEC(USR | AA | AS | AE | AT | AN | AI | AO | AP | AL | AR, SPEC_STICKY, USR) +SPEC( AA | AS | AE | AT | AN | AI | AO | AP, SPEC_STICKY, USR) +SPEC(NUM | AA | AS | AE | AT | AN | AI | AO | AP, SPEC_STICKY, USR) +SPEC(CMD | AA | AS | AE | AT | AN | AI | AO | AP, SPEC_STICKY, USR) +SPEC(USR | AA | AS | AE | AT | AN | AI | AO | AP, SPEC_STICKY, USR) diff --git a/keyboards/ginny/keymaps/default/dicts/aset/num-keymap.def b/keyboards/ginny/keymaps/default/dicts/aset/num-keymap.def index 75084d75cd08..b31787bf6f07 100755 --- a/keyboards/ginny/keymaps/default/dicts/aset/num-keymap.def +++ b/keyboards/ginny/keymaps/default/dicts/aset/num-keymap.def @@ -11,7 +11,6 @@ PRES(NUM|AE|AT, PRES(NUM|AS|AT, KC_NO) PRES(NUM|AN|AO, KC_NO) PRES(NUM|AS|AI, KC_EQL) -PRES(NUM|AA|AS, KC_SPC) PRES(NUM|AS|AO, KC_DOT) PRES(NUM|AI|AO, KC_EQL) PRES(NUM|AS|AN, KC_END) @@ -27,9 +26,8 @@ PRES(NUM|AE|AO, PRES(NUM|AO|AP, KC_SCLN) PRES(NUM|AE|AI, KC_COMM) PRES(NUM|AE|AP, KC_QUOT) -PRES(NUM|AN|AI|AO|AP, KC_TAB) -PRES(NUM|AA|AT|AN|AP, KC_SPC) -PRES(NUM|AA|AS|AE|AT|AN|AI|AO|AP, KC_SPC) +PRES(NUM|AA|AS|AE|AT, KC_TAB) +PRES(NUM|AN|AI|AO|AP, KC_ENT) KEYS(NUM|AS|AP, cmb_ea889bef063f6825, {KC_LSFT, KC_0, COMBO_END}) KEYS(NUM|AA|AI, cmb_e9bf29584cf72c14, {KC_LSFT, KC_1, COMBO_END}) KEYS(NUM|AA|AO, cmb_bff41f9e9cd6fd93, {KC_LSFT, KC_9, COMBO_END}) diff --git a/keyboards/ginny/rules.mk b/keyboards/ginny/rules.mk index fc1bad603e51..2f851ee53a04 100755 --- a/keyboards/ginny/rules.mk +++ b/keyboards/ginny/rules.mk @@ -1,21 +1,21 @@ # MCU name -MCU = atmega32u4 -BOOTLOADER = atmel-dfu +MCU = atmega32u4 +BOOTLOADER = atmel-dfu -CUSTOM_MATRIX = yes -VIRTSER_ENABLE = no -NKRO_ENABLE = yes -DEBOUNCE_TYPE = eager_pr +CUSTOM_MATRIX = yes +VIRTSER_ENABLE = no +NKRO_ENABLE = no +DEBOUNCE_TYPE = eager_pr # Lets try and save some space eh? -MOUSEKEY_ENABLE = no -EXTRAKEY_ENABLE = no -CONSOLE_ENABLE = yes -COMMAND_ENABLE = no +MOUSEKEY_ENABLE = no +EXTRAKEY_ENABLE = no +CONSOLE_ENABLE = no +COMMAND_ENABLE = no -VPATH += keyboards/gboards/engine -SRC += matrix.c engine.c -QUANTUM_LIB_SRC += i2c_master.c -OPT_DEFS += -DONLYQWERTY -#OPT_DEFS += -DONLYQWERTY -DDEBUG_MATRIX -save-temps -c -LTO_ENABLE = yes +VPATH += keyboards/gboards/engine +SRC += matrix.c engine.c +QUANTUM_LIB_SRC += i2c_master.c +OPT_DEFS += -DONLYQWERTY +#OPT_DEFS += -DONLYQWERTY -DDEBUG_MATRIX -save-temps -c +LTO_ENABLE = yes