1 // This is the canonical layout file for the Quantum project. If you want to add another keyboard,
2 // this is the style you want to emulate.
4 // To flash planck firmware
5 // ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
6 // Reset keyboard or press hw reset button on base (hole)
8 // cd qmk_firmware/keyboards/planck
9 // sudo make KEYMAP=sdothum dfu
11 // sudo make clean (good practice before flashing)
12 // sudo make KEYMAP=sdothum (to compile check)
14 // Package requirements (for arch linux)
15 // ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
22 // ** E R G O W I D E S P L I T ** Layout
24 // Autocompletion tap dance key pairs (),[],{} are available from the
25 // number/symbol layer, as well as, numerous (un)shift key values
27 // The navigation pad provides a single hand right thumb activated cluster
28 // with left hand modifiers
30 // #define PRIVATE_STRING includes private_string.h, a user defined code
31 // block for the PRIV tap dance e.g. SEND_STRING("secret messape"),
32 // see function private()
36 // The num and sym keys together access the navigation pad layer
38 // ,-----------------------------------------------------------------------------------.
39 // | Ctrl | GUI | Alt | Esc | Space| Tab | Bksp | Ent | Left | Down | Up | Right|
40 // `-----------------------------------------------------------------------------------'
44 // For sculpted keycaps such as Cherry or OEM profile, reverse the Alt, Num,
45 // Shift, Shift, Nav, Sym keycaps for more ergonomic thumb orientation and
50 // This source is shamelessly based on the "default" planck layout
52 // #ifdef/#endif block structures are not indented, as syntax highlighting
53 // in vim is sufficient for identification
55 // c++ commenting style is used throughout
59 // See http://thedarnedestthing.com/planck%20constant
60 // See http://thedarnedestthing.com/planck%20done
66 // sudo CPATH=<keymap.c directory>/common make ...
70 #pragma message "You may need to add LAYOUT_planck_grid to your keymap layers - see default for an example"
72 #include "action_layer.h"
74 #include "keymap_steno.h"
81 extern keymap_config_t keymap_config;
100 #ifndef SHIFT_SYMBOLS
110 enum planck_keycodes {
116 ,SM_CIRC // pseudo GUI_T(S(KC_6)) for shifted key-codes, see process_record_user()
117 ,SM_DLR // pseudo SFT_T(S(KC_4)) for shifted key-codes, see process_record_user()
118 ,SM_G // pseudo MT (MOD_LALT | MOD_LSFT, S(KC_G)) for shifted key-codes, see process_record_user()
119 ,SM_PERC // pseudo ALT_T(S(KC_5)) for shifted key-codes, see process_record_user()
120 ,SM_LPRN // pseudo CTL_T(S(KC_9)) for shifted key-codes, see process_record_user()
121 ,SL_LEFT // pseudo LT (_MOUSE, S(KC_LEFT)) for shifted key-codes, see process_record_user()
122 ,SP_DEL // pseudo LT (_MOUSE, KC_DEL) for shifted key-codes, see process_record_user()
123 ,SL_PIPE // pseudo LT (_ADJUST, S(KC_BSLS)) for shifted key-codes, see process_record_user()
124 ,SL_TAB // pseudo LT (_FNCKEY, S(KC_TAB)) for shifted key-codes, see process_record_user()
134 ,LT_C = LT (_NUMBER, KC_C)
135 ,LT_V = LT (_FNCKEY, KC_V)
136 ,LT_N = LT (_EDIT, KC_N)
137 ,LT_M = LT (_SYMBOL, KC_M)
143 #define AT_B ALT_T(KC_B)
144 #define AT_DOWN ALT_T(KC_DOWN)
145 #define CT_RGHT CTL_T(KC_RGHT)
146 #define GT_C GUI_T(KC_C)
147 #define GT_UP GUI_T(KC_UP)
148 #define MT_E MT (MOD_LCTL | MOD_LALT, KC_E)
149 #define MT_X MT (MOD_LALT | MOD_LSFT, KC_X)
150 #define ST_A SFT_T(KC_A)
152 #define HOME_K CTL_T(KC_K)
153 #define HOME_H GUI_T(KC_H)
154 #define HOME_E ALT_T(KC_E)
155 #define HOME_A SFT_T(KC_A)
156 #if defined(BEAKLMU) || defined(BEAKLSP)
157 #define HOME_T SFT_T(KC_T)
158 #define HOME_R ALT_T(KC_R)
159 #define HOME_S GUI_T(KC_S)
160 #define HOME_W CTL_T(KC_W)
162 #define HOME_T SFT_T(KC_T)
163 #define HOME_S ALT_T(KC_S)
164 #define HOME_N GUI_T(KC_N)
165 #define HOME_B CTL_T(KC_B)
178 #define S_DOWN S (KC_DOWN)
179 #define S_LEFT S (KC_LEFT)
180 #define S_RGHT S (KC_RGHT)
181 #define S_TAB S (KC_TAB)
182 #define S_UP S (KC_UP)
184 #include "tapdance.h"
187 #define ___x___ KC_TRNS
188 #define ___fn__ KC_TRNS
192 #define _______ KC_NO
194 #define COPY LCTL(KC_C)
195 #define CUT LCTL(KC_X)
196 #define EOT LCTL(KC_D)
197 #define NAK LCTL(KC_U)
198 #define PASTE LCTL(KC_V)
199 #define UNDO LCTL(KC_Z)
200 #define TMCOPY LALT(LCTL(KC_C))
201 #define TMPASTE LALT(LCTL(KC_V))
202 #define LT_BSLS LT (_MOUSE, KC_BSLS) // see process_record_user() for extended handling
203 #define LT_BSPC LT (_EDIT, KC_BSPC)
204 #define SP_LEFT LT (_EDIT, KC_LEFT)
205 #define LT_ESC LT (_NUMBER, KC_ESC)
206 #define LT_LEFT LT (_SYMBOL, KC_LEFT) // see process_record_user() for extended handling
207 #define SP_BSPC LT (_SYMBOL, KC_BSPC) // see process_record_user() for extended handling
208 #define LT_TAB LT (_FNCKEY, KC_TAB)
209 #define LT_INS LT (_FNCKEY, KC_INS)
210 #define LT_ALTG LT (_FNCKEY, KC_RALT)
211 #define ADJUST MO (_ADJUST)
212 #define OS_ALT OSM (MOD_LALT)
213 #define OS_CTL OSM (MOD_LCTL)
214 #define OS_GUI OSM (MOD_LGUI)
215 #define OS_SFT OSM (MOD_LSFT)
216 #define OS_CALT OSM (MOD_LALT | MOD_LCTL)
217 #define OS_CGUI OSM (MOD_LGUI | MOD_LCTL)
218 #define OS_CSFT OSM (MOD_LSFT | MOD_LCTL)
219 #define OS_SALT OSM (MOD_LALT | MOD_LSFT)
220 #define OS_SGUI OSM (MOD_LGUI | MOD_LSFT)
224 #define CNTR_TL OSM (MOD_LSFT)
226 #define CNTR_TL TT (_TTFNCKEY)
228 #define CNTR_TR KC_CAPS
229 #define CNTR_HL TT (_TTCURSOR)
230 #define CNTR_HR TT (_TTMOUSE)
231 #define CNTR_BL TT (_TTNUMBER)
232 #define CNTR_BR TT (_TTREGEX)
234 #define CNTR_TL OSM (MOD_LALT | MOD_LCTL)
235 #define CNTR_TR OSM (MOD_LGUI | MOD_LCTL)
236 #define CNTR_HL OSM (MOD_LALT | MOD_LSFT)
237 #define CNTR_HR OSM (MOD_LGUI | MOD_LSFT)
238 #define CNTR_BL TD (_CAPS)
239 #define CNTR_BR OSM (MOD_LSFT | MOD_LCTL)
243 #define LT_EQL LT (_ADJUST, KC_EQL)
245 #define LT_0 LT (_ADJUST, KC_0)
247 #ifndef SHIFT_SYMBOLS
248 #define LT_A LT (_NUMSYM, KC_A)
249 #define LT_LFTX LT (_SYMREG, KC_LEFT)
252 // ........................................................ Default Alpha Layout
254 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
259 #include "steno_layout.h"
261 // ...................................................... Number / Function Keys
263 #include "number_fkey_layout.h"
265 // ......................................................... Symbol / Navigation
267 #include "symbol_guifn_layout.h"
269 // ............................................................... Toggle Layers
272 #include "toggle_layout.h"
275 // ......................................................... Short Cuts / Adjust
277 #include "chord_layout.h"
281 // ...................................................................... Sounds
285 // ........................................................... User Keycode Trap
287 #include "keycode_functions.h"
292 static uint8_t base_n = 0;
294 bool process_record_user(uint16_t keycode, keyrecord_t *record)
298 if (record->event.pressed) {
299 base_n = base_n | BASE_1;
300 if (base_n == BASE_12) {
305 base_n = base_n & ~BASE_1;
309 if (record->event.pressed) {
310 base_n = base_n | BASE_2;
311 if (base_n == BASE_12) {
316 base_n = base_n & ~BASE_2;
322 #if defined(BEAKLMU) || defined(BEAKLSP)
328 tap_mods(record, KC_LALT);
333 #if defined(BEAKLMU) || defined(BEAKLSP)
339 tap_mods(record, KC_LCTL);
344 #if defined(BEAKLMU) || defined(BEAKLSP)
350 tap_mods(record, KC_LGUI);
355 tap_mods(record, KC_LSFT);
360 clear_tt(); // exit TT layer
365 if (tt_keycode != 0) {
366 clear_tt(); // exit TT layer
370 tap_layer(record, _NUMBER);
374 tap_layer(record, _SYMBOL);
375 // LT (_SYMBOL, KC_LEFT) left right combination layer
376 thumb_layer(record, RIGHT, 0, 0, _SYMBOL, _LSHIFT);
379 tap_mods(record, KC_LALT);
382 tap_mods(record, KC_LCTL);
385 tap_mods(record, KC_LGUI);
389 mt_shift(record, KC_LGUI, 0, KC_6);
393 mt_shift(record, KC_LSFT, 0, KC_4);
396 // MT(MOD_LALT | MOD_LSFT, S(KC_G))
397 mt_shift(record, KC_LALT, KC_LSFT, KC_G);
401 mt_shift(record, KC_LCTL, 0, KC_9);
405 mt_shift(record, KC_LALT, 0, KC_5);
408 tap_layer(record, _MOUSE);
409 // LT (_MOUSE, KC_BSLS) left right combination layer, see #define LT_BSLS
410 thumb_layer(record, LEFT, 0, 0, _MOUSE, _SYMBOL);
413 tap_layer(record, _MOUSE);
414 // LT (_MOUSE, S(KC_LEFT)) left right combination layer
415 thumb_layer(record, RIGHT, SHIFT, KC_LEFT, _MOUSE, _LSHIFT);
418 tap_layer(record, _MOUSE);
419 // LT (_MOUSE, S(KC_LEFT)) left right combination layer
420 thumb_layer(record, RIGHT, NOSHIFT, KC_DEL, _MOUSE, _LSHIFT);
423 // LT (_ADJUST, S(KC_BSLS)) emulation
424 lt_shift(record, KC_BSLS, _ADJUST);
427 // LT (_FNCKEY, S(KC_TAB)) emulation
428 lt_shift(record, KC_TAB, _FNCKEY);
431 tap_layer(record, _RSHIFT);
432 // LT (_RSHIFT, KC_ENT) emulation, see tap dance enter
435 tap_layer(record, _LSHIFT);
436 // LT (_LSHIFT, KC_SPC) left right combination layer, see tap dance TD_SPC
437 thumb_layer(record, LEFT, 0, 0, _LSHIFT, _SYMBOL);
446 if (tt_keycode != keycode && tt_keycode != 0) {
447 clear_tt(); // return to base layer first if different TT layer selected
449 tt_keycode = keycode;
452 // #ifdef STENO_ENABLE
454 // stn_layer(record, STN_A, _NUMBER);
457 // stn_layer(record, STN_O, _FNCKEY);
460 // stn_layer(record, STN_E, _EDIT);
463 // stn_layer(record, STN_U, _SYMBOL);
467 if (record->event.pressed) {