245 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			245 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
## Babblepaste, a universal translator for keyboard shortcuts
 | 
						|
 | 
						|
The idea is to have one "paste" key do the right thing for any operating system.
 | 
						|
Put the keyboard in Windows mode, and  "paste" means Ctrl-v.
 | 
						|
Switch to Emacs and "Paste" means Ctrl-y.  Mac is GUI-v and so on.
 | 
						|
 | 
						|
Currently supported modes are Windows, OS X, Gnome/KDE, Emacs, VI , ChromeOS, and Readline, with 70+ common macro actions.
 | 
						|
 | 
						|
The babblepaste library looks for the current OS in the babble_mode global variable.
 | 
						|
To switch modes, run the switch_babble_mode() function, or a pre defined BABL_DO_x macro.
 | 
						|
 | 
						|
**BE CAREFUL**
 | 
						|
  * Not all actions are defined for all OSes. The default is to do nothing.
 | 
						|
  * Not all actions are _TESTED_ on all OSes.
 | 
						|
  * Keys can have very different meanings between windows in the same OS. If you switch apps without switching modes, bad things can happen.
 | 
						|
 | 
						|
###To use the library
 | 
						|
#### Add #defines to your config.h.
 | 
						|
```
 | 
						|
    #define USE_BABBLEPASTE
 | 
						|
    
 | 
						|
    //// Uncomment the modes you want to enable
 | 
						|
    #define BABL_WINDOWS
 | 
						|
    #define BABL_READMUX
 | 
						|
    #define BABL_VI
 | 
						|
    #define BABL_MAC
 | 
						|
    #define BABL_LINUX
 | 
						|
    #define BABL_EMACS
 | 
						|
    #define BABL_NANO
 | 
						|
    #define BABL_CHROMEOS
 | 
						|
    
 | 
						|
    //// These enable subsets of babble macros. Disable options to save space
 | 
						|
    #define BABL_MOVE // Uncomment to add basic cursor movement
 | 
						|
    #define BABL_OSKEYS // This adds Cut, paste, window movement and common OS shortcuts
 | 
						|
    #define BABL_BROWSER // Browser shortcuts
 | 
						|
    
 | 
						|
    //// What Browser shortcuts?
 | 
						|
    #define BABL_BROWSER_CHROME // Chrome browser, Google apps
 | 
						|
    //#define BABL_BROWSER_MS
 | 
						|
    //#define BABL_BROWSER_SAFARI // Safari, Apple defaults.
 | 
						|
    
 | 
						|
    //// applications vary even more between OSes. We'll do our best.
 | 
						|
    #define BABL_APP
 | 
						|
    // To enable specific App options.
 | 
						|
    #define BABL_APP_CELLS // spreadsheets and tables
 | 
						|
    #define BABL_APP_EDITOR // Fancy editor commands
 | 
						|
    #define BABL_APP_WINDOWSPLITTING // splitting frames & windows
 | 
						|
    
 | 
						|
    //// What App keybinding is assumed?
 | 
						|
    //#define BABL_APP_GOOGLE // Google office
 | 
						|
    #define BABL_APP_MSOFFICE // MS office
 | 
						|
    //#define BABL_APP_APPLE // Apple office
 | 
						|
    #define BABL_APP_SUBLIME
 | 
						|
```
 | 
						|
 | 
						|
#### Enable Babblepaste in your Keymap
 | 
						|
 | 
						|
Add the following to your keymap in process_record_user, before the main switch statement.
 | 
						|
```
 | 
						|
#ifdef USE_BABBLEPASTE
 | 
						|
    if (keycode > BABBLE_START && keycode < BABBLE_END_RANGE) {
 | 
						|
        if (record->event.pressed) { 
 | 
						|
            babblePaste(keycode, 1);
 | 
						|
        } else {
 | 
						|
            babblePaste(keycode, 0);
 | 
						|
        }
 | 
						|
    }
 | 
						|
#endif
 | 
						|
```
 | 
						|
 | 
						|
#### Add makefile rules
 | 
						|
 | 
						|
Update your rules.mk to include the modes you want.
 | 
						|
 | 
						|
    `SRC += babblePaste.c babl_windows.c babl_mac.c  babl_nano babl_vi.c babl_readmux.c  babl_chromeos.c babl_emacs.c babl_linux.c`
 | 
						|
 | 
						|
 | 
						|
#### Custom Keycodes
 | 
						|
 | 
						|
If you are using custom keycodes, update the safe range in your user.h
 | 
						|
```
 | 
						|
  #if defined(BABBLE_END_RANGE)
 | 
						|
        #define USER_START BABBLE_END_RANGE
 | 
						|
  #else
 | 
						|
      #if defined(KEYMAP_SAFE_RANGE)
 | 
						|
          #define USER_START KEYMAP_SAFE_RANGE
 | 
						|
      #else
 | 
						|
          #define USER_START SAFE_RANGE
 | 
						|
      #endif
 | 
						|
  #endif
 | 
						|
```
 | 
						|
 | 
						|
#### Add Babblepaste actions to your keymap.
 | 
						|
See the full list in babblePaste.h, or the list below
 | 
						|
```
 | 
						|
  B_WIN // switch babblepaste to  windows mode.
 | 
						|
  B_MAC // Mac Mode
 | 
						|
  B_LNX // switch to linux
 | 
						|
  B_VI // switch to Vi mode
 | 
						|
  B_EMAX //  switch mode to emacs
 | 
						|
  B_NANO //  switch mode to emacs
 | 
						|
  B_READ // switch to readline /tmux mode
 | 
						|
  B_CROM // switch to chromeos mode.
 | 
						|
  
 | 
						|
  // Swap meaning of modifier key in most ergonomic location based on babble
 | 
						|
  // mode. Eg Thumb gets CTL on Win/Linux, pinky gets Windows key. Reverse for 
 | 
						|
  // OS X.  See first line in babblepaste function.   
 | 
						|
  #define B_1ME BABL_PRIMARY_OS_MOD 
 | 
						|
  #define B_2ME BABL_SECONDARY_OS_MOD
 | 
						|
  #define B_3ME BABL_TERTIARY_OS_MOD
 | 
						|
 | 
						|
// Macros
 | 
						|
  #define B_L1C  BABL_GO_LEFT_1C
 | 
						|
  #define B_R1C  BABL_GO_RIGHT_1C
 | 
						|
  #define B_L1W  BABL_GO_LEFT_WORD
 | 
						|
  #define B_R1W  BABL_GO_RIGHT_WORD
 | 
						|
  #define B_GSOL  BABL_GO_START_LINE
 | 
						|
  #define B_GEOL  BABL_GO_END_LINE
 | 
						|
  #define B_GTOP  BABL_GO_START_DOC
 | 
						|
  #define B_GEND  BABL_GO_END_DOC
 | 
						|
  #define B_DOWN  BABL_GO_NEXT_LINE
 | 
						|
  #define B_UP    BABL_GO_PREV_LINE
 | 
						|
  #define B_PTOP  BABL_GO_PARA_START
 | 
						|
  #define B_PEND  BABL_GO_PARA_END
 | 
						|
  #define B_PGDN  BABL_PGDN
 | 
						|
  #define B_PGUP  BABL_PGUP
 | 
						|
  #define B_DEL    BABL_DEL_RIGHT_1C
 | 
						|
  #define B_DLW    BABL_DEL_LEFT_WORD
 | 
						|
  #define B_DRW    BABL_DEL_RIGHT_WORD
 | 
						|
  #define B_DEOL  BABL_DEL_TO_LINE_END // delete from cursor to end of line
 | 
						|
  #define B_DSOL  BABL_DEL_TO_LINE_START // delete from cursor to begining line
 | 
						|
  #define B_MODE   BABL_MODE //type out name of current mode.
 | 
						|
 | 
						|
  #define B_UNDO    BABL_UNDO
 | 
						|
  #define B_REDO    BABL_REDO
 | 
						|
  #define B_CUT     BABL_CUT
 | 
						|
  #define B_COPY    BABL_COPY
 | 
						|
  #define B_PASTE    BABL_PASTE
 | 
						|
  #define B_SELALL    BABL_SELECT_ALL
 | 
						|
  #define B_SELA    BABL_SELECT_ALL
 | 
						|
  #define B_FIND     BABL_FIND
 | 
						|
  #define B_FINDN    BABL_FIND_NEXT
 | 
						|
  #define B_FINDP    BABL_FIND_PREV
 | 
						|
  #define B_RPLACE    BABL_FIND_REPLACE
 | 
						|
  #define B_RUNAPP    BABL_RUNAPP
 | 
						|
  #define B_NAPP  BABL_SWITCH_APP_NEXT
 | 
						|
  #define B_PAPP  BABL_SWITCH_APP_LAST // previous
 | 
						|
  #define B_CAPP  BABL_CLOSE_APP
 | 
						|
  #define B_HELP  BABL_HELP
 | 
						|
  #define B_HELP  BABL_HELP
 | 
						|
  #define B_LOCK  BABL_LOCK
 | 
						|
  #define B_SCAP  BABL_SCREENCAPTURE
 | 
						|
  #define B_KEYB  BABL_SWITCH_KEYBOARD_LAYOUT
 | 
						|
 | 
						|
  #define B_NTAB  BABL_BROWSER_NEW_TAB
 | 
						|
  #define B_CTAB  BABL_BROWSER_CLOSE_TAB
 | 
						|
  #define B_ROTB  BABL_BROWSER_REOPEN_LAST_TAB
 | 
						|
  #define B_NXTB  BABL_BROWSER_NEXT_TAB
 | 
						|
  #define B_PTAB  BABL_BROWSER_PREV_TAB
 | 
						|
  #define B_NURL  BABL_BROWSER_URL_BAR
 | 
						|
  #define B_BFWD  BABL_BROWSER_FORWARD
 | 
						|
  #define B_BBAK  BABL_BROWSER_BACK
 | 
						|
  #define B_BFND  BABL_BROWSER_FIND
 | 
						|
  #define B_BOOK  BABL_BROWSER_BOOKMARK
 | 
						|
  #define B_BDEV  BABL_BROWSER_DEV_TOOLS // hard one to remember
 | 
						|
  #define B_BRLD  BABL_BROWSER_RELOAD
 | 
						|
  #define B_BFULL BABL_BROWSER_FULLSCREEN
 | 
						|
  #define B_ZIN   BABL_BROWSER_ZOOM_IN
 | 
						|
  #define B_ZOUT  BABL_BROWSER_ZOOM_OUT
 | 
						|
 | 
						|
  #define B_SAVE  BABL_APP_SAVE
 | 
						|
  #define B_PASTV BABL_APP_PASTE_VALUES
 | 
						|
  #define B_CALN  BABL_APP_CENTER_ALIGN
 | 
						|
  #define B_CFMT  BABL_APP_CLEAR_FORMATTING
 | 
						|
  #define B_SCLA  BABL_APP_SCROLL_ACTIVE_CELL
 | 
						|
  #define B_NCEL  BABL_NEWLINE_IN_CELL
 | 
						|
  #define B_IPRW  BABL_INSERT_ROW_ABOVE
 | 
						|
  #define B_ICOL  BABL_INSERT_COL_LEFT
 | 
						|
  #define B_IROW  BABL_INSERT_ROW
 | 
						|
  #define B_DROW  BABL_DELETE_ROW
 | 
						|
  #define B_SELC  BABL_SELECT_COL
 | 
						|
  #define B_SELR  BABL_SELECT_ROW
 | 
						|
 | 
						|
  #define B_MSEL    BABL_APP_MULTI_SELECT
 | 
						|
  #define B_MARK    BABL_APP_SET_MARK
 | 
						|
  #define B_VSPLIT  BABL_SPLIT_FRAME_VERT
 | 
						|
  #define B_VUNSPT  BABL_UNSPLIT_FRAME_VERT
 | 
						|
  #define B_HSPLIT  BABL_SPLIT_FRAME_HORIZONTAL
 | 
						|
  #define B_HUNSPT  BABL_UNSPLIT_FRAME_HORIZONTAL
 | 
						|
  #define B_NXTFM   BABL_NEXT_FRAME
 | 
						|
  #define B_PRVFM   BABL_PREV_FRAME
 | 
						|
```
 | 
						|
 | 
						|
####Add babblepaste functions to your keyboard or userspace
 | 
						|
Functions babble_led_user() and babble_led_kb() are called when babble mode is changed. 
 | 
						|
```
 | 
						|
void babble_modeswitch_kb(uint8_t mode){
 | 
						|
  #ifdef USE_BABBLEPASTE
 | 
						|
      writePinLow(B3);      writePinLow(B2);
 | 
						|
      switch(mode) {
 | 
						|
        case(BABL_LINUX_MODE):
 | 
						|
          writePinHigh(B2);
 | 
						|
          backlight_level(1);
 | 
						|
          break;
 | 
						|
        case(BABL_MAC_MODE):  
 | 
						|
          writePinHigh(B3);
 | 
						|
          backlight_level(4);
 | 
						|
          break;
 | 
						|
      }
 | 
						|
      // call the user function
 | 
						|
    babble_modeswitch_user(mode);
 | 
						|
  #endif
 | 
						|
```
 | 
						|
 | 
						|
 | 
						|
 | 
						|
## Development FAQs
 | 
						|
 | 
						|
**Todos**
 | 
						|
eeprom store state of babble_mode? or update docs so that people can change the order of the enum in babblespace.h?
 | 
						|
 | 
						|
**You have huge ifdef stanzas instead of functions**
 | 
						|
This fails gracefully if you don't have all options defined. Patch if you can think how to use fewer defines.
 | 
						|
 | 
						|
**Why not an array of arrays as a lookup instead of a function?**
 | 
						|
This would allow you to store the lookup table in PROGMEM.
 | 
						|
True, but that takes more pre-processor skill than I have, and may be less portable to ARM or other flash mappings.
 | 
						|
 | 
						|
**Have you tested every key on every platform?**
 | 
						|
No. Be careful, submit a patch.
 | 
						|
 | 
						|
**Why not change apps App babble modes at the same global level as the OS?**
 | 
						|
This is only a good thing if it doesn't confuse the user. If you can show state of OS vs App, it's probably a good thing.
 | 
						|
 | 
						|
**Can the OS tell the keyboard what mode to use?**
 | 
						|
The keyboard side is easy to do with virtser_recv & a function that updates babble_mode. It still needs a PC side app to track where the keyboard focus is.
 | 
						|
One could use a keyboard macro to launch an app & switch modes for that app.
 | 
						|
 | 
						|
## Thanks
 | 
						|
 | 
						|
Thanks to [wikipedia shortcuts page](https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts)
 | 
						|
and [Jeebak's keymap](https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jeebak/keymap.c)
 | 
						|
this [howtogeek shortcuts page](https://www.howtogeek.com/115664/42-text-editing-keyboard-shortcuts-that-work-almost-everywhere/)
 | 
						|
And of course QMK...
 |