keymap.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
  1. #include QMK_KEYBOARD_H
  2. #include "debug.h"
  3. #include "action_layer.h"
  4. #include "version.h"
  5. // to build this keymap
  6. // make ergodox_ez:dvorak_42_key:teensy
  7. // flashing from rpi:
  8. // sudo teensy_loader_cli -v -w .build/ergodox_ez_dvorak_42_key.hex --mcu atmega32u4
  9. // keeping fork up to date:
  10. // https://help.github.com/articles/configuring-a-remote-for-a-fork/
  11. // https://help.github.com/articles/syncing-a-fork/
  12. // pushing dev branch
  13. // git push origin dev:dev
  14. static bool mouse_lock = false;
  15. enum custom_keycodes {
  16. PLACEHOLDER = SAFE_RANGE, // can always be here
  17. EPRM,
  18. VRSN,
  19. RGB_SLD,
  20. // shell nav macros
  21. SHELL_LS,
  22. SHELL_LSLTR,
  23. SHELL_LSLA,
  24. SHELL_CDPRE,
  25. SHELL_LESS,
  26. SHELL_PLESS,
  27. SHELL_PGREP,
  28. SHELL_TAILF,
  29. SHELL_PWD,
  30. SHELL_H3,
  31. SHELL_AMMCOLO,
  32. SHELL_SCREENRD,
  33. SHELL_SCREEN_NEW,
  34. SHELL_SCREEN_LIST,
  35. SHELL_MKE,
  36. SHELL_HTCSTATUS,
  37. // Cloud9 macros
  38. CLOUD9_TAB_LEFT,
  39. CLOUD9_TAB_RIGHT,
  40. CLOUD9_TAB_CLOSE,
  41. CLOUD9_GOTO_SYMBOL,
  42. CLOUD9_GOTO_LINE,
  43. CLOUD9_NAVIGATE,
  44. };
  45. #define BASE 0 // base dvorak layer
  46. #define KEYNAV 1 // arrow navigation (right hand)
  47. #define KEYSEL 2 // arrow navigation + shift (allow text selection)
  48. #define SHELL_NAV 3 // bash shortcuts
  49. #define SHELL_SCREEN 4 // linux screen shortcuts
  50. #define SCREEN_NAV 5 // navigate between linux screen tabs
  51. #define MOUSE 6 // mouse layer (can be locked with lock key), unmapped for now
  52. #define BROWSER_CONTROL 7 // control browser and mouse
  53. #define COMBINED 8 // combined numbers and symbols layer
  54. // macros
  55. #define MOUSE_TOGGLE 1
  56. #define MOUSE_LOCK 2
  57. #define SCREEN_TAB_LEFT 4
  58. #define SCREEN_TAB_RIGHT 5
  59. #define SCREEN_NEW_TAB 6
  60. #define SWITCH_NDS 7
  61. #define SCREEN_COPY_MODE 8
  62. #define SCREEN_PASTE 9
  63. #define SCREEN_RENAME 10
  64. #define SCREEN_NUMBER 11
  65. #define SCREEN_0 12
  66. #define SCREEN_1 13
  67. #define SCREEN_2 14
  68. #define SCREEN_3 15
  69. #define SCREEN_4 16
  70. #define SCREEN_5 17
  71. #define SCREEN_6 18
  72. #define SCREEN_7 19
  73. #define SCREEN_8 20
  74. #define SCREEN_9 21
  75. #define SCREEN_DETACH 22
  76. #define SCREEN_UP_JUMP 23
  77. #define SCREEN_DOWN_JUMP 24
  78. #define SCREEN_READREG_1 25
  79. #define SCREEN_READREG_2 26
  80. #define SCREEN_READREG_3 27
  81. #define SCREEN_PASTEREG_1 28
  82. #define SCREEN_PASTEREG_2 29
  83. #define SCREEN_PASTEREG_3 30
  84. #define SHELL_WRITE_LOGPATTERN 31
  85. #define SHELL_WRITE_TRANPATTERN 32
  86. #define SHELL_EXPAND_PATTERN 33
  87. #define MACRO_SCREEN_NUM(MACRO_NAME,NUM) \
  88. case MACRO_NAME:\
  89. if (record->event.pressed) {\
  90. return MACRO( D(LCTL), T(A), U(LCTL), T(NUM), END);\
  91. }\
  92. break;\
  93. #define MACRO_SCREEN_REG(MACRO_NAME,NUM) \
  94. case MACRO_NAME:\
  95. if (record->event.pressed) {\
  96. return MACRO( D(LCTL), T(A), U(LCTL), D(LSFT), T(SCOLON), U(LSFT),\
  97. T(R),\
  98. T(E),\
  99. T(A),\
  100. T(D),\
  101. T(R),\
  102. T(E),\
  103. T(G),\
  104. T(SPC),\
  105. T(NUM),\
  106. T(ENTER),\
  107. END);\
  108. }\
  109. break;\
  110. #define MACRO_SCREEN_PASTE(MACRO_NAME,NUM)\
  111. case MACRO_NAME:\
  112. if (record->event.pressed) {\
  113. return MACRO( D(LCTL), T(A), U(LCTL), D(LSFT), T(SCOLON), U(LSFT),\
  114. T(P),\
  115. T(A),\
  116. T(S),\
  117. T(T),\
  118. T(E),\
  119. T(SPC),\
  120. T(NUM),\
  121. T(ENTER),\
  122. END);\
  123. }\
  124. break;\
  125. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  126. [BASE] = KEYMAP(
  127. // left hand
  128. KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
  129. OSL(SCREEN_NAV), KC_QUOTE, KC_COMMA, KC_DOT, KC_P, KC_Y, MEH(KC_2),
  130. OSL(SHELL_NAV), KC_A, KC_O, KC_E, KC_U, KC_I,
  131. OSL(SHELL_SCREEN), KC_SCOLON, KC_Q, KC_J, KC_K, KC_X, MEH(KC_3),
  132. MEH(KC_1), OSM(MOD_LSFT), OSM(MOD_LCTL), MO(KEYSEL), MO(BROWSER_CONTROL),
  133. // left thumb cluster
  134. MEH(KC_4), MEH(KC_5),
  135. MEH(KC_6),
  136. MO(COMBINED),MO(KEYNAV), OSM(MOD_LALT),
  137. // right hand
  138. KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, MEH(KC_9),
  139. MEH(KC_7), KC_F, KC_G, KC_C, KC_R, KC_L, KC_TAB,
  140. KC_D, KC_H, KC_T, KC_N, KC_S, RCTL(KC_BSPC),
  141. MEH(KC_8), KC_B, KC_M, KC_W, KC_V, KC_Z, MEH(KC_F3),
  142. KC_BSPC, RCTL(KC_BSPC), KC_CAPSLOCK, OSM(MOD_LSFT),MEH(KC_F4),
  143. // right thumb cluster
  144. MEH(KC_F5),MEH(KC_F6),MEH(KC_F7),MEH(KC_F8),KC_ENTER,KC_SPACE
  145. ),
  146. [KEYNAV] = KEYMAP(
  147. // left hand
  148. KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  149. KC_TRNS,KC_ESC, CLOUD9_GOTO_LINE, RCTL(KC_Z), RCTL(KC_S), MEH(KC_F10), KC_TRNS,
  150. KC_TRNS,KC_LSFT, CLOUD9_GOTO_SYMBOL, RSFT(KC_TAB), KC_TAB, MEH(KC_A),
  151. KC_TRNS,MEH(KC_B), CLOUD9_NAVIGATE, CLOUD9_TAB_LEFT, CLOUD9_TAB_RIGHT, CLOUD9_TAB_CLOSE, KC_TRNS,
  152. KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  153. // left thumb cluster
  154. KC_TRNS,KC_TRNS,KC_TRNS,TO(MOUSE),KC_TRNS,KC_TRNS,
  155. // right hand
  156. KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MEH(KC_G),
  157. KC_TRNS,KC_NO, KC_HOME, KC_UP, KC_END, KC_PGUP, MEH(KC_H),
  158. LCTL(KC_LEFT), KC_LEFT, KC_DOWN, KC_RIGHT, LCTL(KC_RIGHT), MEH(KC_I),
  159. KC_TRNS,KC_NO, RCTL(KC_C), RCTL(KC_X), RCTL(KC_V), KC_PGDOWN, MEH(KC_J),
  160. KC_BSPC, RCTL(KC_BSPC), KC_DELETE, LCTL(KC_DELETE), MEH(KC_K),
  161. // right thumb cluster
  162. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS
  163. ),
  164. // key selection layer
  165. [KEYSEL] = KEYMAP(
  166. // left hand
  167. KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  168. KC_TRNS,MEH(KC_G), MEH(KC_H),MEH(KC_I), MEH(KC_J), MEH(KC_K), KC_TRNS,
  169. KC_TRNS,MEH(KC_L), MEH(KC_M),MEH(KC_N), MEH(KC_O), MEH(KC_P),
  170. KC_TRNS,MEH(KC_Q), MEH(KC_R),MEH(KC_S), MEH(KC_T), MEH(KC_U), KC_TRNS,
  171. // bottom row
  172. RESET,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  173. // thumb cluster
  174. KC_TRNS,KC_TRNS,
  175. KC_TRNS,
  176. KC_TRNS,KC_TRNS,KC_TRNS,
  177. // right hand
  178. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MEH(KC_Q),
  179. RSFT(KC_PGUP), KC_TRNS, RSFT(KC_HOME), RSFT(KC_UP), RSFT(KC_END), RSFT(KC_PGUP), MEH(KC_R),
  180. RSFT(RCTL(KC_LEFT)), RSFT(KC_LEFT), RSFT(KC_DOWN), RSFT(KC_RIGHT), RSFT(RCTL(KC_RIGHT)), MEH(KC_S),
  181. RSFT(KC_PGDN), KC_TRNS, RCTL(KC_C), RCTL(KC_X), RCTL(KC_V), RSFT(KC_PGDN), MEH(KC_T),
  182. // bottom row
  183. KC_BSPC, RCTL(KC_BSPC), KC_DELETE, LCTL(KC_DELETE), MEH(KC_U),
  184. // thumb cluster
  185. KC_TRNS, KC_TRNS,
  186. KC_TRNS,
  187. KC_TRNS, KC_TRNS, KC_TRNS
  188. ),
  189. // shell navigation layer
  190. [SHELL_NAV] = KEYMAP(
  191. // left hand
  192. KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  193. KC_TRNS,KC_TRNS, SHELL_PGREP, SHELL_PLESS, SHELL_LESS, KC_TRNS, SHELL_H3,
  194. KC_TRNS,SHELL_MKE, SHELL_CDPRE, SHELL_LSLTR, SHELL_LS, SHELL_LSLA,
  195. KC_TRNS,SHELL_SCREEN_LIST, SHELL_SCREENRD, SHELL_SCREEN_NEW, SHELL_TAILF, SHELL_HTCSTATUS, SHELL_AMMCOLO,
  196. // bottom row
  197. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  198. // thumb cluster
  199. KC_TRNS,KC_TRNS,
  200. KC_TRNS,
  201. KC_TRNS,KC_TRNS,KC_TRNS,
  202. // right hand
  203. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M(SHELL_WRITE_TRANPATTERN),
  204. RCTL(KC_L), RCTL(KC_W), KC_HOME, KC_UP, KC_END, KC_TRNS, M(SHELL_WRITE_LOGPATTERN),
  205. LALT(KC_B), KC_LEFT, KC_DOWN, KC_RIGHT, LALT(KC_F), RCTL(KC_W),
  206. RCTL(KC_C), RCTL(KC_U), LALT(KC_DOT), RCTL(KC_R), MEH(KC_V), RCTL(KC_K), M(SHELL_EXPAND_PATTERN),
  207. // bottom row (match functionality of base layer)
  208. KC_BSPC, RCTL(KC_W), KC_DELETE, LALT(KC_D), RCTL(KC_U),
  209. // thumb cluster
  210. KC_TRNS, KC_TRNS,
  211. KC_TRNS,
  212. KC_TRNS, KC_TRNS, KC_TRNS
  213. ),
  214. // linux screen layer
  215. [SHELL_SCREEN] = KEYMAP(
  216. // left hand
  217. KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  218. KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  219. 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, KC_TRNS,
  221. // bottom row
  222. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  223. // thumb cluster
  224. KC_TRNS,KC_TRNS,
  225. KC_TRNS,
  226. KC_TRNS,KC_TRNS,KC_TRNS,
  227. // right hand
  228. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  229. KC_TRNS, M(SCREEN_NEW_TAB), M(SCREEN_7), M(SCREEN_8), M(SCREEN_9), M(SCREEN_RENAME), KC_TRNS,
  230. M(SCREEN_TAB_LEFT), M(SCREEN_4), M(SCREEN_5), M(SCREEN_6), M(SCREEN_TAB_RIGHT), KC_TRNS,
  231. KC_TRNS, KC_TRNS, M(SCREEN_1), M(SCREEN_2), M(SCREEN_3), M(SCREEN_NUMBER), KC_TRNS,
  232. // bottom row
  233. M(SCREEN_0), KC_TRNS, KC_TRNS, KC_TRNS, M(SCREEN_DETACH),
  234. // thumb cluster
  235. KC_TRNS, KC_TRNS,
  236. KC_TRNS,
  237. KC_TRNS, KC_TRNS, KC_TRNS
  238. ),
  239. // navigation within screen (for copy/paste)
  240. [SCREEN_NAV] = KEYMAP(
  241. // left hand
  242. // left hand
  243. KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  244. KC_TRNS,KC_TRNS, M(SCREEN_READREG_3), M(SCREEN_READREG_2), M(SCREEN_READREG_1), KC_TRNS, KC_TRNS,
  245. KC_TRNS,KC_TRNS, M(SCREEN_PASTEREG_3), M(SCREEN_PASTEREG_2), M(SCREEN_PASTEREG_1), KC_TRNS,
  246. KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  247. // bottom row
  248. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  249. // thumb cluster
  250. KC_TRNS,KC_TRNS,
  251. KC_TRNS,
  252. KC_TRNS,KC_TRNS,KC_TRNS,
  253. // right hand
  254. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  255. KC_TRNS, KC_TRNS, KC_0, KC_UP, KC_DLR, M(SCREEN_UP_JUMP), KC_TRNS,
  256. KC_B, KC_LEFT, KC_DOWN, KC_RIGHT, KC_W, M(SCREEN_COPY_MODE),
  257. KC_TRNS, KC_TRNS, S(KC_W), S(KC_Y), M(SCREEN_PASTE), M(SCREEN_DOWN_JUMP), MEH(KC_V),
  258. // bottom row (match functionality of base layer)
  259. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  260. // thumb cluster
  261. KC_TRNS, KC_TRNS,
  262. KC_TRNS,
  263. KC_TRNS, KC_TRNS, KC_TRNS
  264. ),
  265. [COMBINED] = KEYMAP(
  266. // left hand
  267. KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  268. KC_TRNS,KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_TRNS,
  269. KC_TRNS,KC_LPRN, KC_RPRN, KC_LBRACKET, KC_RBRACKET, KC_UNDS,
  270. KC_TRNS,KC_COLN, KC_DQUO, KC_LCBR, KC_RCBR, KC_AMPR, KC_TRNS,
  271. // bottom row
  272. KC_TRNS,KC_TRNS, KC_TILD, KC_GRAVE, KC_CIRC,
  273. // thumb cluster
  274. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  275. // right hand
  276. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MEH(KC_L),
  277. KC_TRNS, KC_PLUS, KC_7, KC_8, KC_9, KC_ASTR, MEH(KC_M),
  278. KC_MINS, KC_4, KC_5, KC_6, KC_SLSH, MEH(KC_N),
  279. KC_TRNS, KC_EQUAL, KC_1, KC_2, KC_3, KC_QUES, MEH(KC_O),
  280. // bottom row
  281. KC_0, KC_DOT, KC_PIPE, KC_BSLS, MEH(KC_P),
  282. // thumb cluster
  283. KC_TRNS,KC_TRNS,
  284. KC_TRNS,
  285. KC_TRNS,KC_TRNS,KC_TRNS),
  286. [MOUSE] = KEYMAP(
  287. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  288. KC_TRNS, KC_TRNS, KC_PGUP, KC_MS_WH_UP, KC_UP, KC_TRNS, KC_TRNS,
  289. KC_TRNS, KC_MS_ACCEL0, KC_PGDN, KC_MS_WH_DOWN, KC_DOWN, KC_TRNS,
  290. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  291. KC_TRNS, KC_TRNS, M(MOUSE_LOCK), KC_TRNS, KC_MS_ACCEL0,
  292. KC_TRNS, KC_TRNS,
  293. KC_TRNS,
  294. KC_TRNS, KC_BTN3, KC_TRNS,
  295. // right hand
  296. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  297. KC_TRNS, KC_UP, KC_HOME, KC_MS_U, KC_END, KC_MS_WH_UP, KC_TRNS,
  298. KC_DOWN, KC_MS_L, KC_MS_D, KC_MS_R, KC_MS_WH_DOWN, KC_TRNS,
  299. KC_TRNS, MEH(KC_X), MEH(KC_Y), MEH(KC_Z), KC_F5, RCTL(KC_W), KC_TRNS,
  300. // browser tab control
  301. RSFT(RCTL(KC_TAB)), RCTL(KC_TAB), RCTL(KC_T), LALT(KC_LEFT), KC_TRNS,
  302. KC_TRNS, KC_TRNS,
  303. KC_TRNS,
  304. KC_TRNS, KC_BTN1, KC_BTN2
  305. ),
  306. [BROWSER_CONTROL] = KEYMAP(
  307. // left hand
  308. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  309. KC_TRNS, KC_TRNS, KC_BTN3, KC_MS_U, KC_BTN1, KC_BTN2, KC_TRNS,
  310. KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
  311. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  312. // bottom row
  313. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  314. KC_TRNS, KC_TRNS,
  315. KC_TRNS,
  316. KC_TRNS, KC_TRNS, KC_TRNS,
  317. // right hand
  318. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  319. KC_TRNS, KC_UP, KC_PGUP, KC_PGDN, KC_MS_WH_UP, KC_TRNS, KC_TRNS,
  320. KC_DOWN, RSFT(RCTL(KC_TAB)), RCTL(KC_TAB), KC_MS_WH_DOWN, LALT(KC_LEFT), KC_TRNS,
  321. KC_TRNS, KC_TRNS, RCTL(KC_1), RCTL(KC_9), KC_F6, KC_F5, KC_TRNS,
  322. // bottom row
  323. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  324. KC_TRNS, KC_TRNS,
  325. KC_TRNS,
  326. KC_TRNS, RCTL(KC_W), RCTL(KC_T)
  327. ),
  328. };
  329. const uint16_t PROGMEM fn_actions[] = {
  330. [1] = ACTION_LAYER_TAP_TOGGLE(1)
  331. };
  332. // leaving this in place for compatibilty with old keymaps cloned and re-compiled.
  333. const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
  334. {
  335. switch(id) {
  336. case MOUSE_TOGGLE:
  337. if (record->event.pressed) {
  338. layer_on(MOUSE);
  339. } else {
  340. if(!mouse_lock)
  341. layer_off(MOUSE);
  342. }
  343. break;
  344. case MOUSE_LOCK:
  345. if (record->event.pressed)
  346. {
  347. if(mouse_lock)
  348. {
  349. mouse_lock = false;
  350. layer_off(MOUSE);
  351. }
  352. else
  353. mouse_lock = true;
  354. }
  355. break;
  356. case SCREEN_TAB_LEFT:
  357. if (record->event.pressed) {
  358. return MACRO( D(LCTL), T(A), U(LCTL), T(P), END);
  359. }
  360. break;
  361. case SCREEN_TAB_RIGHT:
  362. if (record->event.pressed) {
  363. return MACRO( D(LCTL), T(A), U(LCTL), T(N), END);
  364. }
  365. break;
  366. case SCREEN_NEW_TAB:
  367. if (record->event.pressed) {
  368. return MACRO( D(LCTL), T(A), U(LCTL), T(C), END);
  369. }
  370. break;
  371. case SCREEN_DETACH:
  372. if (record->event.pressed) {
  373. return MACRO( D(LCTL), T(A), U(LCTL), T(D), END);
  374. }
  375. break;
  376. case SCREEN_RENAME:
  377. if (record->event.pressed) {
  378. return MACRO( D(LCTL), T(A), U(LCTL), D(LSFT), T(A), U(LSFT), END);
  379. }
  380. break;
  381. case SCREEN_NUMBER:
  382. if (record->event.pressed) {
  383. return MACRO( D(LCTL), T(A), U(LCTL), D(LSFT), T(SCOLON), U(LSFT),
  384. T(N),
  385. T(U),
  386. T(M),
  387. T(B),
  388. T(E),
  389. T(R),
  390. T(SPC),
  391. END);
  392. }
  393. break;
  394. MACRO_SCREEN_REG(SCREEN_READREG_1,1);
  395. MACRO_SCREEN_REG(SCREEN_READREG_2,2);
  396. MACRO_SCREEN_REG(SCREEN_READREG_3,3);
  397. MACRO_SCREEN_PASTE(SCREEN_PASTEREG_1,1);
  398. MACRO_SCREEN_PASTE(SCREEN_PASTEREG_2,2);
  399. MACRO_SCREEN_PASTE(SCREEN_PASTEREG_3,3);
  400. MACRO_SCREEN_NUM(SCREEN_0,0);
  401. MACRO_SCREEN_NUM(SCREEN_1,1);
  402. MACRO_SCREEN_NUM(SCREEN_2,2);
  403. MACRO_SCREEN_NUM(SCREEN_3,3);
  404. MACRO_SCREEN_NUM(SCREEN_4,4);
  405. MACRO_SCREEN_NUM(SCREEN_5,5);
  406. MACRO_SCREEN_NUM(SCREEN_6,6);
  407. MACRO_SCREEN_NUM(SCREEN_7,7);
  408. MACRO_SCREEN_NUM(SCREEN_8,8);
  409. MACRO_SCREEN_NUM(SCREEN_9,9);
  410. case SCREEN_UP_JUMP:
  411. if (record->event.pressed) {
  412. return MACRO( T(5), T(UP), END);
  413. }
  414. break;
  415. case SCREEN_DOWN_JUMP:
  416. if (record->event.pressed) {
  417. return MACRO( T(5), T(DOWN), END);
  418. }
  419. break;
  420. case SCREEN_COPY_MODE:
  421. if (record->event.pressed) {
  422. return MACRO( D(LCTL), T(A), U(LCTL), T(ESC), END);
  423. }
  424. break;
  425. case SCREEN_PASTE:
  426. if (record->event.pressed) {
  427. return MACRO( D(LCTL), T(A), U(LCTL), T(RBRC), END);
  428. }
  429. break;
  430. case SHELL_WRITE_LOGPATTERN:
  431. if (record->event.pressed) {
  432. return MACRO( D(LSFT),
  433. T(8),
  434. T(8),
  435. U(LSFT),
  436. T(L),
  437. T(O),
  438. T(G),
  439. T(LEFT),
  440. T(LEFT),
  441. T(LEFT),
  442. T(LEFT),
  443. END);
  444. }
  445. break;
  446. case SHELL_WRITE_TRANPATTERN:
  447. if (record->event.pressed) {
  448. return MACRO( D(LSFT),
  449. T(8),
  450. T(8),
  451. U(LSFT), T(T), T(R), T(A), T(N), T(LEFT), T(LEFT), T(LEFT), T(LEFT), T(LEFT), END);
  452. }
  453. break;
  454. case SHELL_EXPAND_PATTERN:
  455. if (record->event.pressed) {
  456. return MACRO( D(LALT), T(F), U(LALT), D(LCTL), T(X), U(LCTL), D(LSFT), T(8), D(LSFT), END);
  457. }
  458. break;
  459. }
  460. return MACRO_NONE;
  461. };
  462. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  463. switch (keycode) {
  464. // dynamically generate these.
  465. case EPRM:
  466. if (record->event.pressed) {
  467. eeconfig_init();
  468. }
  469. return false;
  470. break;
  471. case VRSN:
  472. if (record->event.pressed) {
  473. SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
  474. }
  475. return false;
  476. break;
  477. case RGB_SLD:
  478. if (record->event.pressed) {
  479. rgblight_mode(1);
  480. }
  481. return false;
  482. break;
  483. }
  484. // shell macros
  485. if(record->event.pressed) {
  486. switch (keycode) {
  487. case SHELL_LS:
  488. SEND_STRING("ls\n");
  489. return true;
  490. break;
  491. case SHELL_LSLTR:
  492. SEND_STRING("ls -ltr\n");
  493. return true;
  494. break;
  495. case SHELL_LSLA:
  496. SEND_STRING("ls -la\n");
  497. return true;
  498. break;
  499. case SHELL_CDPRE:
  500. SEND_STRING("cd ..\n");
  501. return true;
  502. break;
  503. case SHELL_LESS:
  504. SEND_STRING("less ");
  505. return true;
  506. break;
  507. case SHELL_PLESS:
  508. SEND_STRING(" | less");
  509. return true;
  510. break;
  511. case SHELL_PGREP:
  512. SEND_STRING(" | grep ");
  513. return true;
  514. break;
  515. case SHELL_TAILF:
  516. SEND_STRING("tail -f ");
  517. return true;
  518. break;
  519. case SHELL_PWD:
  520. SEND_STRING("echo `pwd`/");
  521. return true;
  522. break;
  523. case SHELL_H3:
  524. SEND_STRING("h3\n");
  525. return true;
  526. break;
  527. case SHELL_AMMCOLO:
  528. SEND_STRING("ammcolo\n");
  529. return true;
  530. break;
  531. case SHELL_SCREENRD:
  532. SEND_STRING("screen -r -d ");
  533. return true;
  534. break;
  535. case SHELL_SCREEN_NEW:
  536. SEND_STRING("screen -S ");
  537. return true;
  538. break;
  539. case SHELL_SCREEN_LIST:
  540. SEND_STRING("screen -list\n");
  541. return true;
  542. break;
  543. case SHELL_MKE:
  544. SEND_STRING("mke\n");
  545. return true;
  546. break;
  547. case SHELL_HTCSTATUS:
  548. SEND_STRING("htcStatus -j ");
  549. return true;
  550. break;
  551. // Cloud9 macros
  552. case CLOUD9_TAB_LEFT:
  553. SEND_STRING(SS_LCTRL("["));
  554. return true;
  555. break;
  556. case CLOUD9_TAB_RIGHT:
  557. SEND_STRING(SS_LCTRL("]"));
  558. return true;
  559. break;
  560. case CLOUD9_TAB_CLOSE:
  561. SEND_STRING(SS_LALT("w"));
  562. return true;
  563. break;
  564. case CLOUD9_GOTO_SYMBOL:
  565. SEND_STRING(SS_LSFT(SS_LCTRL("e")));
  566. return true;
  567. break;
  568. case CLOUD9_GOTO_LINE:
  569. SEND_STRING(SS_LCTRL("g"));
  570. return true;
  571. break;
  572. case CLOUD9_NAVIGATE:
  573. SEND_STRING(SS_LCTRL("e"));
  574. return true;
  575. break;
  576. }
  577. }
  578. return true;
  579. }
  580. void led_set_user(uint8_t usb_led) {
  581. if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
  582. ergodox_right_led_1_on();
  583. } else {
  584. ergodox_right_led_1_off();
  585. }
  586. }
  587. void matrix_scan_user(void) {
  588. uint8_t layer = biton32(layer_state);
  589. ergodox_board_led_off();
  590. ergodox_right_led_2_off();
  591. ergodox_right_led_3_off();
  592. switch (layer) {
  593. case COMBINED:
  594. ergodox_right_led_2_on();
  595. break;
  596. case SHELL_NAV:
  597. case SHELL_SCREEN:
  598. case KEYNAV:
  599. case KEYSEL:
  600. case SCREEN_NAV:
  601. ergodox_right_led_3_on();
  602. break;
  603. case MOUSE:
  604. case BROWSER_CONTROL:
  605. ergodox_right_led_2_on();
  606. ergodox_right_led_3_on();
  607. break;
  608. default:
  609. break;
  610. }
  611. };