]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/ergodox/keymaps/dvorak_programmer/keymap.c
make shell layer more compatible with default layer
[qmk_firmware.git] / keyboards / ergodox / keymaps / dvorak_programmer / keymap.c
1
2 #include "ergodox.h"
3 #include "led.h"
4 #include "debug.h"
5 #include "action_layer.h"
6 #include "action_code.h"
7
8 #define BASE    0 // default layer
9 #define SHELL_LAYER 1
10 #define SHELL_NAV 2
11 #define KEY_NAV 3 // key navigation layer
12 #define KEY_SEL 4 // key selection layer
13 #define NUMBER  5  // number layer
14 #define SYMBOL  6
15 #define BRACKETS  7
16 #define SHORTCUTS 8
17 #define MOUSE 9
18
19 // macros
20 #define MC_COPY_LINE  0
21 #define MC_CUT_LINE   1
22 #define MC_PASTE_LINE 2
23 #define MC_NEW_SEARCH_TAB 3
24 #define SCREEN_TAB_LEFT 4
25 #define SCREEN_TAB_RIGHT 5
26 #define SCREEN_NEW_TAB 6
27 #define SWITCH_NDS 7
28 #define SCREEN_COPY_MODE 8
29 #define SCREEN_PASTE 9
30 #define OPEN_CLOSE_PAREN 10
31 #define OPEN_CLOSE_BRACKET 11
32 #define OPEN_CLOSE_CURLY 12
33 #define OPEN_CLOSE_SINGLE_QUOTE 13
34 #define OPEN_CLOSE_DOUBLE_QUOTE 14
35 #define SHELL_RECALL_LAST_ARG_REMOVE_FIRST_COMMAND 15
36 #define SEMICOLON_NEWLINE 16
37 #define END_NEWLINE 17
38
39
40 const uint16_t PROGMEM fn_actions[] = {
41   [1] = ACTION_LAYER_TAP_TOGGLE(KEY_NAV), // FN1 - keynav layer
42   [2] = ACTION_LAYER_TAP_TOGGLE(NUMBER), // FN2 - number layer
43   [3] = ACTION_MODS_ONESHOT(MOD_LSFT),   // FN3 - shift modifier / oneshot
44   [4] = ACTION_MODS_ONESHOT(MOD_LCTL),   // FN4 - ctrl modifier / oneshot
45   [5] = ACTION_MODS_ONESHOT(MOD_LALT),   // FN5 - alt modifier / oneshot
46 };
47
48 //Tap Dance Declarations
49 enum {
50   TD_SHIFT_CAPSLOCK = 0,
51   TD_BRK_LEFT = 1,
52   TD_BRK_RIGHT = 2
53 };
54
55
56
57 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
58 // base layer
59 [BASE] = KEYMAP(  // layer 0 : default
60         // left hand
61         KC_ESC,                    KC_F1,          KC_F2,       KC_F3,        KC_F4,       KC_F5,       KC_F6,
62         LT(SHELL_NAV,KC_TAB),      KC_QUOT,        KC_COMM,     KC_DOT,       KC_P,        KC_Y,        MO(KEY_SEL),
63         OSL(BRACKETS),             KC_A,           KC_O,        KC_E,         KC_U,        KC_I,
64         OSM(MOD_LSFT),             KC_SCLN,        KC_Q,        KC_J,         KC_K,        KC_X,        MO(KEY_NAV),
65                    OSL(SHORTCUTS),KC_FN4, KC_FN5,OSL(SYMBOL),MO(NUMBER),  
66                                               // thumb cluster
67                                                MO(MOUSE), RCTL(KC_S),
68                                                                       RCTL(KC_DEL),
69                                                KC_BSPC,RCTL(KC_BSPC),KC_DEL,
70         // right hand
71              KC_F7,       KC_F8,       KC_F9,       KC_F10,        KC_F11,       KC_F12,       KC_BSLS,
72              KC_PGUP,     KC_F,        KC_G,        KC_C,          KC_R,         KC_L,         KC_SLSH,
73                           KC_D,        KC_H,        KC_T,          KC_N,         KC_S,         KC_MINS,
74              KC_PGDN,     KC_B,        KC_M,        KC_W,          KC_V,         KC_Z,         TD(TD_SHIFT_CAPSLOCK),
75                                   // lower keys - browser tab control
76                                   RSFT(RCTL(KC_TAB)), RCTL(KC_TAB), RCTL(KC_T), LALT(KC_LEFT), RCTL(KC_W),
77              // thumb cluster
78              KC_HOME,KC_END,
79              KC_UP,
80              KC_DOWN,KC_ENT, KC_SPC
81     ),
82      
83
84          
85 // permanent shell layer - meant to be used while in a terminal. only the top keys are overriden
86 [SHELL_LAYER] = KEYMAP(
87        // left hand
88        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,LALT(KC_DOT),RCTL(KC_R),RCTL(KC_C),
89        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
90        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
91        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
92                // bottom row
93                KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
94                                        // thumb cluster
95                                        KC_TRNS,KC_TRNS,
96                                                KC_TRNS,
97                                KC_TRNS,KC_TRNS,KC_TRNS,
98        // right hand
99        RCTL(KC_W), LALT(KC_B),LALT(KC_F), KC_LEFT, KC_RIGHT, LALT(KC_D), KC_TRNS,
100        KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
101                  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
102        KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
103                 // bottom row
104                  KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
105        // thumb cluster
106        KC_TRNS, KC_TRNS,
107        KC_TRNS,
108        KC_TRNS, KC_TRNS, KC_TRNS
109 ),       
110          
111 // shell navigation layer
112 [SHELL_NAV] = KEYMAP(
113        // left hand
114        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
115        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
116        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
117        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
118                // bottom row
119                KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
120                                        // thumb cluster
121                                        KC_TRNS,KC_TRNS,
122                                                LALT(KC_D),
123                                KC_TRNS,RCTL(KC_W),KC_TRNS,
124        // right hand
125        KC_TRNS,    KC_TRNS,        KC_TRNS,             KC_TRNS,         KC_TRNS,         KC_TRNS,        KC_TRNS,
126        RCTL(KC_L), RCTL(KC_W),     KC_HOME,             KC_UP,           KC_END,          LALT(KC_D),     RCTL(KC_R),
127                    LALT(KC_B),     KC_LEFT,             KC_DOWN,         KC_RIGHT,        LALT(KC_F),     LALT(KC_DOT),
128        RCTL(KC_C), RCTL(KC_U),     M(SCREEN_COPY_MODE), M(SCREEN_PASTE), MEH(KC_V),      RCTL(KC_K),     M(SHELL_RECALL_LAST_ARG_REMOVE_FIRST_COMMAND),
129                 // bottom row
130                  M(SCREEN_TAB_LEFT), M(SCREEN_TAB_RIGHT), M(SCREEN_NEW_TAB),  KC_TRNS,    KC_TRNS,
131        // thumb cluster
132        KC_TRNS, KC_TRNS,
133        KC_TRNS,
134        KC_TRNS, KC_TRNS, KC_TRNS
135 ),
136
137     
138 // key navigation layer
139 [KEY_NAV] = KEYMAP(
140        // left hand
141        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
142        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
143        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
144        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
145                // bottom row
146                KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
147                                        // thumb cluster
148                                        KC_TRNS,KC_TRNS,
149                                                KC_TRNS,
150                                KC_TRNS,KC_TRNS,KC_TRNS,
151        // right hand
152        KC_TRNS, KC_TRNS,        KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,        KC_TRNS,
153        KC_TRNS, KC_PGDN,        KC_HOME,    KC_UP,      KC_END,     KC_PGUP,        M(MC_COPY_LINE),
154                 RCTL(KC_LEFT),  KC_LEFT,    KC_DOWN,    KC_RIGHT,   RCTL(KC_RIGHT), M(MC_CUT_LINE),
155        KC_TRNS, KC_TRNS,        RCTL(KC_C), RCTL(KC_X), RCTL(KC_V), KC_TRNS,        M(MC_PASTE_LINE),
156                 // bottom row
157                 KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS,    KC_TRNS,
158        // thumb cluster
159        KC_TRNS, KC_TRNS,
160        KC_TRNS,
161        KC_TRNS, KC_TRNS, KC_TRNS
162 ),
163
164 // key selection layer
165 [KEY_SEL] = KEYMAP(
166        // left hand
167        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
168        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
169        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
170        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
171                // bottom row
172                KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
173                                        // thumb cluster
174                                        KC_TRNS,KC_TRNS,
175                                                KC_TRNS,
176                                KC_TRNS,KC_TRNS,KC_TRNS,
177        // right hand
178        KC_TRNS,       KC_TRNS,             KC_TRNS,       KC_TRNS,       KC_TRNS,        KC_TRNS,              KC_TRNS,
179        RSFT(KC_PGUP), RSFT(KC_PGDN),       RSFT(KC_HOME), RSFT(KC_UP),   RSFT(KC_END),   RSFT(KC_PGUP),        M(MC_COPY_LINE),
180                       RSFT(RCTL(KC_LEFT)), RSFT(KC_LEFT), RSFT(KC_DOWN), RSFT(KC_RIGHT), RSFT(RCTL(KC_RIGHT)), M(MC_CUT_LINE),
181        RSFT(KC_PGDN), KC_TRNS,             RCTL(KC_C),    RCTL(KC_X),    RCTL(KC_V),     KC_TRNS,              M(MC_PASTE_LINE),
182                 // bottom row
183                 KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS,    KC_TRNS,
184        // thumb cluster
185        KC_TRNS, KC_TRNS,
186        KC_TRNS,
187        KC_TRNS, KC_TRNS, KC_TRNS
188 ),
189
190 // number layer
191 [NUMBER] = KEYMAP(
192        // left hand
193        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
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,
196        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
197                // bottom row
198                KC_TRNS,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, KC_TRNS,
205        KC_TRNS, KC_PLUS,  KC_7,    KC_8,    KC_9,     KC_ASTR, KC_TRNS,
206                 KC_MINS,  KC_4,    KC_5,    KC_6,     KC_SLSH, KC_TRNS,
207        KC_TRNS, KC_EQUAL, KC_1,    KC_2,    KC_3,     KC_COLN, KC_TRNS,
208                                // bottom row
209                                 KC_0, KC_DOT, KC_COMMA, KC_TRNS,  KC_TRNS,
210        // thumb cluster
211        KC_TRNS, KC_TRNS,
212        KC_TRNS,
213        KC_TRNS, KC_TRNS, KC_TRNS
214 ),
215
216
217 [SYMBOL] = KEYMAP(
218        // left hand
219        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
220        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
221        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
222        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,       
223        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
224                                        KC_TRNS,KC_TRNS,
225                                                KC_TRNS,
226                                KC_TRNS,KC_TRNS,KC_TRNS,
227        // right hand
228        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
229        KC_TRNS, KC_PLUS, KC_AMPR, KC_ASTR, KC_GRAVE,KC_TILD, KC_TRNS,
230                 KC_MINS, KC_DLR,  KC_PERC, KC_CIRC, KC_PIPE, KC_TRNS,
231        KC_TRNS, KC_EQUAL,KC_EXLM, KC_AT,   KC_HASH, KC_TRNS, KC_TRNS,
232                          KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 
233        M(SEMICOLON_NEWLINE), M(END_NEWLINE),
234        KC_TRNS,
235        KC_TRNS, KC_TRNS, KC_TRNS
236 ),
237
238 [BRACKETS] = KEYMAP(
239        // left hand
240        KC_TRNS,KC_TRNS,KC_TRNS,             KC_TRNS,            KC_TRNS,               KC_TRNS,KC_TRNS,
241        KC_TRNS,KC_TRNS,M(OPEN_CLOSE_CURLY), M(OPEN_CLOSE_PAREN),M(OPEN_CLOSE_BRACKET), KC_TRNS,KC_TRNS,
242        KC_TRNS,KC_LPRN, KC_RPRN,            KC_LBRC,            KC_RBRC,               KC_TRNS,
243        KC_TRNS,KC_TRNS,KC_TRNS,             KC_LCBR,            KC_RCBR,               KC_TRNS,KC_TRNS,       
244        KC_TRNS,KC_TRNS,KC_TRNS,             KC_TRNS,            KC_TRNS,
245                                         KC_TRNS,KC_TRNS,
246                                                KC_TRNS,
247                                KC_TRNS,KC_TRNS,KC_TRNS,
248        // right hand
249        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
250        KC_TRNS, KC_TRNS, M(OPEN_CLOSE_BRACKET),M(OPEN_CLOSE_PAREN),M(OPEN_CLOSE_CURLY),KC_TRNS,KC_TRNS,
251                 KC_TRNS, KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_TRNS,
252        KC_TRNS, KC_TRNS, KC_LCBR, KC_RCBR, KC_TRNS, KC_TRNS, KC_TRNS, 
253                          KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 
254        KC_TRNS, KC_TRNS,
255        KC_TRNS,
256        KC_TRNS, KC_TRNS, KC_TRNS
257 ),
258
259 [SHORTCUTS] = KEYMAP(
260        // left hand
261        KC_NO,  MEH(KC_F1), MEH(KC_F2), MEH(KC_F3),  MEH(KC_F4), MEH(KC_F5), MEH(KC_F6),
262        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
263        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
264        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,       
265        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
266                                          MEH(KC_0),MEH(KC_1),
267                                                    MEH(KC_2),
268                                MEH(KC_3),MEH(KC_4),MEH(KC_5),
269        // right hand
270        MEH(KC_F7), MEH(KC_F8), MEH(KC_F9), MEH(KC_F10),  MEH(KC_F11), MEH(KC_F12),  M(SWITCH_NDS),
271        KC_TRNS, MEH(KC_A), MEH(KC_B),    MEH(KC_C),    MEH(KC_D),    MEH(KC_E), MEH(KC_F),
272                 MEH(KC_G), MEH(KC_H),    MEH(KC_I),    MEH(KC_J),    MEH(KC_K), MEH(KC_L),
273        KC_TRNS, MEH(KC_M), MEH(KC_N),    MEH(KC_O),    MEH(KC_P),    MEH(KC_Q), MEH(KC_R),
274                            MEH(KC_S),    MEH(KC_T),    MEH(KC_U),    MEH(KC_V), MEH(KC_X),
275        MEH(KC_6), MEH(KC_7),
276        MEH(KC_8),
277        MEH(KC_9), TO(BASE), TO(SHELL_LAYER)
278 ),
279
280
281 [MOUSE] = KEYMAP(
282        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
283        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
284        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,
287                                            KC_TRNS, KC_TRNS,
288                                                     KC_TRNS,
289                                   KC_TRNS, KC_TRNS, KC_TRNS,
290     // right hand
291        KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
292        KC_TRNS,  KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
293                  KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS,
294        KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
295                           KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
296        KC_TRNS, KC_TRNS,
297        KC_TRNS,
298            KC_TRNS, KC_BTN1, KC_BTN2
299 ),
300
301 };
302
303
304
305 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
306 {
307   // MACRODOWN only works in this function
308       switch(id) {
309         case MC_COPY_LINE:
310             if (record->event.pressed) {
311                 return MACRO( T(HOME), D(LSFT), T(END), U(LSFT), D(LCTL), T(C), U(LCTL), END);
312             }
313             break;
314         case MC_CUT_LINE:
315             if (record->event.pressed) {
316                 return MACRO( T(HOME), D(LSFT), T(END), U(LSFT), D(LCTL), T(X), U(LCTL), END);
317             }        
318             break;
319         case MC_PASTE_LINE:
320             if (record->event.pressed) {
321                 return MACRO( T(END), T(ENTER), D(LCTL), T(V), U(LCTL), END);
322             }                
323             break;
324         case MC_NEW_SEARCH_TAB:
325              if (record->event.pressed) {
326                 return MACRO( D(LCTL), T(T), T(K), U(LCTL), END);
327             }
328             break;
329         case SCREEN_TAB_LEFT:
330              if (record->event.pressed) {
331                 return MACRO( D(LCTL), T(A), U(LCTL), T(P), END);
332             }        
333             break;
334         case SCREEN_TAB_RIGHT:
335              if (record->event.pressed) {
336                 return MACRO( D(LCTL), T(A), U(LCTL), T(N), END);
337             }                    
338             break;
339         case SCREEN_NEW_TAB:
340              if (record->event.pressed) {
341                 return MACRO( D(LCTL), T(A), U(LCTL), T(C), END);
342             }                                
343         break;
344         case SCREEN_COPY_MODE:
345             if (record->event.pressed) {
346                 return MACRO( D(LCTL), T(A), U(LCTL), T(ESC), END);
347             }
348         break;
349         case SCREEN_PASTE:
350             if (record->event.pressed) {
351                 return MACRO( D(LCTL), T(A), U(LCTL), T(RBRC), END); 
352             }
353         break;        
354         case SWITCH_NDS:
355              if (record->event.pressed) {
356                 return MACRO( D(LSFT), T(F11), U(LSFT), W(500), D(LALT), T(TAB), U(LALT), END); 
357             }                                
358         break;        
359         case OPEN_CLOSE_PAREN:
360             if (record->event.pressed) {
361                 return MACRO( D(LSFT), T(LPRN), T(RPRN), U(LSFT), T(LEFT), END);
362             }
363         break;
364         case OPEN_CLOSE_BRACKET:
365             if (record->event.pressed) {
366                 return MACRO( T(LBRC), T(RBRC), T(LEFT), END);
367             }
368         break;        
369         case OPEN_CLOSE_CURLY:
370             if (record->event.pressed) {
371                 return MACRO( D(LSFT), T(LCBR), T(RCBR), U(LSFT), T(LEFT), END);
372             }
373         break;                
374         case OPEN_CLOSE_SINGLE_QUOTE:
375             if (record->event.pressed) {
376                 return MACRO( T(QUOT), T(QUOT), T(LEFT), END);
377             }
378         break;        
379         case OPEN_CLOSE_DOUBLE_QUOTE:
380             if (record->event.pressed) {
381                 return MACRO( D(LSFT), T(QUOT), T(QUOT), U(LSFT), T(LEFT), END);
382             }
383         break;                        
384         case SHELL_RECALL_LAST_ARG_REMOVE_FIRST_COMMAND:
385             if (record->event.pressed) {
386                 return MACRO( T(UP), T(HOME), D(LALT), T(D), U(LALT), END);
387             }
388         break;                                
389                 case SEMICOLON_NEWLINE:
390             if (record->event.pressed) {
391                 return MACRO( T(END), T(SCLN), T(ENTER), END);
392             }           
393                 break;
394                 case END_NEWLINE:
395             if (record->event.pressed) {
396                 return MACRO( T(END), T(ENTER), END);
397             }           
398                 break;          
399         
400       }
401     return MACRO_NONE;
402 };
403
404 // Runs just one time when the keyboard initializes.
405 void matrix_init_user(void) {
406
407     return;
408 };
409
410 void led_set_user(uint8_t usb_led) {
411     if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
412         ergodox_right_led_1_on();
413     } else {
414         ergodox_right_led_1_off();
415     }
416 }
417
418 qk_tap_dance_action_t tap_dance_actions[] = {
419   [TD_SHIFT_CAPSLOCK]  = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPSLOCK),
420   [TD_BRK_LEFT]  = ACTION_TAP_DANCE_DOUBLE (KC_LPRN, KC_LCBR),
421   [TD_BRK_RIGHT] = ACTION_TAP_DANCE_DOUBLE (KC_RPRN, KC_RCBR)
422
423 };
424
425
426 // Runs constantly in the background, in a loop.
427 void matrix_scan_user(void) {
428
429     uint8_t layer = biton32(layer_state);
430
431     ergodox_board_led_off();
432     ergodox_right_led_2_off();
433     ergodox_right_led_3_off();
434     switch (layer) {
435         case NUMBER:
436         case SYMBOL:
437                 case BRACKETS:
438                 //case SHELL_LAYER:             
439             ergodox_right_led_2_on();
440             break;
441         case KEY_NAV:
442         case KEY_SEL:
443             ergodox_right_led_3_on();
444             break;        
445         case SHORTCUTS:
446             ergodox_right_led_2_on();
447             ergodox_right_led_3_on();
448             break;
449         default:
450             // none
451             break;
452     } 
453     return;
454 };