danielo515.c 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. #include "danielo515.h"
  2. bool onMac = true;
  3. // Send control or GUI depending if we are on windows or mac
  4. bool CMD(uint16_t kc) {
  5. if(onMac){ tap_code16(LGUI(kc)); } else { tap_code16(LCTL(kc)); }
  6. return false;
  7. }
  8. //**************** Handle keys function *********************//
  9. bool altPressed = false;
  10. bool process_record_user(uint16_t keycode, keyrecord_t *record)
  11. {
  12. bool pressed = record->event.pressed;
  13. if(pressed){
  14. refresh_incremental_macros(keycode);
  15. if(process_incremental_macro(keycode)){
  16. return false;
  17. }
  18. if(is_macro(keycode)){
  19. return handle_macro(keycode);
  20. }
  21. switch (keycode) {
  22. case MAC_TGL:
  23. onMac = !onMac;
  24. onMac ? SEND_STRING("On mac") : SEND_STRING("Not on MAC");
  25. return false;
  26. }
  27. }
  28. switch (keycode)
  29. {
  30. case QWERTY:
  31. if (record->event.pressed) {
  32. #ifdef AUDIO_ENABLE
  33. PLAY_SONG(tone_qwerty);
  34. #endif
  35. layer_on(_QWERTY);
  36. }
  37. return false;
  38. case LOWER:
  39. if (record->event.pressed) {
  40. layer_on(_LOWER);
  41. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  42. } else {
  43. layer_off(_LOWER);
  44. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  45. }
  46. return false;
  47. case RAISE:
  48. if (record->event.pressed) {
  49. layer_on(_RAISE);
  50. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  51. } else {
  52. layer_off(_RAISE);
  53. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  54. }
  55. return false;
  56. case ADJUST:
  57. if (record->event.pressed) {
  58. layer_on(_ADJUST);
  59. } else {
  60. layer_off(_ADJUST);
  61. }
  62. return false;
  63. // == Macros START ===
  64. case ARROW:
  65. if (record->event.pressed) SEND_STRING("->");
  66. return false;
  67. case F_ARROW:
  68. if (record->event.pressed) SEND_STRING("=>");
  69. return false;
  70. case GREP:
  71. if (record->event.pressed) SEND_STRING(" | grep "); return false;
  72. // == Macros END ===
  73. // == Multi Os START ===
  74. case KC_HOME:// make the home behave the same on OSX
  75. if (record->event.pressed && onMac) {
  76. SEND_STRING(SS_LCTRL("a"));
  77. return false;
  78. }
  79. case KC_END:// make the end behave the same on OSX
  80. if (record->event.pressed && onMac) {
  81. tap_code16(C(KC_E));
  82. return false;
  83. }
  84. case AC_A:// Accent á
  85. if (record->event.pressed) SEND_STRING(SS_LALT("e") "a"); return false;
  86. case AC_E:// Accent é
  87. if (record->event.pressed) SEND_STRING(SS_LALT("e") "e"); return false;
  88. case AC_I:// Accent í
  89. if (record->event.pressed) SEND_STRING(SS_LALT("e") "i"); return false;
  90. case AC_O:// Accent ó
  91. if (record->event.pressed) SEND_STRING(SS_LALT("e") "o"); return false;
  92. case CUT: if (record->event.pressed) return CMD(KC_X);
  93. case COPY:
  94. if (record->event.pressed) {
  95. onMac ? SEND_STRING(SS_LGUI("c")) : SEND_STRING(SS_LCTRL("c"));
  96. }
  97. return false;
  98. case PASTE:
  99. if (record->event.pressed) {
  100. onMac ? SEND_STRING(SS_LGUI("v")) : SEND_STRING(SS_LCTRL("v"));
  101. }
  102. return false;
  103. case SAVE:
  104. if (record->event.pressed) {
  105. onMac ? SEND_STRING(SS_LGUI("s")) : SEND_STRING(SS_LCTRL("s"));
  106. }
  107. return false;
  108. case UNDO:
  109. if (record->event.pressed) {
  110. onMac ? SEND_STRING(SS_LGUI("z")) : SEND_STRING(SS_LCTRL("z"));
  111. }
  112. return false;
  113. case FIND:
  114. if (record->event.pressed) {
  115. onMac ? SEND_STRING(SS_LGUI("f")) : SEND_STRING(SS_LCTRL("f"));
  116. }
  117. return false;
  118. case CHG_LAYOUT:
  119. if (record->event.pressed) {
  120. onMac ? SEND_STRING(SS_LCTRL(" ")) : SEND_STRING(SS_LCTRL("f"));
  121. }
  122. return false;
  123. // == Multi Os END ===
  124. #ifdef RGBLIGHT_ENABLE
  125. case RGB_SLD:
  126. if (record->event.pressed) { rgblight_mode(1); }
  127. return false;
  128. break;
  129. //First time alt + tab, and alt stays sticky. Next press we just send tab. Any other key releases the alt
  130. #endif
  131. case ALT_TAB:
  132. if (record->event.pressed)
  133. {
  134. if (altPressed)
  135. {
  136. tap_code(KC_TAB);
  137. }
  138. else
  139. {
  140. altPressed = true;
  141. layer_on(7); // go to movement layer
  142. onMac ? register_code(KC_LGUI) : register_code(KC_LALT);
  143. tap_code(KC_TAB);
  144. }
  145. }
  146. return false;
  147. // avoid alt releasing if the key is of movement
  148. case KC_RIGHT ... KC_UP:
  149. if (altPressed)
  150. {
  151. return true; // yes QMK, do your stuff
  152. }
  153. }
  154. // Reset sticky alt tab
  155. if (altPressed)
  156. {
  157. onMac ? unregister_code(KC_LGUI) : unregister_code(KC_LALT);
  158. altPressed = false;
  159. layer_off(7);
  160. return false;
  161. }
  162. return true;
  163. };
  164. //**************** LEADER *********************//
  165. #ifdef LEADER_ENABLE
  166. LEADER_EXTERNS();
  167. #ifdef RGBLIGHT_ENABLE
  168. void leader_start() {
  169. rgblight_setrgb_range(5, 100, 199, 10,15);
  170. };
  171. void leader_end(){
  172. rgblight_setrgb_range(200, 200, 255, 10,15);
  173. };
  174. #endif
  175. void matrix_scan_user(void)
  176. {
  177. if (leading && leader_sequence_size > 0 && timer_elapsed(leader_time) > LEADER_TIMEOUT)
  178. {
  179. leading = false;
  180. SEQ_ONE_KEY(KC_T) {
  181. SEND_STRING("``" SS_TAP(X_LEFT));
  182. }
  183. // Triple ticks
  184. SEQ_TWO_KEYS(KC_T, KC_T) {
  185. SEND_STRING("```" SS_TAP(X_ENTER) SS_TAP(X_ENTER) "```" SS_TAP(X_UP));
  186. }
  187. // ==== International spanish accent vowels ====
  188. SEQ_ONE_KEY(KC_A) {
  189. SEND_STRING(SS_LALT("e") "a");
  190. }
  191. SEQ_ONE_KEY(KC_E) {
  192. SEND_STRING(SS_LALT("e") "e");
  193. }
  194. SEQ_ONE_KEY(KC_I) {
  195. SEND_STRING(SS_LALT("e") "i");
  196. }
  197. SEQ_ONE_KEY(KC_O) {
  198. SEND_STRING(SS_LALT("e") "o");
  199. }
  200. SEQ_ONE_KEY(KC_U) {
  201. SEND_STRING(SS_LALT("e") "u");
  202. }
  203. SEQ_ONE_KEY(KC_N) { // ñ
  204. SEND_STRING(SS_LALT("n") "n");
  205. }
  206. // ==== MACROS ===
  207. SEQ_ONE_KEY(KC_G) { // grep
  208. SEND_STRING(" | grep ");
  209. }
  210. SEQ_ONE_KEY(KC_K) {
  211. onMac ? SEND_STRING(SS_LCTRL(" ")) : SEND_STRING(SS_LCTRL("f"));
  212. }
  213. SEQ_TWO_KEYS(KC_D, KC_G) { // vim delete all
  214. if(onMac){
  215. SEND_STRING(SS_LGUI("a") SS_TAP(X_D));
  216. } else {
  217. SEND_STRING(SS_LCTRL("a") SS_TAP(X_D));
  218. }
  219. }
  220. SEQ_ONE_KEY(KC_BSPACE) { // tripe delete!
  221. SEND_STRING(SS_TAP(X_BSPACE) SS_TAP(X_BSPACE) SS_TAP(X_BSPACE));
  222. }
  223. SEQ_TWO_KEYS(KC_P, KC_G) {
  224. SEND_STRING("ps -ef | grep ");
  225. }
  226. SEQ_TWO_KEYS(KC_J, KC_A) {
  227. SEND_STRING("() => {}"SS_TAP(X_LEFT) SS_TAP(X_LEFT)SS_TAP(X_LEFT) SS_TAP(X_LEFT)SS_TAP(X_LEFT) SS_TAP(X_LEFT)SS_TAP(X_LEFT));
  228. }
  229. SEQ_TWO_KEYS(KC_S, KC_S) {
  230. SEND_STRING("~/.ssh/ "); // this is a pain to type
  231. }
  232. SEQ_TWO_KEYS(KC_F, KC_T) {
  233. SEND_STRING("feat():" SS_TAP(X_LEFT) SS_TAP(X_LEFT));
  234. }
  235. // ### LAYER CHANGE
  236. SEQ_ONE_KEY(KC_1) {
  237. layer_on(1);
  238. }
  239. SEQ_ONE_KEY(KC_H) { // control enter, because yes
  240. SEND_STRING(SS_DOWN(X_LCTRL) SS_TAP(X_ENTER) SS_UP(X_LCTRL));
  241. }
  242. // paste all
  243. SEQ_ONE_KEY(KC_P) {
  244. if(onMac){
  245. SEND_STRING(SS_LGUI("a") SS_LGUI("v"));
  246. } else {
  247. SEND_STRING(SS_LCTRL("a") SS_LCTRL("v"));
  248. }
  249. }
  250. SEQ_THREE_KEYS(KC_M, KC_A, KC_C) {
  251. onMac = true;
  252. #ifdef RGBLIGHT_ENABLE
  253. rgblight_setrgb(255, 255, 255);
  254. #endif
  255. }
  256. SEQ_THREE_KEYS(KC_W, KC_I, KC_N) {
  257. onMac = false;
  258. #ifdef RGBLIGHT_ENABLE
  259. rgblight_setrgb(255, 255, 0);
  260. #endif
  261. }
  262. /* Copy all */
  263. SEQ_ONE_KEY(KC_Y) {
  264. if(onMac){
  265. SEND_STRING(SS_LGUI("a") SS_LGUI("c"));
  266. } else {
  267. SEND_STRING(SS_LCTRL("a") SS_LCTRL("c"));
  268. }
  269. }
  270. //emoji bar
  271. SEQ_TWO_KEYS(KC_E, KC_E) {
  272. SEND_STRING(SS_DOWN(X_LGUI) SS_LCTRL(" ") SS_UP(X_LGUI));
  273. }
  274. SEQ_TWO_KEYS(KC_F, KC_F) {
  275. SEND_STRING("ps -ef | grep ");
  276. }
  277. SEQ_TWO_KEYS(KC_H, KC_T) {
  278. SEND_STRING("https://");
  279. }
  280. leader_end();
  281. }
  282. }
  283. #endif // LEADER
  284. // ======== INCREMENTAL MACROS STUFF =============
  285. #define MAX_INCREMENTAL_MACRO 20
  286. #define TAP_ROTATION_TIMEOUT 400
  287. uint16_t latest_kc = 0;
  288. uint16_t latest_rotation = 0;
  289. int key_count = 0;
  290. const char incremental_macros[][MAX_INCREMENTAL_MACRO] = { "String1"SS_TAP(X_HOME)"X-", "String2"SS_TAP(X_HOME) };
  291. bool process_incremental_macro (uint16_t kc) {
  292. if( kc < INC_MACROS_START || kc > INC_MACROS_END ){
  293. return false;
  294. }
  295. int macro_idx = (int) (kc - INC_MACROS_START) - 1;
  296. char tempstring[3] = {0};
  297. tempstring[0] = incremental_macros[macro_idx][key_count];
  298. // Special cases of SS_TAP SS_UP and SS_DOWN, they require two characters so get both once and skip on next iteration
  299. if( tempstring[0] == '\1' || tempstring[0] == '\2' || tempstring[0] == '\3'){
  300. tempstring[1] = incremental_macros[macro_idx][++key_count];
  301. }
  302. if( tempstring[0] == '\0'){
  303. key_count = 0;
  304. }
  305. send_string(tempstring);
  306. return true;
  307. };
  308. void refresh_incremental_macros (uint16_t kc) {
  309. if (kc == latest_kc)
  310. {
  311. if ( (timer_elapsed(latest_rotation) > TAP_ROTATION_TIMEOUT) || (key_count >= MAX_INCREMENTAL_MACRO) ) key_count = 0;
  312. else key_count++;
  313. } else {
  314. key_count = 0;
  315. latest_kc = kc;
  316. }
  317. latest_rotation = timer_read();
  318. }
  319. // ======== VISUAL STUDIO CODE SHORTCUTS STUFF
  320. bool is_macro (uint16_t kc){
  321. return kc > MACRO_START && kc < MACRO_END;
  322. };
  323. bool command_shift_p (bool isMac) {
  324. isMac
  325. ? SEND_STRING(SS_DOWN(X_LSHIFT)SS_LGUI("p")SS_UP(X_LSHIFT))
  326. : SEND_STRING(SS_DOWN(X_LSHIFT)SS_LCTRL("p")SS_UP(X_LSHIFT));
  327. return false;
  328. };
  329. bool VSCommand(bool isMac, char *cmd)
  330. {
  331. command_shift_p (isMac);
  332. send_string(cmd);
  333. SEND_STRING(SS_TAP(X_ENTER));
  334. return false;
  335. };
  336. bool handle_macro(uint16_t kc)
  337. {
  338. switch (kc)
  339. {
  340. case T_TERM: return VSCommand(onMac, "toit");
  341. case FIX_ALL: return VSCommand(onMac, "faap");
  342. case BLK_CMNT: return VSCommand(onMac, "tbc");
  343. case LN_CMNT: return VSCommand(onMac, "tlic");
  344. case CMD_S_P: return command_shift_p(onMac);
  345. case TRI_TICKS: SEND_STRING("[[[ "); break;
  346. }
  347. return false;
  348. };