babblePaste.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. /* A library to output the right key shortcut in any common app.
  2. Given a global variable babble_mode to show the environment and a
  3. key that calls the paste macro, do the right type of paste.
  4. Setting the context is done by another macro, or TBD interaction with the host.
  5. Huge thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts
  6. and https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jeebak/keymap.c
  7. */
  8. #include "babblePaste.h"
  9. #include "action_layer.h"
  10. // GLOBAL variable. Sets startup default if no eeppom
  11. char babble_mode = MAC_MODE ;
  12. const static macro_t *babblePaste (keyrecord_t *record, uint16_t shortcut) {
  13. switch(babble_mode) {
  14. #ifdef MS_MODE
  15. case MS_MODE:
  16. switch(shortcut) {
  17. case BABL_DEL_RIGHT_1C:
  18. return (static macro_t *) MACRO( D(DEL), END );
  19. case BABL_DEL_LEFT_WORD:
  20. return MACRO( D(LCTRL), T(BSPACE), U(LCTRL), END );
  21. case BABL_DEL_RIGHT_WORD:
  22. return MACRO( D(LCTRL), T(DEL), U(LCTRL), END );
  23. case BABL_GO_LEFT_1C:
  24. return MACRO( T(LEFT), END );
  25. case BABL_GO_RIGHT_1C:
  26. return MACRO( T(RIGHT), END );
  27. case BABL_GO_LEFT_WORD:
  28. return MACRO( D(LCTRL), T(LEFT), U(LCTRL), END );
  29. case BABL_GO_RIGHT_WORD:
  30. return MACRO( D(LCTRL), T(RIGHT), U(LCTRL), END );
  31. case BABL_GO_START_LINE:
  32. return MACRO( T(HOME), END );
  33. case BABL_GO_START_DOC:
  34. return MACRO( D(LCTRL),T(HOME), U(LCTRL),END );
  35. case BABL_GO_END_LINE:
  36. return MACRO( T(END), END );
  37. case BABL_GO_END_DOC:
  38. return MACRO( D(LCTRL),T(END), U(LCTRL),END );
  39. case BABL_GO_NEXT_LINE:
  40. return MACRO( T(DOWN), END );
  41. case BABL_GO_PREV_LINE:
  42. return MACRO( T(UP), END );
  43. case BABL_PGDN:
  44. return MACRO( T(PGDN), END );
  45. case BABL_PGUP:
  46. return MACRO( T(PGUP), END );
  47. #ifndef BABL_MOVEMENTONLY
  48. case BABL_UNDO:
  49. return MACRO( D(LCTRL), T(Z), U(LCTRL), END );
  50. case BABL_REDO:
  51. return MACRO( D(LCTRL), T(Y), U(LCTRL), END );
  52. case BABL_CUT:
  53. return MACRO( D(LCTRL), T(X), U(LCTRL), END );
  54. case BABL_COPY:
  55. return MACRO( D(LCTRL), T(C), U(LCTRL), END );
  56. case BABL_PASTE:
  57. return MACRO( D(LCTRL), T(V), U(LCTRL), END );
  58. case BABL_SELECT_ALL:
  59. return MACRO( D(LCTRL), T(A), U(LCTRL), END );
  60. case BABL_UNDO:
  61. return MACRO( D(LCTRL), T(Z), U(LCTRL), END );
  62. case BABL_REDO:
  63. return MACRO( D(LCTRL), T(Y), U(LCTRL), END );
  64. case BABL_CUT:
  65. return MACRO( D(LCTRL), T(X), U(LCTRL), END );
  66. case BABL_COPY:
  67. return MACRO( D(LCTRL), T(C), U(LCTRL), END );
  68. case BABL_PASTE:
  69. return MACRO( D(LCTRL), T(V), U(LCTRL), END );
  70. case BABL_SELECT_ALL:
  71. return MACRO( D(LCTRL), T(A), U(LCTRL), END );
  72. case BABL_FIND:
  73. return MACRO( D(LCTRL),T(F), U(LCTRL),END );
  74. case BABL_FIND_NEXT:
  75. return MACRO( T(F3),END );
  76. case BABL_FIND_REPLACE:
  77. return MACRO( D(LCTRL),T(H), U(LCTRL),END );
  78. case BABL_RUNAPP:
  79. return MACRO( D(LGUI),T(R), U(LGUI),END );
  80. case BABL_SWITCH_APP_NEXT:
  81. return MACRO( D(LALT),T(TAB), U(LALT),END );
  82. case BABL_SWITCH_APP_LAST:
  83. return MACRO( D(LSFT),D(LALT),T(TAB), U(LALT), U(LSFT),END );
  84. case BABL_CLOSE_APP:
  85. return MACRO( D(LALT),T(F4), U(LALT),END );
  86. case BABL_HELP:
  87. return MACRO( T(F1),END );
  88. #endif
  89. break;
  90. return MACRO_NONE;
  91. }
  92. #endif
  93. #ifdef LINUX_MODE
  94. case LINUX_MODE:
  95. switch(shortcut) {
  96. case BABL_DEL_RIGHT_1C:
  97. return MACRO( D(DEL), END );
  98. case BABL_DEL_LEFT_WORD:
  99. return MACRO( D(LCTRL), T(BSPACE), U(LCTRL), END );
  100. case BABL_DEL_RIGHT_WORD:
  101. return MACRO( D(LCTRL), T(DEL), U(LCTRL), END );
  102. case BABL_GO_LEFT_1C:
  103. return MACRO( T(LEFT), END );
  104. case BABL_GO_RIGHT_1C:
  105. return MACRO( T(RIGHT), END );
  106. case BABL_GO_LEFT_WORD:
  107. return MACRO( D(LCTRL), T(LEFT), U(LCTRL), END );
  108. case BABL_GO_RIGHT_WORD:
  109. return MACRO( D(LCTRL), T(RIGHT), U(LCTRL), END );
  110. case BABL_GO_START_LINE:
  111. return MACRO( T(HOME), END );
  112. case BABL_GO_START_DOC:
  113. return MACRO( D(LCTRL),T(HOME), U(LCTRL),END );
  114. case BABL_GO_END_LINE:
  115. return MACRO( T(END), END );
  116. case BABL_GO_END_DOC:
  117. return MACRO( D(LCTRL),T(END), U(LCTRL),END );
  118. case BABL_GO_NEXT_LINE:
  119. return MACRO( T(DOWN), END );
  120. case BABL_GO_PREV_LINE:
  121. return MACRO( T(UP), END );
  122. case BABL_PGDN:
  123. return MACRO( T(PGDN), END );
  124. case BABL_PGUP:
  125. return MACRO( T(PGUP), END );
  126. #ifndef BABL_MOVEMENTONLY
  127. case BABL_UNDO:
  128. return MACRO( D(LCTRL), T(Z), U(LCTRL), END );
  129. case BABL_REDO:
  130. return MACRO( D(LCTRL), T(Y), U(LCTRL), END );
  131. case BABL_CUT:
  132. return MACRO( D(LCTRL), T(X), U(LCTRL), END );
  133. case BABL_COPY:
  134. return MACRO( D(LCTRL), T(C), U(LCTRL), END );
  135. case BABL_PASTE:
  136. return MACRO( D(LCTRL), T(V), U(LCTRL), END );
  137. case BABL_SELECT_ALL:
  138. return MACRO( D(LCTRL), T(A), U(LCTRL), END );
  139. case BABL_FIND:
  140. return MACRO( D(LCTRL),T(F), U(LCTRL),END );
  141. case BABL_FIND_NEXT:
  142. /* return MACRO( T(F3),END ); KDE */
  143. return MACRO( D(LCTRL),T(G), U(LCTRL),END ); // Gnome*/
  144. case BABL_FIND_REPLACE:
  145. /* return MACRO( D(LCTRL),T(R), U(LCTRL),END ); KDE */
  146. return MACRO( D(LCTRL),T(H), U(LCTRL),END ); // Gnome*/
  147. case BABL_RUNAPP:
  148. return MACRO( D(LALT),T(F2), U(LALT),END );
  149. case BABL_SWITCH_APP_NEXT:
  150. return MACRO( D(LCTL),T(TAB), U(LCTL),END );
  151. case BABL_SWITCH_APP_LAST:
  152. return MACRO( D(LSFT),D(LCTL),T(TAB), U(LCTL), U(LSFT),END );
  153. case BABL_CLOSE_APP:
  154. return MACRO( D(LALT),T(F4), U(LALT),END );
  155. case BABL_HELP:
  156. return MACRO_NONE;
  157. #endif
  158. break;
  159. return MACRO_NONE;
  160. }
  161. #endif
  162. #ifdef MAC_MODE
  163. case MAC_MODE:
  164. switch(shortcut) {
  165. case BABL_DEL_RIGHT_1C:
  166. return MACRO( D(DEL), END );
  167. case BABL_DEL_LEFT_WORD:
  168. return MACRO( D(LALT), T(BSPACE), U(LALT), END );
  169. case BABL_DEL_RIGHT_WORD:
  170. return MACRO( D(LALT), T(DEL), U(LALT), END );
  171. case BABL_GO_LEFT_1C:
  172. return MACRO( T(LEFT), END );
  173. case BABL_GO_RIGHT_1C:
  174. return MACRO( T(RIGHT), END );
  175. case BABL_GO_LEFT_WORD:
  176. return MACRO( D(LALT), T(LEFT), U(LALT), END );
  177. case BABL_GO_RIGHT_WORD:
  178. return MACRO( D(LALT), T(RIGHT), U(LALT), END );
  179. case BABL_GO_START_LINE:
  180. return MACRO( D(LGUI), T(LEFT), U(LGUI), END );
  181. case BABL_GO_START_DOC:
  182. return MACRO( D(LGUI),T(UP), U(LGUI),END );
  183. case BABL_GO_END_LINE:
  184. return MACRO( D(LGUI), T(RIGHT), U(LGUI), END );
  185. case BABL_GO_END_DOC:
  186. return MACRO( D(LGUI),T(DOWN), U(LGUI),END );
  187. case BABL_GO_NEXT_LINE:
  188. return MACRO( T(DOWN), END );
  189. case BABL_GO_PREV_LINE:
  190. return MACRO( T(UP), END );
  191. case BABL_PGDN:
  192. return MACRO( D(LALT), T(DOWN), U(LALT), END );
  193. case BABL_PGUP:
  194. return MACRO( D(LALT), T(UP), U(LALT), END );
  195. #ifndef BABL_MOVEMENTONLY
  196. case BABL_UNDO:
  197. return MACRO( D(LGUI), T(Z), U(LGUI), END );
  198. case BABL_REDO:
  199. return MACRO( D(LSFT),D(LGUI), T(Z), U(LSFT),U(LGUI), END );
  200. case BABL_CUT:
  201. return MACRO( D(LGUI), T(X), U(LGUI), END );
  202. case BABL_COPY:
  203. return MACRO( D(LGUI), T(C), U(LGUI), END );
  204. case BABL_PASTE:
  205. return MACRO( D(LGUI), T(V), U(LGUI), END );
  206. case BABL_SELECT_ALL:
  207. return MACRO( D(LGUI), T(A), U(LGUI), END );
  208. case BABL_FIND:
  209. return MACRO( D(LGUI),T(F), U(LGUI),END );
  210. case BABL_FIND_NEXT:
  211. return MACRO( D(LGUI),T(G), U(LGUI),END );
  212. case BABL_FIND_REPLACE:
  213. return MACRO( D(LGUI),T(F), U(LGUI),END );
  214. case BABL_RUNAPP:
  215. return MACRO( D(LGUI),T(R), U(LGUI),END );
  216. case BABL_SWITCH_APP_NEXT:
  217. return MACRO( D(LGUI),T(TAB), U(LGUI),END );
  218. case BABL_SWITCH_APP_LAST:
  219. return MACRO( D(LSFT),D(LGUI),T(TAB), U(LGUI), U(LSFT),END );
  220. case BABL_CLOSE_APP:
  221. return MACRO( D(LGUI),T(Q), U(LGUI),END );
  222. case BABL_HELP:
  223. return MACRO( D(LSFT),D(LGUI),T(SLASH), U(LGUI), U(LSFT),END );
  224. #endif
  225. break;
  226. return MACRO_NONE;
  227. }
  228. #endif
  229. #ifdef EMACS_MODE
  230. case EMACS_MODE:
  231. switch(shortcut) {
  232. //probably should allow meta to not be ALT
  233. case BABL_DEL_RIGHT_1C:
  234. return MACRO( D(LCTL), T(D), U(LCTL),END );
  235. case BABL_DEL_LEFT_WORD:
  236. return MACRO( D(LCTL), T(BSPACE), U(LCTL), END );
  237. case BABL_DEL_RIGHT_WORD:
  238. return MACRO( D(LALT), T(D), U(LALT), END );
  239. case BABL_GO_LEFT_1C:
  240. return MACRO( T(LEFT), END );
  241. case BABL_GO_RIGHT_1C:
  242. return MACRO( T(RIGHT), END );
  243. case BABL_GO_LEFT_WORD:
  244. return MACRO( D(LALT), T(B), U(LALT), END );
  245. case BABL_GO_RIGHT_WORD:
  246. return MACRO( D(LALT), T(F), U(LALT), END );
  247. case BABL_GO_START_LINE:
  248. return MACRO( D(LCTRL), T(A), U(LCTRL), END );
  249. case BABL_GO_START_DOC:
  250. return MACRO( D(LALT), D(LSFT), T(COMM),U(LSFT), U(LALT) ,END );
  251. case BABL_GO_END_LINE:
  252. return MACRO( D(LCTRL), T(E), U(LCTRL), END );
  253. case BABL_GO_END_DOC:
  254. return MACRO( D(LALT), D(LSFT), T(DOT),U(LSFT), U(LALT) ,END );
  255. case BABL_GO_NEXT_LINE:
  256. return MACRO( D(LCTRL), T(N), U(LCTRL), END );
  257. case BABL_GO_PREV_LINE:
  258. return MACRO( D(LCTRL), T(P), U(LCTRL), END );
  259. case BABL_PGDN:
  260. return MACRO(D(LCTRL), T(V), U(LCTRL), END );
  261. case BABL_PGUP:
  262. return MACRO( D(LALT), T(V), U(LALT), END );
  263. #ifndef BABL_MOVEMENTONLY
  264. case BABL_UNDO:
  265. return MACRO( D(LCTL), T(X), U(LCTL),T(C), END );
  266. case BABL_REDO:
  267. return MACRO( D(LCTL), T(X), U(LCTL),T(C), END ); // arguably
  268. case BABL_CUT:
  269. return MACRO( D(LCTL), T(W), U(LCTL), END );
  270. case BABL_COPY:
  271. return MACRO( D(LALT), T(W), U(LALT), END ); //really?
  272. case BABL_PASTE:
  273. return MACRO( D(LCTL), T(Y), U(LCTL), END );
  274. case BABL_SELECT_ALL:
  275. return MACRO(D(LCTL), T(X), U(LCTL),T(H), END );
  276. case BABL_FIND:
  277. return MACRO( D(LCTRL), T(S), U(LCTRL),END );
  278. case BABL_FIND_NEXT:
  279. return MACRO( D(LCTRL), T(S), U(LCTRL),END );
  280. case BABL_FIND_REPLACE:
  281. return MACRO( D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END );
  282. case BABL_RUNAPP:
  283. return MACRO( D(LALT), T(X), U(LALT),T(S),T(H),T(E),T(L),T(L),END );// arguably
  284. case BABL_SWITCH_APP_NEXT:
  285. return MACRO( D(LCTL), T(X), U(LCTL),T(RIGHT), END ); // arguably
  286. case BABL_SWITCH_APP_LAST:
  287. return MACRO( D(LCTL), T(X), U(LCTL),T(LEFT), END ); // arguably
  288. case BABL_CLOSE_APP:
  289. return MACRO(D(LCTL), T(X), U(LCTL),T(C),END );
  290. case BABL_HELP:
  291. return MACRO( D(LCTL),T(H), U(LCTL),T(A),END); // start search in help
  292. #endif
  293. break;
  294. return MACRO_NONE;
  295. }
  296. #endif
  297. #ifdef VI_MODE
  298. case VI_MODE:
  299. switch(shortcut) {
  300. //assume esc is already called
  301. case BABL_DEL_RIGHT_1C:
  302. return MACRO( T(X),END );
  303. case BABL_DEL_LEFT_WORD:
  304. return MACRO( T(D),T(G),T(E),END );
  305. case BABL_DEL_RIGHT_WORD:
  306. return MACRO( T(D),T(W),END );
  307. case BABL_GO_LEFT_1C:
  308. return MACRO( T(H), END );
  309. case BABL_GO_RIGHT_1C:
  310. return MACRO( T(L), END );
  311. case BABL_GO_LEFT_WORD:
  312. return MACRO( T(B),END );
  313. case BABL_GO_RIGHT_WORD:
  314. return MACRO( T(W), END );
  315. case BABL_GO_START_LINE:
  316. return MACRO( D(LSFT), T(6),U(LSFT), END ); //^
  317. case BABL_GO_START_DOC:
  318. return MACRO( T(G),T(G) ,END );
  319. case BABL_GO_END_LINE:
  320. return MACRO( D(LSFT), T(4),U(LSFT) , END ); //$
  321. case BABL_GO_END_DOC:
  322. return MACRO( D(LSFT), T(G),U(LSFT),END );
  323. case BABL_GO_NEXT_LINE:
  324. return MACRO( T(J), END );
  325. case BABL_GO_PREV_LINE:
  326. return MACRO( T(K), END );
  327. case BABL_PGDN:
  328. return MACRO(D(LCTRL), T(F), U(LCTRL), END );
  329. case BABL_PGUP:
  330. return MACRO( D(LCTRL), T(B), U(LCTRL), END );
  331. #ifndef BABL_MOVEMENTONLY
  332. case BABL_UNDO:
  333. return MACRO( T(U), END );
  334. case BABL_REDO:
  335. return MACRO( D(LCTL), T(R), U(LCTL), END );
  336. case BABL_CUT:
  337. return MACRO( T(X), END );
  338. case BABL_COPY:
  339. return MACRO( T(Y),END );
  340. case BABL_PASTE:
  341. return MACRO( T(P), END );
  342. case BABL_SELECT_ALL:
  343. return MACRO( D(LSFT), T(SCLN),U(LSFT),D(LSFT), T(5),U(LSFT),T(Y), END ); // wrong but helpful?
  344. case BABL_FIND:
  345. return MACRO( T(SLASH),END );
  346. case BABL_FIND_NEXT:
  347. return MACRO( T(N),END );
  348. case BABL_FIND_REPLACE:
  349. return MACRO( D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END );
  350. case BABL_RUNAPP:
  351. return MACRO_NONE;
  352. case BABL_SWITCH_APP_NEXT:
  353. return MACRO_NONE;
  354. case BABL_SWITCH_APP_LAST:
  355. return MACRO_NONE;
  356. case BABL_CLOSE_APP:
  357. return MACRO(D(LSFT), T(SCLN),U(LSFT), T(Q), D(RSFT), T(1),U(RSFT), END );
  358. case BABL_HELP:
  359. return MACRO(D(LSFT), T(SCLN),U(LSFT),T(H),END); // start search in help
  360. break;
  361. #endif
  362. return MACRO_NONE;
  363. }
  364. #endif
  365. #ifdef READMUX_MODE
  366. // Readline command line editing + tmux windowing
  367. // I havent decided how much to do readline and how much tmux
  368. case READMUX_MODE:
  369. switch(shortcut) {
  370. case BABL_DEL_RIGHT_1C:
  371. return MACRO( D(LCTL), T(D), U(LCTL),END );
  372. case BABL_DEL_LEFT_WORD:
  373. return MACRO( D(LCTL), T(W), U(LCTL), END );
  374. case BABL_DEL_RIGHT_WORD:
  375. return MACRO( D(LALT), T(D), U(LALT), END );
  376. case BABL_GO_LEFT_1C:
  377. return MACRO( T(LEFT), END );
  378. case BABL_GO_RIGHT_1C:
  379. return MACRO( T(RIGHT), END );
  380. case BABL_GO_LEFT_WORD:
  381. return MACRO( D(LALT), T(B), U(LALT), END );
  382. case BABL_GO_RIGHT_WORD:
  383. return MACRO( D(LALT), T(F), U(LALT), END );
  384. case BABL_GO_START_LINE:
  385. return MACRO( D(LCTRL), T(A), U(LCTRL), END );
  386. case BABL_GO_START_DOC:
  387. return MACRO_NONE; // tmux?
  388. case BABL_GO_END_LINE:
  389. return MACRO( D(LCTRL), T(E), U(LCTRL), END );
  390. case BABL_GO_END_DOC:
  391. return MACRO_NONE; // tmux?
  392. case BABL_GO_NEXT_LINE:
  393. return MACRO( D(LCTRL), T(N), U(LCTRL), END );
  394. case BABL_GO_PREV_LINE:
  395. return MACRO( D(LCTRL), T(P), U(LCTRL), END );
  396. case BABL_PGDN:
  397. return MACRO( T(PGDN), END );
  398. case BABL_PGUP:
  399. return MACRO( T(PGUP), END );
  400. #ifndef BABL_MOVEMENTONLY
  401. case BABL_UNDO:
  402. return MACRO( D(LALT), T(R), U(LALT) , END );
  403. case BABL_REDO:
  404. return MACRO( D(LCTL), T(X), U(LCTL),T(C), END ); // arguably
  405. case BABL_CUT:
  406. return MACRO( D(LCTL), T(K), U(LCTL), END ); // wrong half the time
  407. case BABL_COPY:
  408. return MACRO_NONE;
  409. case BABL_PASTE:
  410. return MACRO( D(LCTL), T(Y), U(LCTL), END );
  411. case BABL_SELECT_ALL:
  412. return MACRO(D(LCTL), T(A), T(K), T(Y), U(LCTL) , END );
  413. case BABL_FIND:
  414. return MACRO( D(LCTRL), T(R), U(LCTRL), END ); // search history
  415. case BABL_FIND_NEXT:
  416. eturn MACRO( D(LCTRL), T(S), U(LCTRL), END );
  417. case BABL_FIND_REPLACE:
  418. return MACRO_NONE; // tmux?
  419. case BABL_RUNAPP:
  420. return MACRO( D(LCTRL), T(B), U(LCTRL), T(C),END ); //tmux
  421. case BABL_SWITCH_APP_NEXT:
  422. return MACRO( D(LCTRL), T(B), U(LCTRL), T(N),END ); //tmux
  423. case BABL_SWITCH_APP_LAST:
  424. return MACRO( D(LCTRL), T(B), U(LCTRL), T(P),END ); //tmux
  425. case BABL_CLOSE_APP:
  426. return MACRO( D(LCTRL), T(B), U(LCTRL), T(D),END); // usually what I want
  427. break;
  428. case BABL_HELP:
  429. return MACRO_NONE;
  430. #endif
  431. break;
  432. return MACRO_NONE;
  433. }
  434. #endif
  435. return MACRO_NONE;
  436. }
  437. }