babblePaste.txt 15 KB

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