| 
          # -*- coding: utf-8 -*- | 
        
        
           | 
          # autostart = true | 
        
        
           | 
          
 | 
        
        
           | 
          import re | 
        
        
           | 
          from xkeysnail.transform import * | 
        
        
           | 
          
 | 
        
        
           | 
          # Use the following for testing terminal keymaps | 
        
        
           | 
          # terminals = [ "", ... ] | 
        
        
           | 
          # xbindkeys -mk | 
        
        
           | 
          terminals = ["gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm","kitty","alacritty","mate-terminal","tilix","xfce4-terminal"] | 
        
        
           | 
          terminals = [term.casefold() for term in terminals] | 
        
        
           | 
          termStr = "|".join(str(x) for x in terminals) | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          mscodes = ["code","vscodium"] | 
        
        
           | 
          codeStr = "|".join(str(x) for x in mscodes) | 
        
        
           | 
          
 | 
        
        
           | 
          ## added by ingram | 
        
        
           | 
          jetbrains = ["jetbrains-idea"] | 
        
        
           | 
          jetbrains = [term.casefold() for term in jetbrains] | 
        
        
           | 
          
 | 
        
        
           | 
          define_conditional_modmap(lambda wm_class: wm_class.casefold() in jetbrains,{ | 
        
        
           | 
              Key.LEFT_ALT: Key.LEFT_META, | 
        
        
           | 
              Key.LEFT_META: Key.LEFT_ALT, | 
        
        
           | 
          
 | 
        
        
           | 
              Key.RIGHT_ALT: Key.RIGHT_META, | 
        
        
           | 
              Key.RIGHT_META: Key.RIGHT_ALT | 
        
        
           | 
          }) | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          # [Multipurpose modmap] Give a key two meanings. A normal key when pressed and | 
        
        
           | 
          # released, and a modifier key when held down with another key. See Xcape, | 
        
        
           | 
          # Carabiner and caps2esc for ideas and concept. | 
        
        
           | 
          #define_multipurpose_modmap( | 
        
        
           | 
              # Enter is enter when pressed and released. Control when held down. | 
        
        
           | 
              # Capslock is capslock when pressed and released. Control when held down. | 
        
        
           | 
          #    { | 
        
        
           | 
          #       Key.ENTER: [Key.ENTER, Key.RIGHT_CTRL], | 
        
        
           | 
          #       Key.CAPSLOCK: [Key.CAPSLOCK, Key.LEFT_CTRL] | 
        
        
           | 
          #    } | 
        
        
           | 
          #) | 
        
        
           | 
          
 | 
        
        
           | 
          ## ended by ingram | 
        
        
           | 
          
 | 
        
        
           | 
          ## ingram: | 
        
        
           | 
          ##   `not in terminals` change to `not in (jetbrains + terminals)` | 
        
        
           | 
          
 | 
        
        
           | 
          # [Global modemap] Change modifier keys as in xmodmap | 
        
        
           | 
          define_conditional_modmap(lambda wm_class: wm_class.casefold() not in (jetbrains + terminals),{ | 
        
        
           | 
              # # Chromebook | 
        
        
           | 
              # Key.LEFT_ALT: Key.RIGHT_CTRL,   # Chromebook | 
        
        
           | 
              # Key.LEFT_CTRL: Key.LEFT_ALT,    # Chromebook | 
        
        
           | 
              # Key.RIGHT_ALT: Key.RIGHT_CTRL,  # Chromebook | 
        
        
           | 
              # Key.RIGHT_CTRL: Key.RIGHT_ALT,  # Chromebook | 
        
        
           | 
          
 | 
        
        
           | 
              # # Default Mac/Win | 
        
        
           | 
              Key.LEFT_ALT: Key.RIGHT_CTRL,   # WinMac | 
        
        
           | 
              Key.LEFT_META: Key.LEFT_ALT,    # WinMac | 
        
        
           | 
              Key.LEFT_CTRL: Key.LEFT_META,   # WinMac | 
        
        
           | 
              Key.RIGHT_ALT: Key.RIGHT_CTRL,  # WinMac | 
        
        
           | 
              Key.RIGHT_META: Key.RIGHT_ALT,  # WinMac | 
        
        
           | 
              Key.RIGHT_CTRL: Key.RIGHT_META, # WinMac | 
        
        
           | 
          
 | 
        
        
           | 
              # # Mac Only | 
        
        
           | 
              # Key.LEFT_META: Key.RIGHT_CTRL,  # Mac | 
        
        
           | 
              # Key.LEFT_CTRL: Key.LEFT_META,   # Mac | 
        
        
           | 
              # Key.RIGHT_META: Key.RIGHT_CTRL, # Mac | 
        
        
           | 
              # Key.RIGHT_CTRL: Key.RIGHT_META, # Mac | 
        
        
           | 
          }) | 
        
        
           | 
          
 | 
        
        
           | 
          # [Conditional modmap] Change modifier keys in certain applications | 
        
        
           | 
          define_conditional_modmap(re.compile(termStr, re.IGNORECASE), { | 
        
        
           | 
              # # Chromebook | 
        
        
           | 
              # Key.LEFT_ALT: Key.RIGHT_CTRL,     # Chromebook | 
        
        
           | 
              # # Left Ctrl Stays Left Ctrl | 
        
        
           | 
              # Key.LEFT_META: Key.LEFT_ALT,      # Chromebook | 
        
        
           | 
              # Key.RIGHT_ALT: Key.RIGHT_CTRL,    # Chromebook - Multi-language (Remove) | 
        
        
           | 
              # Key.RIGHT_CTRL: Key.RIGHT_ALT,    # Chromebook | 
        
        
           | 
              # # Right Meta does not exist on chromebooks | 
        
        
           | 
          
 | 
        
        
           | 
              # # Default Mac/Win | 
        
        
           | 
              Key.LEFT_ALT: Key.RIGHT_CTRL,   # WinMac | 
        
        
           | 
              Key.LEFT_META: Key.LEFT_ALT,    # WinMac | 
        
        
           | 
              Key.LEFT_CTRL: Key.LEFT_CTRL,   # WinMac | 
        
        
           | 
              Key.RIGHT_ALT: Key.RIGHT_CTRL,  # WinMac - Multi-language (Remove) | 
        
        
           | 
              Key.RIGHT_META: Key.RIGHT_ALT,  # WinMac | 
        
        
           | 
              Key.RIGHT_CTRL: Key.LEFT_CTRL,  # WinMac | 
        
        
           | 
          
 | 
        
        
           | 
              # # Mac Only | 
        
        
           | 
              # Key.LEFT_META: Key.RIGHT_CTRL,  # Mac | 
        
        
           | 
              # # Left Ctrl Stays Left Ctrl | 
        
        
           | 
              # Key.RIGHT_META: Key.RIGHT_CTRL, # Mac | 
        
        
           | 
              # Key.RIGHT_CTRL: Key.LEFT_CTRL,  # Mac | 
        
        
           | 
          }) | 
        
        
           | 
          
 | 
        
        
           | 
          # Keybindings for Nautilus | 
        
        
           | 
          define_keymap(re.compile("org.gnome.nautilus", re.IGNORECASE),{ | 
        
        
           | 
              K("RC-Up"): K("M-Up"),          # Go Up dir | 
        
        
           | 
              K("RC-Down"): K("M-Down"),      # Go Down dir | 
        
        
           | 
              K("RC-Left"): K("M-Left"),      # Go Back | 
        
        
           | 
              K("RC-Right"): K("M-Right"),    # Go Forward | 
        
        
           | 
          }) | 
        
        
           | 
          
 | 
        
        
           | 
          ## ingram: | 
        
        
           | 
          ##   None condition keymap change to `not in jetbrains` | 
        
        
           | 
          ## | 
        
        
           | 
          ##define_keymap(None,{ | 
        
        
           | 
          define_keymap(lambda wm_class: wm_class.casefold() not in jetbrains,{ | 
        
        
           | 
              # Basic App hotkey functions | 
        
        
           | 
              K("RC-Q"): K("Alt-F4"), | 
        
        
           | 
              K("RC-H"): K("Alt-F9"), | 
        
        
           | 
              # Cmd Tab - App Switching Default | 
        
        
           | 
              ## ingram tweak Cmd | 
        
        
           | 
              K("RC-Tab"): K("Super-Tab"), | 
        
        
           | 
              K("RC-Shift-Tab"): K("Super-Shift-Tab"), | 
        
        
           | 
          
 | 
        
        
           | 
              ##K("RC-Tab"): K("RC-F13"),                     # Default not-xfce4 | 
        
        
           | 
              ##K("RC-Shift-Tab"): K("RC-Shift-F13"),         # Default not-xfce4 | 
        
        
           | 
              ##K("RC-Grave"): K("M-F6"),                     # Default not-xfce4 | 
        
        
           | 
              ##K("RC-Shift-Grave"): K("M-Shift-F6"),         # Default not-xfce4 | 
        
        
           | 
              # K("RC-Tab"): K("RC-backslash"),               # xfce4 | 
        
        
           | 
              # K("RC-Shift-Tab"): K("RC-Shift-backslash"),   # xfce4 | 
        
        
           | 
              # K("RC-Grave"): K("RC-Shift-backslash"),       # xfce4 | 
        
        
           | 
              # In-App Tab switching | 
        
        
           | 
              # K("M-Tab"): K("C-Tab"),                       # Chromebook - In-App Tab switching | 
        
        
           | 
              # K("M-Shift-Tab"): K("C-Shift-Tab"),           # Chromebook - In-App Tab switching | 
        
        
           | 
              # K("M-Grave") : K("C-Shift-Tab"),              # Chromebook - In-App Tab switching | 
        
        
           | 
              K("Super-Tab"): K("LC-Tab"),                  # Default not-chromebook | 
        
        
           | 
              K("Super-Shift-Tab"): K("LC-Shift-Tab"),      # Default not-chromebook | 
        
        
           | 
          
 | 
        
        
           | 
              # Wordwise | 
        
        
           | 
              K("RC-Left"): K("Home"),                      # Beginning of Line | 
        
        
           | 
              K("Super-a"): K("Home"),                      # Beginning of Line | 
        
        
           | 
              K("RC-Shift-Left"): K("Shift-Home"),          # Select all to Beginning of Line | 
        
        
           | 
              K("RC-Right"): K("End"),                      # End of Line | 
        
        
           | 
              K("Super-e"): K("End"),                       # End of Line | 
        
        
           | 
              K("RC-Shift-Right"): K("Shift-End"),          # Select all to End of Line | 
        
        
           | 
              # K("RC-Left"): K("C-LEFT_BRACE"),              # Firefox-nw - Back | 
        
        
           | 
              # K("RC-Right"): K("C-RIGHT_BRACE"),            # Firefox-nw - Forward | 
        
        
           | 
              # K("RC-Left"): K("M-LEFT"),                    # Chrome-nw - Back | 
        
        
           | 
              # K("RC-Right"): K("M-RIGHT"),                  # Chrome-nw - Forward | 
        
        
           | 
              K("RC-Up"): K("C-Home"),                      # Beginning of File | 
        
        
           | 
              K("RC-Shift-Up"): K("C-Shift-Home"),          # Select all to Beginning of File | 
        
        
           | 
              K("RC-Down"): K("C-End"),                     # End of File | 
        
        
           | 
              K("RC-Shift-Down"): K("C-Shift-End"),         # Select all to End of File | 
        
        
           | 
              # K("M-Backspace"): K("Delete"),                # Chromebook - Delete | 
        
        
           | 
              K("Super-Backspace"): K("C-Backspace"),       # Default not-chromebook - Delete Left Word of Cursor | 
        
        
           | 
              K("Super-Delete"): K("C-Delete"),             # Default not-chromebook - Delete Right Word of Cursor | 
        
        
           | 
              K("Alt-Backspace"): K("C-Backspace"),       # Default not-chromebook - Delete Left Word of Cursor | 
        
        
           | 
              K("Alt-Delete"): K("C-Delete"),             # Default not-chromebook - Delete Right Word of Cursor | 
        
        
           | 
              # K(""): pass_through_key,                      # cancel | 
        
        
           | 
              # K(""): K(""),                                 # | 
        
        
           | 
          
 | 
        
        
           | 
              ## IME, ingram | 
        
        
           | 
              K("RC-Space"): K("Super-Space"), | 
        
        
           | 
              K("RC-Shift-Space"): K("Super-Shift-Space"), | 
        
        
           | 
          }) | 
        
        
           | 
          
 | 
        
        
           | 
          ## ingram: | 
        
        
           | 
          ##   jetbrains specific tweak  | 
        
        
           | 
          define_keymap(lambda wm_class: wm_class.casefold() in jetbrains,{ | 
        
        
           | 
          }) | 
        
        
           | 
          
 | 
        
        
           | 
          ## ingram: | 
        
        
           | 
          ##   global tweak for more macOS feel, except terminal  | 
        
        
           | 
          define_keymap(lambda wm_class: wm_class.casefold() not in terminals,{ | 
        
        
           | 
              ## Alternative to Ctrl-tab switch | 
        
        
           | 
              K("RC-Shift-RIGHT_BRACE"): K("LC-Tab"), | 
        
        
           | 
              K("RC-Shift-LEFT_BRACE"): K("LC-Shift-Tab"), | 
        
        
           | 
          }) | 
        
        
           | 
          
 | 
        
        
           | 
          ## ingram: | 
        
        
           | 
          ##   `not in mscodes` change to `not in (jetbrains + mscodes)` | 
        
        
           | 
          
 | 
        
        
           | 
          define_keymap(lambda wm_class: wm_class.casefold() not in (jetbrains + mscodes),{ | 
        
        
           | 
              # Wordwise remaining - for Everything but VS Code, Jenbrains | 
        
        
           | 
              K("M-Left"): K("C-Left"),               # Left of Word | 
        
        
           | 
              K("M-Shift-Left"): K("C-Shift-Left"),   # Select Left of Word | 
        
        
           | 
              K("M-Right"): K("C-Right"),             # Right of Word | 
        
        
           | 
              K("M-Shift-Right"): K("C-Shift-Right"), # Select Right of Word | 
        
        
           | 
              K("M-Shift-g"): K("C-Shift-g"),         # View source control | 
        
        
           | 
              # ** VS Code fix ** | 
        
        
           | 
              #   Electron issue precludes normal keybinding fix. | 
        
        
           | 
              #   Alt menu auto-focus/toggle gets in the way. | 
        
        
           | 
              # | 
        
        
           | 
              #   refer to ./xkeysnail-config/vscode_keybindings.json | 
        
        
           | 
              # ** | 
        
        
           | 
              # | 
        
        
           | 
              # ** Firefox fix ** | 
        
        
           | 
              #   User will need to set "ui.key.menuAccessKeyFocuses" | 
        
        
           | 
              #   under about:config to false. | 
        
        
           | 
              # | 
        
        
           | 
              #   https://superuser.com/questions/770301/pentadactyl-how-to-disable-menu-bar-toggle-by-alt | 
        
        
           | 
              # ** | 
        
        
           | 
              # | 
        
        
           | 
          }) | 
        
        
           | 
          
 | 
        
        
           | 
          # Keybindings for VS Code | 
        
        
           | 
          define_keymap(re.compile(codeStr, re.IGNORECASE),{ | 
        
        
           | 
              # Wordwise remaining - for VS Code | 
        
        
           | 
              # Alt-F19 hack fixes Alt menu activation | 
        
        
           | 
              K("M-Left"): [K("M-F19"),K("C-Left")],                  # Left of Word | 
        
        
           | 
              K("M-Right"): [K("M-F19"),K("C-Right")],                # Right of Word | 
        
        
           | 
              K("M-Shift-Left"): [K("M-F19"),K("C-Shift-Left")],      # Select Left of Word | 
        
        
           | 
              K("M-Shift-Right"): [K("M-F19"),K("C-Shift-Right")],    # Select Right of Word | 
        
        
           | 
          
 | 
        
        
           | 
              # K("C-PAGE_DOWN"): pass_through_key,         # cancel next_view | 
        
        
           | 
              # K("C-PAGE_UP"): pass_through_key,           # cancel prev_view | 
        
        
           | 
              K("C-M-Left"): K("C-PAGE_UP"),              # next_view | 
        
        
           | 
              K("C-M-Right"): K("C-PAGE_DOWN"),           # prev_view | 
        
        
           | 
          
 | 
        
        
           | 
              # VS Code Shortcuts | 
        
        
           | 
              K("C-g"): pass_through_key,                 # cancel Go to Line... | 
        
        
           | 
              K("Super-g"): K("C-g"),                     # Go to Line... | 
        
        
           | 
              K("F3"): pass_through_key,                  # cancel Find next | 
        
        
           | 
              K("C-h"): pass_through_key,                 # cancel replace | 
        
        
           | 
              K("C-M-f"): K("C-h"),                       # replace | 
        
        
           | 
              K("C-Shift-h"): pass_through_key,           # cancel replace_next | 
        
        
           | 
              K("C-M-e"): K("C-Shift-h"),                 # replace_next | 
        
        
           | 
              K("f3"): pass_through_key,                  # cancel find_next | 
        
        
           | 
              K("C-g"): K("f3"),                          # find_next | 
        
        
           | 
              K("Shift-f3"): pass_through_key,            # cancel find_prev | 
        
        
           | 
              K("C-Shift-g"): K("Shift-f3"),              # find_prev | 
        
        
           | 
              # K("Super-C-g"): K("C-f2"),                  # Default - Sublime - find_all_under | 
        
        
           | 
              # K("C-M-g"): K("C-f2"),                      # Chromebook - Sublime - find_all_under | 
        
        
           | 
              # K("Super-Shift-up"): K("M-Shift-up"),       # multi-cursor up - Sublime | 
        
        
           | 
              # K("Super-Shift-down"): K("M-Shift-down"),   # multi-cursor down - Sublime | 
        
        
           | 
              # K(""): pass_through_key,                    # cancel | 
        
        
           | 
              # K(""): K(""),                               # | 
        
        
           | 
          }, "Code") | 
        
        
           | 
          
 | 
        
        
           | 
          define_keymap(re.compile("konsole", re.IGNORECASE),{ | 
        
        
           | 
              # Ctrl Tab - In App Tab Switching | 
        
        
           | 
              K("LC-Tab") : K("Shift-Right"), | 
        
        
           | 
              K("LC-Shift-Tab") : K("Shift-Left"), | 
        
        
           | 
              K("LC-Grave") : K("Shift-Left"), | 
        
        
           | 
          
 | 
        
        
           | 
          }, "Konsole tab switching") | 
        
        
           | 
          
 | 
        
        
           | 
          define_keymap(re.compile("Io.elementary.terminal|kitty", re.IGNORECASE),{ | 
        
        
           | 
              # Ctrl Tab - In App Tab Switching | 
        
        
           | 
              K("LC-Tab") : K("LC-Shift-Right"), | 
        
        
           | 
              K("LC-Shift-Tab") : K("LC-Shift-Left"), | 
        
        
           | 
              K("LC-Grave") : K("LC-Shift-Left"), | 
        
        
           | 
          
 | 
        
        
           | 
          }, "Elementary Terminal tab switching") | 
        
        
           | 
          
 | 
        
        
           | 
          define_keymap(re.compile(termStr, re.IGNORECASE),{ | 
        
        
           | 
              # Ctrl Tab - In App Tab Switching | 
        
        
           | 
              K("LC-Tab") : K("LC-PAGE_DOWN"), | 
        
        
           | 
              K("LC-Shift-Tab") : K("LC-PAGE_UP"), | 
        
        
           | 
              K("LC-Grave") : K("LC-PAGE_UP"), | 
        
        
           | 
              # Converts Cmd to use Ctrl-Shift | 
        
        
           | 
              K("RC-Tab"): K("RC-F13"), | 
        
        
           | 
              K("RC-Shift-Tab"): K("RC-Shift-F13"), | 
        
        
           | 
              K("RC-V"): K("C-Shift-V"), | 
        
        
           | 
              K("RC-MINUS"): K("C-Shift-MINUS"), | 
        
        
           | 
              K("RC-EQUAL"): K("C-Shift-EQUAL"), | 
        
        
           | 
              K("RC-BACKSPACE"): K("C-Shift-BACKSPACE"), | 
        
        
           | 
              K("RC-W"): K("C-Shift-W"), | 
        
        
           | 
              K("RC-E"): K("C-Shift-E"), | 
        
        
           | 
              K("RC-R"): K("C-Shift-R"), | 
        
        
           | 
              K("RC-T"): K("C-Shift-t"), | 
        
        
           | 
              K("RC-Y"): K("C-Shift-Y"), | 
        
        
           | 
              K("RC-U"): K("C-Shift-U"), | 
        
        
           | 
              K("RC-I"): K("C-Shift-I"), | 
        
        
           | 
              K("RC-O"): K("C-Shift-O"), | 
        
        
           | 
              K("RC-P"): K("C-Shift-P"), | 
        
        
           | 
              K("RC-LEFT_BRACE"): K("C-Shift-LEFT_BRACE"), | 
        
        
           | 
              K("RC-RIGHT_BRACE"): K("C-Shift-RIGHT_BRACE"), | 
        
        
           | 
              K("RC-A"): K("C-Shift-A"), | 
        
        
           | 
              K("RC-S"): K("C-Shift-S"), | 
        
        
           | 
              K("RC-D"): K("C-Shift-D"), | 
        
        
           | 
              K("RC-F"): K("C-Shift-F"), | 
        
        
           | 
              K("RC-G"): K("C-Shift-G"), | 
        
        
           | 
              K("RC-H"): K("C-Shift-H"), | 
        
        
           | 
              K("RC-J"): K("C-Shift-J"), | 
        
        
           | 
              K("RC-K"): K("C-Shift-K"), | 
        
        
           | 
              K("RC-L"): K("C-Shift-L"), | 
        
        
           | 
              K("RC-SEMICOLON"): K("C-Shift-SEMICOLON"), | 
        
        
           | 
              K("RC-APOSTROPHE"): K("C-Shift-APOSTROPHE"), | 
        
        
           | 
              K("RC-GRAVE"): K("C-Shift-GRAVE"), | 
        
        
           | 
              K("RC-BACKSLASH"): K("C-Shift-BACKSLASH"), | 
        
        
           | 
              K("RC-Z"): K("C-Shift-Z"), | 
        
        
           | 
              K("RC-X"): K("C-Shift-X"), | 
        
        
           | 
              K("RC-C"): K("C-Shift-C"), | 
        
        
           | 
              K("RC-V"): K("C-Shift-V"), | 
        
        
           | 
              K("RC-B"): K("C-Shift-B"), | 
        
        
           | 
              K("RC-N"): K("C-Shift-N"), | 
        
        
           | 
              K("RC-M"): K("C-Shift-M"), | 
        
        
           | 
              K("RC-COMMA"): K("C-Shift-COMMA"), | 
        
        
           | 
              K("RC-DOT"): K("C-Shift-DOT"), | 
        
        
           | 
              K("RC-SLASH"): K("C-Shift-SLASH"), | 
        
        
           | 
              K("RC-KPASTERISK"): K("C-Shift-KPASTERISK"), | 
        
        
           | 
          
 | 
        
        
           | 
              ## ingram, Alternative to Ctrl-tab switch | 
        
        
           | 
              K("RC-Shift-RIGHT_BRACE"): K("LC-PAGE_DOWN"), | 
        
        
           | 
              K("RC-Shift-LEFT_BRACE"): K("LC-PAGE_UP"), | 
        
        
           | 
          
 | 
        
        
           | 
          }, "terminals") | 
        
        
           | 
          
 | 
        
        
           | 
          ## ingram: force xkb for intellij (kinto always reset xkbmap) | 
        
        
           | 
          import os | 
        
        
           | 
          os.system("/usr/bin/setxkbmap -option altwin:meta_win") | 
        
  
Kinto 真的好方便,只可惜目前 stable 版本還沒支援 Wayland。