]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/ergodox_ez/keymaps/dvorak_42_key/keymap.c
Keymap: Cleanups on the ergodox EZ / atreus dvorak 42 key layouts (#3887)
[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 // flashing from rpi:
10 // sudo teensy_loader_cli -v -w .build/ergodox_ez_dvorak_42_key.hex --mcu atmega32u4
11
12 // keeping fork up to date:
13 // https://help.github.com/articles/configuring-a-remote-for-a-fork/
14 // https://help.github.com/articles/syncing-a-fork/
15 // pushing dev branch
16 // git push origin dev:dev
17
18 enum custom_keycodes {
19   PLACEHOLDER = SAFE_RANGE, // can always be here
20   EPRM,
21   VRSN,
22   RGB_SLD,
23   // shell nav macros
24   SHELL_LS,
25   SHELL_LSLTR,
26   SHELL_LSLA,
27   SHELL_CDPRE,
28   SHELL_LESS,
29   SHELL_PLESS,
30   SHELL_PGREP,
31   SHELL_TAILF,
32
33   SHELL_PWD,
34   SHELL_H3,
35   SHELL_AMMCOLO,
36   SHELL_SCREENRD,
37   SHELL_SCREEN_NEW,
38   SHELL_SCREEN_LIST,
39   SHELL_MKE,
40   SHELL_HTCSTATUS,
41   SHELL_HTCBOUNCE,
42   SHELL_DUMPTLOG,
43
44   SHELL_EXPAND_OE_LOGPATTERN,
45   SHELL_EXPAND_OE_TRANPATTERN,
46   
47   // Cloud9 macros
48   CLOUD9_TAB_LEFT,
49   CLOUD9_TAB_RIGHT,
50   CLOUD9_TAB_CLOSE,
51   CLOUD9_GOTO_SYMBOL,
52   CLOUD9_GOTO_LINE,
53   CLOUD9_NAVIGATE,
54
55 };
56
57
58 #define BASE         0 // base dvorak layer
59 #define KEYNAV       1 // arrow navigation (right hand)
60 #define KEYSEL       2 // arrow navigation + shift (allow text selection)
61 #define SHELL_NAV    3 // bash shortcuts
62 #define SHELL_SCREEN 4 // linux screen shortcuts
63 #define SCREEN_NAV   5 // navigate between linux screen tabs 
64 #define BROWSER_CONTROL 6 // control browser and mouse
65 #define COMBINED        7 // combined numbers and symbols layer
66
67
68 // macros
69 #define SCREEN_TAB_LEFT 4
70 #define SCREEN_TAB_RIGHT 5
71 #define SCREEN_NEW_TAB 6
72 #define SCREEN_COPY_MODE 8
73 #define SCREEN_PASTE 9
74 #define SCREEN_RENAME 10
75 #define SCREEN_NUMBER 11
76 #define SCREEN_0 12
77 #define SCREEN_1 13
78 #define SCREEN_2 14
79 #define SCREEN_3 15
80 #define SCREEN_4 16
81 #define SCREEN_5 17
82 #define SCREEN_6 18
83 #define SCREEN_7 19
84 #define SCREEN_8 20
85 #define SCREEN_9 21
86 #define SCREEN_DETACH 22
87 #define SCREEN_UP_JUMP 23
88 #define SCREEN_DOWN_JUMP 24
89 #define SCREEN_READREG_1 25
90 #define SCREEN_READREG_2 26
91 #define SCREEN_READREG_3 27
92 #define SCREEN_PASTEREG_1 28
93 #define SCREEN_PASTEREG_2 29
94 #define SCREEN_PASTEREG_3 30
95 #define DEL_TO_HOME 36
96
97
98
99
100 #define MACRO_SCREEN_NUM(MACRO_NAME,NUM) \
101         case MACRO_NAME:\
102              if (record->event.pressed) {\
103                 return MACRO( D(LCTL), T(A), U(LCTL), T(NUM), END);\
104             }\
105         break;\
106
107 #define MACRO_SCREEN_REG(MACRO_NAME,NUM) \
108         case MACRO_NAME:\
109              if (record->event.pressed) {\
110                 return MACRO( D(LCTL), T(A), U(LCTL), D(LSFT), T(SCOLON), U(LSFT),\
111                               T(R),\
112                               T(E),\
113                               T(A),\
114                               T(D),\
115                               T(R),\
116                               T(E),\
117                                                           T(G),\
118                               T(SPC),\
119                                                           T(NUM),\
120                                                           T(ENTER),\
121                              END);\
122             }\
123         break;\
124
125 #define MACRO_SCREEN_PASTE(MACRO_NAME,NUM)\
126         case MACRO_NAME:\
127              if (record->event.pressed) {\
128                 return MACRO( D(LCTL), T(A), U(LCTL), D(LSFT), T(SCOLON), U(LSFT),\
129                               T(P),\
130                               T(A),\
131                               T(S),\
132                               T(T),\
133                               T(E),\
134                               T(SPC),\
135                                                           T(NUM),\
136                                                           T(ENTER),\
137                              END);\
138             }\
139         break;\
140
141 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
142
143   [BASE] = LAYOUT_ergodox(
144       // left hand
145       KC_ESC,            KC_F1,         KC_F2,      KC_F3,        KC_F4,   KC_F5,   KC_F6,
146       OSL(SCREEN_NAV),   KC_QUOTE,      KC_COMMA,   KC_DOT,       KC_P,    KC_Y,    MEH(KC_2),
147       OSL(SHELL_NAV),    KC_A,          KC_O,       KC_E,         KC_U,    KC_I,
148       OSL(SHELL_SCREEN), KC_SCOLON,     KC_Q,       KC_J,         KC_K,    KC_X,    MEH(KC_3),
149       MEH(KC_1),         OSM(MOD_LSFT), OSM(MOD_LCTL), MO(KEYSEL), MO(BROWSER_CONTROL),
150
151       // left thumb cluster
152                 MEH(KC_4),      MEH(KC_5),
153                                 MEH(KC_6),
154       MO(COMBINED),MO(KEYNAV),  OSM(MOD_LALT),
155
156       // right hand
157       KC_F7,     KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, MEH(KC_9),
158       MEH(KC_7), KC_F,  KC_G,  KC_C,   KC_R,   KC_L,   KC_TAB,
159                  KC_D,  KC_H,  KC_T,   KC_N,   KC_S,   RCTL(KC_BSPC),
160       MEH(KC_8), KC_B,  KC_M,  KC_W,   KC_V,   KC_Z,   MEH(KC_F3),
161       KC_BSPC,   RCTL(KC_BSPC), KC_CAPSLOCK, OSM(MOD_LSFT),MEH(KC_F4),
162
163       // right thumb cluster
164       MEH(KC_F5),MEH(KC_F6),MEH(KC_F7),MEH(KC_F8),KC_ENTER,KC_SPACE
165
166   ),
167
168   [KEYNAV] = LAYOUT_ergodox(
169     // left hand
170     KC_TRNS,KC_TRNS,     KC_TRNS,            KC_TRNS,         KC_TRNS,          KC_TRNS,          KC_TRNS,
171     KC_TRNS,KC_ESC,      CLOUD9_GOTO_LINE,   RCTL(KC_Z),      RCTL(KC_S),       MEH(KC_F10),      KC_TRNS,
172     KC_TRNS,KC_LSFT,     CLOUD9_GOTO_SYMBOL, RSFT(KC_TAB),    KC_TAB,           MEH(KC_A),
173     KC_TRNS,MEH(KC_B),   CLOUD9_NAVIGATE,    CLOUD9_TAB_LEFT, CLOUD9_TAB_RIGHT, CLOUD9_TAB_CLOSE, KC_TRNS,
174     KC_TRNS,KC_TRNS,     KC_TRNS,            KC_TRNS,         KC_TRNS,
175     // left thumb cluster
176     KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
177
178
179     // right hand
180     KC_TRNS,KC_TRNS,       KC_TRNS,    KC_TRNS,         KC_TRNS,    KC_TRNS,         MEH(KC_G),
181     KC_TRNS,KC_NO,         KC_HOME,    KC_UP,           KC_END,     KC_PGUP,         MEH(KC_H),
182             LCTL(KC_LEFT), KC_LEFT,    KC_DOWN,         KC_RIGHT,   LCTL(KC_RIGHT),  MEH(KC_I),
183     KC_TRNS,M(DEL_TO_HOME),RCTL(KC_C), RCTL(KC_X),      RCTL(KC_V), KC_PGDOWN,       MEH(KC_J),
184                            KC_BSPC,   RCTL(KC_BSPC),    KC_DELETE,  LCTL(KC_DELETE), MEH(KC_K),
185
186     // right thumb cluster
187     KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS
188   ),
189
190     // key selection layer
191     [KEYSEL] = LAYOUT_ergodox(
192            // left hand
193            KC_TRNS,KC_TRNS,   KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS,
194            KC_TRNS,MEH(KC_G), MEH(KC_H),MEH(KC_I), MEH(KC_J), MEH(KC_K), KC_TRNS,
195            KC_TRNS,MEH(KC_L), MEH(KC_M),MEH(KC_N), MEH(KC_O), MEH(KC_P),
196            KC_TRNS,MEH(KC_Q), MEH(KC_R),MEH(KC_S), MEH(KC_T), MEH(KC_U), KC_TRNS,
197                    // bottom row
198                    RESET,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
199                                            // thumb cluster
200                                            KC_TRNS,KC_TRNS,
201                                                    KC_TRNS,
202                                    KC_TRNS,KC_TRNS,KC_TRNS,
203            // right hand
204            KC_TRNS,       KC_TRNS,             KC_TRNS,       KC_TRNS,       KC_TRNS,        KC_TRNS,              MEH(KC_Q),
205            RSFT(KC_PGUP), KC_TRNS,             RSFT(KC_HOME), RSFT(KC_UP),   RSFT(KC_END),   RSFT(KC_PGUP),        MEH(KC_R),
206                           RSFT(RCTL(KC_LEFT)), RSFT(KC_LEFT), RSFT(KC_DOWN), RSFT(KC_RIGHT), RSFT(RCTL(KC_RIGHT)), MEH(KC_S),
207            RSFT(KC_PGDN), KC_TRNS,             RCTL(KC_C),    RCTL(KC_X),    RCTL(KC_V),     RSFT(KC_PGDN),        MEH(KC_T),
208                     // bottom row
209                     KC_BSPC,   RCTL(KC_BSPC),    KC_DELETE,  LCTL(KC_DELETE),                                      MEH(KC_U),
210            // thumb cluster
211            KC_TRNS, KC_TRNS,
212            KC_TRNS,
213            KC_TRNS, KC_TRNS, KC_TRNS
214     ),
215
216   // shell navigation layer
217   [SHELL_NAV] = LAYOUT_ergodox(
218        // left hand
219        KC_NO,  KC_TRNS,           KC_TRNS,        KC_TRNS,          KC_TRNS,     KC_TRNS,         KC_TRNS,
220        KC_TRNS,KC_TRNS,           SHELL_PGREP,    SHELL_PLESS,      SHELL_LESS,  SHELL_HTCBOUNCE, SHELL_H3,
221        KC_TRNS,SHELL_MKE,         SHELL_CDPRE,    SHELL_LSLTR,      SHELL_LS,    SHELL_LSLA,
222        KC_TRNS,SHELL_SCREEN_LIST, SHELL_SCREENRD, SHELL_SCREEN_NEW, SHELL_TAILF, SHELL_HTCSTATUS, SHELL_AMMCOLO,
223                // bottom row
224                KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
225                                        // thumb cluster
226                                        KC_TRNS,KC_TRNS,
227                                                KC_TRNS,
228                                KC_TRNS,KC_TRNS,KC_TRNS,
229        // right hand
230        KC_TRNS,    KC_TRNS,    KC_TRNS,             KC_TRNS,         KC_TRNS,    KC_TRNS,    SHELL_EXPAND_OE_TRANPATTERN,
231        RCTL(KC_L), RCTL(KC_W), KC_HOME,             KC_UP,           KC_END,     KC_TRNS,    SHELL_EXPAND_OE_LOGPATTERN,
232                    LALT(KC_B), KC_LEFT,             KC_DOWN,         KC_RIGHT,   LALT(KC_F), RCTL(KC_W),
233        RCTL(KC_C), RCTL(KC_U), LALT(KC_DOT),        RCTL(KC_R),      KC_BTN2,    RCTL(KC_K), SHELL_DUMPTLOG,
234                    // bottom row (match functionality of base layer)
235                    KC_BSPC,    RCTL(KC_W),          KC_DELETE,       LALT(KC_D), RCTL(KC_U),
236        // thumb cluster
237        KC_TRNS, KC_TRNS,
238        KC_TRNS,
239        KC_TRNS, KC_TRNS, KC_TRNS
240   ),
241
242
243     // linux screen layer
244   [SHELL_SCREEN] = LAYOUT_ergodox(
245        // left hand
246        KC_NO,  KC_TRNS,    KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,   KC_TRNS,
247        KC_TRNS,KC_TRNS,    KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,   KC_TRNS,
248        KC_TRNS,KC_TRNS,    KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,
249        KC_TRNS,KC_TRNS,    KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,   KC_TRNS,
250                // bottom row
251                KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
252                                        // thumb cluster
253                                        KC_TRNS,KC_TRNS,
254                                                KC_TRNS,
255                                KC_TRNS,KC_TRNS,KC_TRNS,
256        // right hand
257        KC_TRNS, KC_TRNS,            KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,             KC_TRNS,
258        KC_TRNS, M(SCREEN_NEW_TAB),  M(SCREEN_7), M(SCREEN_8), M(SCREEN_9), M(SCREEN_RENAME),    KC_TRNS,
259                 M(SCREEN_TAB_LEFT), M(SCREEN_4), M(SCREEN_5), M(SCREEN_6), M(SCREEN_TAB_RIGHT), KC_TRNS,
260        KC_TRNS, KC_TRNS,            M(SCREEN_1), M(SCREEN_2), M(SCREEN_3), M(SCREEN_NUMBER),    KC_TRNS,
261                                     // bottom row
262                                     M(SCREEN_0), KC_TRNS,     KC_TRNS,     KC_TRNS,             M(SCREEN_DETACH),
263        // thumb cluster
264        KC_TRNS, KC_TRNS,
265        KC_TRNS,
266        KC_TRNS, KC_TRNS, KC_TRNS
267   ),
268
269   // navigation within screen (for copy/paste)
270   [SCREEN_NAV] = LAYOUT_ergodox(
271        // left hand
272        // left hand
273        KC_NO,  KC_TRNS,    KC_TRNS,              KC_TRNS,                 KC_TRNS,               KC_TRNS,   KC_TRNS,
274        KC_TRNS,KC_TRNS,    M(SCREEN_READREG_3),  M(SCREEN_READREG_2),  M(SCREEN_READREG_1),   KC_TRNS,   KC_TRNS,
275        KC_TRNS,KC_TRNS,    M(SCREEN_PASTEREG_3), M(SCREEN_PASTEREG_2), M(SCREEN_PASTEREG_1),  KC_TRNS,
276        KC_TRNS,KC_TRNS,    KC_TRNS,                      KC_TRNS,             KC_TRNS,               KC_TRNS,   KC_TRNS,
277                // bottom row
278                KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
279                                        // thumb cluster
280                                        KC_TRNS,KC_TRNS,
281                                                KC_TRNS,
282                                KC_TRNS,KC_TRNS,KC_TRNS,
283        // right hand
284        KC_TRNS,    KC_TRNS,    KC_TRNS,        KC_TRNS,         KC_TRNS,         KC_TRNS,                 KC_TRNS,
285        KC_TRNS,    KC_TRNS,    KC_0,           KC_UP,           KC_DLR,          M(SCREEN_UP_JUMP),   KC_TRNS,
286                    KC_B,       KC_LEFT,        KC_DOWN,         KC_RIGHT,        KC_W,                    M(SCREEN_COPY_MODE),
287        KC_TRNS,    KC_TRNS,    S(KC_W),        S(KC_Y),         M(SCREEN_PASTE), M(SCREEN_DOWN_JUMP), MEH(KC_V),
288                    // bottom row (match functionality of base layer)
289                    KC_TRNS,    KC_TRNS,        KC_TRNS,         KC_TRNS,    KC_TRNS,
290        // thumb cluster
291        KC_TRNS, KC_TRNS,
292        KC_TRNS,
293        KC_TRNS, KC_TRNS, KC_TRNS
294   ),
295
296
297
298
299   [COMBINED] = LAYOUT_ergodox(
300
301     // left hand
302     KC_NO,  KC_TRNS, KC_TRNS,    KC_TRNS,     KC_TRNS,     KC_TRNS, KC_TRNS,
303     KC_TRNS,KC_EXLM, KC_AT,      KC_HASH,     KC_DLR,      KC_PERC, KC_TRNS,
304     KC_TRNS,KC_LPRN, KC_RPRN,    KC_LBRACKET, KC_RBRACKET, KC_UNDS,
305     KC_TRNS,KC_COLN, KC_DQUO,    KC_LCBR,     KC_RCBR,     KC_AMPR, KC_TRNS,
306     // bottom row
307     KC_TRNS,KC_TRNS, KC_TILD,    KC_GRAVE,    KC_CIRC,
308     // thumb cluster
309     KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
310
311     // right hand
312     KC_TRNS, KC_TRNS,     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,     MEH(KC_L),
313     KC_TRNS, KC_PLUS,     KC_7,    KC_8,    KC_9,    KC_ASTR,     MEH(KC_M),
314              KC_MINS,     KC_4,    KC_5,    KC_6,    KC_SLSH,     MEH(KC_N),
315     KC_TRNS, KC_EQUAL,    KC_1,    KC_2,    KC_3,    KC_QUES,     MEH(KC_O),
316     // bottom row
317                           KC_0,    KC_DOT,  KC_PIPE, KC_BSLS,     MEH(KC_P),
318     // thumb cluster
319     KC_TRNS,KC_TRNS,
320         KC_TRNS,
321         KC_TRNS,KC_TRNS,KC_TRNS),
322   
323   
324     [BROWSER_CONTROL] = LAYOUT_ergodox(
325                    // left hand
326            KC_TRNS, KC_TRNS,      KC_TRNS,       KC_TRNS,       KC_TRNS,      KC_TRNS, KC_TRNS,
327            KC_TRNS, KC_TRNS,      KC_BTN3,       KC_MS_U,       KC_BTN1,      KC_BTN2, KC_TRNS,
328            KC_TRNS, KC_TRNS,      KC_MS_L,       KC_MS_D,       KC_MS_R,      KC_TRNS,
329            KC_TRNS, KC_TRNS,      KC_TRNS,       KC_TRNS,       KC_TRNS,      KC_TRNS, KC_TRNS,
330                    // bottom row
331            KC_TRNS, KC_TRNS,      KC_TRNS,       KC_TRNS,       KC_TRNS,
332
333                                                KC_TRNS, KC_TRNS,
334                                                         KC_TRNS,
335                                       KC_TRNS, KC_TRNS, KC_TRNS,
336           // right hand
337            KC_TRNS,  KC_TRNS,   KC_TRNS,            KC_TRNS,      KC_TRNS,       KC_TRNS,       KC_TRNS,
338            KC_TRNS,  KC_UP,     KC_PGUP,            KC_PGDN,      KC_MS_WH_UP,   KC_TRNS,       KC_TRNS,
339                      KC_DOWN,   RSFT(RCTL(KC_TAB)), RCTL(KC_TAB), KC_MS_WH_DOWN, LALT(KC_LEFT), KC_TRNS,
340            KC_TRNS,  KC_TRNS,   RCTL(KC_1),         RCTL(KC_9),   KC_F6,         KC_F5,         KC_TRNS,
341                                 // bottom row
342                                 KC_TRNS,            KC_TRNS,      KC_TRNS,       KC_TRNS,       KC_TRNS,
343            KC_TRNS, KC_TRNS,
344            KC_TRNS,
345            KC_TRNS, RCTL(KC_W), RCTL(KC_T)
346     ),
347
348
349 };
350
351 const uint16_t PROGMEM fn_actions[] = {
352   [1] = ACTION_LAYER_TAP_TOGGLE(1)
353 };
354
355 // leaving this in place for compatibilty with old keymaps cloned and re-compiled.
356 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
357 {
358       switch(id) {
359         case SCREEN_TAB_LEFT:
360             if (record->event.pressed) {
361                 return MACRO( D(LCTL), T(A), U(LCTL), T(P), END);
362             }
363             break;
364         case SCREEN_TAB_RIGHT:
365              if (record->event.pressed) {
366                 return MACRO( D(LCTL), T(A), U(LCTL), T(N), END);
367             }
368             break;
369         case SCREEN_NEW_TAB:
370              if (record->event.pressed) {
371                 return MACRO( D(LCTL), T(A), U(LCTL), T(C), END);
372             }
373         break;
374         case SCREEN_DETACH:
375              if (record->event.pressed) {
376                 return MACRO( D(LCTL), T(A), U(LCTL), T(D), END);
377             }
378         break;
379         case SCREEN_RENAME:
380              if (record->event.pressed) {
381                 return MACRO( D(LCTL), T(A), U(LCTL), D(LSFT), T(A), U(LSFT), END);
382             }
383         break;
384         case SCREEN_NUMBER:
385              if (record->event.pressed) {
386                 return MACRO( D(LCTL), T(A), U(LCTL), D(LSFT), T(SCOLON), U(LSFT),
387                               T(N),
388                               T(U),
389                               T(M),
390                               T(B),
391                               T(E),
392                               T(R),
393                               T(SPC),
394                              END);
395             }
396         break;
397
398                 MACRO_SCREEN_REG(SCREEN_READREG_1,1);
399                 MACRO_SCREEN_REG(SCREEN_READREG_2,2);
400                 MACRO_SCREEN_REG(SCREEN_READREG_3,3);
401
402                 MACRO_SCREEN_PASTE(SCREEN_PASTEREG_1,1);
403                 MACRO_SCREEN_PASTE(SCREEN_PASTEREG_2,2);
404                 MACRO_SCREEN_PASTE(SCREEN_PASTEREG_3,3);
405
406         MACRO_SCREEN_NUM(SCREEN_0,0);
407         MACRO_SCREEN_NUM(SCREEN_1,1);
408         MACRO_SCREEN_NUM(SCREEN_2,2);
409         MACRO_SCREEN_NUM(SCREEN_3,3);
410         MACRO_SCREEN_NUM(SCREEN_4,4);
411         MACRO_SCREEN_NUM(SCREEN_5,5);
412         MACRO_SCREEN_NUM(SCREEN_6,6);
413         MACRO_SCREEN_NUM(SCREEN_7,7);
414         MACRO_SCREEN_NUM(SCREEN_8,8);
415         MACRO_SCREEN_NUM(SCREEN_9,9);
416
417                 case SCREEN_UP_JUMP:
418             if (record->event.pressed) {
419                 return MACRO( T(5), T(UP), END);
420             }
421                 break;
422
423                 case SCREEN_DOWN_JUMP:
424             if (record->event.pressed) {
425                 return MACRO( T(5), T(DOWN), END);
426             }
427                 break;
428
429         case SCREEN_COPY_MODE:
430             if (record->event.pressed) {
431                 return MACRO( D(LCTL), T(A), U(LCTL), T(ESC), END);
432             }
433         break;
434         case SCREEN_PASTE:
435             if (record->event.pressed) {
436                 return MACRO( D(LCTL), T(A), U(LCTL), T(RBRC), END);
437             }
438         break;        
439
440         case DEL_TO_HOME:
441             if (record->event.pressed) {
442                 return MACRO( 
443                                 // delete to the beginning of the line
444                                 D(LSFT), T(HOME), U(LSFT),
445                                 T(DELETE),
446                                 END);
447             }                           
448             break;              
449
450    
451       }
452     return MACRO_NONE;
453 };
454
455 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
456   switch (keycode) {
457     // dynamically generate these.
458     case EPRM:
459       if (record->event.pressed) {
460         eeconfig_init();
461       }
462       return false;
463       break;
464     case VRSN:
465       if (record->event.pressed) {
466         SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
467       }
468       return false;
469       break;
470     case RGB_SLD:
471       if (record->event.pressed) {
472         rgblight_mode(1);
473       }
474       return false;
475       break;
476   }
477
478   // shell macros
479   if(record->event.pressed) {
480     switch (keycode) {
481         case SHELL_LS:
482             SEND_STRING("ls\n");
483             return true;
484             break;
485         case SHELL_LSLTR:
486             SEND_STRING("ls -ltr\n");
487             return true;
488             break;
489         case SHELL_LSLA:
490             SEND_STRING("ls -la\n");
491             return true;
492             break;
493         case SHELL_CDPRE:
494             SEND_STRING("cd ..\n");
495             return true;
496             break;
497         case SHELL_LESS:
498             SEND_STRING("less ");
499             return true;
500             break;
501         case SHELL_PLESS:
502             SEND_STRING(" | less");
503             return true;
504             break;
505         case SHELL_PGREP:
506             SEND_STRING(" | grep ");
507             return true;
508             break;
509         case SHELL_TAILF:
510             SEND_STRING("tail -f ");
511             return true;
512             break;
513         case SHELL_PWD:
514             SEND_STRING("echo `pwd`/");
515             return true;
516             break;
517         case SHELL_H3:
518             SEND_STRING("h3\n");
519             return true;
520             break;
521         case SHELL_AMMCOLO:
522             SEND_STRING("ammcolo\n");
523             return true;
524             break;
525         case SHELL_SCREENRD:
526             SEND_STRING("screen -r -d ");
527             return true;
528             break;
529         case SHELL_SCREEN_NEW:
530             SEND_STRING("screen -S ");
531             return true;
532             break;
533         case SHELL_SCREEN_LIST:
534             SEND_STRING("screen -list\n");
535             return true;
536             break;
537         case SHELL_MKE:
538             SEND_STRING("mki -j8\n");
539             return true;
540             break;
541         case SHELL_HTCSTATUS:
542             SEND_STRING("htcStatus -j ");
543             return true;
544             break;               
545         case SHELL_HTCBOUNCE:
546             SEND_STRING("htcBounce -j ");
547             return true;
548             break;               
549         case SHELL_EXPAND_OE_LOGPATTERN:
550             SEND_STRING(SS_TAP(X_LEFT)"*CQW_HKEX"SS_TAP(X_END)"*.log"SS_LCTRL("x")SS_LSFT("8"));
551             break;      
552         case SHELL_EXPAND_OE_TRANPATTERN:
553             SEND_STRING(SS_TAP(X_LEFT)"*CQW_HKEX"SS_TAP(X_END)"*.tran"SS_LCTRL("x")SS_LSFT("8"));
554             break;      
555         case SHELL_DUMPTLOG:
556             SEND_STRING(" | dumptlog - ");
557             return true;
558             break;            
559         // Cloud9 macros
560         case CLOUD9_TAB_LEFT:
561             SEND_STRING(SS_LCTRL("["));
562             return true;
563                         break;
564                 case CLOUD9_TAB_RIGHT:
565             SEND_STRING(SS_LCTRL("]"));
566             return true;
567                         break;
568                 case CLOUD9_TAB_CLOSE:
569             SEND_STRING(SS_LALT("w"));
570             return true;
571                         break;
572                 case CLOUD9_GOTO_SYMBOL:
573             SEND_STRING(SS_LSFT(SS_LCTRL("e")));
574             return true;
575                         break;
576                 case CLOUD9_GOTO_LINE:
577             SEND_STRING(SS_LCTRL("g"));
578             return true;
579                         break;
580                 case CLOUD9_NAVIGATE:
581             SEND_STRING(SS_LCTRL("e"));
582             return true;
583                         break;
584
585     }
586   }
587
588   return true;
589 }
590
591 void led_set_user(uint8_t usb_led) {
592     if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
593         ergodox_right_led_1_on();
594     } else {
595         ergodox_right_led_1_off();
596     }
597 }
598
599 void matrix_scan_user(void) {
600
601     uint8_t layer = biton32(layer_state);
602
603     ergodox_board_led_off();
604     ergodox_right_led_2_off();
605     ergodox_right_led_3_off();
606     switch (layer) {
607         case COMBINED:
608             ergodox_right_led_2_on();
609             break;
610         case SHELL_NAV:
611         case SHELL_SCREEN:
612         case KEYNAV:
613         case KEYSEL:
614                 case SCREEN_NAV:
615             ergodox_right_led_3_on();
616             break;
617         case BROWSER_CONTROL:
618             ergodox_right_led_2_on();
619             ergodox_right_led_3_on();
620             break;
621         default:
622             break;
623     }
624
625 };