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