]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/ergodox_ez/keymaps/algernon/keymap.c
Renames keyboard folder to keyboards, adds couple of tmk's fixes (#432)
[qmk_firmware.git] / keyboards / ergodox_ez / keymaps / algernon / keymap.c
1 /*
2  * algernon's ErgoDox EZ layout, please see the README.md file!
3  */
4
5 #include "ergodox_ez.h"
6 #include "led.h"
7 #include "debug.h"
8 #include "action_layer.h"
9 #include "action_util.h"
10 #include "mousekey.h"
11 #include "timer.h"
12 #include "keymap_plover.h"
13
14 /* Layers */
15
16 enum {
17   BASE = 0,
18   APPSEL,
19   HUN,
20   EMACS,
21   OHLFT,
22   OHRGT,
23   PLVR,
24   EXPRM
25 };
26
27 /* Macros */
28
29 enum {
30   NONE = 0,
31   // Buttons that do extra stuff
32   A_GUI,
33   A_PLVR,
34   A_ESC,
35   A_MPN,
36   A_COLN,
37
38   // Function / number keys
39   KF_1, // 1, F1
40   KF_2, // 2, F2
41   KF_3, // ...
42   KF_4,
43   KF_5,
44   KF_6,
45   KF_7,
46   KF_8,
47   KF_9,
48   KF_10,
49   KF_11, // =, F11
50
51   // Application select keys
52   APP_SLK, // Slack
53   APP_EMCS, // Emacs
54   APP_TERM, // Terminal
55   APP_CHRM, // Chrome
56   APP_MSIC, // Music
57
58   // Diagonal mouse movement
59   A_MUL,
60   A_MUR,
61   A_MDL,
62   A_MDR,
63
64   // Emacs layer keys
65   AE_VIS, // Visual mode
66   AE_PSTDEL, // Paste/Delete
67   AE_CPYC, // Copy/Cut
68   AE_EMACS, // Emacs copy & paste mode
69   AE_TERM, // Terminal copy & paste mode
70   AE_OTHER, // Other copy & paste mode
71   AE_INS, // Insert mode
72   AE_OVR, // Overwrite mode
73   AE_APPND, // Append
74
75   // Hungarian layer keys
76   HU_AA, // Á
77   HU_OO, // Ó
78   HU_EE, // É
79   HU_UU, // Ú
80   HU_II, // Í
81   HU_OE, // Ö
82   HU_UE, // Ü
83   HU_OEE, // Ő
84   HU_UEE, // Ű
85
86   // One-handed layout specials
87   OH_BSSPC,
88   OH_ENTSFT,
89   OH_BASE,
90   OH_LEFT,
91   OH_RIGHT,
92 };
93
94 /* Fn keys */
95
96 enum {
97   F_BSE = 0,
98   F_HUN,
99   F_GUI,
100   F_SFT,
101   F_ALT,
102   F_CTRL
103 };
104
105 /* States & timers */
106
107 uint8_t m_visual_state = 0;
108 static uint16_t m_cutdel_timer;
109 static uint16_t m_copypaste_timer;
110
111 uint16_t gui_timer = 0;
112
113 uint16_t kf_timers[12];
114
115 uint16_t oh_base_timer = 0;
116 uint16_t oh_bsspc_timer = 0;
117 uint16_t oh_entsft_timer = 0;
118
119 #define OH_BLINK_INTERVAL 500
120
121 uint8_t oh_left_blink = 0;
122 uint16_t oh_left_blink_timer = 0;
123 uint8_t oh_right_blink = 0;
124 uint16_t oh_right_blink_timer = 0;
125
126 enum {
127   CP_EMACS = 0,
128   CP_TERM  = 1,
129   CP_OTHER = 2,
130 };
131
132 uint8_t cp_mode = CP_EMACS;
133
134 /* The Keymap */
135
136 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
137
138 /* Keymap 0: Base Layer
139  *
140  * ,-----------------------------------------------------.           ,-----------------------------------------------------.
141  * |        `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr |           | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10|       F11 |
142  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
143  * | Next/Prev |   '  |   ,  |   .  |   P  |   Y  |   [  |           |  ]   |   F  |   G  |   C  |   R  |  L   | =         |
144  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
145  * |       Tab |   A  |   O  |   E  |   U  |   I  |------|           |------|   D  |   H  |   T  |   N  |  S   | \         |
146  * |-----------+------+------+------+------+------|   (  |           |  )   |------+------+------+------+------+-----------|
147  * | Play/Pause|   /  |   Q  |   J  |   K  |   X  |      |           |      |   B  |   M  |   W  |   V  |  Z   |      Stop |
148  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
149  *     |  Home | End  | Down |  Up  |   :  |                                       |   -  | Left | Right| PgUp | PgDn  |
150  *     `-----------------------------------'                                       `-----------------------------------'
151  *                                         ,-------------.           ,-------------.
152  *                                         | LAlt | GUI  |           |EMACS | 1HND |
153  *                                  ,------|------|------|           |------+------+------.
154  *                                  |      |      | Ctrl |           | LEAD |      |      |
155  *                                  |Backsp|LShift|------|           |------| Enter| Space|
156  *                                  |      |      | ESC  |           | HUN  |      |      |
157  *                                  `--------------------'           `--------------------'
158  */
159 [BASE] = KEYMAP(
160 // left hand
161  KC_GRV             ,M(KF_1)     ,M(KF_2)     ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)
162 ,M(A_MPN)           ,KC_QUOT     ,KC_COMM     ,KC_DOT ,KC_P   ,KC_Y   ,KC_LBRC
163 ,KC_TAB             ,KC_A        ,KC_O        ,KC_E   ,KC_U   ,KC_I
164 ,KC_MPLY            ,KC_SLSH     ,KC_Q        ,KC_J   ,KC_K   ,KC_X   ,KC_LPRN
165 ,KC_HOME            ,KC_END      ,KC_DOWN     ,KC_UP  ,M(A_COLN)
166
167                                                             ,F(F_ALT),F(F_GUI)
168                                                                      ,F(F_CTRL)
169                                                     ,KC_BSPC,F(F_SFT),M(A_ESC)
170
171                                                                 // right hand
172                                                                ,KC_APP  ,M(KF_6),M(KF_7),M(KF_8),M(KF_9)     ,M(KF_10)    ,KC_F11
173                                                                ,KC_RBRC ,KC_F   ,KC_G   ,KC_C   ,KC_R        ,KC_L        ,KC_EQL
174                                                                         ,KC_D   ,KC_H   ,KC_T   ,KC_N        ,KC_S        ,KC_BSLS
175                                                                ,KC_RPRN ,KC_B   ,KC_M   ,KC_W   ,KC_V        ,KC_Z        ,KC_MSTP
176                                                                                 ,KC_MINS,KC_LEFT,KC_RGHT     ,KC_PGUP     ,KC_PGDN
177
178                                                                ,OSL(EMACS),M(OH_LEFT)
179                                                                ,KC_LEAD
180                                                                ,F(F_HUN),KC_ENT ,KC_SPC
181     ),
182
183 /* Keymap 1: Application select layer
184  *
185  * ,-----------------------------------------------------.           ,-----------------------------------------------------.
186  * |           |Music |Slack |Emacs |Term  |Chrome|      |           |      |      |      |      |      |      |           |
187  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
188  * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |
189  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
190  * |           |      |      |      |      |      |------|           |------|      |      |      |      |      |           |
191  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
192  * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |
193  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
194  *      |      |      |      |      |      |                                       |      |      |      |      |      |
195  *      `----------------------------------'                                       `----------------------------------'
196  *                                         ,-------------.           ,-------------.
197  *                                         |      |      |           |      |      |
198  *                                  ,------|------|------|           |------+------+------.
199  *                                  |      |      |      |           |      |      |      |
200  *                                  |      |      |------|           |------|      |      |
201  *                                  |      |      |      |           |      |      |      |
202  *                                  `--------------------'           `--------------------'
203  */
204
205 [APPSEL] = KEYMAP(
206 // left hand
207  KC_TRNS ,M(APP_MSIC),M(APP_SLK),M(APP_EMCS),M(APP_TERM),M(APP_CHRM),KC_TRNS
208 ,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS    ,KC_TRNS    ,KC_TRNS
209 ,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS    ,KC_TRNS
210 ,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS    ,KC_TRNS    ,KC_TRNS
211 ,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS
212
213                                              ,KC_TRNS ,KC_TRNS
214                                                       ,KC_TRNS
215                                     ,KC_TRNS ,KC_TRNS ,KC_TRNS
216
217                                                                 // right hand
218                                                                ,KC_TRNS ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_TRNS
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
221                                                                ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
222                                                                                  ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
223
224                                                                ,KC_TRNS ,KC_TRNS
225                                                                ,KC_TRNS
226                                                                ,KC_TRNS ,KC_TRNS  ,KC_TRNS
227     ),
228
229
230 /* Keymap 2: Hungarian Layer
231  *
232  * ,-----------------------------------------------------.           ,-----------------------------------------------------.
233  * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |
234  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
235  * |           |      |  Ő   |      |  Ű   |      |      |           |      |      |      |      |      |      |           |
236  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
237  * |           |   Á  |  Ó   |  É   |  Ú   |  Í   |------|           |------|      |      |      |      |      |           |
238  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
239  * |           |      |  Ö   |      |  Ü   |      |      |           |      |      |      |      |      |      |           |
240  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
241  *      |      |      |      |      |      |                                       |      |      |      |      |      |
242  *      `----------------------------------'                                       `----------------------------------'
243  *                                         ,-------------.           ,-------------.
244  *                                         |      |      |           |      |      |
245  *                                  ,------|------|------|           |------+------+------.
246  *                                  |      |      |      |           |      |      |      |
247  *                                  |      |      |------|           |------|      |      |
248  *                                  |      |      |      |           | BASE |      |      |
249  *                                  `--------------------'           `--------------------'
250  */
251
252 [HUN] = KEYMAP(
253 // left hand
254  KC_NO   ,KC_NO   ,KC_NO    ,KC_NO   ,KC_NO    ,KC_NO   ,KC_TRNS
255 ,KC_NO   ,KC_NO   ,M(HU_OEE),KC_NO   ,M(HU_UEE),KC_NO   ,KC_NO
256 ,KC_NO   ,M(HU_AA),M(HU_OO) ,M(HU_EE),M(HU_UU) ,M(HU_II)
257 ,KC_TRNS ,KC_NO   ,M(HU_OE) ,KC_NO   ,M(HU_UE) ,KC_NO   ,KC_NO
258 ,KC_TRNS ,KC_TRNS ,KC_TRNS  ,KC_TRNS ,KC_NO
259
260                                              ,KC_TRNS ,KC_TRNS
261                                                       ,KC_TRNS
262                                     ,KC_TRNS ,KC_TRNS ,KC_TRNS
263
264                                                                 // right hand
265                                                                ,KC_TRNS ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO
266                                                                ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO
267                                                                         ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO
268                                                                ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO
269                                                                                  ,KC_NO   ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
270
271                                                                ,KC_NO   ,KC_NO
272                                                                ,KC_NO
273                                                                ,F(F_BSE),KC_TRNS  ,KC_TRNS
274     ),
275
276 /* Keymap 3: Spacemacs layer
277  *
278  * ,-----------------------------------------------------.           ,-----------------------------------------------------.
279  * | MS Slow   | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 |ScrLCK|           |ScrLCK| 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10|    F11    |
280  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
281  * | MS Normal |      | Home |  Up  | PgUp |      |Visual|           |Scroll|  $   |MsUpL | MsUp |MsUpR |  R   |PrintScreen|
282  * |-----------+------+------+------+------+------| Mode |           |  Up  |------+------+------+------+------+-----------|
283  * | MS Fast   |APPEND| Left | Down | Right| INS  |------|           |------|  D   |MsLeft| MsDn |MsRght|      |           |
284  * |-----------+------+------+------+------+------| Cut  |           |Scroll|------+------+------+------+------+-----------|
285  * | Play/Pause|      | End  | Down | PgDn |  X   | Copy |           | Down |      |MsDnL |  W   |MsDnR |      |      Stop |
286  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
287  *      |EmacsM|TermM |OtherM|      |      |                                       |Vol Up|Vol Dn| Mute |      |      |
288  *      `----------------------------------'                                       `----------------------------------'
289  *                                         ,-------------.           ,-------------.
290  *                                         |  Alt | GUI  |           | BASE | MClk |
291  *                                  ,------|------|------|           |------+------+------.
292  *                                  |Delete|      | Ctrl |           | Prev |Left  |Right |
293  *                                  |      |LShift|------|           |------| Click| Click|
294  *                                  |Paste |      | ESC  |           | Next |      |      |
295  *                                  `--------------------'           `--------------------'
296  */
297 [EMACS] = KEYMAP(
298 // left hand
299  KC_ACL0    ,M(KF_1)     ,M(KF_2)    ,M(KF_3) ,M(KF_4) ,M(KF_5) ,LGUI(KC_L)
300 ,KC_ACL1    ,KC_NO       ,KC_HOME    ,KC_UP   ,KC_PGUP ,KC_NO   ,M(AE_VIS)
301 ,KC_ACL2    ,M(AE_APPND) ,KC_LEFT    ,KC_DOWN ,KC_RIGHT,M(AE_INS)
302 ,KC_MPLY    ,KC_NO       ,KC_END     ,KC_DOWN ,KC_PGDN ,KC_X    ,M(AE_CPYC)
303 ,M(AE_EMACS),M(AE_TERM)  ,M(AE_OTHER),KC_NO   ,KC_NO
304                                                         ,KC_TRNS ,KC_TRNS
305                                                                  ,KC_TRNS
306                                            ,M(AE_PSTDEL),KC_TRNS ,KC_TRNS
307
308                                                                      // right hand
309                                                                      ,LGUI(KC_L),M(KF_6) ,M(KF_7) ,M(KF_8) ,M(KF_9) ,M(KF_10) ,M(KF_11)
310                                                                      ,KC_WH_U   ,KC_DLR  ,M(A_MUL),KC_MS_U ,M(A_MUR),M(AE_OVR),KC_PSCR
311                                                                                 ,KC_D    ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_NO    ,KC_NO
312                                                                      ,KC_WH_D   ,KC_NO   ,M(A_MDL),KC_W    ,M(A_MDR),KC_NO    ,KC_MSTP
313                                                                                          ,KC_VOLU ,KC_VOLD ,KC_MUTE ,KC_NO    ,KC_NO
314
315                                                                      ,KC_TRNS   ,KC_MS_BTN3
316                                                                      ,KC_MPRV
317                                                                      ,KC_MNXT   ,KC_BTN1 ,KC_BTN2
318     ),
319
320 /* Keymap 5: One-handed, left side
321  *
322  * ,-----------------------------------------------------.
323  * |        `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 |A  BSE|
324  * |-----------+------+------+------+------+-------------|
325  * |       Tab |   '  |   ,  |   .  |   P  |   Y  |   [  |
326  * |-----------+------+------+------+------+------|      |
327  * |         - |   A  |   O  |   E  |   U  |   I  |------|
328  * |-----------+------+------+------+------+------|   (  |
329  * | Play/Pause|   ;  |   Q  |   J  |   K  |   X  |      |
330  * `-----------+------+------+------+------+-------------'
331  *     |  Home | End  | Down |  Up  | ESC  |
332  *     `-----------------------------------'
333  *                                         ,-------------.
334  *                                         | LAlt | GUI  |
335  *                                  ,------|------|------|
336  *                                  |BackSp|LShift| Ctrl |
337  *                                  |      |      |------|
338  *                                  |Space |Enter |OTHER |
339  *                                  `--------------------'
340  */
341 [OHLFT] = KEYMAP(
342 // left hand
343  KC_GRV     ,M(KF_1)     ,M(KF_2)     ,M(KF_3)   ,M(KF_4)    ,M(KF_5) ,M(OH_BASE)
344 ,KC_TAB     ,KC_QUOT     ,KC_COMM     ,KC_DOT    ,KC_P       ,KC_Y    ,KC_LBRC
345 ,KC_MINS    ,KC_A        ,KC_O        ,KC_E      ,KC_U       ,KC_I
346 ,KC_MPLY    ,KC_SCLN     ,KC_Q        ,KC_J      ,KC_K       ,KC_X    ,KC_LPRN
347 ,KC_HOME    ,KC_END      ,KC_DOWN     ,KC_UP     ,M(A_ESC)
348
349                                                                 ,KC_TRNS     ,KC_TRNS
350                                                                              ,KC_TRNS
351                                                     ,M(OH_BSSPC),M(OH_ENTSFT),M(OH_RIGHT)
352
353                                                                 // right hand
354                                                                ,KC_NO   ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO
355                                                                ,KC_NO   ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO
356                                                                         ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO
357                                                                ,KC_NO   ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO
358                                                                                 ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO
359
360                                                                ,KC_NO   ,KC_NO
361                                                                ,KC_NO
362                                                                ,KC_NO   ,KC_NO  ,KC_NO
363     ),
364
365 /* Keymap 6: One-handed, right side
366  *
367  * ,-----------------------------------------------------.
368  * | =     F11 | 0 F10| 9 F9 | 8 F8 | 7 F7 | 6 F6 |A  BSE|
369  * |-----------+------+------+------+------+-------------|
370  * |         / |   L  |   R  |   C  |   G  |   F  |   ]  |
371  * |-----------+------+------+------+------+------|      |
372  * |         \ |   S  |   N  |   T  |   H  |   D  |------|
373  * |-----------+------+------+------+------+------|   )  |
374  * |      Stop |   Z  |   V  |   W  |   M  |   B  |      |
375  * `-----------+------+------+------+------+-------------'
376  *     |  PgDn | PgUp | Right| Left | ESC  |
377  *     `-----------------------------------'
378  *                                         ,-------------.
379  *                                         | LAlt | GUI  |
380  *                                  ,------|------|------|
381  *                                  |BackSp|LShift| Ctrl |
382  *                                  |      |      |------|
383  *                                  |Space |Enter |OTHER |
384  *                                  `--------------------'
385  */
386 [OHRGT] = KEYMAP(
387 // left hand
388  M(KF_11)   ,M(KF_10)    ,M(KF_9)     ,M(KF_8)   ,M(KF_7)    ,M(KF_6) ,M(OH_BASE)
389 ,KC_SLSH    ,KC_L        ,KC_R        ,KC_C      ,KC_G       ,KC_F    ,KC_RBRC
390 ,KC_BSLS    ,KC_S        ,KC_N        ,KC_T      ,KC_H       ,KC_D
391 ,KC_MSTP    ,KC_Z        ,KC_V        ,KC_W      ,KC_M       ,KC_B    ,KC_RPRN
392 ,KC_PGDN    ,KC_PGUP     ,KC_RGHT     ,KC_LEFT   ,M(A_ESC)
393
394                                                                 ,KC_TRNS     ,KC_TRNS
395                                                                              ,KC_TRNS
396                                                     ,M(OH_BSSPC),M(OH_ENTSFT),M(OH_LEFT)
397
398                                                                 // right hand
399                                                                ,KC_NO   ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO
400                                                                ,KC_NO   ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO
401                                                                         ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO
402                                                                ,KC_NO   ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO
403                                                                                 ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO
404
405                                                                ,KC_NO   ,KC_NO
406                                                                ,KC_NO
407                                                                ,KC_NO   ,KC_NO  ,KC_NO
408     ),
409
410 /* Keymap 7: Steno for Plover
411  *
412  * ,--------------------------------------------------.           ,--------------------------------------------------.
413  * |        |      |      |      |      |      | BASE |           |      |      |      |      |      |      |        |
414  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
415  * |        |   #  |   #  |   #  |   #  |   #  |      |           |      |  #   |  #   |   #  |   #  |  #   |   #    |
416  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
417  * |        |      |   T  |   P  |   H  |      |------|           |------|      |  F   |   P  |   L  |  T   |   D    |
418  * |--------+   S  +------+------+------+   *  |      |           |      |  *   +------+------+------+------+--------|
419  * |        |      |   K  |   W  |   R  |      |      |           |      |      |  R   |   B  |   G  |  S   |   Z    |
420  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
421  *   |      |      |      |      |      |                                       |      |      |      |      |      |
422  *   `----------------------------------'                                       `----------------------------------'
423  *                                        ,-------------.       ,-------------.
424  *                                        |      |      |       |      |      |
425  *                                 ,------|------|------|       |------+------+------.
426  *                                 |      |      |      |       |      |      |      |
427  *                                 |   A  |   O  |------|       |------|  E   |  U   |
428  *                                 |      |      |      |       |      |      |      |
429  *                                 `--------------------'       `--------------------'
430  */
431
432 [PLVR] = KEYMAP(
433 // left hand
434 KC_NO,  KC_NO,  KC_NO,  KC_NO,   KC_NO,  KC_NO,   M(A_PLVR),
435 KC_NO,  PV_NUM, PV_NUM, PV_NUM,  PV_NUM, PV_NUM,  KC_NO,
436 KC_NO,  PV_LS,  PV_LT,  PV_LP,   PV_LH,  PV_STAR,
437 KC_NO,  PV_LS,  PV_LK,  PV_LW,   PV_LR,  PV_STAR, KC_NO,
438 KC_NO,  KC_NO,  KC_NO,  KC_NO,   KC_NO,
439                                            KC_NO, KC_NO,
440                                            KC_NO,
441                                            PV_A,  PV_O,  KC_NO,
442
443                                                  // right hand
444                                                  KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,
445                                                  KC_NO,   PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM,
446                                                           PV_STAR, PV_RF,   PV_RP,   PV_RL,   PV_RT,   PV_RD,
447                                                  KC_NO,   PV_STAR, PV_RR,   PV_RB,   PV_RG,   PV_RS,   PV_RZ,
448                                                                    KC_NO,   KC_NO,   KC_NO,   KC_NO, KC_NO,
449                                            KC_NO,      KC_NO,
450                                            KC_NO,
451                                            KC_NO,PV_E, PV_U
452  ),
453
454 /* Keymap 8: Experimental layer
455  *
456  * ,-----------------------------------------------------.           ,-----------------------------------------------------.
457  * |        `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr |           | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10|       F11 |
458  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
459  * | Next/Prev |   '  |   ,  |   .  |   P  |   Y  |   [  |           |  ]   |   Q  |   F  |   C  |   R  |  J   | =         |
460  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
461  * |       Tab |   A  |   O  |   E  |   U  |   I  |------|           |------|   D  |   H  |   T  |   N  |  S   | \         |
462  * |-----------+------+------+------+------+------|   (  |           |  )   |------+------+------+------+------+-----------|
463  * | Play/Pause|   Z  |   K  |   V  |   G  |   X  |      |           |      |   L  |   M  |   W  |   B  |  /   |      Stop |
464  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
465  *     |  Home | End  | Down |  Up  |   :  |                                       |   -  | Left | Right| PgUp | PgDn  |
466  *     `-----------------------------------'                                       `-----------------------------------'
467  *                                         ,-------------.           ,-------------.
468  *                                         | LAlt | GUI  |           |EMACS | 1HND |
469  *                                  ,------|------|------|           |------+------+------.
470  *                                  |      |      | Ctrl |           | LEAD |      |      |
471  *                                  |Backsp|LShift|------|           |------| Enter| Space|
472  *                                  |      |      | ESC  |           | HUN  |      |      |
473  *                                  `--------------------'           `--------------------'
474  */
475 [EXPRM] = KEYMAP(
476 // left hand
477  KC_GRV             ,M(KF_1)     ,M(KF_2)     ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)
478 ,M(A_MPN)           ,KC_QUOT     ,KC_COMM     ,KC_DOT ,KC_P   ,KC_Y   ,KC_LBRC
479 ,KC_TAB             ,KC_A        ,KC_O        ,KC_E   ,KC_U   ,KC_I
480 ,KC_MPLY            ,KC_Z        ,KC_K        ,KC_V   ,KC_G   ,KC_X   ,KC_LPRN
481 ,KC_HOME            ,KC_END      ,KC_DOWN     ,KC_UP  ,M(A_COLN)
482
483                                                             ,F(F_ALT),F(F_GUI)
484                                                                      ,F(F_CTRL)
485                                                     ,KC_BSPC,F(F_SFT),M(A_ESC)
486
487                                                                 // right hand
488                                                                ,KC_APP  ,M(KF_6),M(KF_7),M(KF_8),M(KF_9)     ,M(KF_10)    ,KC_F11
489                                                                ,KC_RBRC ,KC_Q   ,KC_F   ,KC_C   ,KC_R        ,KC_J        ,KC_EQL
490                                                                         ,KC_D   ,KC_H   ,KC_T   ,KC_N        ,KC_S        ,KC_BSLS
491                                                                ,KC_RPRN ,KC_L   ,KC_M   ,KC_W   ,KC_B        ,KC_SLSH     ,KC_MSTP
492                                                                                 ,KC_MINS,KC_LEFT,KC_RGHT     ,KC_PGUP     ,KC_PGDN
493
494                                                                ,OSL(EMACS),M(OH_LEFT)
495                                                                ,KC_LEAD
496                                                                ,F(F_HUN),KC_ENT ,KC_SPC
497     ),
498
499
500 };
501
502 const uint16_t PROGMEM fn_actions[] = {
503    [F_BSE]  = ACTION_LAYER_CLEAR(ON_PRESS)
504   ,[F_HUN]  = ACTION_LAYER_INVERT(HUN, ON_PRESS)
505   ,[F_GUI]  = ACTION_MACRO_TAP(A_GUI)
506   ,[F_SFT]  = ACTION_MODS_ONESHOT (MOD_LSFT)
507   ,[F_ALT]  = ACTION_MODS_ONESHOT (MOD_LALT)
508   ,[F_CTRL] = ACTION_MODS_ONESHOT (MOD_LCTL)
509 };
510
511 void toggle_steno(int pressed)
512 {
513   uint8_t layer = biton32(layer_state);
514
515   if (pressed) {
516     if (layer != PLVR) layer_on(PLVR); else layer_off(PLVR);
517
518     register_code(PV_LP);
519     register_code(PV_LH);
520     register_code(PV_LR);
521     register_code(PV_O);
522     register_code(PV_RL);
523     register_code(PV_RG);
524   } else {
525     unregister_code(PV_LP);
526     unregister_code(PV_LH);
527     unregister_code(PV_LR);
528     unregister_code(PV_O);
529     unregister_code(PV_RL);
530     unregister_code(PV_RG);
531   }
532 }
533
534 macro_t *ang_do_hun (keyrecord_t *record, uint16_t accent, uint16_t hun_char)
535 {
536   uint8_t need_shift = 0;
537   uint8_t hold_shift = 0;
538
539   if (!record->event.pressed)
540     return MACRO_NONE;
541
542   layer_off (HUN);
543
544   if (keyboard_report->mods & MOD_BIT (KC_LSFT)) {
545     hold_shift = 1;
546     need_shift = 1;
547     unregister_code (KC_LSFT);
548   }
549   if ((get_oneshot_mods () & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out ()) {
550     need_shift = 1;
551     hold_shift = 0;
552     unregister_code (KC_LSFT);
553   }
554
555   clear_oneshot_mods ();
556
557   register_code (KC_RALT);
558   unregister_code (KC_RALT);
559   if (accent == (KC_DQT)) {
560     register_code (KC_RSFT);
561   }
562   register_code (accent);
563   unregister_code (accent);
564   if (need_shift && accent != (KC_DQT)) {
565     register_code (KC_RSFT);
566   } else if (accent == (KC_DQT) && !need_shift) {
567     unregister_code (KC_RSFT);
568   }
569   register_code (hun_char);
570   unregister_code (hun_char);
571   if (need_shift || accent == (KC_DQT))
572     unregister_code (KC_RSFT);
573   if (hold_shift)
574     register_code (KC_LSFT);
575
576   return MACRO_NONE;
577 }
578
579 void ang_handle_kf (keyrecord_t *record, uint8_t id)
580 {
581   uint8_t code = id - KF_1;
582
583   if (record->event.pressed) {
584     kf_timers[code] = timer_read ();
585   } else {
586     uint8_t kc;
587
588     if (timer_elapsed (kf_timers[code]) > TAPPING_TERM) {
589       // Long press
590       kc = KC_F1 + code;
591     } else {
592       if (id == KF_11)
593         kc = KC_EQL;
594       else
595         kc = KC_1 + code;
596     }
597
598     register_code (kc);
599     unregister_code (kc);
600   }
601 }
602
603 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
604 {
605       switch(id) {
606       case A_ESC:
607         if (record->event.pressed) {
608           if ((get_oneshot_mods ()) && !has_oneshot_mods_timed_out ()) {
609             clear_oneshot_mods ();
610           } else {
611             register_code (KC_ESC);
612           }
613           layer_off (HUN);
614         } else {
615           unregister_code (KC_ESC);
616         }
617         break;
618
619       case A_COLN:
620         if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
621             ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {
622           int oneshot = ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out());
623
624           if (record->event.pressed) {
625             if (oneshot)
626               clear_oneshot_mods ();
627             unregister_code (KC_LSFT);
628
629             register_code (KC_SCLN);
630             unregister_code (KC_SCLN);
631             if (!oneshot)
632               register_code (KC_LSFT);
633           }
634         } else {
635           return MACRODOWN (D(RSFT), T(SCLN), U(RSFT), END);
636         }
637         break;
638
639       case A_MPN:
640         if (record->event.pressed) {
641           if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
642               ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {
643             int oneshot = ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out());
644
645             if (oneshot)
646               clear_oneshot_mods ();
647             unregister_code (KC_LSFT);
648
649             register_code (KC_MPRV);
650             unregister_code (KC_MPRV);
651
652             if (!oneshot)
653               register_code (KC_LSFT);
654           } else {
655             return MACRO (T(MNXT), END);
656           }
657         }
658         break;
659
660         /* Hungarian layer */
661       case HU_AA:
662         return ang_do_hun (record, KC_QUOT, KC_A);
663       case HU_OO:
664         return ang_do_hun (record, KC_QUOT, KC_O);
665       case HU_EE:
666         return ang_do_hun (record, KC_QUOT, KC_E);
667       case HU_UU:
668         return ang_do_hun (record, KC_QUOT, KC_U);
669       case HU_II:
670         return ang_do_hun (record, KC_QUOT, KC_I);
671       case HU_OE:
672         return ang_do_hun (record, KC_DQT, KC_O);
673       case HU_UE:
674         return ang_do_hun (record, KC_DQT, KC_U);
675       case HU_OEE:
676         return ang_do_hun (record, KC_EQL, KC_O);
677       case HU_UEE:
678         return ang_do_hun (record, KC_EQL, KC_U);
679
680         /* Mouse movement */
681       case A_MUL:
682         if (record->event.pressed) {
683           mousekey_on(KC_MS_UP);
684           mousekey_on(KC_MS_LEFT);
685         } else {
686           mousekey_off(KC_MS_UP);
687           mousekey_off(KC_MS_LEFT);
688         }
689         mousekey_send();
690         break;
691
692       case A_MUR:
693         if (record->event.pressed) {
694           mousekey_on(KC_MS_UP);
695           mousekey_on(KC_MS_RIGHT);
696         } else {
697           mousekey_off(KC_MS_UP);
698           mousekey_off(KC_MS_RIGHT);
699         }
700         mousekey_send();
701         break;
702
703       case A_MDL:
704         if (record->event.pressed) {
705           mousekey_on(KC_MS_DOWN);
706           mousekey_on(KC_MS_LEFT);
707         } else {
708           mousekey_off(KC_MS_DOWN);
709           mousekey_off(KC_MS_LEFT);
710         }
711         mousekey_send();
712         break;
713
714       case A_MDR:
715         if (record->event.pressed) {
716           mousekey_on(KC_MS_DOWN);
717           mousekey_on(KC_MS_RIGHT);
718         } else {
719           mousekey_off(KC_MS_DOWN);
720           mousekey_off(KC_MS_RIGHT);
721         }
722         mousekey_send();
723         break;
724
725         /* EMACS layer stuff */
726       case AE_EMACS:
727         if (record->event.pressed) {
728           cp_mode = CP_EMACS;
729         }
730         break;
731
732       case AE_TERM:
733         if (record->event.pressed) {
734           cp_mode = CP_TERM;
735         }
736         break;
737
738       case AE_OTHER:
739         if (record->event.pressed) {
740           cp_mode = CP_OTHER;
741         }
742         break;
743
744       case AE_VIS:
745         if (cp_mode == CP_EMACS && record->event.pressed) {
746           return MACRO(T(V), END);
747         }
748         break;
749
750       case AE_CPYC:
751         if (record->event.pressed) {
752           m_copypaste_timer = timer_read ();
753         } else {
754           if (timer_elapsed (m_copypaste_timer) > TAPPING_TERM) {
755             // Long press: Cut
756             switch (cp_mode) {
757             case CP_EMACS:
758               return MACRO(T(X), END);
759               break;
760             case CP_TERM:
761               return MACRO(D(RCTRL), D(RSFT), T(X), U(RSFT), U(RCTRL), END);
762               break;
763             case CP_OTHER:
764               return MACRO(D(RCTRL), T(X), U(RCTRL), END);
765               break;
766             }
767           } else {
768             // Short press: Copy
769             switch (cp_mode) {
770             case CP_EMACS:
771               return MACRO(T(Y), END);
772               break;
773             case CP_TERM:
774               return MACRO(D(RCTRL), D(RSFT), T(C), U(RSFT), U(RCTRL), END);
775               break;
776             case CP_OTHER:
777               return MACRO(D(RCTRL), T(C), U(RCTRL), END);
778               break;
779             }
780           }
781         }
782         break;
783
784       case AE_PSTDEL:
785         if (record->event.pressed) {
786           m_cutdel_timer = timer_read ();
787         } else {
788           if (timer_elapsed (m_cutdel_timer) > TAPPING_TERM) {
789             // Long press: Delete
790             switch (cp_mode) {
791             case CP_EMACS:
792               return MACRO(T(D), END);
793               break;
794             case CP_TERM:
795             case CP_OTHER:
796               return MACRO(T(DEL), END);
797               break;
798             }
799           } else {
800             // Short press: Paste
801             switch (cp_mode) {
802             case CP_EMACS:
803               if (keyboard_report->mods & MOD_BIT(KC_RSFT)) {
804                 unregister_code (KC_RSFT);
805                 return MACRO(U(RSFT), T(RBRC), T(P), D(RSFT), END);
806               }
807               else
808                 return MACRO(T(P), END);
809               break;
810             case CP_TERM:
811               return MACRO(D(RCTRL), D(RSFT), T(V), U(RSFT), U(RCTRL), END);
812               break;
813             case CP_OTHER:
814               return MACRO(D(RCTRL), T(V), U(RCTRL), END);
815               break;
816             }
817           }
818         }
819         break;
820
821       case AE_INS:
822         if (record->event.pressed) {
823           return MACRO(T(I), END);
824         } else {
825           layer_clear();
826         }
827         break;
828
829       case AE_OVR:
830         if (record->event.pressed) {
831           return MACRO(T(R), END);
832         } else {
833           layer_clear();
834         }
835         break;
836
837       case AE_APPND:
838         if (record->event.pressed) {
839           return MACRO(T(A), END);
840         } else {
841           layer_clear();
842         }
843         break;
844
845         /* Plover base */
846       case A_PLVR:
847         toggle_steno(record->event.pressed);
848         break;
849
850         /* GUI & AppSel */
851       case A_GUI:
852         if (record->event.pressed) {
853           register_code (KC_LGUI);
854           if (record->tap.count && !record->tap.interrupted) {
855             if (record->tap.count >= 2) {
856               register_code (KC_W);
857               layer_on (APPSEL);
858               set_oneshot_layer (APPSEL, ONESHOT_START);
859             }
860           } else {
861             record->tap.count = 0;
862           }
863           gui_timer = 0;
864         } else {
865           if (record->tap.count >= 2)
866             {
867               unregister_code (KC_W);
868               clear_oneshot_layer_state (ONESHOT_PRESSED);
869             }
870           gui_timer = timer_read ();
871         }
872         break;
873
874       case APP_SLK:
875         return MACRODOWN(T(S), T(C), T(U), T(D), T(C), T(L), T(O), T(U), T(D), T(ENT), END);
876
877       case APP_EMCS:
878         return MACRODOWN(T(E), T(M), T(A), T(C), T(S), T(ENT), END);
879
880       case APP_TERM:
881         return MACRODOWN(T(T), T(E), T(R), T(M), T(ENT), END);
882
883       case APP_CHRM:
884         return MACRODOWN(T(C), T(H), T(R), T(O), T(M), T(ENT), END);
885
886       case APP_MSIC:
887         return MACRODOWN(T(R), T(H), T(Y), T(T), T(H), T(M), T(B), T(O), T(X), T(ENT), END);
888
889         /* Function keys */
890       case KF_1 ... KF_11:
891         ang_handle_kf (record, id);
892         break;
893
894         /* 1HAND layout */
895       case OH_BASE:
896         if (record->event.pressed) {
897           oh_base_timer = timer_read ();
898         } else {
899           if (timer_elapsed (oh_base_timer) > TAPPING_TERM) {
900             layer_clear ();
901           } else {
902             return MACRO (T(APP), END);
903           }
904         }
905         break;
906
907       case OH_BSSPC:
908         if (record->event.pressed) {
909           oh_bsspc_timer = timer_read ();
910         } else {
911           if (timer_elapsed (oh_bsspc_timer) > TAPPING_TERM) {
912             return MACRO (T(BSPC), END);
913           } else {
914             return MACRO (T(SPC), END);
915           }
916         }
917         break;
918
919       case OH_ENTSFT:
920         if (record->event.pressed) {
921           oh_entsft_timer = timer_read ();
922         } else {
923           if (timer_elapsed (oh_entsft_timer) > TAPPING_TERM) {
924             if (keyboard_report->mods & MOD_BIT(KC_LSFT))
925               unregister_code (KC_LSFT);
926             else
927               register_code (KC_LSFT);
928           } else {
929             return MACRO (T(ENT), END);
930           }
931         }
932         break;
933
934       case OH_LEFT:
935         if (record->event.pressed) {
936           layer_move (OHLFT);
937           oh_left_blink = 1;
938           oh_left_blink_timer = timer_read ();
939           ergodox_right_led_1_on ();
940         }
941         break;
942
943       case OH_RIGHT:
944         if (record->event.pressed) {
945           layer_move (OHRGT);
946           oh_right_blink = 1;
947           oh_right_blink_timer = timer_read ();
948           ergodox_right_led_3_on ();
949         }
950         break;
951       }
952       return MACRO_NONE;
953 };
954
955 // Runs just one time when the keyboard initializes.
956 void matrix_init_user(void) {
957   ergodox_led_all_on();
958   for (int i = LED_BRIGHTNESS_HI; i > LED_BRIGHTNESS_LO; i--) {
959     ergodox_led_all_set (i);
960     _delay_ms (5);
961   }
962   _delay_ms(1000);
963   for (int i = LED_BRIGHTNESS_LO; i > 0; i--) {
964     ergodox_led_all_set (i);
965     _delay_ms (10);
966   }
967   ergodox_led_all_off();
968 };
969
970 LEADER_EXTERNS();
971
972 void ang_do_unicode (void) {
973   register_code (KC_RCTL);
974   register_code (KC_RSFT);
975   register_code (KC_U);
976   unregister_code (KC_U);
977   unregister_code (KC_RSFT);
978   unregister_code (KC_RCTL);
979   _delay_ms (100);
980 }
981
982 void ang_tap (uint16_t codes[]) {
983   for (int i = 0; codes[i] != 0; i++) {
984     register_code (codes[i]);
985     unregister_code (codes[i]);
986     _delay_ms (50);
987   }
988 }
989
990 #define TAP_ONCE(code) \
991   register_code (code); \
992   unregister_code (code)
993
994 uint8_t is_exp = 0;
995
996 // Runs constantly in the background, in a loop.
997 void matrix_scan_user(void) {
998   uint8_t layer = biton32(layer_state);
999
1000   if (gui_timer && timer_elapsed (gui_timer) > TAPPING_TERM)
1001     unregister_code (KC_LGUI);
1002
1003   if (layer != OHLFT)
1004     oh_left_blink = 0;
1005   if (layer != OHRGT)
1006     oh_right_blink = 0;
1007
1008   if (layer == HUN) {
1009     ergodox_right_led_2_on();
1010     ergodox_right_led_3_on();
1011   } else if (layer == EMACS) {
1012     ergodox_right_led_1_on();
1013     ergodox_right_led_2_on();
1014   } else if (layer == PLVR) {
1015     ergodox_right_led_1_on ();
1016     ergodox_right_led_2_on ();
1017     ergodox_right_led_3_on ();
1018   } else if (layer == EXPRM) {
1019     ergodox_right_led_1_on ();
1020     ergodox_right_led_2_on ();
1021     ergodox_right_led_3_on ();
1022
1023     ergodox_right_led_2_set (LED_BRIGHTNESS_HI);
1024   }
1025
1026   if (layer == OHLFT || layer == OHRGT) {
1027     ergodox_right_led_2_on();
1028
1029     if (oh_left_blink) {
1030       if (timer_elapsed (oh_left_blink_timer) > OH_BLINK_INTERVAL) {
1031         if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) == 0)
1032           ergodox_right_led_1_off ();
1033       }
1034       if (timer_elapsed (oh_left_blink_timer) > OH_BLINK_INTERVAL * 2) {
1035         ergodox_right_led_1_on ();
1036         oh_left_blink_timer = timer_read ();
1037       }
1038     }
1039
1040     if (oh_right_blink) {
1041       if (timer_elapsed (oh_right_blink_timer) > OH_BLINK_INTERVAL) {
1042         if ((keyboard_report->mods & MOD_BIT(KC_LCTRL)) == 0)
1043           ergodox_right_led_3_off ();
1044       }
1045       if (timer_elapsed (oh_right_blink_timer) > OH_BLINK_INTERVAL * 2) {
1046         ergodox_right_led_3_on ();
1047         oh_right_blink_timer = timer_read ();
1048       }
1049     }
1050   }
1051
1052   if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
1053       ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {
1054     ergodox_right_led_1_set (LED_BRIGHTNESS_HI);
1055     ergodox_right_led_1_on ();
1056   } else {
1057     ergodox_right_led_1_set (LED_BRIGHTNESS_LO);
1058     if (layer != OHLFT && layer != EMACS && layer != PLVR && layer != EXPRM)
1059       ergodox_right_led_1_off ();
1060   }
1061
1062   if (keyboard_report->mods & MOD_BIT(KC_LALT) ||
1063       ((get_oneshot_mods() & MOD_BIT(KC_LALT)) && !has_oneshot_mods_timed_out())) {
1064     ergodox_right_led_2_set (LED_BRIGHTNESS_HI);
1065     ergodox_right_led_2_on ();
1066   } else {
1067     ergodox_right_led_2_set (LED_BRIGHTNESS_LO);
1068     if (layer != OHRGT && layer != HUN && layer != OHLFT && layer != EMACS && layer != PLVR && layer != EXPRM)
1069       ergodox_right_led_2_off ();
1070   }
1071
1072   if (keyboard_report->mods & MOD_BIT(KC_LCTRL) ||
1073       ((get_oneshot_mods() & MOD_BIT(KC_LCTRL)) && !has_oneshot_mods_timed_out())) {
1074     ergodox_right_led_3_set (LED_BRIGHTNESS_HI);
1075     ergodox_right_led_3_on ();
1076   } else {
1077     ergodox_right_led_3_set (LED_BRIGHTNESS_LO);
1078     if (layer != OHRGT && layer != HUN && layer != PLVR && layer != EXPRM)
1079       ergodox_right_led_3_off ();
1080   }
1081
1082   LEADER_DICTIONARY() {
1083     leading = false;
1084     leader_end ();
1085
1086     SEQ_ONE_KEY (KC_U) {
1087       ang_do_unicode ();
1088     }
1089
1090 #ifdef QMK_VERSION
1091     SEQ_ONE_KEY (KC_V) {
1092       SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
1093     }
1094 #endif
1095
1096     SEQ_ONE_KEY (KC_L) {
1097       /* λ */
1098       ang_do_unicode ();
1099
1100       uint16_t codes[] = {KC_0, KC_3, KC_B, KC_B, KC_ENT, 0};
1101       ang_tap (codes);
1102     }
1103
1104     SEQ_ONE_KEY (KC_Y) {
1105       uint16_t codes[] = {KC_BSLS, KC_O, KC_SLSH, 0};
1106       ang_tap (codes);
1107     }
1108
1109     SEQ_ONE_KEY (KC_S) {
1110       ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);
1111       TAP_ONCE (KC_BSLS);
1112       register_code (KC_RSFT); TAP_ONCE (KC_MINS); TAP_ONCE (KC_9); unregister_code (KC_RSFT);
1113       ang_do_unicode (); TAP_ONCE (KC_3); TAP_ONCE (KC_0); TAP_ONCE (KC_C); TAP_ONCE (KC_4); TAP_ONCE (KC_SPC);
1114       register_code (KC_RSFT); TAP_ONCE (KC_0); TAP_ONCE (KC_MINS); unregister_code (KC_RSFT);
1115       TAP_ONCE (KC_SLSH);
1116       ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);
1117     }
1118
1119     SEQ_TWO_KEYS (KC_W, KC_M) {
1120       register_code (KC_LALT);
1121       register_code (KC_F2);
1122       unregister_code (KC_F2);
1123       unregister_code (KC_LALT);
1124
1125       _delay_ms (1000);
1126
1127       uint16_t codes[] = {KC_M, KC_A, KC_X, KC_MINS, KC_F, KC_O, KC_C, KC_U, KC_S, KC_E, KC_D, KC_ENT, 0};
1128       ang_tap (codes);
1129       register_code (KC_LGUI);
1130       register_code (KC_UP);
1131       unregister_code (KC_UP);
1132       unregister_code (KC_LGUI);
1133     }
1134
1135     SEQ_ONE_KEY (KC_E) {
1136       if (is_exp == 0) {
1137         default_layer_and (0);
1138         default_layer_or ((1 << EXPRM));
1139         is_exp = 1;
1140
1141         ergodox_led_all_off ();
1142         ergodox_right_led_3_on ();
1143         _delay_ms (100);
1144         ergodox_right_led_2_on ();
1145         _delay_ms (100);
1146         ergodox_right_led_3_off ();
1147         ergodox_right_led_1_on ();
1148         _delay_ms (100);
1149         ergodox_right_led_2_off ();
1150         _delay_ms (100);
1151         ergodox_right_led_1_off ();
1152       } else {
1153         is_exp = 0;
1154         default_layer_and (0);
1155         default_layer_or (1 << BASE);
1156
1157         ergodox_led_all_off ();
1158         ergodox_right_led_1_on ();
1159         _delay_ms (100);
1160         ergodox_right_led_2_on ();
1161         _delay_ms (100);
1162         ergodox_right_led_1_off ();
1163         ergodox_right_led_3_on ();
1164         _delay_ms (100);
1165         ergodox_right_led_2_off ();
1166         _delay_ms (100);
1167         ergodox_right_led_3_off ();
1168
1169       }
1170     }
1171   }
1172 }