keymap.c 25 KB

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