]> git.donarmstrong.com Git - qmk_firmware.git/blob - layouts/community/ergodox/albert/keymap.c
Creates a layouts/ folder for keymaps shared between keyboards (#1609)
[qmk_firmware.git] / layouts / community / ergodox / albert / keymap.c
1 #include QMK_KEYBOARD_H
2 #include "debug.h"
3 #include "action_layer.h"
4 #include "version.h"
5
6 #include <stdarg.h>
7
8 /* use UK keymap */
9
10 #define UK_HASH KC_NONUS_HASH
11 #define UK_BSLS KC_NONUS_BSLASH
12 #define UK_PIPE LSFT(UK_BSLS)
13
14 #define BASE 0 // default layer
15 #define SYMB 1 // symbols
16 #define NUMB 2 // numbers and hex
17 #define CRSR 3 // cursor keys
18 #define MOUS 4 // mouse keys
19 #define KEYW 5 // keyword macros
20 #define EMAC 6 // emacs
21
22 // my macros
23 #define UM_ECET   M(0)  // { }
24 #define UM_0x     M(1)
25 #define UM_PUB    M(2)
26 #define UM_PRO    M(3)
27 #define UM_PRV    M(4)
28 #define UM_CLS    M(5)
29 #define UM_STR    M(6)
30 #define UM_RET    M(7)
31 #define UM_INC    M(8)
32 #define UM_OBJ    M(9)
33 #define UM_GITLOG M(10)
34 #define UM_GOODM  M(11)
35 #define UM_NAMESP M(12)
36 #define UM_EMTR   M(14) // emacs toggle read-only
37 #define UM_EMWR   M(15) // emacs write buffer (save)
38 #define UM_EMUN   M(16) // emacs undo
39 #define UM_EMRE   M(17) // emacs redo
40 #define UM_EMPB   M(18) // emacs previous buffer
41 #define UM_EMNB   M(19) // emacs next buffer
42 #define UM_GOODN  M(20)
43 #define UM_ECETS  M(22)  // { };
44 #define UM_TMPL   M(23)
45 #define UM_TYPN   M(24)
46 #define UM_CONT   M(25)
47 #define UM_BREAK  M(26)
48 #define UM_CONST  M(27)
49 #define UM_SMILY  M(28)
50 #define UM_SADF   M(29)
51 #define UM_SCARF  M(30)
52 #define UM_DECAF  M(31)
53 #define UM_OPER   M(32)
54 #define UM_NULP   M(33)
55 #define UM_EXTR   M(34)
56 #define UM_VIRT   M(35)
57 #define UM_EMFB   M(36) // emacs font bigger
58 #define UM_EMFS   M(37) // emacs font smaller
59 #define UM_VOLAT  M(38)
60
61 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
62 /* Keymap 0: Base layer
63  *
64  * ,--------------------------------------------------.           ,--------------------------------------------------.
65  * | ESC    |   1  |   2  |   3  |   4  |   5  | SfLt |           | SfRt |   6  |   7  |   8  |   9  |   0  | BkSp   |
66  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
67  * | Tab    |   Q  |   W  |   E  |   R  |   T  |  L1  |           |  L1  |   Y  |   U  |   I  |   O  |   P  | Del    |
68  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
69  * | Caps/L2|   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |   ;  |Enter/L2|
70  * |--------+------+------+------+------+------|  L6  |           |  L6  |------+------+------+------+------+--------|
71  * | LSft/( |   Z  |   X  |   C  | V/L3 | B/L4 |      |           |      | N/L4 | M/L3 |   ,  |   .  |   /  | RSft/) |
72  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
73  *   |Ctrl/[| Alt/]|   #  | Left |Right |                                       |  Up  | Down |   -  | Alt/[|Ctrl/]|
74  *   `----------------------------------'                                       `----------------------------------'
75  *                                        ,-------------.       ,-------------.
76  *                                        |  L2  | lead |       | lead |  Ins |
77  *                                 ,------|------|------|       |------+------+------.
78  *                                 | Space| BkSp | Home |       | PgUp | Enter|Space |
79  *                                 |  /   |  /   |------|       |------|   /  |  /   |
80  *                                 | Ctrl | Alt  |End/L5|       |PDn/L5|  Alt | Ctrl |
81  *                                 `--------------------'       `--------------------'
82  */
83 [BASE] = LAYOUT_ergodox(  // layer 0 : default
84         // left hand
85         KC_ESC,            KC_1,            KC_2,       KC_3,      KC_4,           KC_5,           LSFT(KC_LEFT),
86         KC_TAB,            KC_Q,            KC_W,       KC_E,      KC_R,           KC_T,           MO(SYMB),
87         LT(NUMB, KC_CAPS), KC_A,            KC_S,       KC_D,      KC_F,           KC_G,
88         KC_LSPO,           KC_Z,            KC_X,       KC_C,      LT(CRSR, KC_V), LT(MOUS, KC_B), MO(EMAC),
89         CTL_T(KC_LBRC),    ALT_T(KC_RBRC),  UK_HASH,    KC_LEFT,   KC_RGHT,
90                                                                                      TG(NUMB),        KC_LEAD,
91                                                                                                       KC_HOME,
92                                                                      CTL_T(KC_SPC),  ALT_T(KC_BSPC),  LT(KEYW, KC_END),
93         // right hand
94              LSFT(KC_RGHT),   KC_6,            KC_7,            KC_8,      KC_9,       KC_0,             KC_BSPC,
95              MO(SYMB),        KC_Y,            KC_U,            KC_I,      KC_O,       KC_P,             KC_DELT,
96                               KC_H,            KC_J,            KC_K,      KC_L,       KC_SCLN,          LT(NUMB, KC_ENT),
97              MO(EMAC),        LT(MOUS, KC_N),  LT(CRSR, KC_M),  KC_COMM,   KC_DOT,     KC_SLSH,          KC_RSPC,
98                                                KC_UP,           KC_DOWN,   KC_MINS,    ALT_T(KC_LBRC),   CTL_T(KC_RBRC),
99            KC_LEAD,            KC_INS,
100            KC_PGUP,
101            LT(KEYW, KC_PGDN),  ALT_T(KC_ENT),   CTL_T(KC_SPC)
102     ),
103 /* Keymap 1: Symbol Layer with F keys
104  *
105  * ,--------------------------------------------------.           ,--------------------------------------------------.
106  * |   ##   |  F1  |  F2  |  F3  |  F4  |  F5  |  ##  |           |  ##  |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
107  * |--------+------+------+------+------+------+------|           |------+------+------+------+------+------+--------|
108  * |   ##   |   !  |   "  |   £  |   $  |   %  |  ##  |           |  ##  |   -  |   +  |   =  |   @  |   ~  |   F12  |
109  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
110  * |   ##   |   ^  |   &  |   *  |   _  |   #  |------|           |------|   {  |   }  |   ;  |   '  |   #  |   ##   |
111  * |--------+------+------+------+------+------|  ##  |           |  ##  |------+------+------+------+------+--------|
112  * |   ##   |   \  |   |  |   `  |   -  |   /  |      |           |      |   [  |   ]  |   <  |   >  |   ?  |   ##   |
113  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
114  *   |  ##  |  ##  |  ##  |  ##  |  ##  |                                       |  ##  |  ##  |  ##  |  ##  |  ##  |
115  *   `----------------------------------'                                       `----------------------------------'
116  *                                        ,-------------.       ,-------------.
117  *                                        |  ##  |  ##  |       |  ##  |  ##  |
118  *                                 ,------|------|------|       |------+------+------.
119  *                                 |      |      |  ##  |       |  ##  |      |      |
120  *                                 |  ##  |  ##  |------|       |------|  ##  |  ##  |
121  *                                 |      |      |  ##  |       |  ##  |      |      |
122  *                                 `--------------------'       `--------------------'
123  */
124 [SYMB] = LAYOUT_ergodox(
125         // left hand
126         KC_TRNS,   KC_F1,       KC_F2,       KC_F3,       KC_F4,          KC_F5,       KC_TRNS,
127         KC_TRNS,   KC_EXLM,     LSFT(KC_2),  LSFT(KC_3),  LSFT(KC_4),     LSFT(KC_5),  KC_TRNS,
128         KC_TRNS,   LSFT(KC_6),  LSFT(KC_7),  LSFT(KC_8),  LSFT(KC_MINS),  UK_HASH,
129         KC_TRNS,   UK_BSLS,     UK_PIPE,     KC_GRV,      KC_MINS,        KC_SLSH,     KC_TRNS,
130         KC_TRNS,   KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,
131                                                                             KC_TRNS,   KC_TRNS,
132                                                                                        KC_TRNS,
133                                                                  KC_TRNS,   KC_TRNS,   KC_TRNS,
134         // right hand
135              KC_TRNS,   KC_F6,       KC_F7,       KC_F8,          KC_F9,          KC_F10,         KC_F11,
136              KC_TRNS,   KC_MINS,     KC_PLUS,     KC_EQL,         LSFT(KC_QUOT),  LSFT(UK_HASH),  KC_F12,
137                         KC_LCBR,     KC_RCBR,     KC_SCLN,        KC_QUOT,        UK_HASH,        KC_TRNS,
138              KC_TRNS,   KC_LBRC,     KC_RBRC,     LSFT(KC_COMM),  LSFT(KC_DOT),   LSFT(KC_SLSH),  KC_TRNS,
139                                      KC_TRNS,     KC_TRNS,        KC_TRNS,        KC_TRNS,        KC_TRNS,
140            KC_TRNS,   KC_TRNS,
141            KC_TRNS,
142            KC_TRNS,   KC_TRNS,  KC_TRNS
143     ),
144 /* Keymap 2: Numerics and hex
145  *
146  * ,---------------------------------------------------.           ,--------------------------------------------------.
147  * |   ##    |  A   |  B   |  C   |  D   |  E   |  F   |           |  A   |  B   |  C   |  D   |   E  |   F  |   ##   |
148  * |---------+------+------+------+------+------+------|           |------+------+------+------+------+------+--------|
149  * |   ##    |  *   |  7   |  8   |  9   |  *   |  0x  |           |  0x  |  *   |   7  |   8  |   9  |   *  |   ##   |
150  * |---------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
151  * |   ##    |  /   |  4   |  5   |  6   |  /   |------|           |------|  /   |   4  |   5  |   6  |   /  |   ##   |
152  * |---------+------+------+------+------+------|  ##  |           |  ##  |------+------+------+------+------+--------|
153  * |   ##    |  -   |  1   |  2   |  3   |  -   |      |           |      |  -   |   1  |   2  |   3  |   -  |   ##   |
154  * `---------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
155  *   |   =   |  +   |  0   |  ,   |  .   |                                       |   0  |   ,  |   .  |   +  |  =   |
156  *   `-----------------------------------'                                       `----------------------------------'
157  *                                        ,-------------.       ,-------------.
158  *                                        |  ##  |  ##  |       |  ##  |  ##  |
159  *                                 ,------|------|------|       |------+------+------.
160  *                                 |      |      |  ##  |       |  ##  |      |      |
161  *                                 |  ##  |  ##  |------|       |------|  ##  |  ##  |
162  *                                 |      |      |  ##  |       |  ##  |      |      |
163  *                                 `--------------------'       `--------------------'
164  */
165 [NUMB] = LAYOUT_ergodox(
166         // left hand
167         KC_TRNS,   KC_A,        KC_B,        KC_C,        KC_D,           KC_E,        KC_F,
168         KC_TRNS,   KC_ASTR,     KC_7,        KC_8,        KC_9,           KC_ASTR,     UM_0x,
169         KC_TRNS,   KC_SLSH,     KC_4,        KC_5,        KC_6,           KC_SLSH,
170         KC_TRNS,   KC_MINS,     KC_1,        KC_2,        KC_3,           KC_MINS,     KC_TRNS,
171         KC_EQL,    KC_PLUS,     KC_0,        KC_COMM,     KC_DOT,
172                                                                             KC_TRNS,   KC_TRNS,
173                                                                                        KC_TRNS,
174                                                                  KC_TRNS,   KC_TRNS,   KC_TRNS,
175         // right hand
176              KC_A,      KC_B,        KC_C,        KC_D,           KC_E,           KC_F,           KC_TRNS,
177              UM_0x,     KC_ASTR,     KC_7,        KC_8,           KC_9,           KC_ASTR,        KC_TRNS,
178                         KC_SLSH,     KC_4,        KC_5,           KC_6,           KC_SLSH,        KC_TRNS,
179              KC_TRNS,   KC_MINS,     KC_1,        KC_2,           KC_3,           KC_MINS,        KC_TRNS,
180                                      KC_0,        KC_COMM,        KC_DOT,         KC_PLUS,        KC_EQL,
181            KC_TRNS,   KC_TRNS,
182            KC_TRNS,
183            KC_TRNS,   KC_TRNS,   KC_TRNS
184     ),
185 /* Keymap 3: Cursor movement
186  *
187  * ,---------------------------------------------------.           ,--------------------------------------------------.
188  * |         |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
189  * |---------+------+------+------+------+------+------|           |------+------+------+------+------+------+--------|
190  * |         | Home |      |  Up  |      | PgUp |      |           |      | PgUp |      |  Up  |      | Home |        |
191  * |---------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
192  * |         | End  | Left | Down | Right| PgDn |------|           |------| PgDn | Left | Down | Right| End  |        |
193  * |---------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
194  * |   ##    |  Up  |      | Down |  ##  |      |      |           |      |      |  ##  | Down |      |  Up  |   ##   |
195  * `---------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
196  *   | Left  | Down | Right|      |      |                                       |      |      | Left | Down | Right|
197  *   `-----------------------------------'                                       `----------------------------------'
198  *                                        ,-------------.       ,-------------.
199  *                                        |      |      |       |      |      |
200  *                                 ,------|------|------|       |------+------+------.
201  *                                 |      |      |      |       |      |      |      |
202  *                                 |  ##  |  ##  |------|       |------|  ##  |  ##  |
203  *                                 |      |      |      |       |      |      |      |
204  *                                 `--------------------'       `--------------------'
205  */
206 [CRSR] = LAYOUT_ergodox(
207         // left hand
208         KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,
209         KC_NO,     KC_HOME,   KC_NO,     KC_UP,     KC_NO,     KC_PGUP,   KC_NO,
210         KC_NO,     KC_END,    KC_LEFT,   KC_DOWN,   KC_RGHT,   KC_PGDN,
211         KC_TRNS,   KC_UP,     KC_NO,     KC_DOWN,   KC_TRNS,   KC_NO,     KC_NO,
212         KC_LEFT,   KC_DOWN,   KC_RGHT,   KC_NO,     KC_NO,
213                                                                    KC_NO,     KC_NO,
214                                                                               KC_NO,
215                                                         KC_TRNS,   KC_TRNS,   KC_NO,
216         // right hand
217              KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,
218              KC_NO,     KC_PGUP,   KC_NO,     KC_UP,     KC_NO,     KC_HOME,   KC_NO,
219                         KC_PGDN,   KC_LEFT,   KC_DOWN,   KC_RGHT,   KC_END,    KC_NO,
220              KC_NO,     KC_NO,     KC_TRNS,   KC_DOWN,   KC_NO,     KC_UP,     KC_TRNS,
221                                    KC_NO,     KC_NO,     KC_LEFT,   KC_DOWN,   KC_RGHT,
222            KC_NO,   KC_NO,
223            KC_NO,
224            KC_NO,   KC_TRNS,   KC_TRNS
225     ),
226 /* Keymap 4: Media and mouse keys
227  *
228  * ,--------------------------------------------------.           ,--------------------------------------------------.
229  * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
230  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
231  * |        |      | Lclk | MsUp | Rclk |      |      |           |      |      | Lclk | MsUp | Rclk |      |        |
232  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
233  * |        |      |MsLeft|MsDown|MsRght|      |------|           |------|      |MsLeft|MsDown|MsRght|      |        |
234  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
235  * |  Lclk  | MsUp | Rclk |MsDown|      |  ##  |      |           |      |  ##  |      |MsDown| Lclk | MsUp | Rclk   |
236  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
237  *   |MsLeft|MsDown|MsRight      |      |                                       |      |      |MsLeft|MsDown|MsRght|
238  *   `----------------------------------'                                       `----------------------------------'
239  *                                        ,-------------.       ,-------------.
240  *                                        |      |      |       |      |      |
241  *                                 ,------|------|------|       |------+------+------.
242  *                                 |      |      |      |       |      |      |      |
243  *                                 |      |      |------|       |------|      |      |
244  *                                 |      |      |      |       |      |      |      |
245  *                                 `--------------------'       `--------------------'
246  */
247 [MOUS] = LAYOUT_ergodox(
248         // left hand
249         KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,
250         KC_NO,     KC_NO,     KC_BTN1,   KC_MS_U,   KC_BTN2,   KC_NO,     KC_NO,
251         KC_NO,     KC_NO,     KC_MS_L,   KC_MS_D,   KC_MS_R,   KC_NO,
252         KC_BTN1,   KC_MS_U,   KC_BTN2,   KC_MS_D,   KC_NO,     KC_TRNS,   KC_NO,
253         KC_MS_L,   KC_MS_D,   KC_MS_R,   KC_NO,     KC_NO,
254                                                                    KC_NO,   KC_NO,
255                                                                             KC_NO,
256                                                           KC_NO,   KC_NO,   KC_NO,
257         // right hand
258              KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,
259              KC_NO,     KC_NO,     KC_BTN1,   KC_MS_U,   KC_BTN2,   KC_NO,     KC_NO,
260                         KC_NO,     KC_MS_L,   KC_MS_D,   KC_MS_R,   KC_NO,     KC_NO,
261              KC_NO,     KC_TRNS,   KC_NO,     KC_MS_D,   KC_BTN1,   KC_MS_U,   KC_BTN2,
262                                    KC_NO,     KC_NO,     KC_MS_L,   KC_MS_D,   KC_MS_R,
263            KC_NO,   KC_NO,
264            KC_NO,
265            KC_NO,   KC_NO,   KC_NO
266     ),
267 /* Keymap 5: Keywords
268  *
269  * ,---------------------------------------------------.           ,--------------------------------------------------.
270  * |         |      |      | scarf| sadf | smily|      |           |      | decaf|      |      |      |      |        |
271  * |---------+------+------+------+------+------+------|           |------+------+------+------+------+------+--------|
272  * |         | const| volat| oper |  ret | tmpl |      |           |      | typen| cont |  prv |  pro | pub  |        |
273  * |---------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
274  * |         |      |  str |  obj |      | gitl |------|           |------|      |      |      | nulp |      |        |
275  * |---------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
276  * |         |      | extr |  cls | virt | break|      |           |      |namesp| goodm| goodn|      |      |        |
277  * `---------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
278  *   |       |      |  inc |      |      |                                       |      |      |      |      |      |
279  *   `-----------------------------------'                                       `----------------------------------'
280  *                                        ,-------------.       ,-------------.
281  *                                        |      |      |       | ecet | ecets|
282  *                                 ,------|------|------|       |------+------+------.
283  *                                 |      |      |      |       |      |      |      |
284  *                                 |      |      |------|       |------|      |      |
285  *                                 |      |      |  ##  |       |  ##  |      |      |
286  *                                 `--------------------'       `--------------------'
287  */
288 [KEYW] = LAYOUT_ergodox(
289         // left hand
290         KC_NO,     KC_NO,     KC_NO,     UM_SCARF,  UM_SADF,   UM_SMILY,   KC_NO,
291         KC_NO,     UM_CONST,  UM_VOLAT,  UM_OPER,   UM_RET,    UM_TMPL,    KC_NO,
292         KC_NO,     KC_NO,     UM_STR,    UM_OBJ,    KC_NO,     UM_GITLOG,
293         KC_NO,     KC_NO,     UM_EXTR,   UM_CLS,    UM_VIRT,   UM_BREAK,   KC_NO,
294         KC_NO,     KC_NO,     UM_INC,    KC_NO,     KC_NO,
295                                                                    KC_NO,    KC_NO,
296                                                                              KC_NO,
297                                                           KC_NO,   KC_NO,    KC_TRNS,
298         // right hand
299              KC_NO,     UM_DECAF,  KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,
300              KC_NO,     UM_TYPN,   UM_CONT,   UM_PRV,    UM_PRO,    UM_PUB,    KC_NO,
301                         KC_NO,     KC_NO,     KC_NO,     UM_NULP,   KC_NO,     KC_NO,
302              KC_NO,     UM_NAMESP, UM_GOODM,  UM_GOODN,  KC_NO,     KC_NO,     KC_NO,
303                                    KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,
304            UM_ECET,  UM_ECETS,
305            KC_NO,
306            KC_TRNS,  KC_NO,   KC_NO
307     ),
308 /* Keymap 6: emacs
309  *
310  * ,---------------------------------------------------.           ,--------------------------------------------------.
311  * |         |      |      |      |      |      | empb |           | emnb | emfs | emfb |      |      |      |        |
312  * |---------+------+------+------+------+------+------|           |------+------+------+------+------+------+--------|
313  * |         | emtr |      |      |      |      |      |           |      | emun | emre | w-up |      |      |        |
314  * |---------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
315  * |         |      | emwr |      |      |      |------|           |------|      |w-left|w-down|w-rght|      |        |
316  * |---------+------+------+------+------+------|  ##  |           |  ##  |------+------+------+------+------+--------|
317  * |         |      |      |      |      |      |      |           |      |      |      |w-down|      |      |        |
318  * `---------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
319  *   |       |      |      |      |      |                                       |      |      |      |      |      |
320  *   `-----------------------------------'                                       `----------------------------------'
321  *                                        ,-------------.       ,-------------.
322  *                                        |      |      |       |      |      |
323  *                                 ,------|------|------|       |------+------+------.
324  *                                 |      |      |      |       |      |      |      |
325  *                                 |      |      |------|       |------|      |      |
326  *                                 |      |      |      |       |      |      |      |
327  *                                 `--------------------'       `--------------------'
328  */
329 [EMAC] = LAYOUT_ergodox(
330         // left hand
331         KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,     UM_EMPB,
332         KC_NO,     UM_EMTR,   KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,
333         KC_NO,     KC_NO,     UM_EMWR,   KC_NO,     KC_NO,     KC_NO,
334         KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_TRNS,
335         KC_NO,     KC_NO,     KC_NO,     KC_NO,     KC_NO,
336                                                                    KC_NO,   KC_NO,
337                                                                             KC_NO,
338                                                           KC_NO,   KC_NO,   KC_NO,
339         // right hand
340              UM_EMNB,   UM_EMFS,  UM_EMFB,        KC_NO,          KC_NO,          KC_NO,     KC_NO,
341              KC_NO,     UM_EMUN,  UM_EMRE,        LSFT(KC_UP),    KC_NO,          KC_NO,     KC_NO,
342                         KC_NO,    LSFT(KC_LEFT),  LSFT(KC_DOWN),  LSFT(KC_RGHT),  KC_NO,     KC_NO,
343              KC_TRNS,   KC_NO,    KC_NO,          LSFT(KC_DOWN),  KC_NO,          KC_NO,     KC_NO,
344                                   KC_NO,          KC_NO,          KC_NO,          KC_NO,     KC_NO,
345            KC_NO,   KC_NO,
346            KC_NO,
347            KC_NO,   KC_NO,   KC_NO
348     ),
349 };
350
351 enum next_key_down_up {
352     NK_DOWN_UP,
353     NK_DOWN,
354     NK_UP // a bit of a hack, this works as long as NK_UP < KC_A
355 };
356
357 void send_keystrokes(uint8_t key, ...)
358 {
359     va_list vl;
360     va_start(vl, key);
361     enum next_key_down_up nkdu = NK_DOWN_UP;
362     while (key != KC_NO) {
363         if (key < KC_A) {
364             nkdu = key;
365         } else {
366             switch (nkdu) {
367             case NK_DOWN_UP:
368                 register_code(key);
369             case NK_UP:
370                 unregister_code(key);
371                 break;
372             case NK_DOWN:
373                 register_code(key);
374             }
375             nkdu = NK_DOWN_UP;
376         }
377         key = va_arg(vl, int);
378     }
379     va_end(vl);
380 }
381
382 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
383 {
384   // MACRODOWN only works in this function
385     switch(id) {
386     case 0: // { }
387         if (record->event.pressed) {
388             return MACRO(T(ENT), D(LSFT), T(LBRC), U(LSFT), T(ENT),
389                          D(LSFT), T(RBRC), U(LSFT), T(UP),
390                          T(TAB), END);
391         }
392         break;
393     case 1:
394         if (record->event.pressed) {
395             return MACRO(T(0), T(X), END);
396         }
397         break;
398     case 2:
399         if (record->event.pressed) {
400             SEND_STRING("public");
401         }
402         break;
403     case 3:
404         if (record->event.pressed) {
405             SEND_STRING("protected");
406         }
407         break;
408     case 4:
409         if (record->event.pressed) {
410             SEND_STRING("private");
411         }
412         break;
413     case 5: // class
414         if (record->event.pressed) {
415             return MACRO(T(C), T(L), T(A), T(S), T(S), T(ENT),
416                          D(LSFT), T(LBRC), U(LSFT), T(ENT),
417                          T(P), T(U), T(B), T(L), T(I), T(C),
418                          D(LSFT), T(SCLN), U(LSFT), T(ENT), T(ENT),
419                          T(P), T(R), T(I), T(V), T(A), T(T), T(E),
420                          D(LSFT), T(SCLN), U(LSFT), T(ENT),
421                          D(LSFT), T(RBRC), U(LSFT), T(SCLN), T(ENT),
422                          T(UP), T(UP), T(UP), T(UP), T(UP), T(UP), T(UP),
423                          T(END), T(SPC), END);
424         }
425         break;
426     case 6: // struct
427         if (record->event.pressed) {
428             return MACRO(T(S), T(T), T(R), T(U), T(C), T(T), T(ENT),
429                          D(LSFT), T(LBRC), U(LSFT), T(ENT),
430                          D(LSFT), T(RBRC), U(LSFT), T(SCLN), T(ENT),
431                          T(UP), T(UP), T(UP), T(UP),
432                          T(END), T(SPC), END);
433         }
434         break;
435     case 7:
436         if (record->event.pressed) {
437             SEND_STRING("return");
438         }
439         break;
440     case 8: // #include
441         if (record->event.pressed) {
442             return MACRO(T(NONUS_HASH), T(I), T(N), T(C), T(L), T(U), T(D), T(E), END);
443         }
444         break;
445     case 9:
446         if (record->event.pressed) {
447             SEND_STRING("objdump -CT -x -d");
448         }
449         break;
450     case 10:
451         if (record->event.pressed) {
452             SEND_STRING("git log --oneline --graph --decorate=short");
453         }
454         break;
455     case 11:
456         if (record->event.pressed) {
457             SEND_STRING("good morning");
458         }
459         break;
460     case 12:
461         if (record->event.pressed) {
462             SEND_STRING("namespace");
463         }
464         break;
465     case 14: // emacs toggle read-only
466         if (record->event.pressed) {
467             return MACRO(D(LCTL), T(X), T(Q), U(LCTL), END);
468         }
469         break;
470     case 15: // emacs write buffer
471         if (record->event.pressed) {
472             return MACRO(D(LCTL), T(X), T(S), U(LCTL), END);
473         }
474         break;
475     case 16: // emacs undo
476         if (record->event.pressed) {
477             return MACRO(D(LCTL), D(LSFT), T(MINS), U(LSFT), U(LCTL), END);
478         }
479         break;
480     case 17: // emacs redo
481         if (record->event.pressed) {
482             return MACRO(D(LALT), D(LSFT), T(MINS), U(LSFT), U(LALT), END);
483         }
484         break;
485     case 18: // emacs previous buffer
486         if (record->event.pressed) {
487             return MACRO(D(LCTL), T(X), U(LCTL), T(LEFT), END);
488         }
489         break;
490     case 19: // emacs next buffer
491         if (record->event.pressed) {
492             return MACRO(D(LCTL), T(X), U(LCTL), T(RGHT), END);
493         }
494         break;
495     case 20:
496         if (record->event.pressed) {
497             SEND_STRING("good night");
498         }
499         break;
500     case 22: // { };
501         if (record->event.pressed) {
502             return MACRO(T(ENT), D(LSFT), T(LBRC), U(LSFT), T(ENT),
503                          D(LSFT), T(RBRC), U(LSFT), T(SCLN), T(UP),
504                          T(TAB), END);
505         }
506         break;
507     case 23:
508         if (record->event.pressed) {
509             SEND_STRING("template");
510         }
511         break;
512     case 24:
513         if (record->event.pressed) {
514             SEND_STRING("typename");
515         }
516         break;
517     case 25:
518         if (record->event.pressed) {
519             SEND_STRING("continue");
520             return MACRO(T(SCLN), END);
521         }
522         break;
523     case 26:
524         if (record->event.pressed) {
525             SEND_STRING("break");
526             return MACRO(T(SCLN), END);
527         }
528         break;
529     case 27:
530         if (record->event.pressed) {
531             SEND_STRING("const");
532         }
533         break;
534     case 28:
535         if (record->event.pressed) {
536             SEND_STRING(":-)");
537         }
538         break;
539     case 29:
540         if (record->event.pressed) {
541             SEND_STRING(":-(");
542         }
543         break;
544     case 30: // dazed
545         if (record->event.pressed) {
546             send_keystrokes(NK_DOWN, KC_LSFT, KC_8, KC_MINS, KC_8, NK_UP, KC_LSFT, KC_NO);
547         }
548         break;
549     case 31: // decaf
550         if (record->event.pressed) {
551             send_keystrokes(NK_DOWN, KC_LSFT, KC_C, KC_9, KC_MINS, KC_0, NK_UP, KC_LSFT, KC_NO);
552         }
553         break;
554     case 32:
555         if (record->event.pressed) {
556             SEND_STRING("operator");
557         }
558         break;
559     case 33:
560         if (record->event.pressed) {
561             SEND_STRING("nullptr");
562         }
563         break;
564     case 34:
565         if (record->event.pressed) {
566             SEND_STRING("extern");
567         }
568         break;
569     case 35:
570         if (record->event.pressed) {
571             SEND_STRING("virtual");
572         }
573         break;
574     case 36: // emacs font smaller
575         if (record->event.pressed) {
576             return MACRO(D(LCTL), T(X), T(EQL), U(LCTL), END);
577         }
578         break;
579     case 37:  // emacs font bigger
580         if (record->event.pressed) {
581             return MACRO(D(LCTL), T(X), T(MINS), U(LCTL), END);
582         }
583         break;
584     case 38:
585         if (record->event.pressed) {
586             SEND_STRING("volatile");
587         }
588         break;
589     }
590     return MACRO_NONE;
591 }
592
593 LEADER_EXTERNS();
594
595 // Runs constantly in the background, in a loop.
596 void matrix_scan_user(void) {
597
598     LEADER_DICTIONARY() {
599         leading = false;
600         leader_end();
601
602         SEQ_TWO_KEYS(KC_G, KC_A) {
603             SEND_STRING("git add .");
604         }
605         SEQ_TWO_KEYS(KC_G, KC_D) {
606             SEND_STRING("git diff");
607         }
608         SEQ_THREE_KEYS(KC_G, KC_D, KC_S) {
609             SEND_STRING("git diff --staged");
610         }
611         SEQ_TWO_KEYS(KC_G, KC_L) {
612             SEND_STRING("git log");
613         }
614         SEQ_THREE_KEYS(KC_G, KC_L, KC_O) {
615             SEND_STRING("git log --oneline");
616         }
617         SEQ_TWO_KEYS(KC_G, KC_F) {
618             SEND_STRING("git fetch");
619         }
620         SEQ_TWO_KEYS(KC_G, KC_O) {
621             SEND_STRING("git checkout");
622         }
623         SEQ_TWO_KEYS(KC_G, KC_P) {
624             SEND_STRING("git pull");
625         }
626         SEQ_TWO_KEYS(KC_G, KC_S) {
627             SEND_STRING("git status");
628         }
629         SEQ_TWO_KEYS(KC_G, KC_C) {
630             SEND_STRING("git commit -m ''");
631             send_keystrokes(KC_LEFT, KC_NO);
632         }
633         SEQ_THREE_KEYS(KC_G, KC_C, KC_A) {
634             SEND_STRING("git commit --amend");
635         }
636
637         SEQ_TWO_KEYS(KC_C, KC_C) {
638             SEND_STRING("const_cast<>");
639             send_keystrokes(KC_LEFT, KC_NO);
640         }
641         SEQ_TWO_KEYS(KC_C, KC_D) {
642             SEND_STRING("dynamic_cast<>");
643             send_keystrokes(KC_LEFT, KC_NO);
644         }
645         SEQ_TWO_KEYS(KC_C, KC_R) {
646             SEND_STRING("reinterpret_cast<>");
647             send_keystrokes(KC_LEFT, KC_NO);
648         }
649         SEQ_TWO_KEYS(KC_C, KC_S) {
650             SEND_STRING("static_cast<>");
651             send_keystrokes(KC_LEFT, KC_NO);
652         }
653
654         SEQ_ONE_KEY(KC_SLSH) {
655             send_keystrokes(KC_SLSH, NK_DOWN, KC_LSFT, KC_8, KC_8, NK_UP, KC_LSFT, KC_ENT,
656                             NK_DOWN, KC_LSFT, KC_8, NK_UP, KC_LSFT, KC_ENT,
657                             NK_DOWN, KC_LSFT, KC_8, NK_UP, KC_LSFT, KC_SLSH, KC_UP, KC_END, KC_SPC,
658                             KC_NO);
659         }
660     }
661 }