keymap.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  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. static bool mouse_lock = false;
  8. enum custom_keycodes {
  9. PLACEHOLDER = SAFE_RANGE, // can always be here
  10. EPRM,
  11. VRSN,
  12. RGB_SLD,
  13. // shell nav macros
  14. SHELL_LS,
  15. SHELL_LSLTR,
  16. SHELL_CDPRE,
  17. SHELL_LESS,
  18. SHELL_PLESS,
  19. SHELL_PGREP,
  20. SHELL_TAILF,
  21. SHELL_PWD,
  22. SHELL_H3,
  23. SHELL_AMMCOLO,
  24. SHELL_SCREENRD,
  25. SHELL_SCREEN_NEW,
  26. SHELL_SCREEN_LIST,
  27. SHELL_MKE,
  28. SHELL_HTCSTATUS,
  29. };
  30. #define BASE 0 // base dvorak layer
  31. #define KEYNAV 1 // arrow navigation (right hand)
  32. #define KEYSEL 2 // arrow navigation + shift (allow text selection)
  33. #define SHELL_NAV 3 // bash shortcuts
  34. #define SHELL_SCREEN 4 // linux screen shortcuts
  35. #define MOUSE 5 // mouse layer (can be locked with lock key)
  36. #define COMBINED 6 // combined numbers and symbols layer
  37. // macros
  38. #define MOUSE_TOGGLE 1
  39. #define MOUSE_LOCK 2
  40. #define SCREEN_TAB_LEFT 4
  41. #define SCREEN_TAB_RIGHT 5
  42. #define SCREEN_NEW_TAB 6
  43. #define SWITCH_NDS 7
  44. #define SCREEN_COPY_MODE 8
  45. #define SCREEN_PASTE 9
  46. #define SCREEN_RENAME 10
  47. #define SCREEN_NUMBER 11
  48. #define SCREEN_0 12
  49. #define SCREEN_1 13
  50. #define SCREEN_2 14
  51. #define SCREEN_3 15
  52. #define SCREEN_4 16
  53. #define SCREEN_5 17
  54. #define SCREEN_6 18
  55. #define SCREEN_7 19
  56. #define SCREEN_8 20
  57. #define SCREEN_9 21
  58. #define SCREEN_DETACH 22
  59. #define SHELL_RECALL_LAST_ARG_REMOVE_FIRST_COMMAND 30
  60. #define MACRO_SCREEN_NUM(MACRO_NAME,NUM) \
  61. case MACRO_NAME:\
  62. if (record->event.pressed) {\
  63. return MACRO( D(LCTL), T(A), U(LCTL), T(NUM), END);\
  64. }\
  65. break;\
  66. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  67. [BASE] = KEYMAP(
  68. // left hand
  69. KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
  70. KC_TAB, KC_QUOTE, KC_COMMA, KC_DOT, KC_P, KC_Y, MEH(KC_2),
  71. OSL(SHELL_NAV), KC_A, KC_O, KC_E, KC_U, KC_I,
  72. OSL(SHELL_SCREEN), KC_SCOLON, KC_Q, KC_J, KC_K, KC_X, MEH(KC_3),
  73. MEH(KC_1), OSM(MOD_LSFT), OSM(MOD_LCTL), M(MOUSE_TOGGLE), MO(KEYSEL),
  74. // left thumb cluster
  75. MEH(KC_4), MEH(KC_5),
  76. MEH(KC_6),
  77. MO(COMBINED),MO(KEYNAV), OSM(MOD_LALT),
  78. // right hand
  79. KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, MEH(KC_9),
  80. MEH(KC_7), KC_F, KC_G, KC_C, KC_R, KC_L, MEH(KC_F1),
  81. KC_D, KC_H, KC_T, KC_N, KC_S, MEH(KC_F2),
  82. MEH(KC_8), KC_B, KC_M, KC_W, KC_V, KC_Z, MEH(KC_F3),
  83. KC_BSPC, RCTL(KC_BSPC), KC_CAPSLOCK, OSM(MOD_LSFT),MEH(KC_F4),
  84. // right thumb cluster
  85. MEH(KC_F5),MEH(KC_F6),MEH(KC_F7),MEH(KC_F8),KC_ENTER,KC_SPACE
  86. ),
  87. [KEYNAV] = KEYMAP(
  88. // left hand
  89. KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  90. KC_TRNS,KC_ESC, MEH(KC_F9), RCTL(KC_Z), RCTL(KC_S), MEH(KC_F10), KC_TRNS,
  91. KC_TRNS,MEH(KC_F11), MEH(KC_F12), RSFT(KC_TAB), KC_TAB, MEH(KC_A),
  92. KC_TRNS,MEH(KC_B), MEH(KC_C), MEH(KC_D), MEH(KC_E), MEH(KC_F), KC_TRNS,
  93. KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  94. // left thumb cluster
  95. KC_TRNS,KC_TRNS,KC_TRNS,TO(MOUSE),KC_TRNS,KC_TRNS,
  96. // right hand
  97. KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MEH(KC_G),
  98. KC_TRNS,KC_NO, KC_HOME, KC_UP, KC_END, KC_PGUP, MEH(KC_H),
  99. LCTL(KC_LEFT), KC_LEFT, KC_DOWN, KC_RIGHT, LCTL(KC_RIGHT), MEH(KC_I),
  100. KC_TRNS,KC_NO, RCTL(KC_C), RCTL(KC_X), RCTL(KC_V), KC_PGDOWN, MEH(KC_J),
  101. KC_BSPC, RCTL(KC_BSPC), KC_DELETE, LCTL(KC_DELETE), MEH(KC_K),
  102. // right thumb cluster
  103. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS
  104. ),
  105. // key selection layer
  106. [KEYSEL] = KEYMAP(
  107. // left hand
  108. KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  109. KC_TRNS,MEH(KC_G), MEH(KC_H),MEH(KC_I), MEH(KC_J), MEH(KC_K), KC_TRNS,
  110. KC_TRNS,MEH(KC_L), MEH(KC_M),MEH(KC_N), MEH(KC_O), MEH(KC_P),
  111. KC_TRNS,MEH(KC_Q), MEH(KC_R),MEH(KC_S), MEH(KC_T), MEH(KC_U), KC_TRNS,
  112. // bottom row
  113. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  114. // thumb cluster
  115. KC_TRNS,KC_TRNS,
  116. KC_TRNS,
  117. KC_TRNS,KC_TRNS,KC_TRNS,
  118. // right hand
  119. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MEH(KC_Q),
  120. RSFT(KC_PGUP), KC_TRNS, RSFT(KC_HOME), RSFT(KC_UP), RSFT(KC_END), RSFT(KC_PGUP), MEH(KC_R),
  121. RSFT(RCTL(KC_LEFT)), RSFT(KC_LEFT), RSFT(KC_DOWN), RSFT(KC_RIGHT), RSFT(RCTL(KC_RIGHT)), MEH(KC_S),
  122. RSFT(KC_PGDN), KC_TRNS, RCTL(KC_C), RCTL(KC_X), RCTL(KC_V), RSFT(KC_PGDN), MEH(KC_T),
  123. // bottom row
  124. KC_BSPC, RCTL(KC_BSPC), KC_DELETE, LCTL(KC_DELETE), MEH(KC_U),
  125. // thumb cluster
  126. KC_TRNS, KC_TRNS,
  127. KC_TRNS,
  128. KC_TRNS, KC_TRNS, KC_TRNS
  129. ),
  130. // shell navigation layer
  131. [SHELL_NAV] = KEYMAP(
  132. // left hand
  133. KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  134. KC_TRNS,KC_TRNS, SHELL_PGREP, SHELL_PLESS, SHELL_LESS, KC_TRNS, SHELL_H3,
  135. KC_TRNS,SHELL_MKE, SHELL_CDPRE, SHELL_LSLTR, SHELL_LS, SHELL_PWD,
  136. KC_TRNS,SHELL_SCREEN_LIST, SHELL_SCREENRD, SHELL_SCREEN_NEW, SHELL_TAILF, SHELL_HTCSTATUS, SHELL_AMMCOLO,
  137. // bottom row
  138. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  139. // thumb cluster
  140. KC_TRNS,KC_TRNS,
  141. KC_TRNS,
  142. KC_TRNS,KC_TRNS,KC_TRNS,
  143. // right hand
  144. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M(SWITCH_NDS),
  145. RCTL(KC_L), RCTL(KC_W), KC_HOME, KC_UP, KC_END, KC_TRNS, RCTL(KC_R),
  146. LALT(KC_B), KC_LEFT, KC_DOWN, KC_RIGHT, LALT(KC_F), LALT(KC_DOT),
  147. RCTL(KC_C), RCTL(KC_U), M(SCREEN_COPY_MODE), M(SCREEN_PASTE), MEH(KC_V), RCTL(KC_K), M(SHELL_RECALL_LAST_ARG_REMOVE_FIRST_COMMAND),
  148. // bottom row (match functionality of base layer)
  149. KC_BSPC, RCTL(KC_W), KC_DELETE, LALT(KC_D), RCTL(KC_U),
  150. // thumb cluster
  151. KC_TRNS, KC_TRNS,
  152. KC_TRNS,
  153. KC_TRNS, KC_TRNS, KC_TRNS
  154. ),
  155. // linux screen layer
  156. [SHELL_SCREEN] = KEYMAP(
  157. // left hand
  158. KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  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,
  161. KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  162. // bottom row
  163. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  164. // thumb cluster
  165. KC_TRNS,KC_TRNS,
  166. KC_TRNS,
  167. KC_TRNS,KC_TRNS,KC_TRNS,
  168. // right hand
  169. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  170. KC_TRNS, M(SCREEN_NEW_TAB), M(SCREEN_7), M(SCREEN_8), M(SCREEN_9), M(SCREEN_RENAME), KC_TRNS,
  171. M(SCREEN_TAB_LEFT), M(SCREEN_4), M(SCREEN_5), M(SCREEN_6), M(SCREEN_TAB_RIGHT), KC_TRNS,
  172. KC_TRNS, KC_TRNS, M(SCREEN_1), M(SCREEN_2), M(SCREEN_3), M(SCREEN_NUMBER), KC_TRNS,
  173. // bottom row
  174. M(SCREEN_0), KC_TRNS, KC_TRNS, KC_TRNS, M(SCREEN_DETACH),
  175. // thumb cluster
  176. KC_TRNS, KC_TRNS,
  177. KC_TRNS,
  178. KC_TRNS, KC_TRNS, KC_TRNS
  179. ),
  180. [COMBINED] = KEYMAP(
  181. // left hand
  182. KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  183. KC_TRNS,KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_TRNS,
  184. KC_TRNS,KC_LPRN, KC_RPRN, KC_LBRACKET, KC_RBRACKET, KC_UNDS,
  185. KC_TRNS,KC_COLN, KC_DQUO, KC_LCBR, KC_RCBR, KC_AMPR, KC_TRNS,
  186. // bottom row
  187. KC_TRNS,KC_TRNS, KC_TILD, KC_GRAVE, KC_CIRC,
  188. // 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_L),
  192. KC_TRNS, KC_PLUS, KC_7, KC_8, KC_9, KC_ASTR, MEH(KC_M),
  193. KC_MINS, KC_4, KC_5, KC_6, KC_SLSH, MEH(KC_N),
  194. KC_TRNS, KC_EQUAL, KC_1, KC_2, KC_3, KC_QUES, MEH(KC_O),
  195. // bottom row
  196. KC_0, KC_DOT, KC_PIPE, KC_BSLS, MEH(KC_P),
  197. // thumb cluster
  198. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS),
  199. [MOUSE] = KEYMAP(
  200. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  201. KC_TRNS, KC_TRNS, KC_PGUP, KC_MS_WH_UP, KC_UP, KC_TRNS, KC_TRNS,
  202. KC_TRNS, KC_MS_ACCEL0, KC_PGDN, KC_MS_WH_DOWN, KC_DOWN, KC_TRNS,
  203. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  204. KC_TRNS, KC_TRNS, M(MOUSE_LOCK), KC_TRNS, KC_MS_ACCEL0,
  205. KC_TRNS, KC_TRNS,
  206. KC_TRNS,
  207. KC_TRNS, KC_BTN3, KC_TRNS,
  208. // right hand
  209. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  210. KC_TRNS, KC_UP, KC_HOME, KC_MS_U, KC_END, KC_MS_WH_UP, KC_TRNS,
  211. KC_DOWN, KC_MS_L, KC_MS_D, KC_MS_R, KC_MS_WH_DOWN, KC_TRNS,
  212. KC_TRNS, MEH(KC_X), MEH(KC_Y), MEH(KC_Z), KC_F5, RCTL(KC_W), KC_TRNS,
  213. // browser tab control
  214. RSFT(RCTL(KC_TAB)), RCTL(KC_TAB), RCTL(KC_T), LALT(KC_LEFT), KC_TRNS,
  215. KC_TRNS, KC_TRNS,
  216. KC_TRNS,
  217. KC_TRNS, KC_BTN1, KC_BTN2
  218. ),
  219. };
  220. const uint16_t PROGMEM fn_actions[] = {
  221. [1] = ACTION_LAYER_TAP_TOGGLE(1)
  222. };
  223. // leaving this in place for compatibilty with old keymaps cloned and re-compiled.
  224. const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
  225. {
  226. switch(id) {
  227. case MOUSE_TOGGLE:
  228. if (record->event.pressed) {
  229. layer_on(MOUSE);
  230. } else {
  231. if(!mouse_lock)
  232. layer_off(MOUSE);
  233. }
  234. break;
  235. case MOUSE_LOCK:
  236. if (record->event.pressed)
  237. {
  238. if(mouse_lock)
  239. {
  240. mouse_lock = false;
  241. layer_off(MOUSE);
  242. }
  243. else
  244. mouse_lock = true;
  245. }
  246. break;
  247. case SCREEN_TAB_LEFT:
  248. if (record->event.pressed) {
  249. return MACRO( D(LCTL), T(A), U(LCTL), T(P), END);
  250. }
  251. break;
  252. case SCREEN_TAB_RIGHT:
  253. if (record->event.pressed) {
  254. return MACRO( D(LCTL), T(A), U(LCTL), T(N), END);
  255. }
  256. break;
  257. case SCREEN_NEW_TAB:
  258. if (record->event.pressed) {
  259. return MACRO( D(LCTL), T(A), U(LCTL), T(C), END);
  260. }
  261. break;
  262. case SCREEN_DETACH:
  263. if (record->event.pressed) {
  264. return MACRO( D(LCTL), T(A), U(LCTL), T(D), END);
  265. }
  266. break;
  267. case SCREEN_RENAME:
  268. if (record->event.pressed) {
  269. return MACRO( D(LCTL), T(A), U(LCTL), D(LSFT), T(A), U(LSFT), END);
  270. }
  271. break;
  272. case SCREEN_NUMBER:
  273. if (record->event.pressed) {
  274. return MACRO( D(LCTL), T(A), U(LCTL), D(LSFT), T(SCOLON), U(LSFT),
  275. T(N),
  276. T(U),
  277. T(M),
  278. T(B),
  279. T(E),
  280. T(R),
  281. T(SPC),
  282. END);
  283. }
  284. break;
  285. MACRO_SCREEN_NUM(SCREEN_0,0);
  286. MACRO_SCREEN_NUM(SCREEN_1,1);
  287. MACRO_SCREEN_NUM(SCREEN_2,2);
  288. MACRO_SCREEN_NUM(SCREEN_3,3);
  289. MACRO_SCREEN_NUM(SCREEN_4,4);
  290. MACRO_SCREEN_NUM(SCREEN_5,5);
  291. MACRO_SCREEN_NUM(SCREEN_6,6);
  292. MACRO_SCREEN_NUM(SCREEN_7,7);
  293. MACRO_SCREEN_NUM(SCREEN_8,8);
  294. MACRO_SCREEN_NUM(SCREEN_9,9);
  295. case SCREEN_COPY_MODE:
  296. if (record->event.pressed) {
  297. return MACRO( D(LCTL), T(A), U(LCTL), T(ESC), END);
  298. }
  299. break;
  300. case SCREEN_PASTE:
  301. if (record->event.pressed) {
  302. return MACRO( D(LCTL), T(A), U(LCTL), T(RBRC), END);
  303. }
  304. break;
  305. case SWITCH_NDS:
  306. if (record->event.pressed) {
  307. return MACRO( D(LSFT),
  308. T(F11),
  309. U(LSFT),
  310. W(255),
  311. D(LALT),
  312. T(TAB),
  313. U(LALT),
  314. END);
  315. }
  316. break;
  317. case SHELL_RECALL_LAST_ARG_REMOVE_FIRST_COMMAND:
  318. if (record->event.pressed) {
  319. return MACRO( T(UP), T(HOME), D(LALT), T(D), U(LALT), END);
  320. }
  321. break;
  322. }
  323. return MACRO_NONE;
  324. };
  325. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  326. switch (keycode) {
  327. // dynamically generate these.
  328. case EPRM:
  329. if (record->event.pressed) {
  330. eeconfig_init();
  331. }
  332. return false;
  333. break;
  334. case VRSN:
  335. if (record->event.pressed) {
  336. SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
  337. }
  338. return false;
  339. break;
  340. case RGB_SLD:
  341. if (record->event.pressed) {
  342. rgblight_mode(1);
  343. }
  344. return false;
  345. break;
  346. }
  347. // shell macros
  348. if(record->event.pressed) {
  349. switch (keycode) {
  350. case SHELL_LS:
  351. SEND_STRING("ls\n");
  352. return true;
  353. break;
  354. case SHELL_LSLTR:
  355. SEND_STRING("ls -ltr\n");
  356. return true;
  357. break;
  358. case SHELL_CDPRE:
  359. SEND_STRING("cd ..\n");
  360. return true;
  361. break;
  362. case SHELL_LESS:
  363. SEND_STRING("less ");
  364. return true;
  365. break;
  366. case SHELL_PLESS:
  367. SEND_STRING(" | less");
  368. return true;
  369. break;
  370. case SHELL_PGREP:
  371. SEND_STRING(" | grep ");
  372. return true;
  373. break;
  374. case SHELL_TAILF:
  375. SEND_STRING("tail -f ");
  376. return true;
  377. break;
  378. case SHELL_PWD:
  379. SEND_STRING("echo `pwd`/");
  380. return true;
  381. break;
  382. case SHELL_H3:
  383. SEND_STRING("h3\n");
  384. return true;
  385. break;
  386. case SHELL_AMMCOLO:
  387. SEND_STRING("ammcolo\n");
  388. return true;
  389. break;
  390. case SHELL_SCREENRD:
  391. SEND_STRING("screen -r -d ");
  392. return true;
  393. break;
  394. case SHELL_SCREEN_NEW:
  395. SEND_STRING("screen -S ");
  396. return true;
  397. break;
  398. case SHELL_SCREEN_LIST:
  399. SEND_STRING("screen -list\n");
  400. return true;
  401. break;
  402. case SHELL_MKE:
  403. SEND_STRING("mke\n");
  404. return true;
  405. break;
  406. case SHELL_HTCSTATUS:
  407. SEND_STRING("htcStatus -j ");
  408. return true;
  409. break;
  410. }
  411. }
  412. return true;
  413. }
  414. void led_set_user(uint8_t usb_led) {
  415. if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
  416. ergodox_right_led_1_on();
  417. } else {
  418. ergodox_right_led_1_off();
  419. }
  420. }
  421. void matrix_scan_user(void) {
  422. uint8_t layer = biton32(layer_state);
  423. ergodox_board_led_off();
  424. ergodox_right_led_2_off();
  425. ergodox_right_led_3_off();
  426. switch (layer) {
  427. case COMBINED:
  428. ergodox_right_led_2_on();
  429. break;
  430. case SHELL_NAV:
  431. case SHELL_SCREEN:
  432. case KEYNAV:
  433. case KEYSEL:
  434. ergodox_right_led_3_on();
  435. break;
  436. case MOUSE:
  437. ergodox_right_led_2_on();
  438. ergodox_right_led_3_on();
  439. break;
  440. default:
  441. break;
  442. }
  443. };