2 // Inspired by MicroDox:
3 // http://geekhack.org/index.php?topic=42231.msg1062851#msg1062851
4 // https://www.massdrop.com/ext/ergodox/?referer=CTL63V&hash=9ff8ddbb75e03e517aaa39acabc81669
7 static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
9 * Keymap: Default Layer in QWERTY
11 * ,--------------------------------------------------. ,--------------------------------------------------.
12 * | | | | | | | | | | | | | | | |
13 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
14 * | Tab | Q | W | E | R | T | | | | Y | U | I | O | P | [ |
15 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
16 * | Tab/Shf| A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
17 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
18 * | LCtrl/~| Z | X | C | V | B | | | | N | M | , | . | / | ] |
19 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
20 * | | | Caps | LAlt | LGui | | RGui | | | | |
21 * | | | | Spc | Esc | | | | | | |
22 * `----------------------------------' `----------------------------------'
23 * ,-------------. ,-------------.
25 * ,------|------|------| |------+------+------.
27 * | BkSp | Del |------| |------| Enter| Space|
28 * | | | Esc | | Ins | | |
29 * | LCtl | LSft | LAlt | | RAlt | RSft | RCtl |
30 * `--------------------' `--------------------'
34 ****************************************************************************************************
36 * Under XOrg, I use my own mapping from QWERTY to "Workman for Programmers"
37 * See XOrg files in ./addons/ subdirectory.
39 * I have to do so, because of two things:
40 * 1) my native language is Russian, and XOrg keymap for it is based on QWERTY layout
41 * 2) I want to have non-standart shifted keys, like $ (as normal) and @ (as shifted), or _ and -
43 * And even if (2) could be solved using FN* keys (but there is limit in firmware for only 32 such
44 * keys), then (1) can't be solved at firmware level at all.
46 * So, I have to stick with QWERTY as my main layout + my own XOrg keyboard layout for English.
47 * But sometimes I have to input something when XOrg is not active - for example, in Linux console,
48 * or in firmware console (while debugging firmware), or when keyboard is connected to not my computer.
50 * For such cases I have Layer1 :)
51 * // hint: switch to Layer1 is only at Layer6
53 ****************************************************************************************************
57 * Keymap: Default Layer in Workman
59 * ,--------------------------------------------------. ,--------------------------------------------------.
60 * | | | | | | | | | | | | | | | |
61 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
62 * | Tab | Q | D | R | W | B | | | | J | F | U | P | $ | : |
63 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
64 * | Tab/Shf| A | S | H | T | G |------| |------| Y | N | E | O | I | - |
65 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
66 * | LCtrl | Z | X | M | C | V | | | | K | L | , | . | / | | |
67 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
68 * | | | Caps | LAlt | LGui | | RGui | | | | |
69 * | | | | Spc | Esc | | | | | | |
70 * `----------------------------------' `----------------------------------'
71 * ,-------------. ,-------------.
73 * ,------|------|------| |------+------+------.
75 * | BkSp | Del |------| |------| Enter| Space|
76 * | | | Esc | | Ins | | |
77 * | LCtl | LSft | LAlt | | RAlt | RSft | RCtl |
78 * `--------------------' `--------------------'
80 * Keymap: Default Layer in Workman / with Shift
82 * ,--------------------------------------------------. ,--------------------------------------------------.
83 * | | | | | | | | | | | | | | | |
84 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
85 * | Tab | Q | D | R | W | B | | | | J | F | U | P | @ | % |
86 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
87 * | Tab/Shf| A | S | H | T | G |------| |------| Y | N | E | O | I | _ |
88 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
89 * | LCtrl | Z | X | M | C | V | | | | K | L | , | . | / | & |
90 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
91 * | | | Caps | LAlt | LGui | | RGui | | | | |
92 * | | | | Spc | Esc | | | | | | |
93 * `----------------------------------' `----------------------------------'
94 * ,-------------. ,-------------.
96 * ,------|------|------| |------+------+------.
98 * | BkSp | Del |------| |------| Enter| Space|
99 * | | | Esc | | Ins | | |
100 * | LCtl | LSft | LAlt | | RAlt | RSft | RCtl |
101 * `--------------------' `--------------------'
103 * | ~ | ; | ! | # | { | } | ' | | ^ | [ | ] | * | ( | ) | = |
104 * | ` | 1 | 2 | 3 | 4 | 5 | " | | \ | 6 | 7 | 8 | 9 | 0 | + |
107 KEYMAP( // Layer0: default, leftled:none
109 NO, NO, NO, NO, NO, NO, NO,
110 TAB, Q, W, E, R, T, NO,
111 FN11,FN28,FN29,FN30,FN21,G,
112 FN12,FN24,FN25,FN26,FN27,B, NO,
113 NO, NO, CAPS,FN13,FN14,
118 NO, NO, NO, NO, NO, NO, NO,
119 NO, Y, U, I, O, P, LBRC,
120 H, J, K, L, FN22,FN15,
121 NO, N, M, COMM,DOT, SLSH,FN16,
122 RGUI,FN17,NO, NO, NO,
128 KEYMAP( // Layer1: Workman layout, leftled:all
130 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
131 TRNS,Q, D, R, W, B, TRNS,
133 TRNS,Z, X, M, C, V, TRNS,
134 TRNS,TRNS,TRNS,TRNS,TRNS,
139 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
140 TRNS,J, F, U, P, 4, TRNS,
142 TRNS,K, L, TRNS,TRNS,TRNS,TRNS,
143 TRNS,TRNS,TRNS,TRNS,TRNS,
149 KEYMAP( // Layer2: numpad, leftled:blue
151 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
152 TRNS,NO, NO, NO, NO, NO, TRNS,
153 TRNS,NO, NO, NO, TRNS,NO,
154 TRNS,NO, NO, NO, TRNS,NO, TRNS,
155 TRNS,TRNS,TRNS,TRNS,TRNS,
160 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
161 TRNS,NLCK,P7, P8, P9, PMNS,PGUP,
162 PAST,P4, P5, P6, PPLS,PGDN,
163 TRNS,FN17,P1, P2, P3, PSLS,PENT,
164 P0, PDOT,SLSH,NO, NO,
170 KEYMAP( // Layer3: F-keys + PgUp/PgDn on right hand, leftled:green
172 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
173 TRNS,NO, NO, NO, NO, NO, TRNS,
174 TRNS,NO, TRNS,NO, NO, NO,
175 TRNS,NO, TRNS,NO, NO, NO, TRNS,
176 TRNS,TRNS,TRNS,LALT,LGUI,
181 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
182 TRNS,PSCR,F1, F2, F3, F4, PGUP,
183 SLCK,F5, F6, F7, F8, PGDN,
184 TRNS,PAUS,F9, F10, F11, F12, APP,
185 RGUI,RALT,TRNS,TRNS,TRNS,
191 KEYMAP( // Layer4: unconvenient keys on right hand, leftled:red
193 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
194 TRNS,NO, NO, NO, NO, NO, TRNS,
195 TRNS,TRNS,NO, NO, NO, NO,
196 TRNS,TRNS,NO, NO, NO, NO, TRNS,
197 TRNS,TRNS,TRNS,TRNS,TRNS,
202 // in Workman right hand will be:
210 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
211 TRNS,MINS,4, 5, 9, 0, PPLS,
212 BSLS,2, P, FN1, 1, EQL,
213 TRNS,3, 6, FN3, FN4, 7, FN2,
214 TRNS,TRNS,TRNS,TRNS,TRNS,
220 KEYMAP( // Layer5: cursor, leftled:red
222 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
223 TRNS,NO, NO, NO, NO, NO, TRNS,
224 TRNS,NO, NO, NO, TRNS,NO,
225 TRNS,NO, NO, NO, NO, NO, TRNS,
226 TRNS,TRNS,TRNS,TRNS,TRNS,
231 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
232 TRNS,PGUP,HOME,END, DEL, INS, PGUP,
233 PGDN,LEFT,UP, DOWN,RGHT,PGDN,
234 TRNS,NO, HOME,END, DEL, INS, TRNS,
235 TRNS,TRNS,TRNS,TRNS,TRNS,
241 KEYMAP( // Layer6: F1-F10, Workman-layer switch, Teensy, layer switches, leftled:red+onboard
243 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
244 FN0, F1, F2, F3, F4, F5, TRNS,
245 TRNS,FN18,NO, NO, FN19,NO,
246 TRNS,NO, NO, NO, FN19,NO, TRNS,
247 TRNS,TRNS,TRNS,TRNS,TRNS,
252 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
253 TRNS,F6, F7, F8, F9, F10, FN0,
254 FN0, NO, NO, NO, TRNS,TRNS,
255 TRNS,NO, NO, NO, NO, NO, TRNS,
256 TRNS,TRNS,TRNS,TRNS,TRNS,
266 KEYMAP( // Layer7: F-keys only, leftled:red
268 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
269 TRNS,F13, F14, F15, F16, NO, TRNS,
270 TRNS,F17, F18, F19, F20, NO,
271 TRNS,F21, F22, F23, F24, NO, TRNS,
272 TRNS,TRNS,TRNS,TRNS,TRNS,
277 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
278 TRNS,NO, F1, F2, F3, F4, TRNS,
279 NO, F5, F6, F7, F8, TRNS,
280 TRNS,NO, F9, F10, F11, F12, TRNS,
281 TRNS,TRNS,TRNS,TRNS,TRNS,
287 KEYMAP( // Layer8: mouse and navigation, leftled:blue and green
289 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
290 TRNS,NO, NO, NO, NO, NO, TRNS,
291 TRNS,NO, NO, TRNS,NO, NO,
292 TRNS,NO, NO, TRNS,NO, NO, TRNS,
293 TRNS,TRNS,TRNS,TRNS,TRNS,
299 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
300 TRNS,BTN2,WH_L,WH_U,WH_D,WH_R,PGUP,
301 BTN1,MS_L,MS_U,MS_D,MS_R,PGDN,
302 TRNS,BTN3,HOME,END, DEL, INS, NO,
303 TRNS,TRNS,TRNS,TRNS,TRNS,
310 // templates to copy from
312 KEYMAP( // LayerN: transparent on edges + hard-defined thumb keys, all others are empty
314 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
315 TRNS,NO, NO, NO, NO, NO, TRNS,
316 TRNS,NO, NO, NO, NO, NO,
317 TRNS,NO, NO, NO, NO, NO, TRNS,
318 TRNS,TRNS,TRNS,LALT,LGUI,
323 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
324 TRNS,NO, NO, NO, NO, NO, TRNS,
325 NO, NO, NO, NO, NO, TRNS,
326 TRNS,NO, NO, NO, NO, NO, TRNS,
327 RGUI,RALT,TRNS,TRNS,TRNS,
332 KEYMAP( // LayerN: fully transparent
334 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
335 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
336 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
337 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
338 TRNS,TRNS,TRNS,TRNS,TRNS,
343 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
344 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
345 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
346 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
347 TRNS,TRNS,TRNS,TRNS,TRNS,
356 /* id for user defined functions */
362 * Fn action definition
364 static const uint16_t PROGMEM fn_actions[] = {
365 ACTION_FUNCTION(TEENSY_KEY), // FN0 - Teensy key
367 // Layer4: unconvenient keys on right hand
368 ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN1 = Shifted BackSlash // " in Workman
369 ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // FN2 = Shifted Minus // \ in Workman
370 ACTION_MODS_KEY(MOD_LSFT, KC_COMM), // FN3 = Shifted comma // < in Workman
371 ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // FN4 = Shifted dot // > in Workman
373 // Dual-role keys on thumbs
374 ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPC), // FN5 = LShift with tap BackSpace
375 ACTION_MODS_TAP_KEY(MOD_LSFT, KC_DEL), // FN6 = LCtrl with tap Delete
376 ACTION_MODS_TAP_KEY(MOD_LALT, KC_ESC), // FN7 = LAlt with tap Escape
377 ACTION_MODS_TAP_KEY(MOD_RALT, KC_INS), // FN8 = RAlt with tap Ins
378 ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), // FN9 = RShift with tap Enter
379 ACTION_MODS_TAP_KEY(MOD_RCTL, KC_SPC), // FN10 = RCtrl with tap Space
381 // Dual-role keys on pinkies
382 ACTION_MODS_TAP_KEY(MOD_LSFT, KC_TAB), // FN11 = LShift with tap Tab
383 ACTION_MODS_TAP_KEY(MOD_LCTL, KC_GRV), // FN12 = LCtrl with tap Tilda
384 ACTION_MODS_TAP_KEY(MOD_LALT, KC_SPC), // FN13 = LAlt with tap Space
385 ACTION_MODS_TAP_KEY(MOD_LGUI, KC_ESC), // FN14 = LGui with tap Escape
386 ACTION_MODS_TAP_KEY(MOD_RSFT, KC_QUOT), // FN15 = RShift with tap quotes
387 ACTION_MODS_TAP_KEY(MOD_RCTL, KC_RBRC), // FN16 = RCtrl with tap ]
390 ACTION_LAYER_SET(0, ON_BOTH), // FN17 - set Layer0
391 ACTION_LAYER_SET(1, ON_BOTH), // FN18 - set Layer1, to use Workman layout at firmware level
392 ACTION_LAYER_SET(2, ON_BOTH), // FN19 - set Layer2, to use with Numpad keys
394 ACTION_LAYER_MOMENTARY(2), // UNUSED: FN20 - momentary Layer2, to use with Numpad keys
395 ACTION_LAYER_TAP_KEY(5, KC_F), // FN21 - momentary Layer5, to use with cursor
396 ACTION_LAYER_TAP_KEY(6, KC_SCLN), // FN22 - tapping ; Layer6, to use with F1-F10, Workman-layer switch, Teensy, layer switches
397 ACTION_LAYER_MOMENTARY(7), // UNUSED: FN23 - momentary Layer7, to use with F* keys (F1-F24)
399 ACTION_LAYER_TAP_KEY(4, KC_Z), // FN24 = momentary Layer4 on Z key, to use with unconvenient keys
400 ACTION_LAYER_TAP_KEY(3, KC_X), // FN25 = momentary Layer3 on X key, to use with F* keys
401 ACTION_LAYER_TAP_KEY(8, KC_C), // FN26 = momentary Layer8 on C key, to use with mouse and navigation keys
402 ACTION_LAYER_TAP_KEY(2, KC_V), // FN27 = momentary Layer2 on V key, to use with Numpad keys
404 // i'd like to remove this - will try to get used to live without this and convert them to usual keys
405 ACTION_LAYER_TAP_KEY(4, KC_A), // FN28 = momentary Layer4 on A key, to use with unconvenient keys
406 ACTION_LAYER_TAP_KEY(3, KC_S), // FN29 = momentary Layer3 on S key, to use with F* keys
407 ACTION_LAYER_TAP_KEY(8, KC_D), // FN30 = momentary Layer8 on D key, to use with mouse and navigation keys
408 ACTION_LAYER_TAP_KEY(2, KC_F), // UNUSED: FN31 = momentary Layer2 on F key, to use with Numpad keys
411 void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
413 print("action_function called\n");
414 print("id = "); phex(id); print("\n");
415 print("opt = "); phex(opt); print("\n");
416 if (id == TEENSY_KEY) {
418 print("\n\nJump to bootloader... ");
420 bootloader_jump(); // should not return
421 print("not supported.\n");