keymap.c 46 KB

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