Sierra の標準機能でキーリマップする

  • 14
    いいね
  • 1
    コメント

Technical Note TN2450: Remapping Keys in macOS 10.12 Sierra)
https://developer.apple.com/library/content/technotes/tn2450/

Sierra といえば Karabiner が使えず、キーカスタマイザにとっては鬼門のアップデートでしたが、標準でこんな機能が用意されていました。

要点をまとめると、

  • 1 キー対 1 キーの単純なリマップ
  • システム終了すると設定がリセットされる (つまり起動時に毎回設定が必要)
  • 設定に管理者権限は必要ない
  • デバイスごとに設定可能
  • PC キーボード固有のキー(変換、無変換など)にも設定可能

といったところです。デバイスごとの設定について上記 Technical Note には何も書かれていませんが、hidutil の仕様により、

hidutil property --filter '{"ProductID":0x4545,"VendorID":0x4d9,}' --set '...'

というような形式で書くことができます。

PC 固有のキーは一覧には載っていませんが、リンクされている pdf には記載されていてちゃんと使えます。

それ Hammerspoon でやろうぜ

一旦設定を煮詰めてしまえば実行するだけですが、引数は冗長だしキー定義が独自1でかなり書きづらいです。 Hammerspoon を使っているならば実行のタイミングを任せられるし、Lua で組み立てることができるので都合が良いのではないかと configuration を書きました。

foundation_remapping
https://github.com/hetima/hammerspoon-foundation_remapping

これを利用すれば、init.lua に、

local FRemap = require('foundation_remapping')
local remapper = FRemap.new({vendorID=0x4d9, productID=0x4545})
remapper:remap('Muhenkan', 0x66):remap('Henkan', 'f18')
remapper:remap('PCKana', 'rcmd')
remapper:remap('lalt', 'lcmd'):remap('lcmd', 'lalt')
remapper:remap('Application', 'escape')
remapper:register()

と、簡便に書けます。普段使っている方の keyCode やラベルで設定できます。上記の設定で、

/usr/bin/hidutil property \
 --filter '{"ProductID":17733,"VendorID":1241,}' \
 --set '{"UserKeyMapping":[ \
 {"HIDKeyboardModifierMappingSrc":30064771211,"HIDKeyboardModifierMappingDst":30064771217}, \
 {"HIDKeyboardModifierMappingSrc":30064771210,"HIDKeyboardModifierMappingDst":30064771181}, \
 {"HIDKeyboardModifierMappingSrc":30064771208,"HIDKeyboardModifierMappingDst":30064771303}, \
 {"HIDKeyboardModifierMappingSrc":30064771298,"HIDKeyboardModifierMappingDst":30064771299}, \
 {"HIDKeyboardModifierMappingSrc":30064771299,"HIDKeyboardModifierMappingDst":30064771298}, \
 {"HIDKeyboardModifierMappingSrc":30064771173,"HIDKeyboardModifierMappingDst":30064771113}, \
 ]}'

というコマンドを実行します。

以上、半分は Hammerspoon と自作スクリプトの宣伝でした。


  1. Cosmo_USB2ADB.c に定義されていました。ADB 由来の値でしょうか 普段使ってる方が ADB 由来のようですね