keymap.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. #include "ergodox.h"
  2. #include "led.h"
  3. #include "debug.h"
  4. #include "action_layer.h"
  5. #include "action_code.h"
  6. #define BASE 0 // default layer
  7. #define SHELL_NAV 1
  8. #define KEY_NAV 3 // key navigation layer
  9. #define KEY_SEL 4 // key selection layer
  10. #define NUMBER 5 // number layer
  11. #define SYMBOL 6
  12. #define SHORTCUTS 7
  13. // macros
  14. #define MC_COPY_LINE 0
  15. #define MC_CUT_LINE 1
  16. #define MC_PASTE_LINE 2
  17. #define MC_NEW_SEARCH_TAB 3
  18. #define SCREEN_TAB_LEFT 4
  19. #define SCREEN_TAB_RIGHT 5
  20. #define SCREEN_NEW_TAB 6
  21. #define SWITCH_NDS 7
  22. #define SCREEN_COPY_MODE 8
  23. #define SCREEN_PASTE 9
  24. #define OPEN_CLOSE_PAREN 10
  25. #define OPEN_CLOSE_BRACKET 11
  26. #define OPEN_CLOSE_CURLY 12
  27. #define OPEN_CLOSE_SINGLE_QUOTE 13
  28. #define OPEN_CLOSE_DOUBLE_QUOTE 14
  29. #define SHELL_RECALL_LAST_ARG_REMOVE_FIRST_COMMAND 15
  30. #define SEMICOLON_NEWLINE 16
  31. #define END_NEWLINE 17
  32. const uint16_t PROGMEM fn_actions[] = {
  33. [1] = ACTION_LAYER_TAP_TOGGLE(KEY_NAV), // FN1 - keynav layer
  34. [2] = ACTION_LAYER_TAP_TOGGLE(NUMBER), // FN2 - number layer
  35. [3] = ACTION_MODS_ONESHOT(MOD_LSFT), // FN3 - shift modifier / oneshot
  36. [4] = ACTION_MODS_ONESHOT(MOD_LCTL), // FN4 - ctrl modifier / oneshot
  37. [5] = ACTION_MODS_ONESHOT(MOD_LALT), // FN5 - alt modifier / oneshot
  38. };
  39. //Tap Dance Declarations
  40. enum {
  41. TD_SHIFT_CAPSLOCK = 0,
  42. TD_BRK_LEFT = 1,
  43. TD_BRK_RIGHT = 2
  44. };
  45. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  46. // base layer
  47. [BASE] = KEYMAP( // layer 0 : default
  48. // left hand
  49. KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
  50. KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, MO(KEY_SEL),
  51. MO(SHELL_NAV), KC_A, KC_O, KC_E, KC_U, KC_I,
  52. KC_FN3, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, MO(KEY_NAV),
  53. OSL(SHORTCUTS),KC_FN4, KC_FN5,OSL(SYMBOL),MO(NUMBER),
  54. // thumb cluster
  55. RCTL(KC_F), RCTL(KC_S),
  56. RCTL(KC_DEL),
  57. KC_BSPC,RCTL(KC_BSPC),KC_DEL,
  58. // right hand
  59. KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSLS,
  60. KC_PGUP, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH,
  61. KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS,
  62. KC_PGDN, KC_B, KC_M, KC_W, KC_V, KC_Z, TD(TD_SHIFT_CAPSLOCK),
  63. // lower keys - browser tab control
  64. RSFT(RCTL(KC_TAB)), RCTL(KC_TAB), RCTL(KC_T), RCTL(KC_K), RCTL(KC_W),
  65. // thumb cluster
  66. M(SEMICOLON_NEWLINE), M(END_NEWLINE),
  67. KC_TRNS,
  68. KC_TRNS,KC_ENT, KC_SPC
  69. ),
  70. // shell navigation layer
  71. [SHELL_NAV] = KEYMAP(
  72. // left hand
  73. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  74. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  75. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  76. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  77. // bottom row
  78. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  79. // thumb cluster
  80. KC_TRNS,KC_TRNS,
  81. LALT(KC_D),
  82. KC_TRNS,RCTL(KC_W),KC_TRNS,
  83. // right hand
  84. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  85. RCTL(KC_L), RCTL(KC_W), KC_HOME, KC_UP, KC_END, LALT(KC_D), RCTL(KC_R),
  86. LALT(KC_B), KC_LEFT, KC_DOWN, KC_RIGHT, LALT(KC_F), LALT(KC_DOT),
  87. RCTL(KC_C), RCTL(KC_U), M(SCREEN_COPY_MODE), M(SCREEN_PASTE), HYPR(KC_V), RCTL(KC_K), M(SHELL_RECALL_LAST_ARG_REMOVE_FIRST_COMMAND),
  88. // bottom row
  89. M(SCREEN_TAB_LEFT), M(SCREEN_TAB_RIGHT), M(SCREEN_NEW_TAB), KC_TRNS, KC_TRNS,
  90. // thumb cluster
  91. KC_TRNS, KC_TRNS,
  92. KC_TRNS,
  93. KC_TRNS, KC_TRNS, KC_TRNS
  94. ),
  95. // key navigation layer
  96. [KEY_NAV] = KEYMAP(
  97. // left hand
  98. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  99. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  100. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  101. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  102. // bottom row
  103. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  104. // thumb cluster
  105. KC_TRNS,KC_TRNS,
  106. KC_TRNS,
  107. KC_TRNS,KC_TRNS,KC_TRNS,
  108. // right hand
  109. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  110. KC_TRNS, KC_PGDN, KC_HOME, KC_UP, KC_END, KC_PGUP, M(MC_COPY_LINE),
  111. RCTL(KC_LEFT), KC_LEFT, KC_DOWN, KC_RIGHT, RCTL(KC_RIGHT), M(MC_CUT_LINE),
  112. KC_TRNS, KC_TRNS, RCTL(KC_C), RCTL(KC_X), RCTL(KC_V), KC_TRNS, M(MC_PASTE_LINE),
  113. // bottom row
  114. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  115. // thumb cluster
  116. KC_TRNS, KC_TRNS,
  117. KC_TRNS,
  118. KC_TRNS, KC_TRNS, KC_TRNS
  119. ),
  120. // key selection layer
  121. [KEY_SEL] = KEYMAP(
  122. // left hand
  123. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  124. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  125. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  126. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  127. // bottom row
  128. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  129. // thumb cluster
  130. KC_TRNS,KC_TRNS,
  131. KC_TRNS,
  132. KC_TRNS,KC_TRNS,KC_TRNS,
  133. // right hand
  134. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  135. RSFT(KC_PGUP), RSFT(KC_PGDN), RSFT(KC_HOME), RSFT(KC_UP), RSFT(KC_END), RSFT(KC_PGUP), M(MC_COPY_LINE),
  136. RSFT(RCTL(KC_LEFT)), RSFT(KC_LEFT), RSFT(KC_DOWN), RSFT(KC_RIGHT), RSFT(RCTL(KC_RIGHT)), M(MC_CUT_LINE),
  137. RSFT(KC_PGDN), KC_TRNS, RCTL(KC_C), RCTL(KC_X), RCTL(KC_V), KC_TRNS, M(MC_PASTE_LINE),
  138. // bottom row
  139. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  140. // thumb cluster
  141. KC_TRNS, KC_TRNS,
  142. KC_TRNS,
  143. KC_TRNS, KC_TRNS, KC_TRNS
  144. ),
  145. // number layer
  146. [NUMBER] = KEYMAP(
  147. // left hand
  148. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  149. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  150. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  151. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  152. // bottom row
  153. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  154. // thumb cluster
  155. KC_TRNS,KC_TRNS,
  156. KC_TRNS,
  157. KC_TRNS,KC_TRNS,KC_TRNS,
  158. // right hand
  159. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  160. KC_TRNS, KC_PLUS, KC_7, KC_8, KC_9, KC_ASTR, KC_TRNS,
  161. KC_MINS, KC_4, KC_5, KC_6, KC_SLSH, KC_TRNS,
  162. KC_TRNS, KC_EQUAL, KC_1, KC_2, KC_3, KC_COLN, KC_TRNS,
  163. // bottom row
  164. KC_0, KC_DOT, KC_COMMA, KC_TRNS, KC_TRNS,
  165. // thumb cluster
  166. KC_TRNS, KC_TRNS,
  167. KC_TRNS,
  168. KC_TRNS, KC_TRNS, KC_TRNS
  169. ),
  170. [SYMBOL] = KEYMAP(
  171. // left hand
  172. KC_NO,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
  173. KC_TRNS,KC_TRNS, M(OPEN_CLOSE_PAREN), KC_LPRN, KC_RPRN, KC_TRNS, KC_TRNS,
  174. KC_TRNS,KC_TRNS, M(OPEN_CLOSE_BRACKET), KC_LBRC, KC_RBRC, M(OPEN_CLOSE_DOUBLE_QUOTE),
  175. KC_TRNS,M(SEMICOLON_NEWLINE),M(OPEN_CLOSE_CURLY), KC_LCBR, KC_RCBR, M(OPEN_CLOSE_SINGLE_QUOTE),KC_TRNS,
  176. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  177. KC_TRNS,KC_TRNS,
  178. KC_TRNS,
  179. KC_TRNS,KC_TRNS,KC_TRNS,
  180. // right hand
  181. KC_LPRN, KC_RPRN, KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, KC_TRNS,
  182. KC_TRNS, KC_PLUS, KC_AMPR, KC_ASTR, KC_GRAVE,KC_TILD, KC_TRNS,
  183. KC_MINS, KC_DLR, KC_PERC, KC_CIRC, KC_PIPE, KC_TRNS,
  184. KC_TRNS, KC_EQUAL,KC_EXLM, KC_AT, KC_HASH, KC_TRNS, KC_TRNS,
  185. KC_LBRC, KC_RBRC, TD(TD_BRK_LEFT), TD(TD_BRK_RIGHT), KC_TRNS,
  186. KC_TRNS, KC_TRNS,
  187. KC_TRNS,
  188. KC_TRNS, KC_TRNS, KC_TRNS
  189. ),
  190. [SHORTCUTS] = KEYMAP(
  191. // left hand
  192. KC_NO, HYPR(KC_F1), HYPR(KC_F2), HYPR(KC_F3), HYPR(KC_F4), HYPR(KC_F5), HYPR(KC_F6),
  193. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  194. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  195. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  196. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  197. KC_TRNS,KC_TRNS,
  198. KC_TRNS,
  199. KC_TRNS,KC_TRNS,KC_TRNS,
  200. // right hand
  201. HYPR(KC_F7), HYPR(KC_F8), HYPR(KC_F9), HYPR(KC_F10), HYPR(KC_F11), HYPR(KC_F12), M(SWITCH_NDS),
  202. KC_TRNS, HYPR(KC_A), HYPR(KC_B), HYPR(KC_C), HYPR(KC_D), HYPR(KC_E), HYPR(KC_F),
  203. HYPR(KC_G), HYPR(KC_H), HYPR(KC_I), HYPR(KC_J), HYPR(KC_K), HYPR(KC_L),
  204. KC_TRNS, HYPR(KC_M), HYPR(KC_N), HYPR(KC_O), HYPR(KC_P), HYPR(KC_Q), HYPR(KC_R),
  205. LALT(KC_LEFT),LALT(KC_RIGHT),KC_F5, LCTL(LGUI(KC_LEFT)), LCTL(LGUI(KC_RIGHT)),
  206. KC_TRNS, KC_TRNS,
  207. KC_TRNS,
  208. KC_TRNS, KC_TRNS, KC_TRNS
  209. ),
  210. };
  211. const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
  212. {
  213. // MACRODOWN only works in this function
  214. switch(id) {
  215. case MC_COPY_LINE:
  216. if (record->event.pressed) {
  217. return MACRO( T(HOME), D(LSFT), T(END), U(LSFT), D(LCTL), T(C), U(LCTL), END);
  218. }
  219. break;
  220. case MC_CUT_LINE:
  221. if (record->event.pressed) {
  222. return MACRO( T(HOME), D(LSFT), T(END), U(LSFT), D(LCTL), T(X), U(LCTL), END);
  223. }
  224. break;
  225. case MC_PASTE_LINE:
  226. if (record->event.pressed) {
  227. return MACRO( T(END), T(ENTER), D(LCTL), T(V), U(LCTL), END);
  228. }
  229. break;
  230. case MC_NEW_SEARCH_TAB:
  231. if (record->event.pressed) {
  232. return MACRO( D(LCTL), T(T), T(K), U(LCTL), END);
  233. }
  234. break;
  235. case SCREEN_TAB_LEFT:
  236. if (record->event.pressed) {
  237. return MACRO( D(LCTL), T(A), U(LCTL), T(P), END);
  238. }
  239. break;
  240. case SCREEN_TAB_RIGHT:
  241. if (record->event.pressed) {
  242. return MACRO( D(LCTL), T(A), U(LCTL), T(N), END);
  243. }
  244. break;
  245. case SCREEN_NEW_TAB:
  246. if (record->event.pressed) {
  247. return MACRO( D(LCTL), T(A), U(LCTL), T(C), END);
  248. }
  249. break;
  250. case SCREEN_COPY_MODE:
  251. if (record->event.pressed) {
  252. return MACRO( D(LCTL), T(A), U(LCTL), T(ESC), END);
  253. }
  254. break;
  255. case SCREEN_PASTE:
  256. if (record->event.pressed) {
  257. return MACRO( D(LCTL), T(A), U(LCTL), T(RBRC), END);
  258. }
  259. break;
  260. case SWITCH_NDS:
  261. if (record->event.pressed) {
  262. return MACRO( D(LSFT), T(F11), U(LSFT), W(500), D(LALT), T(TAB), U(LALT), END);
  263. }
  264. break;
  265. case OPEN_CLOSE_PAREN:
  266. if (record->event.pressed) {
  267. return MACRO( D(LSFT), T(LPRN), T(RPRN), U(LSFT), T(LEFT), END);
  268. }
  269. break;
  270. case OPEN_CLOSE_BRACKET:
  271. if (record->event.pressed) {
  272. return MACRO( T(LBRC), T(RBRC), T(LEFT), END);
  273. }
  274. break;
  275. case OPEN_CLOSE_CURLY:
  276. if (record->event.pressed) {
  277. return MACRO( D(LSFT), T(LCBR), T(RCBR), U(LSFT), T(LEFT), END);
  278. }
  279. break;
  280. case OPEN_CLOSE_SINGLE_QUOTE:
  281. if (record->event.pressed) {
  282. return MACRO( T(QUOT), T(QUOT), T(LEFT), END);
  283. }
  284. break;
  285. case OPEN_CLOSE_DOUBLE_QUOTE:
  286. if (record->event.pressed) {
  287. return MACRO( D(LSFT), T(QUOT), T(QUOT), U(LSFT), T(LEFT), END);
  288. }
  289. break;
  290. case SHELL_RECALL_LAST_ARG_REMOVE_FIRST_COMMAND:
  291. if (record->event.pressed) {
  292. return MACRO( T(UP), T(HOME), D(LALT), T(D), U(LALT), END);
  293. }
  294. break;
  295. case SEMICOLON_NEWLINE:
  296. if (record->event.pressed) {
  297. return MACRO( T(END), T(SCLN), T(ENTER), END);
  298. }
  299. break;
  300. case END_NEWLINE:
  301. if (record->event.pressed) {
  302. return MACRO( T(END), T(ENTER), END);
  303. }
  304. break;
  305. }
  306. return MACRO_NONE;
  307. };
  308. // Runs just one time when the keyboard initializes.
  309. void matrix_init_user(void) {
  310. return;
  311. };
  312. void led_set_user(uint8_t usb_led) {
  313. if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
  314. ergodox_right_led_1_on();
  315. } else {
  316. ergodox_right_led_1_off();
  317. }
  318. }
  319. qk_tap_dance_action_t tap_dance_actions[] = {
  320. [TD_SHIFT_CAPSLOCK] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPSLOCK),
  321. [TD_BRK_LEFT] = ACTION_TAP_DANCE_DOUBLE (KC_LPRN, KC_LCBR),
  322. [TD_BRK_RIGHT] = ACTION_TAP_DANCE_DOUBLE (KC_RPRN, KC_RCBR)
  323. };
  324. // Runs constantly in the background, in a loop.
  325. void matrix_scan_user(void) {
  326. uint8_t layer = biton32(layer_state);
  327. ergodox_board_led_off();
  328. ergodox_right_led_2_off();
  329. ergodox_right_led_3_off();
  330. switch (layer) {
  331. case NUMBER:
  332. case SYMBOL:
  333. ergodox_right_led_2_on();
  334. break;
  335. case KEY_NAV:
  336. case KEY_SEL:
  337. ergodox_right_led_3_on();
  338. break;
  339. case SHORTCUTS:
  340. ergodox_right_led_2_on();
  341. ergodox_right_led_3_on();
  342. break;
  343. default:
  344. // none
  345. break;
  346. }
  347. return;
  348. };