keymap.c 33 KB

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