]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/ergodox_ez/keymaps/dvorak_42_key/keymap.c
Ergodox EZ and Atreus 42 key dvorak layout updates (#1964)
[qmk_firmware.git] / keyboards / ergodox_ez / keymaps / dvorak_42_key / keymap.c
1 #include QMK_KEYBOARD_H
2 #include "debug.h"
3 #include "action_layer.h"
4 #include "version.h"
5
6
7 // to build this keymap
8 // make ergodox_ez:dvorak_42_key:teensy
9
10 static bool mouse_lock = false;
11
12 enum custom_keycodes {
13   PLACEHOLDER = SAFE_RANGE, // can always be here
14   EPRM,
15   VRSN,
16   RGB_SLD,
17   // shell nav macros
18   SHELL_LS,
19   SHELL_LSLTR,
20   SHELL_CDPRE,
21   SHELL_LESS,
22   SHELL_PLESS,
23   SHELL_PGREP,
24   SHELL_TAILF,  
25   
26   SHELL_PWD,
27   SHELL_H3,
28   SHELL_AMMCOLO,
29   SHELL_SCREENRD,
30   SHELL_SCREEN_NEW,
31   SHELL_SCREEN_LIST,
32   SHELL_MKE,
33 };
34
35
36 #define BASE         0 // base dvorak layer
37 #define KEYNAV       1 // arrow navigation (right hand)
38 #define KEYSEL       2 // arrow navigation + shift (allow text selection)
39 #define SHELL_NAV    3 // bash shortcuts
40 #define SHELL_SCREEN 4 // linux screen shortcuts
41 #define MOUSE        5 // mouse layer (can be locked with lock key)
42 #define COMBINED     6 // combined numbers and symbols layer
43
44 // macros
45 #define MOUSE_TOGGLE 1
46 #define MOUSE_LOCK 2
47 #define SCREEN_TAB_LEFT 4
48 #define SCREEN_TAB_RIGHT 5
49 #define SCREEN_NEW_TAB 6
50 #define SWITCH_NDS 7
51 #define SCREEN_COPY_MODE 8
52 #define SCREEN_PASTE 9
53 #define SCREEN_RENAME 10
54 #define SCREEN_NUMBER 11
55 #define SCREEN_0 12
56 #define SCREEN_1 13
57 #define SCREEN_2 14
58 #define SCREEN_3 15
59 #define SCREEN_4 16
60 #define SCREEN_5 17
61 #define SCREEN_6 18
62 #define SCREEN_7 19
63 #define SCREEN_8 20
64 #define SCREEN_9 21
65 #define SCREEN_DETACH 22
66 #define SHELL_RECALL_LAST_ARG_REMOVE_FIRST_COMMAND 30
67
68
69 #define MACRO_SCREEN_NUM(MACRO_NAME,NUM) \
70         case MACRO_NAME:\
71              if (record->event.pressed) {\
72                 return MACRO( D(LCTL), T(A), U(LCTL), T(NUM), END);\
73             }\
74         break;\
75
76 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
77
78   [BASE] = KEYMAP(
79           // left hand
80           KC_ESC,            KC_F1,         KC_F2,      KC_F3,        KC_F4,   KC_F5,   KC_F6,
81           KC_TAB,            KC_QUOTE,      KC_COMMA,   KC_DOT,       KC_P,    KC_Y,    MEH(KC_2),
82           OSL(SHELL_NAV),    KC_A,          KC_O,       KC_E,         KC_U,    KC_I,
83           OSL(SHELL_SCREEN), KC_SCOLON,     KC_Q,       KC_J,         KC_K,    KC_X,    MEH(KC_3),
84           MEH(KC_1),         OSM(MOD_LSFT), OSM(MOD_LCTL), M(MOUSE_TOGGLE), MO(KEYSEL),
85           
86           // left thumb cluster
87                     MEH(KC_4),      MEH(KC_5),
88                                     MEH(KC_6),
89           MO(COMBINED),MO(KEYNAV),  OSM(MOD_LALT),
90           
91           // right hand
92           KC_F7,     KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, MEH(KC_9),
93           MEH(KC_7), KC_F,  KC_G,  KC_C,   KC_R,   KC_L,   MEH(KC_F1),
94                              KC_D,  KC_H,  KC_T,   KC_N,   KC_S,   MEH(KC_F2),
95           MEH(KC_8), KC_B,  KC_M,  KC_W,   KC_V,   KC_Z,   MEH(KC_F3),
96           KC_BSPC,   RCTL(KC_BSPC), KC_CAPSLOCK, OSM(MOD_LSFT),MEH(KC_F4),
97     
98           // right thumb cluster
99           MEH(KC_F5),MEH(KC_F6),MEH(KC_F7),MEH(KC_F8),KC_ENTER,KC_SPACE
100   
101   ),
102   
103   [KEYNAV] = KEYMAP(
104         // left hand
105         KC_TRNS,KC_TRNS,     KC_TRNS,     KC_TRNS,      KC_TRNS,    KC_TRNS,     KC_TRNS,
106         KC_TRNS,KC_ESC,      MEH(KC_F9),  RCTL(KC_Z),   RCTL(KC_S), MEH(KC_F10), KC_TRNS,
107         KC_TRNS,MEH(KC_F11), MEH(KC_F12), RSFT(KC_TAB), KC_TAB,     MEH(KC_A),
108         KC_TRNS,MEH(KC_B),   MEH(KC_C),   MEH(KC_D),    MEH(KC_E),  MEH(KC_F),   KC_TRNS,
109         KC_TRNS,KC_TRNS,     KC_TRNS,     KC_TRNS,      KC_TRNS,
110         // left thumb cluster
111         KC_TRNS,KC_TRNS,KC_TRNS,TO(MOUSE),KC_TRNS,KC_TRNS,
112         
113         // right hand
114         KC_TRNS,KC_TRNS,       KC_TRNS,    KC_TRNS,         KC_TRNS,    KC_TRNS,         MEH(KC_G),
115         KC_TRNS,KC_NO,         KC_HOME,    KC_UP,           KC_END,     KC_PGUP,         MEH(KC_H),
116                 LCTL(KC_LEFT), KC_LEFT,    KC_DOWN,         KC_RIGHT,   LCTL(KC_RIGHT),  MEH(KC_I),
117         KC_TRNS,KC_NO,         RCTL(KC_C), RCTL(KC_X),      RCTL(KC_V), KC_PGDOWN,       MEH(KC_J),
118                                KC_BSPC,   RCTL(KC_BSPC),    KC_DELETE,  LCTL(KC_DELETE), MEH(KC_K),
119         
120         // right thumb cluster
121         KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS
122   ),  
123   
124         // key selection layer
125         [KEYSEL] = KEYMAP(
126                    // left hand
127                    KC_TRNS,KC_TRNS,   KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,
128                    KC_TRNS,MEH(KC_G), MEH(KC_H),MEH(KC_I), MEH(KC_J), MEH(KC_K), KC_TRNS,
129                    KC_TRNS,MEH(KC_L), MEH(KC_M),MEH(KC_N), MEH(KC_O), MEH(KC_P),
130                    KC_TRNS,MEH(KC_Q), MEH(KC_R),MEH(KC_S), MEH(KC_T), MEH(KC_U), KC_TRNS,
131                                    // bottom row
132                                    KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
133                                                                                    // thumb cluster
134                                                                                    KC_TRNS,KC_TRNS,
135                                                                                                    KC_TRNS,
136                                                                    KC_TRNS,KC_TRNS,KC_TRNS,
137                    // right hand
138                    KC_TRNS,       KC_TRNS,             KC_TRNS,       KC_TRNS,       KC_TRNS,        KC_TRNS,              MEH(KC_Q),
139                    RSFT(KC_PGUP), KC_TRNS,             RSFT(KC_HOME), RSFT(KC_UP),   RSFT(KC_END),   RSFT(KC_PGUP),        MEH(KC_R),
140                                                   RSFT(RCTL(KC_LEFT)), RSFT(KC_LEFT), RSFT(KC_DOWN), RSFT(KC_RIGHT), RSFT(RCTL(KC_RIGHT)), MEH(KC_S),
141                    RSFT(KC_PGDN), KC_TRNS,             RCTL(KC_C),    RCTL(KC_X),    RCTL(KC_V),     RSFT(KC_PGDN),        MEH(KC_T),
142                                         // bottom row
143                                         KC_BSPC,   RCTL(KC_BSPC),    KC_DELETE,  LCTL(KC_DELETE),                                      MEH(KC_U),
144                    // thumb cluster
145                    KC_TRNS, KC_TRNS,
146                    KC_TRNS,
147                    KC_TRNS, KC_TRNS, KC_TRNS
148         ),  
149   
150   // shell navigation layer
151   [SHELL_NAV] = KEYMAP(
152        // left hand
153        KC_TRNS,KC_TRNS,           KC_TRNS,        KC_TRNS,          KC_TRNS,     KC_TRNS,    KC_TRNS,
154        KC_TRNS,KC_TRNS,           SHELL_PGREP,    SHELL_PLESS,      SHELL_LESS,  SHELL_MKE,  SHELL_H3,
155        KC_TRNS,LCTL(KC_A),        SHELL_CDPRE,    SHELL_LSLTR,      SHELL_LS,    SHELL_PWD,
156        KC_TRNS,SHELL_SCREEN_LIST, SHELL_SCREENRD, SHELL_SCREEN_NEW, SHELL_TAILF, KC_TRNS,    SHELL_AMMCOLO,
157                // bottom row
158                KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
159                                        // thumb cluster
160                                        KC_TRNS,KC_TRNS,
161                                                KC_TRNS,
162                                KC_TRNS,KC_TRNS,KC_TRNS,
163        // right hand
164        KC_TRNS,    KC_TRNS,    KC_TRNS,             KC_TRNS,         KC_TRNS,    KC_TRNS,    M(SWITCH_NDS),
165        RCTL(KC_L), KC_TRNS,    KC_HOME,             KC_UP,           KC_END,     KC_TRNS,    RCTL(KC_R),
166                    LALT(KC_B), KC_LEFT,             KC_DOWN,         KC_RIGHT,   LALT(KC_F), LALT(KC_DOT),
167        RCTL(KC_C), KC_TRNS,    M(SCREEN_COPY_MODE), M(SCREEN_PASTE), MEH(KC_V),  RCTL(KC_K), M(SHELL_RECALL_LAST_ARG_REMOVE_FIRST_COMMAND),
168                    // bottom row (match functionality of base layer)
169                    KC_TRNS,    RCTL(KC_W),          KC_TRNS,         LALT(KC_D), RCTL(KC_U),
170        // thumb cluster
171        KC_TRNS, KC_TRNS,
172        KC_TRNS,
173        KC_TRNS, KC_TRNS, KC_TRNS
174   ),
175   
176
177     // linux screen layer
178   [SHELL_SCREEN] = KEYMAP(
179        // left hand
180        KC_TRNS,KC_TRNS,    KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,   KC_TRNS,
181        KC_TRNS,KC_TRNS,    KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,   KC_TRNS,
182        KC_TRNS,KC_TRNS,    KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,
183        KC_TRNS,KC_TRNS,    KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,   KC_TRNS,
184                // bottom row
185                KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
186                                        // thumb cluster
187                                        KC_TRNS,KC_TRNS,
188                                                KC_TRNS,
189                                KC_TRNS,KC_TRNS,KC_TRNS,
190        // right hand
191        KC_TRNS, KC_TRNS,            KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,             KC_TRNS,
192        KC_TRNS, M(SCREEN_NEW_TAB),  M(SCREEN_7), M(SCREEN_8), M(SCREEN_9), M(SCREEN_RENAME),    KC_TRNS,
193                 M(SCREEN_TAB_LEFT), M(SCREEN_4), M(SCREEN_5), M(SCREEN_6), M(SCREEN_TAB_RIGHT), KC_TRNS,
194        KC_TRNS, KC_TRNS,            M(SCREEN_1), M(SCREEN_2), M(SCREEN_3), M(SCREEN_NUMBER),    KC_TRNS,
195                                     // bottom row
196                                     M(SCREEN_0), KC_TRNS,     KC_TRNS,     KC_TRNS,             M(SCREEN_DETACH),
197        // thumb cluster
198        KC_TRNS, KC_TRNS,
199        KC_TRNS,
200        KC_TRNS, KC_TRNS, KC_TRNS
201   ),
202
203   
204   [COMBINED] = KEYMAP(
205   
206         // left hand
207         KC_NO,  KC_TRNS, KC_TRNS,    KC_TRNS,     KC_TRNS,     KC_TRNS,KC_TRNS,
208         KC_TRNS,KC_EXLM, KC_AT,      KC_HASH,     KC_DLR,      KC_PERC,KC_TRNS,
209         KC_TRNS,KC_LPRN, KC_RPRN,    KC_LBRACKET, KC_RBRACKET, KC_UNDS,
210         KC_TRNS,KC_COLN, KC_DQUO,    KC_LCBR,     KC_RCBR,     KC_TRNS,KC_TRNS,
211         // bottom row
212         KC_TRNS,KC_PIPE, KC_BSLS,    KC_CIRC,     KC_AMPR,
213         // thumb cluster
214         KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
215         
216         // right hand
217         KC_TRNS, KC_TRNS,     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,     MEH(KC_L),
218         KC_TRNS, KC_PLUS,     KC_7,    KC_8,    KC_9,    KC_ASTR,     MEH(KC_M),
219                  KC_MINS,     KC_4,    KC_5,    KC_6,    KC_SLSH,     MEH(KC_N),
220         KC_TRNS, KC_EQUAL,    KC_1,    KC_2,    KC_3,    KC_QUES,     MEH(KC_O),
221         // bottom row 
222                               KC_0,    KC_DOT,  KC_TILD, KC_GRAVE,     MEH(KC_P),
223         // thumb cluster
224         KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS),
225   
226   
227         [MOUSE] = KEYMAP(
228                    KC_TRNS, KC_TRNS,      KC_TRNS,       KC_TRNS,       KC_TRNS,      KC_TRNS, KC_TRNS,
229                    KC_TRNS, KC_TRNS,      KC_PGUP,       KC_MS_WH_UP,   KC_UP,        KC_TRNS, KC_TRNS,
230                    KC_TRNS, KC_MS_ACCEL0, KC_PGDN,       KC_MS_WH_DOWN, KC_DOWN,      KC_TRNS,
231                    KC_TRNS, KC_TRNS,      KC_TRNS,       KC_TRNS,       KC_TRNS,      KC_TRNS, KC_TRNS,
232                    KC_TRNS, KC_TRNS,      M(MOUSE_LOCK), KC_TRNS,       KC_MS_ACCEL0,
233                    
234                                                                                            KC_TRNS, KC_TRNS,
235                                                                                                                 KC_TRNS,
236                                                                           KC_TRNS, KC_BTN3, KC_TRNS,
237                 // right hand
238                    KC_TRNS,  KC_TRNS,   KC_TRNS,      KC_TRNS,      KC_TRNS,      KC_TRNS,       KC_TRNS,
239                    KC_TRNS,  KC_UP,     KC_HOME,      KC_MS_U,      KC_END,       KC_MS_WH_UP,   KC_TRNS,
240                                          KC_DOWN,   KC_MS_L,      KC_MS_D,      KC_MS_R,      KC_MS_WH_DOWN, KC_TRNS,
241                    KC_TRNS,  MEH(KC_X), MEH(KC_Y),    MEH(KC_Z),    KC_F5,        RCTL(KC_W),    KC_TRNS,
242                                                                         // browser tab control
243                                                                 RSFT(RCTL(KC_TAB)), RCTL(KC_TAB), RCTL(KC_T), LALT(KC_LEFT), KC_TRNS,
244                    KC_TRNS, KC_TRNS,
245                    KC_TRNS,
246                    KC_TRNS, KC_BTN1, KC_BTN2
247         ),  
248         
249
250 };
251
252 const uint16_t PROGMEM fn_actions[] = {
253   [1] = ACTION_LAYER_TAP_TOGGLE(1)
254 };
255
256 // leaving this in place for compatibilty with old keymaps cloned and re-compiled.
257 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
258 {
259       switch(id) {
260                 case MOUSE_TOGGLE:
261             if (record->event.pressed) {
262                                 layer_on(MOUSE);
263             } else {
264                                 if(!mouse_lock)
265                                         layer_off(MOUSE);
266                         }
267                         break;
268                 case MOUSE_LOCK:
269                         if (record->event.pressed)
270                         {
271                                 if(mouse_lock)
272                                 {
273                                         mouse_lock = false;
274                                         layer_off(MOUSE);
275                                 }
276                                 else
277                                         mouse_lock = true;
278                         }
279                         break;
280         case SCREEN_TAB_LEFT:
281             if (record->event.pressed) {
282                 return MACRO( D(LCTL), T(A), U(LCTL), T(P), END);
283             }        
284             break;
285         case SCREEN_TAB_RIGHT:
286              if (record->event.pressed) {
287                 return MACRO( D(LCTL), T(A), U(LCTL), T(N), END);
288             }                    
289             break;
290         case SCREEN_NEW_TAB:
291              if (record->event.pressed) {
292                 return MACRO( D(LCTL), T(A), U(LCTL), T(C), END);
293             }                                
294         break;
295         case SCREEN_DETACH:
296              if (record->event.pressed) {
297                 return MACRO( D(LCTL), T(A), U(LCTL), T(D), END);
298             }                                
299         break;          
300         case SCREEN_RENAME:
301              if (record->event.pressed) {
302                 return MACRO( D(LCTL), T(A), U(LCTL), D(LSFT), T(A), U(LSFT), END);
303             }                                
304         break;          
305         case SCREEN_NUMBER:
306              if (record->event.pressed) {
307                 return MACRO( D(LCTL), T(A), U(LCTL), D(LSFT), T(SCOLON), U(LSFT),
308                                               T(N),
309                                                           T(U),
310                                                           T(M),
311                                                           T(B),
312                                                           T(E),
313                                                           T(R),
314                                                           T(SPC),
315                                 END);
316             }                                
317         break;          
318
319                 MACRO_SCREEN_NUM(SCREEN_0,0);
320                 MACRO_SCREEN_NUM(SCREEN_1,1);
321                 MACRO_SCREEN_NUM(SCREEN_2,2);
322                 MACRO_SCREEN_NUM(SCREEN_3,3);
323                 MACRO_SCREEN_NUM(SCREEN_4,4);
324                 MACRO_SCREEN_NUM(SCREEN_5,5);
325                 MACRO_SCREEN_NUM(SCREEN_6,6);
326                 MACRO_SCREEN_NUM(SCREEN_7,7);
327                 MACRO_SCREEN_NUM(SCREEN_8,8);
328                 MACRO_SCREEN_NUM(SCREEN_9,9);
329                 
330         case SCREEN_COPY_MODE:
331             if (record->event.pressed) {
332                 return MACRO( D(LCTL), T(A), U(LCTL), T(ESC), END);
333             }
334         break;
335         case SCREEN_PASTE:
336             if (record->event.pressed) {
337                 return MACRO( D(LCTL), T(A), U(LCTL), T(RBRC), END); 
338             }
339         break;        
340         case SWITCH_NDS:
341             if (record->event.pressed) {
342                 return MACRO( D(LSFT), 
343                                                           T(F11), 
344                                                           U(LSFT), 
345                                                           W(255), 
346                                                           D(LALT), 
347                                                           T(TAB), 
348                                                           U(LALT), 
349                                                           END); 
350             }                                
351         break;        
352         case SHELL_RECALL_LAST_ARG_REMOVE_FIRST_COMMAND:
353             if (record->event.pressed) {
354                 return MACRO( T(UP), T(HOME), D(LALT), T(D), U(LALT), END);
355             }
356         break;                                
357       }
358     return MACRO_NONE;
359 };
360
361 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
362   switch (keycode) {
363     // dynamically generate these.
364     case EPRM:
365       if (record->event.pressed) {
366         eeconfig_init();
367       }
368       return false;
369       break;
370     case VRSN:
371       if (record->event.pressed) {
372         SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
373       }
374       return false;
375       break;
376     case RGB_SLD:
377       if (record->event.pressed) {
378         rgblight_mode(1);
379       }
380       return false;
381       break;
382   }
383   
384   // shell macros
385   if(record->event.pressed) {
386         switch (keycode) {
387                 case SHELL_LS:
388                         SEND_STRING("ls\n");
389                         return true;
390                         break;
391                 case SHELL_LSLTR:
392                         SEND_STRING("ls -ltr\n");
393                         return true;
394                         break;
395                 case SHELL_CDPRE:
396                         SEND_STRING("cd ..\n");
397                         return true;
398                         break;
399                 case SHELL_LESS:
400                         SEND_STRING("less ");
401                         return true;
402                         break;
403                 case SHELL_PLESS:
404                         SEND_STRING(" | less");
405                         return true;
406                         break;
407                 case SHELL_PGREP:
408                         SEND_STRING(" | grep ");
409                         return true;
410                         break;                  
411                 case SHELL_TAILF:
412                         SEND_STRING("tail -f ");
413                         return true;
414                         break;
415                 case SHELL_PWD:
416                         SEND_STRING("echo `pwd`/");
417                         return true;
418                         break;                  
419                 case SHELL_H3:
420                         SEND_STRING("h3\n");
421                         return true;
422                         break;                  
423                 case SHELL_AMMCOLO:
424                         SEND_STRING("ammcolo\n");
425                         return true;
426                         break;                  
427                 case SHELL_SCREENRD:
428                         SEND_STRING("screen -r -d ");
429                         return true;
430                         break;                                  
431                 case SHELL_SCREEN_NEW:
432                         SEND_STRING("screen -S ");
433                         return true;
434                         break;
435                 case SHELL_SCREEN_LIST:
436                         SEND_STRING("screen -list\n");
437                         return true;
438                         break;                  
439                 case SHELL_MKE:
440                         SEND_STRING("mke\n");
441                         return true;
442                         break;                  
443         }
444   }
445   
446   return true;
447 }
448
449 void led_set_user(uint8_t usb_led) {
450     if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
451         ergodox_right_led_1_on();
452     } else {
453         ergodox_right_led_1_off();
454     }
455 }
456
457 void matrix_scan_user(void) {
458
459     uint8_t layer = biton32(layer_state);
460
461     ergodox_board_led_off();
462     ergodox_right_led_2_off();
463     ergodox_right_led_3_off();
464     switch (layer) {
465                 case COMBINED:
466                     ergodox_right_led_2_on();           
467                         break;
468             case SHELL_NAV:                     
469                 case SHELL_SCREEN:
470             case KEYNAV:
471                 case KEYSEL:
472                     ergodox_right_led_3_on();
473                         break;
474         case MOUSE:
475             ergodox_right_led_2_on();
476             ergodox_right_led_3_on();
477             break;
478         default:
479             break;
480     }
481
482 };