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!
Thanks, this looks like just what I need! Did you leave the FC660C dip switches in their default position?
I cannot check at the moment (working from home and keyboard at work) but I think I left them on the defaults.
Hi there! Thanks for the walkthrough!
I’m wondering, I want to remap my Leopold FC750R but have it a bit different from yours. Where could I find a list of all available functions, like the ones below?
{$FROM: $PRINT_SCREEN, $TO: $MEDIA_EJECT}
Specifically I’m interested in adding a volume up and volume down.
Also, does pressing media_play a second time pause the media?
Thank you!
The “functions” are the USB key and page identifiers, some of which are linked at the top of the script. Without having tried it, I’d look into the IOHIDUsageTables.h at the kHIDUsage_Csmr_VolumeIncrement / -Decrement values, so that instead of “0xC000000B0” for play / pause, you could try “0xC000000E9” and “0xC000000EA” to see whether that works.
Thank you! Do you have any recommendations on where to get topre-compatible keycaps for the mac command key?
I haven’t seen any Topre keycaps that include Mac command keys (but I also haven’t looked too hard). But in general, they seem rare enough as it is.