333fred layout update (#1971)
[jackhill/qmk/firmware.git] / layouts / community / ergodox / 333fred / keymap.c
1 #include QMK_KEYBOARD_H
2 #include "debug.h"
3 #include "action_layer.h"
4 #include "version.h"
5 #include "333fred.h"
6
7 enum custom_keycodes {
8 PLACEHOLDER = SAFE_RANGE, // can always be here
9 EPRM,
10 VRSN,
11 };
12
13 enum custom_macros {
14 VERSION,
15 EEPROM,
16
17 // Windows macros
18 DLEFT,
19 DRIGHT,
20 PSCREEN_APP,
21 LSFT_TAB,
22
23 // VS Macros
24 REFACTOR,
25 TEST,
26 DEBUG_TEST,
27 FORMAT,
28 BUILD,
29 GO_TO_IMPL,
30 FIND_ALL_REF,
31 REMOVE_SORT_USINGS,
32
33 // KeePass macros
34 KEEPASS_OPEN,
35 KEEPASS_TYPE,
36 };
37
38 // NOTE: Cells marked with ACCESS must remain transparent, they're the keys that actually get to that layer
39
40 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
41 /* Keymap 0: Basic layer
42 *
43 * ,--------------------------------------------------. ,--------------------------------------------------.
44 * | ` | 1 | 2 | 3 | 4 | 5 | = | | L1 | 6 | 7 | 8 | 9 | 0 | - |
45 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
46 * | TAB | Q | W | E | R | T | L1 | | L2 | Y | U | I | O | P | \ |
47 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
48 * | Esc | A | S | D |LT 3,F| G |------| |------| H | J | K | L | ; | ' |
49 * |--------+------+------+------+------+------| L2 | |MO(3) |------+------+------+------+------+--------|
50 * | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift |
51 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
52 * |LCTRL | F4 | F5 | LGUI | LALT | | Left | Down | Up | Right| RGUI |
53 * `----------------------------------' `----------------------------------'
54 * ,-------------. ,-------------.
55 * | Copy | Paste| | Copy | Paste |
56 * ,------|------|------| |------+--------+------.
57 * | | | PgUp | | PgDn | | |
58 * | Bcksp|OSL(2)|------| |------| Ent |Space |
59 * | | VIM | Del | | RCtrl| | |
60 * `--------------------' `----------------------'
61 */
62 // If it accepts an argument (i.e, is a function), it doesn't need KC_.
63 // Otherwise, it needs KC_*
64 [BASE] = LAYOUT_ergodox( // layer 0 : default
65 // left hand
66 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_EQL,
67 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(CODE),
68 KC_ESC, KC_A, KC_S, KC_D, LT(VIM, KC_F),KC_G,
69 OSM(MOD_LSFT), CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, TG(SYMB),
70 OSM(MOD_LCTL), KC_F4, KC_F5, KC_LGUI,KC_LALT,
71 LCTL(KC_C), LCTL(KC_V),
72 KC_PGUP,
73 KC_BSPC,TD(TD_SYM_VIM), KC_DEL,
74 // right hand
75 TG(CODE), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
76 TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
77 KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
78 MO(MDIA), KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), OSM(MOD_RSFT),
79 KC_LEFT,KC_DOWN,KC_UP, KC_RIGHT, KC_RGUI,
80 LCTL(KC_C), LCTL(KC_V),
81 KC_PGDN,
82 KC_RCTL, KC_ENT, KC_SPC
83 ),
84 /* Keymap 1: Code Layer
85 *
86 * ,--------------------------------------------------. ,--------------------------------------------------.
87 * | | | | | | | | |ACCESS| | | | | | |
88 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
89 * | | | | | | | F10 | | F11 | | | | | | |
90 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
91 * | | | | | | |------| |------| | | | | | |
92 * |--------+------+------+------+------+------| L2 | | |------+------+------+------+------+--------|
93 * | | | | | | | | | | | | | | | |
94 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
95 * | | | | | | | F12 |GoToIm| FAR | | |
96 * `----------------------------------' `----------------------------------'
97 * ,-------------. ,---------------.
98 * |Format|Build | | Copy | Paste |
99 * ,------|------|------| |------+--------+------.
100 * | | |Refact| |Sort U| | |
101 * | |ACCESS|------| |------| | |
102 * | | | | | | | |
103 * `--------------------' `----------------------'
104 */
105 // If it accepts an argument (i.e, is a function), it doesn't need KC_.
106 // Otherwise, it needs KC_*
107 [CODE] = LAYOUT_ergodox( // layer 1 : code
108 // left hand
109 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
110 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F10,
111 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
112 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TG(SYMB),
113 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
114 M(FORMAT),M(BUILD),
115 M(REFACTOR),
116 KC_TRNS, KC_TRNS, KC_TRNS,
117 // right hand
118
119 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
120 KC_F11, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
121 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
122 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
123 KC_F12, M(GO_TO_IMPL),M(FIND_ALL_REF),KC_TRNS, KC_TRNS,
124 LCTL(KC_C), LCTL(KC_V),
125 M(REMOVE_SORT_USINGS),
126 KC_TRNS, KC_TRNS, KC_TRNS
127 ),
128 /* Keymap 2: Symbol Layer
129 *
130 * ,---------------------------------------------------. ,--------------------------------------------------.
131 * |Version | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
132 * |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
133 * | | ! | @ | ( | ) | | |ACCESS| |ACCESS| Up | 7 | 8 | 9 | * | F12 |
134 * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------|
135 * | | # | $ | { | } | ` |------| |------| Down | 4 | 5 | 6 | + | |
136 * |---------+------+------+------+------+------|ACCESS| | |------+------+------+------+------+--------|
137 * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
138 * `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
139 * | EPRM | | | | | | 0 | 0 | . | = | |
140 * `-----------------------------------' `----------------------------------'
141 * ,-------------. ,-------------.
142 * | | Caps | | | |
143 * ,------|------|------| |------+------+------.
144 * | | |APScr | | | | |
145 * | |ACCESS|------| |------| | |
146 * | | | PScr | |ACCESS| | |
147 * `--------------------' `--------------------'
148 */
149 // SYMBOLS
150 [SYMB] = LAYOUT_ergodox(
151 // left hand
152 VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
153 KC_TRNS,KC_EXLM,KC_AT, KC_LPRN,KC_RPRN,KC_PIPE,KC_TRNS,
154 KC_TRNS,KC_HASH,KC_DLR, KC_LCBR,KC_RCBR,KC_GRV,
155 KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
156 EPRM,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
157 KC_TRNS,KC_CAPS,
158 M(PSCREEN_APP),
159 KC_TRNS,KC_TRNS,KC_PSCR,
160 // right hand
161 KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
162 KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
163 KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
164 KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
165 KC_0, KC_0, KC_DOT, KC_EQL, KC_TRNS,
166 KC_TRNS, KC_TRNS,
167 KC_TRNS,
168 KC_TRNS, KC_TRNS, KC_TRNS
169 ),
170 /* Keymap 3: Media and mouse keys
171 *
172 * ,--------------------------------------------------. ,--------------------------------------------------.
173 * | | | | | | | | | | | | | | | |
174 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
175 * | | | | MsUp | | | | | | | | | | | |
176 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
177 * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | |
178 * |--------+------+------+------+------+------| | |ACCESS|------+------+------+------+------+--------|
179 * | | | | | | | | | | | | | | | |
180 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
181 * | | | | Lclk | Rclk | | | | | | |
182 * `----------------------------------' `----------------------------------'
183 * ,-------------. ,-------------.
184 * | Back+| Back-| | Vol+ | |
185 * ,------|------|------| |------+------+------.
186 * | | |BackTg| | Vol- | | |
187 * | | |------| |------| PL/PS| Next |
188 * | | | | | Back | | |
189 * `--------------------' `--------------------'
190 */
191 // MEDIA AND MOUSE
192 [MDIA] = LAYOUT_ergodox(
193 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
194 KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
195 KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
196 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
197 KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
198 BL_INC, BL_DEC,
199 BL_TOGG,
200 KC_TRNS, KC_TRNS, KC_TRNS,
201 // right hand
202 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
203 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
204 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
205 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
206 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
207 KC_VOLU, KC_TRNS,
208 KC_VOLD,
209 KC_MPRV, KC_MPLY, KC_MNXT
210 ),
211 /* Keymap 4: Movement
212 *
213 * ,--------------------------------------------------. ,--------------------------------------------------.
214 * | | | | | | | | | | | | | | | |
215 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
216 * | |KOpen |KType |LSHFT | | | | | | Copy | | | | Paste| |
217 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
218 * | |DLeft |DRight|LCTRL | LGUI | |------| |------| Left | Down | Up | Right| | |
219 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
220 * | |SFT_TB| TAB | | | | | | | | | | | | |
221 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
222 * | | | | | | | | | | | |
223 * `----------------------------------' `----------------------------------'
224 * ,-------------. ,-------------.
225 * | | | | Home | End |
226 * ,------|------|------| |------+------+------.
227 * | | | | | | | |
228 * | |ACCESS|------| |------| | |
229 * | | | | | | | |
230 * `--------------------' `--------------------'
231 */
232 // MEDIA AND MOUSE
233 [VIM] = LAYOUT_ergodox(
234 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
235 KC_TRNS, M(KEEPASS_OPEN),M(KEEPASS_TYPE),KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS,
236 KC_TRNS, M(DLEFT), M(DRIGHT), KC_LCTL, KC_LGUI, KC_TRNS,
237 KC_TRNS, M(LSFT_TAB), KC_TAB, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
238 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
239 KC_TRNS, KC_TRNS,
240 KC_TRNS,
241 KC_TRNS, KC_TRNS, KC_TRNS,
242 // right hand
243 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
244 KC_TRNS, LCTL(KC_C),KC_TRNS, KC_TRNS, KC_TRNS, LCTL(KC_V),KC_TRNS,
245 KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,KC_TRNS, KC_TRNS,
246 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
247 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
248 KC_HOME, KC_END,
249 KC_TRNS,
250 KC_TRNS, KC_TRNS, KC_TRNS
251
252 )
253 };
254
255 const uint16_t PROGMEM fn_actions[] = {
256 [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
257 };
258
259 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
260 {
261 // MACRODOWN only works in this function
262 switch(id) {
263 case VERSION:
264 if (record->event.pressed) {
265 SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
266 }
267 break;
268 case EEPROM:
269 if (record->event.pressed) { // For resetting EEPROM
270 eeconfig_init();
271 }
272 break;
273 case DLEFT:
274 if (record->event.pressed) { // Windows move desktop left
275 return MACRO(D(LCTL), D(LGUI), T(LEFT), U(LGUI), U(LCTL), END);
276 }
277 break;
278 case DRIGHT:
279 if (record->event.pressed) { // Windows move desktop right
280 return MACRO(D(LCTL), D(LGUI), T(RIGHT), U(LGUI), U(LCTL), END);
281 }
282 break;
283 case PSCREEN_APP:
284 if (record->event.pressed) {
285 return MACRO(D(LALT), T(PSCR), U(LALT), END);
286 }
287 break;
288 case LSFT_TAB:
289 if (record->event.pressed) {
290 return MACRO(D(LSFT), T(TAB), U(LSFT), END);
291 }
292 case REFACTOR:
293 if (record->event.pressed) { // VS Refactor CTRL+R, R
294 return MACRO(D(LCTL), T(R), U(LCTL), T(R), END);
295 }
296 break;
297 case TEST:
298 if (record->event.pressed) { // VS Run Tests CTRL+R, T
299 return MACRO(D(LCTL), T(R), U(LCTL), T(T), END);
300 }
301 break;
302 case DEBUG_TEST:
303 if (record->event.pressed) { // VS Debug Tests CTRL+R, CTRL+T
304 return MACRO(D(LCTL), T(R), T(T), U(LCTL), END);
305 }
306 break;
307 case FORMAT:
308 if (record->event.pressed) { // VS Format Document, CTRL+K, CTRL+D
309 return MACRO(D(LCTL), T(K), T(D), U(LCTL), END);
310 }
311 break;
312 case BUILD:
313 if (record->event.pressed) { // VS Build. Sends CTRL+SHFT+B
314 return MACRO(D(LCTL), D(LSFT), T(B), U(LSFT), U(LCTL), END);
315 }
316 break;
317 case GO_TO_IMPL:
318 if (record->event.pressed) { // VS Go To Implementation. Sends CTRL+F12
319 return MACRO(D(LCTL), T(F12), U(LCTL), END);
320 }
321 break;
322 case FIND_ALL_REF:
323 if (record->event.pressed) { // VS Find All References. Sends CTRL+K, R
324 return MACRO(D(LCTL), T(K), U(LCTL), T(R), END);
325 }
326 break;
327 case REMOVE_SORT_USINGS:
328 if (record->event.pressed) {
329 return MACRO(D(LCTL), T(R), T(G), U(LCTL), END);
330 }
331 break;
332 case KEEPASS_OPEN:
333 if (record->event.pressed) { // Keepass open application
334 return MACRO(D(LCTL), D(LALT), T(K), U(LALT), U(LCTL), END);
335 }
336 break;
337 case KEEPASS_TYPE:
338 if (record->event.pressed) { // Keepass autotype
339 return MACRO(D(LCTL), D(LALT), T(A), U(LALT), U(LCTL), END);
340 }
341 break;
342 }
343 return MACRO_NONE;
344 };
345
346 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
347 tap_dance_process_record(keycode);
348 switch (keycode) {
349 // dynamically generate these.
350 case EPRM:
351 if (record->event.pressed) {
352 eeconfig_init();
353 }
354 return false;
355 break;
356 case VRSN:
357 if (record->event.pressed) {
358 SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
359 }
360 return false;
361 break;
362 }
363 return true;
364 }
365
366 // Runs just one time when the keyboard initializes.
367 void matrix_init_user(void) {
368
369 };
370
371
372 // Runs constantly in the background, in a loop.
373 void matrix_scan_user(void) {
374 ergodox_board_led_on();
375 ergodox_led_all_on();
376 };
377