aboutsummaryrefslogtreecommitdiffstats
path: root/users
diff options
context:
space:
mode:
authorGravatar Drashna Jaelre <drashna@live.com>2018-03-01 07:46:57 -0800
committerGravatar skullydazed <skullydazed@users.noreply.github.com>2018-03-01 07:46:57 -0800
commit452d23da5267899933ca336ae91e7b297d5dfb0b (patch)
treebe1a454d387ee339a5b581239224fdaf5eeaac39 /users
parent7f7f763598b7be7b2081a73be2124f40349d8032 (diff)
downloadqmk_firmware-452d23da5267899933ca336ae91e7b297d5dfb0b.tar.gz
Update to drashna keymaps and userspace (#2450)
* Add OSL keycodes and macro handling * Re-add AVRDUDE target * Userspace document cleanup and commenting * Fix Orthodox keymap layout (cosmetic) * Add caveat for KEYMAP Macros * Minor tweaks * Enable Bootmagic in Ergodox EZ * Minor tweaks
Diffstat (limited to 'users')
-rw-r--r--users/drashna/drashna.c350
-rw-r--r--users/drashna/drashna.h38
2 files changed, 193 insertions, 195 deletions
diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c
index 0bf83cb9f..678570958 100644
--- a/users/drashna/drashna.c
+++ b/users/drashna/drashna.c
@@ -32,14 +32,27 @@ PROGMEM const char secret[][64] = {
};
#endif
+#ifdef AUDIO_ENABLE
+float tone_qwerty[][2] = SONG(QWERTY_SOUND);
+float tone_dvorak[][2] = SONG(DVORAK_SOUND);
+float tone_colemak[][2] = SONG(COLEMAK_SOUND);
+float tone_workman[][2] = SONG(PLOVER_SOUND);
+float tone_hackstartup[][2] = SONG(ONE_UP_SOUND);
+#endif
+
#ifdef FAUXCLICKY_ENABLE
float fauxclicky_pressed_note[2] = MUSICAL_NOTE(_A6, 2); // (_D4, 0.25);
float fauxclicky_released_note[2] = MUSICAL_NOTE(_A6, 2); // (_C4, 0.125);
#else
float fauxclicky_pressed[][2] = SONG(E__NOTE(_A6)); // change to your tastes
float fauxclicky_released[][2] = SONG(E__NOTE(_A6)); // change to your tastes
-#endif
-bool faux_click_enabled = true;
+#endif
+
+bool faux_click_enabled = false;
+bool is_overwatch = false;
+#ifdef RGBLIGHT_ENABLE
+bool rgb_layer_change = true;
+#endif
#ifdef TAP_DANCE_ENABLE
//define diablo macro timer variables
@@ -47,15 +60,11 @@ static uint16_t diablo_timer[4];
static uint8_t diablo_times[] = { 0, 1, 3, 5, 10, 30 };
static uint8_t diablo_key_time[4];
-
bool check_dtimer(uint8_t dtimer) {
// has the correct number of seconds elapsed (as defined by diablo_times)
return (timer_elapsed(diablo_timer[dtimer]) < (diablo_key_time[dtimer] * 1000)) ? false : true;
};
-
-
-
// Cycle through the times for the macro, starting at 0, for disabled.
// Max of six values, so don't exceed
void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data, uint8_t diablo_key) {
@@ -68,26 +77,20 @@ void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data, uint8_
}
}
-
// Would rather have one function for all of this, but no idea how to do that...
void diablo_tapdance1(qk_tap_dance_state_t *state, void *user_data) {
diablo_tapdance_master(state, user_data, 0);
}
-
void diablo_tapdance2(qk_tap_dance_state_t *state, void *user_data) {
diablo_tapdance_master(state, user_data, 1);
}
-
void diablo_tapdance3(qk_tap_dance_state_t *state, void *user_data) {
diablo_tapdance_master(state, user_data, 2);
}
-
void diablo_tapdance4(qk_tap_dance_state_t *state, void *user_data) {
diablo_tapdance_master(state, user_data, 3);
}
-
-
//Tap Dance Definitions
qk_tap_dance_action_t tap_dance_actions[] = {
// tap once to disable, and more to enable timed micros
@@ -97,14 +100,40 @@ qk_tap_dance_action_t tap_dance_actions[] = {
[TD_D3_4] = ACTION_TAP_DANCE_FN(diablo_tapdance4),
};
-#endif
-#ifdef AUDIO_ENABLE
-float tone_qwerty[][2] = SONG(QWERTY_SOUND);
-float tone_dvorak[][2] = SONG(DVORAK_SOUND);
-float tone_colemak[][2] = SONG(COLEMAK_SOUND);
-float tone_workman[][2] = SONG(PLOVER_SOUND);
-float tone_hackstartup[][2] = SONG(ONE_UP_SOUND);
+// Sends the key press to system, but only if on the Diablo layer
+void send_diablo_keystroke(uint8_t diablo_key) {
+ if (biton32(layer_state) == _DIABLO) {
+ switch (diablo_key) {
+ case 0:
+ SEND_STRING("1");
+ break;
+ case 1:
+ SEND_STRING("2");
+ break;
+ case 2:
+ SEND_STRING("3");
+ break;
+ case 3:
+ SEND_STRING("4");
+ break;
+ }
+ }
+}
+
+// Checks each of the 4 timers/keys to see if enough time has elapsed
+// Runs the "send string" command if enough time has passed, and resets the timer.
+void run_diablo_macro_check(void) {
+ uint8_t dtime;
+
+ for (dtime = 0; dtime < 4; dtime++) {
+ if (check_dtimer(dtime) && diablo_key_time[dtime]) {
+ diablo_timer[dtime] = timer_read();
+ send_diablo_keystroke(dtime);
+ }
+ }
+}
+
#endif
@@ -131,13 +160,6 @@ uint32_t layer_state_set_keymap (uint32_t state) {
__attribute__ ((weak))
void led_set_keymap(uint8_t usb_led) {}
-bool is_overwatch = false;
-#ifdef RGBLIGHT_ENABLE
-bool rgb_layer_change = true;
-#endif
-
-
-
// Call user matrix init, set default RGB colors and then
// call the keymap's init function
@@ -167,49 +189,8 @@ void matrix_init_user(void) {
rgblight_mode(5);
}
#endif
-#ifdef AUDIO_ENABLE
-// wait_ms(21); // gets rid of tick
-// stop_all_notes();
-// PLAY_SONG(tone_hackstartup);
-#endif
matrix_init_keymap();
}
-#ifdef TAP_DANCE_ENABLE
-
-// Sends the key press to system, but only if on the Diablo layer
-void send_diablo_keystroke(uint8_t diablo_key) {
- if (biton32(layer_state) == _DIABLO) {
- switch (diablo_key) {
- case 0:
- SEND_STRING("1");
- break;
- case 1:
- SEND_STRING("2");
- break;
- case 2:
- SEND_STRING("3");
- break;
- case 3:
- SEND_STRING("4");
- break;
- }
- }
-}
-
-// Checks each of the 4 timers/keys to see if enough time has elapsed
-// Runs the "send string" command if enough time has passed, and resets the timer.
-void run_diablo_macro_check(void) {
- uint8_t dtime;
-
- for (dtime = 0; dtime < 4; dtime++) {
- if (check_dtimer(dtime) && diablo_key_time[dtime]) {
- diablo_timer[dtime] = timer_read();
- send_diablo_keystroke(dtime);
- }
- }
-
-}
-#endif
// No global matrix scan code, so just run keymap's matix
// scan function
void matrix_scan_user(void) {
@@ -219,11 +200,10 @@ void matrix_scan_user(void) {
matrix_scan_keymap();
}
-void led_set_user(uint8_t usb_led) {
- led_set_keymap(usb_led);
-}
-
+// This block is for all of the gaming macros, as they were all doing
+// the same thing, but with differring text sent.
void send_game_macro(const char *str) {
+ clear_keyboard();
register_code(is_overwatch ? KC_BSPC : KC_ENTER);
unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
wait_ms(50);
@@ -232,21 +212,26 @@ void send_game_macro(const char *str) {
unregister_code(KC_ENTER);
}
+
+// Sent the default layer
void persistent_default_layer_set(uint16_t default_layer) {
eeconfig_update_default_layer(default_layer);
default_layer_set(default_layer);
}
+
// Defines actions tor my global custom keycodes. Defined in drashna.h file
// Then runs the _keymap's recod handier if not processed here
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+// If console is enabled, it will print the matrix position and status of each key pressed
#ifdef CONSOLE_ENABLE
xprintf("KL: row: %u, column: %u, pressed: %u\n", record->event.key.col, record->event.key.row, record->event.pressed);
-#endif
+#endif //CONSOLE_ENABLE
-#ifdef AUDIO_ENABLE
- if (faux_click_enabled) {
+// Run custom faux click code, but only if faux clicky is enabled
+#ifdef AUDIO_ENABLE
+ if ( (faux_click_enabled && keycode != KC_FXCL) || (!faux_click_enabled && keycode == KC_FXCL) ) {
if (record->event.pressed) {
PLAY_SONG(fauxclicky_pressed);
} else {
@@ -254,14 +239,15 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
PLAY_SONG(fauxclicky_released);
}
}
-#endif
+#endif //AUDIO_ENABLE
+
switch (keycode) {
case KC_QWERTY:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_SONG(tone_qwerty);
-#endif
+#endif //AUDIO_ENABLE
persistent_default_layer_set(1UL << _QWERTY);
}
return false;
@@ -270,7 +256,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_SONG(tone_colemak);
-#endif
+#endif //AUDIO_ENABLE
persistent_default_layer_set(1UL << _COLEMAK);
}
return false;
@@ -279,7 +265,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_SONG(tone_dvorak);
-#endif
+#endif //AUDIO_ENABLE
persistent_default_layer_set(1UL << _DVORAK);
}
return false;
@@ -288,11 +274,13 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_SONG(tone_workman);
-#endif
+#endif //AUDIO_ENABLE
persistent_default_layer_set(1UL << _WORKMAN);
}
return false;
break;
+
+
case LOWER:
if (record->event.pressed) {
layer_on(_LOWER);
@@ -324,85 +312,108 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
return false;
break;
-#if !(defined(KEYBOARD_orthodox_rev1) || defined(KEYBOARD_orthodox_rev3) || defined(KEYBOARD_ergodox_ez))
- case KC_OVERWATCH:
- if (record->event.pressed) {
- is_overwatch = !is_overwatch;
- }
-#ifdef RGBLIGHT_ENABLE
- is_overwatch ? rgblight_mode(17) : rgblight_mode(18);
-#endif
- return false;
- break;
- case KC_SALT:
+
+
+ case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader
if (!record->event.pressed) {
- send_game_macro("Salt, salt, salt...");
+ SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP
+#if (defined(BOOTLOADER_DFU) || defined(BOOTLOADER_LUFA_DFU) || defined(BOOTLOADER_QMK_DFU))
+ ":dfu"
+#elif defined(BOOTLOADER_HALFKAY)
+ ":teensy"
+#elif defined(BOOTLOADER_CATERINA)
+ ":avrdude"
+#endif
+ SS_TAP(X_ENTER));
}
return false;
break;
- case KC_MORESALT:
+ case KC_RESET: // Custom RESET code that setr RGBLights to RED
if (!record->event.pressed) {
- send_game_macro("Please sir, can I have some more salt?!");
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable();
+ rgblight_mode(1);
+ rgblight_setrgb(0xff, 0x00, 0x00);
+#endif
+ reset_keyboard();
}
return false;
break;
- case KC_SALTHARD:
- if (!record->event.pressed) {
- send_game_macro("Your salt only makes me harder, and even more aggressive!");
+ case EPRM: // Resets EEPROM
+ if (record->event.pressed) {
+ eeconfig_init();
}
return false;
break;
- case KC_GOODGAME:
- if (!record->event.pressed) {
- send_game_macro("Good game, everyone!");
+ case VRSN: // Prints firmware version
+ if (record->event.pressed) {
+ SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
}
return false;
break;
- case KC_GLHF:
+ case KC_SECRET_1 ... KC_SECRET_5: // Custom
if (!record->event.pressed) {
- send_game_macro("Good luck, have fun!!!");
+ clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+ send_string_P(secret[keycode - KC_SECRET_1]);
}
return false;
break;
- case KC_SYMM:
- if (!record->event.pressed) {
- send_game_macro("Left click to win!");
- }
+
+
+// These are a serious of gaming macros.
+// Only enables for the viterbi, basically,
+// to save on firmware space, since it's limited.
+#if !(defined(KEYBOARD_orthodox_rev1) || defined(KEYBOARD_orthodox_rev3) || defined(KEYBOARD_ergodox_ez))
+
+
+ case KC_OVERWATCH: // Toggle's if we hit "ENTER" or "BACKSPACE" to input macros
+ if (record->event.pressed) { is_overwatch = !is_overwatch; }
+#ifdef RGBLIGHT_ENABLE
+ is_overwatch ? rgblight_mode(17) : rgblight_mode(18);
+#endif //RGBLIGHT_ENABLE
return false;
break;
+
+ case KC_SALT:
+ if (!record->event.pressed) { send_game_macro("Salt, salt, salt..."); }
+ return false; break;
+ case KC_MORESALT:
+ if (!record->event.pressed) { send_game_macro("Please sir, can I have some more salt?!"); }
+ return false; break;
+ case KC_SALTHARD:
+ if (!record->event.pressed) { send_game_macro("Your salt only makes me harder, and even more aggressive!"); }
+ return false; break;
+ case KC_GOODGAME:
+ if (!record->event.pressed) { send_game_macro("Good game, everyone!"); }
+ return false; break;
+ case KC_GLHF:
+ if (!record->event.pressed) { send_game_macro("Good luck, have fun!!!"); }
+ return false; break;
+ case KC_SYMM:
+ if (!record->event.pressed) { send_game_macro("Left click to win!"); }
+ return false; break;
case KC_JUSTGAME:
- if (!record->event.pressed) {
- send_game_macro("It may be a game, but if you don't want to actually try, please go play AI, so that people that actually want to take the game seriously and \"get good\" have a place to do so without trolls like you throwing games.");
- }
- return false;
- break;
+ if (!record->event.pressed) { send_game_macro("It may be a game, but if you don't want to actually try, please go play AI, so that people that actually want to take the game seriously and \"get good\" have a place to do so without trolls like you throwing games."); }
+ return false; break;
case KC_TORB:
- if (!record->event.pressed) {
- send_game_macro("That was positively riveting!");
- }
- return false;
- break;
+ if (!record->event.pressed) { send_game_macro("That was positively riveting!"); }
+ return false; break;
case KC_AIM:
if (!record->event.pressed) {
send_game_macro("That aim is absolutely amazing. It's almost like you're a machine!");
wait_ms(3000);
send_game_macro("Wait! That aim is TOO good! You're clearly using an aim hack! CHEATER!");
}
- return false;
- break;
+ return false; break;
case KC_C9:
- if (!record->event.pressed) {
- send_game_macro("OMG!!! C9!!!");
- }
- return false;
- break;
+ if (!record->event.pressed) { send_game_macro("OMG!!! C9!!!"); }
+ return false; break;
case KC_GGEZ:
- if (!record->event.pressed) {
- send_game_macro("That was a fantastic game, though it was a bit easy. Try harder next time!");
- }
- return false;
- break;
-#endif
+ if (!record->event.pressed) { send_game_macro("That was a fantastic game, though it was a bit easy. Try harder next time!"); }
+ return false; break;
+#endif // !(defined(KEYBOARD_orthodox_rev1) || defined(KEYBOARD_orthodox_rev3) || defined(KEYBOARD_ergodox_ez))
+
+
#ifdef TAP_DANCE_ENABLE
case KC_DIABLO_CLEAR: // reset all Diable timers, disabling them
if (record->event.pressed) {
@@ -412,78 +423,37 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
diablo_key_time[dtime] = diablo_times[0];
}
}
- return false;
- break;
-#endif
- case KC_MAKE:
- if (!record->event.pressed) {
- SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP
-#if (defined(BOOTLOADER_DFU) || defined(BOOTLOADER_LUFA_DFU) || defined(BOOTLOADER_QMK_DFU))
- ":dfu"
-#elif defined(BOOTLOADER_HALFKAY)
- ":teensy"
-//#elif defined(BOOTLOADER_CATERINA)
-// ":avrdude"
-#endif
- SS_TAP(X_ENTER));
- }
- return false;
- break;
- case KC_RESET:
- if (!record->event.pressed) {
-#ifdef RGBLIGHT_ENABLE
- rgblight_enable();
- rgblight_mode(1);
- rgblight_setrgb(0xff, 0x00, 0x00);
-#endif
- reset_keyboard();
- }
- return false;
- break;
- case EPRM:
- if (record->event.pressed) {
- eeconfig_init();
- }
- return false;
- break;
- case VRSN:
- if (record->event.pressed) {
- SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
- }
- return false;
- break;
- case KC_SECRET_1 ... KC_SECRET_5:
- if (!record->event.pressed) {
- send_string_P(secret[keycode - KC_SECRET_1]);
- }
- return false;
- break;
+ return false; break;
+#endif // TAP_DANCE_ENABLE
+
+
case KC_FXCL:
- if (!record->event.pressed) {
+ if (!record->event.pressed) { // Toggles the custom faux click code
faux_click_enabled = !faux_click_enabled;
}
- return false;
- break;
- case KC_RGB_T: // Because I want the option to go back to normal RGB mode rather than always layer indication
+ return false; break;
+ case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal
#ifdef RGBLIGHT_ENABLE
if (record->event.pressed) {
rgb_layer_change = !rgb_layer_change;
+ if (rgb_layer_change) {
+ layer_state_set(layer_state); // This is needed to immediately set the layer color (looks beetter)
+ }
}
-#endif
- return false;
- break;
+#endif // RGBLIGHT_ENABLE
+ return false; break;
#ifdef RGBLIGHT_ENABLE
case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions
if (record->event.pressed) { //This disrables layer indication, as it's assumed that if you're changing this ... you want that disabled
rgb_layer_change = false;
}
- return true;
- break;
-#endif
+ return true; break;
+#endif // RGBLIGHT_ENABLE
}
return process_record_keymap(keycode, record);
}
+
// Runs state check and changes underglow color and animation
// on layer change, no matter where the change was initiated
// Then runs keymap's layer change check
@@ -536,7 +506,7 @@ uint32_t layer_state_set_user(uint32_t state) {
rgblight_set_green;
rgblight_mode(2);
break;
- default:
+ default: // for any other layers, or the default layer
if (default_layer & (1UL << _COLEMAK)) {
rgblight_set_magenta;
}
@@ -549,9 +519,9 @@ uint32_t layer_state_set_user(uint32_t state) {
else {
rgblight_set_teal;
}
- if (biton32(state) == _MODS) {
+ if (biton32(state) == _MODS) { // If the non-OSM layer is enabled, then breathe
rgblight_mode(2);
- } else {
+ } else { // otherwise, stay solid
rgblight_mode(1);
}
break;
@@ -562,3 +532,9 @@ uint32_t layer_state_set_user(uint32_t state) {
}
+// Any custom LED code goes here.
+// So far, I only have keyboard specific code,
+// So nothing goes here.
+void led_set_user(uint8_t usb_led) {
+ led_set_keymap(usb_led);
+}
diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h
index f50bd3106..8d32a5f98 100644
--- a/users/drashna/drashna.h
+++ b/users/drashna/drashna.h
@@ -125,38 +125,55 @@ enum {
TD_D3_3,
TD_D3_4
};
-#endif
+#endif // TAP_DANCE_ENABLE
+
+// Custom Keycodes for Diablo 3 layer
+// But since TD() doesn't work when tapdance is disabled
+// We use custom codes here, so we can substituet the right stuff
#ifdef TAP_DANCE_ENABLE
#define KC_D3_1 TD(TD_D3_1)
#define KC_D3_2 TD(TD_D3_2)
#define KC_D3_3 TD(TD_D3_3)
#define KC_D3_4 TD(TD_D3_4)
-#else
+#else // TAP_DANCE_ENABLE
#define KC_D3_1 KC_1
#define KC_D3_2 KC_2
#define KC_D3_3 KC_3
#define KC_D3_4 KC_4
-#endif
+#endif // TAP_DANCE_ENABLE
+
+// OSM keycodes, to keep things clean and easy to change
+#define KC_MLSF OSM(MOD_LSFT)
+#define KC_MRSF OSM(MOD_RSFT)
+#define ONESHOT_TIMEOUT 3000
#define QMK_KEYS_PER_SCAN 8
#ifdef RGBLIGHT_ENABLE
#define RGBLIGHT_SLEEP
-#endif
+#endif // RGBLIGHT_ENABLE
-#define IGNORE_MOD_TAP_INTERRUPT // this makes it possible to do rolling combos (zx) with keys that convert to other keys on hold (z becomes ctrl when you hold it, and when this option isn't enabled, z rapidly followed by x actually sends Ctrl-x. That's bad.)
+// this makes it possible to do rolling combos (zx) with keys that
+// convert to other keys on hold (z becomes ctrl when you hold it,
+// and when this option isn't enabled, z rapidly followed by x
+// actually sends Ctrl-x. That's bad.)
+#define IGNORE_MOD_TAP_INTERRUPT
+// Disable action_get_macro and fn_actions, since we don't use these
+// and it saves on space in the firmware.
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION
+// If we're still using the official Faux Clicky feature, substituet codes
+// so that we don't have any unused/blank keys.
#ifdef FAUXCLICKY_ENABLE
#define AUD_ON FC_ON
#define AUD_OFF FC_OFF
-#else
+#else // FAUXCLICKY_ENABLE
#define AUD_ON AU_ON
#define AUD_OFF AU_OFF
-#endif
+#endif // FAUXCLICKY_ENABLE
@@ -166,12 +183,17 @@ enum {
#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)
#define KEYMAP_wrapper(...) KEYMAP(__VA_ARGS__)
+
// Blocks for each of the four major keyboard layouts
// Organized so we can quickly adapt and modify all of them
// at once, rather than for each keyboard, one at a time.
// And this allows wor much cleaner blocks in the keymaps.
// For instance Tap/Hold for Control on all of the layouts
+// NOTE: These are all the same length. If you do a search/replace
+// then you need to add/remove underscores to keep the
+// lengths consistent.
+
#define _________________QWERTY_L1_________________ KC_Q, KC_W, KC_E, KC_R, KC_T
#define _________________QWERTY_L2_________________ KC_A, KC_S, KC_D, KC_F, KC_G
#define _________________QWERTY_L3_________________ CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B
@@ -213,7 +235,7 @@ enum {
// this allows us to quickly modify the bottom row for all of the layouts
// so we don't have to alter it 4 times and hope that we haven't missed
// anything
-#define ___________ERGODOX_BOTTOM_LEFT_____________ KC_QUOT, KC_LGUI, KC_LBRC, KC_RBRC
+#define ___________ERGODOX_BOTTOM_LEFT_____________ KC_QUOT, KC_MEH, KC_LBRC, KC_RBRC
#define ___________ERGODOX_BOTTOM_RIGHT____________ KC_LEFT, KC_DOWN, KC_UP, KC_RGHT