keymap.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. #include QMK_KEYBOARD_H
  2. #include <util/delay.h>
  3. extern keymap_config_t keymap_config;
  4. // Each layer gets a name for readability, which is then used in the keymap matrix below.
  5. // The underscores don't mean anything - you can have a layer called STUFF or any other name.
  6. // Layer names don't all need to be of the same length, obviously, and you can also skip them
  7. // entirely and just use numbers.
  8. #define _QW 0
  9. #define _FL 1
  10. #define _MC 2
  11. bool git_duet = false;
  12. bool backlight_arrows = false;
  13. bool backlight_gaming = false;
  14. enum custom_keycodes {
  15. /* GIT related keycodes */
  16. G_ADD = SAFE_RANGE, G_BRN, G_COM, G_COU, G_CLO,
  17. G_DFF, G_DUE, G_DUT, G_FTC, G_LOG, G_MAG, G_MRG,
  18. G_MRT, G_PSH, G_PLL, G_RBS, G_STH, G_STS, G_TIG,
  19. /* Multi-media related keycodes */
  20. A_MUTE, A_NEXT, A_PLPA, A_PREV, A_VOUP, A_VDWN,
  21. /* System related shortcuts */
  22. F_BTN, M_WAPP, K_ARR, K_WASD,
  23. };
  24. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  25. /*
  26. * ,-----------------------------------------------------------.
  27. * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |
  28. * |-----------------------------------------------------------|
  29. * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |
  30. * |-----------------------------------------------------------|
  31. * |FN | A| S| D| F| G| H| J| K| L| ;| '|Return |
  32. * |-----------------------------------------------------------|
  33. * |Shift | Z| X| C| V| B| N| M| ,| .| /| FN |Up |
  34. * |-----------------------------------------------------------|
  35. * |Ctrl|Gui |Alt | Space |Alt |Left |Down|Right|
  36. * `-----------------------------------------------------------'
  37. *
  38. * Note: right FN triggers function layer,
  39. * left FN is a one-shot button for the macro layer
  40. */
  41. /* Layer 0: Qwerty */
  42. [_QW] = LAYOUT_60_ansi_split_rshift( \
  43. KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
  44. KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \
  45. OSL(_MC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \
  46. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, F_BTN, KC_UP, \
  47. KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT \
  48. ),
  49. /*
  50. * ,-----------------------------------------------------------.
  51. * |GRV|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| DEL |
  52. * |-----------------------------------------------------------|
  53. * | MB3|MB2|MUP|MB1|MWU| | | |INS| |RST| | |Print|
  54. * |-----------------------------------------------------------|
  55. * | | ML|MDN|MR |MWD| | | | | | | |
  56. * |-----------------------------------------------------------|
  57. * |CAPS | | | | | | | | | | |PGUP| |
  58. * |-----------------------------------------------------------|
  59. * | | | | |Ctrl|HOME|PGD |END |
  60. * `-----------------------------------------------------------'
  61. */
  62. /* Layer 1: Functions */
  63. [_FL] = LAYOUT_60_ansi_split_rshift(
  64. KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \
  65. KC_BTN3, KC_BTN2, KC_MS_U, KC_BTN1, KC_WH_U, _______, _______, _______, KC_INS, _______, RESET, _______, _______, KC_PSCR, \
  66. KC_CAPS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, _______, _______, _______, _______, _______, _______, KC_TILD, \
  67. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, \
  68. _______, _______, _______, _______, KC_RCTL, KC_HOME, KC_PGDN, KC_END \
  69. ),
  70. /*
  71. * ,-----------------------------------------------------------.
  72. * |DEF| |DUE| | | | | | | | | |GAM| ARR|
  73. * |-----------------------------------------------------------|
  74. * | |MAG|CLO|DUT|RBS|TIG|MRT| | |COU|PSH| | | |
  75. * |-----------------------------------------------------------|
  76. * | |ADD|STS|DFF|FTC|PLL|MRG| |STH|LOG| | | F_OFF|
  77. * |-----------------------------------------------------------|
  78. * | | | |COM| |BRN| | | | |MUT|VOL+|PLPA|
  79. * |-----------------------------------------------------------|
  80. * | | | | |APP |PREV|VOL-|NEXT|
  81. * `-----------------------------------------------------------'
  82. *
  83. * Abbreviations:
  84. * --------------
  85. * DEF - return to default layer
  86. * DUE - enable git duet mode
  87. * CLO - git clone
  88. * DUT - git duet (when in duet mode)
  89. * RBS - git rebase
  90. * MAG - git submodule sync --recursive && git submodule update --init --recursive && git submodule foreach --recursive "git co . && git reset --hard && git clean -dffx"
  91. * TIG - tig
  92. * MRG - git merge
  93. * MRT - git mergetool
  94. * COU - git checkout
  95. * PSH - git push
  96. * ADD - git add
  97. * STS - git status
  98. * DFF - git diff
  99. * FTC - git fetch
  100. * PLL - git pull
  101. * STH - git stash
  102. * LOG - git log
  103. * COM - git commit (or git duet commit if in duet mode)
  104. * BRN - git branch
  105. * APP - application (windows menu key)
  106. * MUT - audio mute
  107. * VOL+ - increase volume
  108. * VOL- - decrease volume
  109. * PLPA - play/pause
  110. * PREV - previous song
  111. * NEXT - next song
  112. * ARR - backlight arrow keys
  113. * GAM - backlight WASD
  114. *
  115. * Note: git commands are SEND_STRING macros sent to the
  116. * currently focused window Make sure it is your terminal :)
  117. */
  118. /* Layer 2: Macros (Git & Multimedia) */
  119. [_MC] = LAYOUT_60_ansi_split_rshift( \
  120. TO(_QW), XXXXXXX, G_DUE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, K_WASD, K_ARR, \
  121. XXXXXXX, G_MAG, G_CLO, G_DUT, G_RBS, G_TIG, G_MRT, XXXXXXX, XXXXXXX, G_COU, G_PSH, XXXXXXX, XXXXXXX, XXXXXXX, \
  122. XXXXXXX, G_ADD, G_STS, G_DFF, G_FTC, G_PLL, G_MRG, XXXXXXX, G_STH, G_LOG, XXXXXXX, XXXXXXX, XXXXXXX, \
  123. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, G_COM, XXXXXXX, G_BRN, XXXXXXX, XXXXXXX, XXXXXXX, A_MUTE, A_PLPA, A_VOUP, \
  124. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_WAPP, A_PREV, A_VDWN, A_NEXT \
  125. ),
  126. };
  127. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  128. if (record->event.pressed) {
  129. switch(keycode) {
  130. /*
  131. * Begin git layer
  132. */
  133. case G_ADD:
  134. SEND_STRING("git add ");
  135. layer_off(_MC);
  136. return false;break;
  137. case G_BRN:
  138. SEND_STRING("git branch\n");
  139. layer_off(_MC);
  140. return false;break;
  141. case G_CLO:
  142. SEND_STRING("git clone ");
  143. layer_off(_MC);
  144. return false;break;
  145. case G_COM:
  146. if(git_duet) {
  147. SEND_STRING("git duet-commit ");
  148. } else {
  149. SEND_STRING("git commit ");
  150. }
  151. layer_off(_MC);
  152. return false;break;
  153. case G_COU:
  154. SEND_STRING("git checkout ");
  155. layer_off(_MC);
  156. return false;break;
  157. case G_DFF:
  158. SEND_STRING("git diff\n");
  159. layer_off(_MC);
  160. return false;break;
  161. case G_DUE:
  162. git_duet = !git_duet;
  163. if(git_duet) {
  164. gh60_esc_led_on();
  165. } else {
  166. gh60_esc_led_off();
  167. }
  168. layer_off(_MC);
  169. return false;break;
  170. case G_DUT:
  171. if(git_duet) {
  172. SEND_STRING("git duet ");
  173. }
  174. layer_off(_MC);
  175. return false; break;
  176. case G_FTC:
  177. SEND_STRING("git fetch ");
  178. layer_off(_MC);
  179. return false;break;
  180. case G_LOG:
  181. SEND_STRING("git log --graph\n");
  182. layer_off(_MC);
  183. return false;break;
  184. case G_MAG:
  185. // This is some git-magic to resync recursive submodule structures inside git projects (thx to https://github.com/jimmykarily)
  186. SEND_STRING("git submodule sync --recursive && git submodule update --init --recursive && git submodule foreach --recursive \" git co . && git reset --hard && git clean -dffx \" \n");
  187. layer_off(_MC);
  188. return false; break;
  189. case G_MRG:
  190. SEND_STRING("git merge ");
  191. layer_off(_MC);
  192. return false;break;
  193. case G_MRT:
  194. SEND_STRING("git mergetool ");
  195. layer_off(_MC);
  196. return false;break;
  197. case G_PLL:
  198. SEND_STRING("git pull ");
  199. layer_off(_MC);
  200. return false;break;
  201. case G_PSH:
  202. SEND_STRING("git push ");
  203. layer_off(_MC);
  204. return false;break;
  205. case G_RBS:
  206. SEND_STRING("git rebase ");
  207. layer_off(_MC);
  208. return false;break;
  209. case G_STH:
  210. SEND_STRING("git stash ");
  211. layer_off(_MC);
  212. return false;break;
  213. case G_STS:
  214. SEND_STRING("git status\n");
  215. layer_off(_MC);
  216. return false;break;
  217. case G_TIG:
  218. SEND_STRING("tig\n");
  219. layer_off(_MC);
  220. return false;break;
  221. /*
  222. * End git layer
  223. */
  224. /*
  225. * Begin multimedia keys
  226. */
  227. case A_MUTE:
  228. register_code(KC_AUDIO_MUTE);
  229. unregister_code(KC_AUDIO_MUTE);
  230. layer_off(_MC);
  231. return false;break;
  232. case A_PLPA:
  233. register_code(KC_MEDIA_PLAY_PAUSE);
  234. unregister_code(KC_MEDIA_PLAY_PAUSE);
  235. layer_off(_MC);
  236. return false;break;
  237. case A_VOUP:
  238. register_code(KC_AUDIO_VOL_UP);
  239. return false;break;
  240. case A_VDWN:
  241. register_code(KC_AUDIO_VOL_DOWN);
  242. return false;break;
  243. case A_PREV:
  244. register_code(KC_MEDIA_PREV_TRACK);
  245. unregister_code(KC_MEDIA_PREV_TRACK);
  246. layer_off(_MC);
  247. return false;break;
  248. case A_NEXT:
  249. register_code(KC_MEDIA_NEXT_TRACK);
  250. unregister_code(KC_MEDIA_NEXT_TRACK);
  251. layer_off(_MC);
  252. return false;break;
  253. /*
  254. * End multimedia keys
  255. */
  256. // Tap dance to get the app button mapped
  257. case M_WAPP:
  258. register_code(KC_APP);
  259. unregister_code(KC_APP);
  260. layer_off(_MC);
  261. return false;break;
  262. /*
  263. * Begin multimedia keys
  264. */
  265. case K_ARR:
  266. backlight_arrows = !backlight_arrows;
  267. if(backlight_arrows) {
  268. gh60_poker_leds_on();
  269. } else {
  270. gh60_poker_leds_off();
  271. }
  272. layer_off(_MC);
  273. return false;break;
  274. case K_WASD:
  275. backlight_gaming = !backlight_gaming;
  276. if(backlight_gaming) {
  277. gh60_wasd_leds_on();
  278. } else {
  279. gh60_wasd_leds_off();
  280. }
  281. layer_off(_MC);
  282. return false; break;
  283. case F_BTN:
  284. gh60_fn_led_on();
  285. layer_on(_FL);
  286. return false;break;
  287. }
  288. /*
  289. * End multimedia keys
  290. */
  291. } else {
  292. switch(keycode) {
  293. /*
  294. * Oneshots that will switch back to the default layer on KEY_UP
  295. */
  296. case A_VOUP:
  297. unregister_code(KC_AUDIO_VOL_UP);
  298. layer_off(_MC);
  299. return false;break;
  300. case A_VDWN:
  301. unregister_code(KC_AUDIO_VOL_DOWN);
  302. layer_off(_MC);
  303. return false;break;
  304. case F_BTN:
  305. layer_off(_FL);
  306. gh60_fn_led_off();
  307. return false;break;
  308. }
  309. }
  310. return true;
  311. };