]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/ergodox_ez/keymaps/dvorak_42_key/keymap.c
Update keyboards/kbdfans/kbd67/readme.md
[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 // leaving this in place for compatibilty with old keymaps cloned and re-compiled.
352 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
353 {
354       switch(id) {
355         case SCREEN_TAB_LEFT:
356             if (record->event.pressed) {
357                 return MACRO( D(LCTL), T(A), U(LCTL), T(P), END);
358             }
359             break;
360         case SCREEN_TAB_RIGHT:
361              if (record->event.pressed) {
362                 return MACRO( D(LCTL), T(A), U(LCTL), T(N), END);
363             }
364             break;
365         case SCREEN_NEW_TAB:
366              if (record->event.pressed) {
367                 return MACRO( D(LCTL), T(A), U(LCTL), T(C), END);
368             }
369         break;
370         case SCREEN_DETACH:
371              if (record->event.pressed) {
372                 return MACRO( D(LCTL), T(A), U(LCTL), T(D), END);
373             }
374         break;
375         case SCREEN_RENAME:
376              if (record->event.pressed) {
377                 return MACRO( D(LCTL), T(A), U(LCTL), D(LSFT), T(A), U(LSFT), END);
378             }
379         break;
380         case SCREEN_NUMBER:
381              if (record->event.pressed) {
382                 return MACRO( D(LCTL), T(A), U(LCTL), D(LSFT), T(SCOLON), U(LSFT),
383                               T(N),
384                               T(U),
385                               T(M),
386                               T(B),
387                               T(E),
388                               T(R),
389                               T(SPC),
390                              END);
391             }
392         break;
393
394                 MACRO_SCREEN_REG(SCREEN_READREG_1,1);
395                 MACRO_SCREEN_REG(SCREEN_READREG_2,2);
396                 MACRO_SCREEN_REG(SCREEN_READREG_3,3);
397
398                 MACRO_SCREEN_PASTE(SCREEN_PASTEREG_1,1);
399                 MACRO_SCREEN_PASTE(SCREEN_PASTEREG_2,2);
400                 MACRO_SCREEN_PASTE(SCREEN_PASTEREG_3,3);
401
402         MACRO_SCREEN_NUM(SCREEN_0,0);
403         MACRO_SCREEN_NUM(SCREEN_1,1);
404         MACRO_SCREEN_NUM(SCREEN_2,2);
405         MACRO_SCREEN_NUM(SCREEN_3,3);
406         MACRO_SCREEN_NUM(SCREEN_4,4);
407         MACRO_SCREEN_NUM(SCREEN_5,5);
408         MACRO_SCREEN_NUM(SCREEN_6,6);
409         MACRO_SCREEN_NUM(SCREEN_7,7);
410         MACRO_SCREEN_NUM(SCREEN_8,8);
411         MACRO_SCREEN_NUM(SCREEN_9,9);
412
413                 case SCREEN_UP_JUMP:
414             if (record->event.pressed) {
415                 return MACRO( T(5), T(UP), END);
416             }
417                 break;
418
419                 case SCREEN_DOWN_JUMP:
420             if (record->event.pressed) {
421                 return MACRO( T(5), T(DOWN), END);
422             }
423                 break;
424
425         case SCREEN_COPY_MODE:
426             if (record->event.pressed) {
427                 return MACRO( D(LCTL), T(A), U(LCTL), T(ESC), END);
428             }
429         break;
430         case SCREEN_PASTE:
431             if (record->event.pressed) {
432                 return MACRO( D(LCTL), T(A), U(LCTL), T(RBRC), END);
433             }
434         break;        
435
436         case DEL_TO_HOME:
437             if (record->event.pressed) {
438                 return MACRO( 
439                                 // delete to the beginning of the line
440                                 D(LSFT), T(HOME), U(LSFT),
441                                 T(DELETE),
442                                 END);
443             }                           
444             break;              
445
446    
447       }
448     return MACRO_NONE;
449 };
450
451 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
452   switch (keycode) {
453     // dynamically generate these.
454     case EPRM:
455       if (record->event.pressed) {
456         eeconfig_init();
457       }
458       return false;
459       break;
460     case VRSN:
461       if (record->event.pressed) {
462         SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
463       }
464       return false;
465       break;
466     case RGB_SLD:
467       if (record->event.pressed) {
468         rgblight_mode(1);
469       }
470       return false;
471       break;
472   }
473
474   // shell macros
475   if(record->event.pressed) {
476     switch (keycode) {
477         case SHELL_LS:
478             SEND_STRING("ls\n");
479             return true;
480             break;
481         case SHELL_LSLTR:
482             SEND_STRING("ls -ltr\n");
483             return true;
484             break;
485         case SHELL_LSLA:
486             SEND_STRING("ls -la\n");
487             return true;
488             break;
489         case SHELL_CDPRE:
490             SEND_STRING("cd ..\n");
491             return true;
492             break;
493         case SHELL_LESS:
494             SEND_STRING("less ");
495             return true;
496             break;
497         case SHELL_PLESS:
498             SEND_STRING(" | less");
499             return true;
500             break;
501         case SHELL_PGREP:
502             SEND_STRING(" | grep ");
503             return true;
504             break;
505         case SHELL_TAILF:
506             SEND_STRING("tail -f ");
507             return true;
508             break;
509         case SHELL_PWD:
510             SEND_STRING("echo `pwd`/");
511             return true;
512             break;
513         case SHELL_H3:
514             SEND_STRING("h3\n");
515             return true;
516             break;
517         case SHELL_AMMCOLO:
518             SEND_STRING("ammcolo\n");
519             return true;
520             break;
521         case SHELL_SCREENRD:
522             SEND_STRING("screen -r -d ");
523             return true;
524             break;
525         case SHELL_SCREEN_NEW:
526             SEND_STRING("screen -S ");
527             return true;
528             break;
529         case SHELL_SCREEN_LIST:
530             SEND_STRING("screen -list\n");
531             return true;
532             break;
533         case SHELL_MKE:
534             SEND_STRING("mki -j8\n");
535             return true;
536             break;
537         case SHELL_HTCSTATUS:
538             SEND_STRING("htcStatus -j ");
539             return true;
540             break;               
541         case SHELL_HTCBOUNCE:
542             SEND_STRING("htcBounce -j ");
543             return true;
544             break;               
545         case SHELL_EXPAND_OE_LOGPATTERN:
546             SEND_STRING(SS_TAP(X_LEFT)"*CQW_HKEX"SS_TAP(X_END)"*.log"SS_LCTRL("x")SS_LSFT("8"));
547             break;      
548         case SHELL_EXPAND_OE_TRANPATTERN:
549             SEND_STRING(SS_TAP(X_LEFT)"*CQW_HKEX"SS_TAP(X_END)"*.tran"SS_LCTRL("x")SS_LSFT("8"));
550             break;      
551         case SHELL_DUMPTLOG:
552             SEND_STRING(" | dumptlog - ");
553             return true;
554             break;            
555         // Cloud9 macros
556         case CLOUD9_TAB_LEFT:
557             SEND_STRING(SS_LCTRL("["));
558             return true;
559                         break;
560                 case CLOUD9_TAB_RIGHT:
561             SEND_STRING(SS_LCTRL("]"));
562             return true;
563                         break;
564                 case CLOUD9_TAB_CLOSE:
565             SEND_STRING(SS_LALT("w"));
566             return true;
567                         break;
568                 case CLOUD9_GOTO_SYMBOL:
569             SEND_STRING(SS_LSFT(SS_LCTRL("e")));
570             return true;
571                         break;
572                 case CLOUD9_GOTO_LINE:
573             SEND_STRING(SS_LCTRL("g"));
574             return true;
575                         break;
576                 case CLOUD9_NAVIGATE:
577             SEND_STRING(SS_LCTRL("e"));
578             return true;
579                         break;
580
581     }
582   }
583
584   return true;
585 }
586
587 void led_set_user(uint8_t usb_led) {
588     if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
589         ergodox_right_led_1_on();
590     } else {
591         ergodox_right_led_1_off();
592     }
593 }
594
595 void matrix_scan_user(void) {
596
597     uint8_t layer = biton32(layer_state);
598
599     ergodox_board_led_off();
600     ergodox_right_led_2_off();
601     ergodox_right_led_3_off();
602     switch (layer) {
603         case COMBINED:
604             ergodox_right_led_2_on();
605             break;
606         case SHELL_NAV:
607         case SHELL_SCREEN:
608         case KEYNAV:
609         case KEYSEL:
610                 case SCREEN_NAV:
611             ergodox_right_led_3_on();
612             break;
613         case BROWSER_CONTROL:
614             ergodox_right_led_2_on();
615             ergodox_right_led_3_on();
616             break;
617         default:
618             break;
619     }
620
621 };