Created
January 10, 2022 10:25
-
-
Save gsinclair/9233f4efc089e6671a271706a2fce0d3 to your computer and use it in GitHub Desktop.
A Karabiner/Goku example that among other things demonstrates swapping Win and Alt keys on an external keyboard to reflect the Mac Option-Command layout.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
:devices { | |
:sculpt-keyboard [{:product_id 1957 :vendor_id 1118}] | |
} | |
:layers {:capslock-mode {:key :caps_lock :alone {:key :escape}} | |
; CAPSLOCK gives arrow keys with hjkl and Enter with m or Escape if tapped | |
} | |
:simlayers { | |
:f-mode {:key :f} ; delimeters ( ) [ ] { } < > | |
:d-mode {:key :d} ; arithmetic + - * / = % \[ \] | |
:s-mode {:key :s} ; punctuation ? ! : ; ' " ` ~ | |
:a-mode {:key :a} ; symbols & | _ \ @ # $ ^ | |
; | |
:q-mode {:key :q} ; General shortcuts (browser etc.) | |
:w-mode {:key :w} ; Selection left and right (letter, word, line) | |
:e-mode {:key :e} ; Movement left and right (letter, word, line) | |
:r-mode {:key :r} ; Deletion left and right (letter, word, line) | |
; | |
:g-mode {:key :g} ; Mouse scroll, desktop left-right, zoom in-out, screenshot | |
; | |
:v-mode {:key :v} ; Number pad | |
} | |
:main [ | |
{:des "Swap Win and Alt on Sculpt keyboard" | |
:rules [:sculpt-keyboard | |
[:left_option :left_command] | |
[:left_command :left_option] | |
[:right_option :right_command] | |
[:application :right_option] | |
] | |
} | |
;;; This doesn't work because ... well, I set CAPS-LOCK = Control in the Mac | |
;;; keyboard settings, but Karabiner doesn't see that when processing these | |
;;; rules :( | |
;;; | |
;;; {:des "CTRL-[hjklm] to arrow movement and Enter, or Esc if alone" | |
;;; :rules [ | |
;;; [:!Th :left_arrow] | |
;;; [:!Tj :down_arrow] | |
;;; [:!Tk :up_arrow] | |
;;; [:!Tl :right_arrow] | |
;;; [:!Tm :return_or_enter] | |
;;; ] | |
;;; } | |
{:des "CAPS LOCK - arrow movement [hjkl] and delete [g;] and Return [m], otherwise CTRL-*, otherwise Escape" | |
:rules [:capslock-mode | |
[:h :left_arrow] | |
[:##j :down_arrow] | |
[:##k :up_arrow] | |
[:##l :right_arrow] | |
[:n :return_or_enter] | |
[:m :return_or_enter] | |
[:!Ch :!Cleft_arrow] | |
[:!Cj :!Cdown_arrow] | |
[:!Ck :!Cup_arrow] | |
[:!Cl :!Cright_arrow] | |
[:!Oh :!Oleft_arrow] | |
[:!Oj :!Odown_arrow] | |
[:!Ok :!Oup_arrow] | |
[:!Ol :!Oright_arrow] | |
[:!Sh :!Sleft_arrow] | |
[:!Sj :!Sdown_arrow] | |
[:!Sk :!Sup_arrow] | |
[:!Sl :!Sright_arrow] | |
[:!OSh :!OSleft_arrow] | |
[:!OSj :!OSdown_arrow] | |
[:!OSk :!OSup_arrow] | |
[:!OSl :!OSright_arrow] | |
[:!CSh :!CSleft_arrow] | |
[:!CSj :!CSdown_arrow] | |
[:!CSk :!CSup_arrow] | |
[:!CSl :!CSright_arrow] | |
;; Jan 2022: I'm trying better options for these actions. | |
;; [:##g :delete_or_backspace] | |
;; [:##semicolon :delete_forward] | |
;; [:##w :!Odelete_or_backspace] | |
;; [:##m :return_or_enter] | |
[:##q :!Tq] | |
[:##w :!Tw] | |
[:##e :!Te] | |
[:##r :!Tr] | |
[:##t :!Tt] | |
[:##y :!Ty] | |
[:##u :!Tu] | |
[:##i :!Ti] | |
[:##o :!To] | |
[:##p :!Tp] | |
[:##a :!Ta] | |
[:##s :!Ts] | |
[:##d :!Td] | |
[:##f :!Tf] | |
[:##g :!Tg] | |
[:##z :!Tz] | |
[:##x :!Tx] | |
[:##c :!Tc] | |
[:##v :!Tv] | |
[:##b :!Tb] | |
; [:##n :!Tn] These are now Enter | |
; [:##m :!Tm] | |
[:##1 :1] | |
[:##2 :2] | |
[:##3 :3] | |
[:##4 :4] | |
[:##5 :5] | |
[:##6 :6] | |
[:##7 :7] | |
[:##8 :8] | |
[:##9 :9] | |
[:##0 :0] | |
[:##hyphen :hyphen] | |
[:##equal_sign :equal_sign] | |
[:##open_bracket :open_bracket] | |
[:##close_bracket :close_bracket] | |
[:##semicolon :semicolon] | |
[:##quote :quote] | |
[:##comma :comma] | |
[:##period :period] | |
[:##slash :slash] | |
] | |
} | |
{:des "f-mode for delimeters" ;; { } ( ) [ ] | |
:rules [:f-mode | |
[:##j :!S9] ; f -> j ( | |
[:##k :!S0] ; f -> k ) | |
[:##m :open_bracket] ; f -> m [ | |
[:##comma :close_bracket] ; f -> , ] | |
[:##u :!Sopen_bracket] ; f -> u { | |
[:##i :!Sclose_bracket] ; f -> i } | |
; The next two are in for legacy reasons. | |
[:##l :open_bracket] ; f -> l [ | |
[:##semicolon :close_bracket] ; f -> ; ] | |
] | |
} | |
{:des "d-mode for arithmetic" ;; < > # + - = * / ~ | |
:rules [:d-mode | |
[:##u :!Scomma] ; d -> o < | |
[:##i :!Speriod] ; d -> p > | |
[:##o :!S3] ; d -> o # | |
[:##j :!Sequal_sign] ; d -> j + | |
[:##k :hyphen] ; d -> k - | |
[:##l :equal_sign] ; d -> l = | |
[:##m :!S8] | |
[:##comma :slash] | |
[:##period :!Sgrave_accent_and_tilde] | |
] | |
} | |
{:des "s-mode for punctuation" ;; ; : ! , . ? ' " ` | |
:rules [:s-mode | |
[:##u :semicolon] | |
[:##i :!Ssemicolon] | |
[:##o :!S1] | |
[:##j :comma] | |
[:##k :period] | |
[:##l :!Sslash] | |
[:##m :quote] | |
[:##comma :!Squote] | |
[:##period :grave_accent_and_tilde] | |
] | |
} | |
{:des "a-mode for symbols" | |
:rules [:a-mode | |
[:##j :!S7] ; a -> j & | |
[:##k :!Sbackslash] ; a -> k | | |
[:##l :!Shyphen] ; a -> l _ | |
[:##semicolon :backslash] ; a -> ; \ | |
[:##u :!S2] ; a -> u @ | |
[:##i :!S3] ; a -> i # | |
[:##o :!S4] ; a -> o $ | |
[:##p :!S6] ; a -> p ^ | |
] | |
} | |
{:des "r-mode for deleting characters with ui, words with jk and lines with hl" | |
:rules [:r-mode | |
[:##u :delete_or_backspace] ; r -> j Delete word backwards | |
[:##i :delete_forward] ; r -> j Delete word backwards | |
[:##j :!Odelete_or_backspace] ; r -> j Delete word backwards | |
[:##k :!Odelete_forward] ; r -> k Delete word forwards | |
[:##h :!Cdelete_or_backspace] ; r -> h Delete to beginning of line | |
[:##l :!Cdelete_forward] ; r -> l Delete to end of line | |
] | |
} | |
{:des "e-mode allows for easy back and forth one character, word or line" | |
:rules [:e-mode | |
[:##u :left_arrow] ; e -> u Left | |
[:##i :right_arrow] ; e -> i Right | |
[:##j :!Oleft_arrow] ; e -> j Opt+Left | |
[:##k :!Oright_arrow] ; e -> k Opt+Right | |
[:##h :!Cleft_arrow] ; e -> h Cmd+Left | |
[:##l :!Cright_arrow] ; e -> l Cmd+Right | |
[:n :return_or_enter] ; e -> n Enter | |
[:m :return_or_enter] ; e -> n Enter | |
] | |
} | |
{:des "w-mode = e-mode + SHIFT (i.e. selection, not just movement)" | |
:rules [:w-mode | |
[:##u :!Sleft_arrow] ; e -> u Shift+Left | |
[:##i :!Sright_arrow] ; e -> i Shift+Right | |
[:##j :!SOleft_arrow] ; e -> j Shift+Opt+Left | |
[:##k :!SOright_arrow] ; e -> k Shift+Opt+Right | |
[:##h :!SCleft_arrow] ; e -> h Shift+Cmd+Left | |
[:##l :!SCright_arrow] ; e -> l Shift+Cmd+Right | |
] | |
} | |
{:des "q-mode for general shortcuts like browser tab navigation" | |
:rules [:q-mode | |
[:##j :!CSopen_bracket] ; q -> j tab to the left: Cmd-{ | |
[:##k :!CSclose_bracket] ; q -> k tab to the right: Cmd-} | |
[:##l :!TCf ] ; q -> l toggle full screen: ^⌘F | |
[:##u :!Cclose_bracket] ; q -> u browser back: Cmd-[ | |
[:##i :!Cclose_bracket] ; q -> i browser forward: Cmd-] | |
[:##o :f2 ] ; q -> o F2 (useful in Excel) | |
[:##p :f4 ] ; q -> p F4 (useful in Excel) | |
] | |
} | |
{:des "v-mode for number pad uio jkl m,." | |
:rules [:v-mode | |
[:u :7] | |
[:i :8] | |
[:o :9] | |
[:j :4] | |
[:k :5] | |
[:l :6] | |
[:m :1] | |
[:comma :2] | |
[:period :3] | |
[:p :0] | |
[:semicolon :period] | |
[:slash :0] | |
[:y :0] | |
[:h :0] | |
[:n :0] | |
] | |
} | |
{:des "c-mode for slash and line type symbols" | |
:rules [:c-mode | |
] | |
} | |
{:des "g-mode for mouse scroll, desktop left-right, zoom in-out, screenshot" | |
:rules [:g-mode | |
] | |
} | |
{:des "Forward slash is an easier right-shift (if combined)" | |
:rules [ | |
[:slash :left_shift nil {:alone :slash}] | |
]} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment