I’m posting a possible QWERTY muscle memory locator to key symbols map so you could check out for yourself how comfortable the notation feels. I did not visually arrange them, so you get no visual clue and might be guided entirely by the syntax when mapping.
l-pinky[ 0, 2]: 1
l-pinky[ 0, 1]: q
l-pinky[ 0, 0]: a
l-pinky[ 0,-1]: z
l-ring[ 0, 2]: 2
l-ring[ 0, 1]: w
l-ring[ 0, 0]: s
l-ring[ 0,-1]: x
l-middle[ 0, 2]: 3
l-middle[ 0, 1]: e
l-middle[ 0, 0]: d
l-middle[ 0,-1]: c
l-point[ 0, 2]: 4
l-point[ 0, 1]: r
l-point[ 0, 0]: f
l-point[ 0,-1]: v
l-point[ 1, 2]: 5
l-point[ 1, 1]: t
l-point[ 1, 0]: g
l-point[ 1,-1]: b
r-point[-1, 2]: 6
r-point[-1, 1]: y
r-point[-1, 0]: h
r-point[-1,-1]: n
r-point[ 0, 2]: 7
r-point[ 0, 1]: u
r-point[ 0, 0]: j
r-point[ 0,-1]: m
r-middle[ 0, 2]: 8
r-middle[ 0, 1]: i
r-middle[ 0, 0]: k
r-middle[ 0,-1]: ,
r-ring[ 0, 2]: 9
r-ring[ 0, 1]: o
r-ring[ 0, 0]: l
r-ring[ 0,-1]: .
r-pinky[ 0, 2]: 0
r-pinky[ 0, 1]: p
r-pinky[ 0, 0]: ;
r-pinky[ 0,-1]: /
r-pinky[ 1, 2]: -
r-pinky[ 1, 1]: [
r-pinky[ 1, 0]: '
r-pinky[ 2, 2]: =
r-pinky[ 2, 1]: ]
r-pinky[ 2, 0]: \
I haven’t checked the keycodes (showkey --ascii
) for all, but two (this is what is returned by my terminal, I’m not sure about the wire format here and if kakoune has only ever access to those terminal interpreted values — but that only means we have to move the anti-corruption-layer further down the stack and not let it bleed in and affect kakoune muscle memory config):
QWERY:
l-middle[ 0, 1]: e 101 0145 0x65
Workman: (emulated by the keyboard firmware)
l-middle[ 0, 1]: r 114 0162 0x72
And here is an example where CSI u
encoding comes into play (but fortunately kakoune understands this perfectly):
Return:
^M 13 0015 0x0d
Ctrl+Return: (CSI u encoded)
^[[13;5u 27 0033 0x1b
91 0133 0x5b
49 0061 0x31
51 0063 0x33
59 0073 0x3b
53 0065 0x35
117 0165 0x75
And here are xev
events when swithing between spanish and english layout (confirming that keycodes are invariant):
KeyPress event, serial 38, synthetic NO, window 0x400001,
root 0x39f, subw 0x0, time 3176346, (90,570), root:(1372,1697),
state 0x0, keycode 47 (keysym 0x3b, semicolon), same_screen YES,
XLookupString gives 1 bytes: (3b) ";"
XmbLookupString gives 1 bytes: (3b) ";"
XFilterEvent returns: False
KeyRelease event, serial 38, synthetic NO, window 0x400001,
root 0x39f, subw 0x0, time 3176498, (90,570), root:(1372,1697),
state 0x0, keycode 47 (keysym 0x3b, semicolon), same_screen YES,
XLookupString gives 1 bytes: (3b) ";"
XFilterEvent returns: False
KeyPress event, serial 38, synthetic NO, window 0x400001,
root 0x39f, subw 0x0, time 3180682, (90,570), root:(1372,1697),
state 0x2000, keycode 47 (keysym 0xf1, ntilde), same_screen YES,
XLookupString gives 2 bytes: (c3 b1) "ñ"
XmbLookupString gives 2 bytes: (c3 b1) "ñ"
XFilterEvent returns: False
KeyRelease event, serial 38, synthetic NO, window 0x400001,
root 0x39f, subw 0x0, time 3180794, (90,570), root:(1372,1697),
state 0x2000, keycode 47 (keysym 0xf1, ntilde), same_screen YES,
XLookupString gives 2 bytes: (c3 b1) "ñ"
XFilterEvent returns: False
This raises the question if it is feasible for kakoune to work with raw key events when it’s expected to interpret muscle memory locators (in all but insert mode).