After browsing too much r/MechanicalKeyboards I bought some more keyboards… 😀
One is a white TKL CODE with 65g Zealios switches
(which is essentially the same as my current WASDv2 except for the case color, switches and lighting), which I bought because I was interested in the Zealios switches, and this is one of the few pre-made keyboards that offer them.
The other was a birthday present to myself and is a Leopold FC660C (Topre) in Grey & Blue:The Leopold does not have a Mac specific mode (although you can use its DIP switches to swap the Windows and Alt key, but that doesn’t get you ⌘ to the right of the space bar).
Therefore I fiddled a bit with remapping some keys for these keyboards for macOS use. One option for the Leopold FC660C is Hasu’s Alt Controller which replaces the controller board itself with a fully programmable one. Another option is to use Karabiner to remap the keys at the software level, but I found the CPU usage of Karabiner’s karabiner_grabber
process a bit too high for what it should be doing. Since macOS 10.12 there’s another way to remap keys using hidutil
.
My configuration (for both keyboards) looks as follows (stored inside ~/bin/remap.sh
which is run on login, based on this script):
#!/usr/bin/env bash
# https://developer.apple.com/library/content/technotes/tn2450/_index.html
# https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-1035.41.2/IOHIDFamily/IOHIDUsageTables.h.auto.html
# https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-1035.41.2/IOHIDFamily/AppleHIDUsageTables.h.auto.html
FROM="\"HIDKeyboardModifierMappingSrc\""
TO="\"HIDKeyboardModifierMappingDst\""
ESCAPE="0x700000029"
CAPS_LOCK="0x700000039"
PRINT_SCREEN="0x700000046"
SCROLL_LOCK="0x700000047"
PAUSE="0x700000048"
INSERT="0x700000049"
F13="0x700000068"
F14="0x700000069"
F15="0x70000006A"
LEFT_ALT="0x7000000E2"
LEFT_GUI="0x7000000E3"
RIGHT_CTRL="0x7000000E4"
RIGHT_ALT="0x7000000E6"
RIGHT_GUI="0x7000000E7"
PC_MENU="0x700000065"
MEDIA_PLAY="0xC000000B0"
MEDIA_NEXT="0xC000000B5"
MEDIA_PREV="0xC000000B6"
MEDIA_EJECT="0xC000000B8"
# WASDv2 / CODE in Mac mode
hidutil property --matching '{"ProductID":0x269, "VendorID":0x4d9}' --set "{\"UserKeyMapping\":[
{$FROM: $CAPS_LOCK, $TO: $ESCAPE},
{$FROM: $INSERT, $TO: $MEDIA_PLAY},
{$FROM: $F13, $TO: $MEDIA_EJECT},
{$FROM: $F14, $TO: $MEDIA_PREV},
{$FROM: $F15, $TO: $MEDIA_NEXT},
]}"
# Leopold FC660C
hidutil property --matching '{"ProductID":0x134, "VendorID":0x853}' --set "{\"UserKeyMapping\":[
{$FROM: $CAPS_LOCK, $TO: $ESCAPE},
{$FROM: $LEFT_GUI, $TO: $LEFT_ALT},
{$FROM: $LEFT_ALT, $TO: $LEFT_GUI},
{$FROM: $RIGHT_ALT, $TO: $RIGHT_GUI},
{$FROM: $RIGHT_CTRL, $TO: $RIGHT_ALT},
{$FROM: $PC_MENU, $TO: $RIGHT_CTRL},
{$FROM: $INSERT, $TO: $MEDIA_PLAY},
{$FROM: $PRINT_SCREEN, $TO: $MEDIA_EJECT},
{$FROM: $SCROLL_LOCK, $TO: $MEDIA_PREV},
{$FROM: $PAUSE, $TO: $MEDIA_NEXT},
]}"
Mainly this maps the modifier keys to be more Mac-like, caps lock to escape (which means I can run the Leopold’s escape key permanently in ` / ~
mode (using Fn + Q), as well as some media keys. The links in the header-comment of the script contain lists of supported pages and usages; the page is the upper 32-bit word and the usage the lower 32-bit word.
If you want to run this on login, you can use launchd
by storing a plist in ~/Library/LaunchAgents/de.maven.remap_keys.plist
for example containing
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>de.maven.remap_keys</string>
<key>ProgramArguments</key>
<array><string>/Users/maven/bin/remap.sh</string></array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Happy hacking!