Macの修飾キーをコマンドラインから変更する

今までMacは英字の内蔵キーボードを使っていてcaps lockをcontrolへ、controlをcaps lockへ割り当ててた。
新しいMacを手に入れたので、このあたりの設定を見直した。

動作確認環境

Mac OSX 10.13.6

今まではどう設定していたのか?

  1. アップルメニュー > 「システム環境設定」を選択して、「キーボード」をクリックして「キーボード」タブを選択します。
  2. 「修飾キー」をクリックし、各修飾キーのポップアップメニューをクリックして変更していきます。

f:id:hatappi1225:20181129211527p:plain

ただふと思うわけです。
コマンドラインから設定したいな」

defaults コマンド

Macには defaults という「plist」と呼ばれるアプリやシステムの設定ファイルに、設定値を変更したりできるコマンドがある。
これを使うことで修飾キーを変更できるっぽい。

そのためにはデバイスを特定する必要がある。
IDの特定にはioregを使う。

vid=$(ioreg -r -n 'Apple Internal Keyboard / Trackpad' | grep -E 'idVendor' | awk '{ print $4 }')
pid=$(ioreg -r -n 'Apple Internal Keyboard / Trackpad' | grep -E 'idProduct' | awk '{ print $4 }')
keyboard_id=${vid}-${pid}-0
echo ${keyboard_id}
# 1111-222-0

ここで例として出力した1111-222-0が内蔵キーボードを識別するものになる。

後は次のコマンドを実行してcaps lock => control, control => caps lockへ割当を行う。

$ defaults -currentHost write -g com.apple.keyboard.modifiermapping.${keyboard_id} -array-add '
<dict>
  <key>HIDKeyboardModifierMappingDst</key>
  <integer>30064771300</integer>
  <key>HIDKeyboardModifierMappingSrc</key>
  <integer>30064771129</integer>
</dict>
'

$ defaults -currentHost write -g com.apple.keyboard.modifiermapping.${keyboard_id} -array-add '
<dict>
  <key>HIDKeyboardModifierMappingDst</key>
  <integer>30064771129</integer>
  <key>HIDKeyboardModifierMappingSrc</key>
  <integer>30064771296</integer>
</dict>
'

$ defaults -currentHost write -g com.apple.keyboard.modifiermapping.${keyboard_id} -array-add '
<dict>
  <key>HIDKeyboardModifierMappingDst</key>
  <integer>30064771129</integer>
  <key>HIDKeyboardModifierMappingSrc</key>
  <integer>30064771300</integer>
</dict>
'

設定された内容の確認は次のコマンドでおこなう。

$ defaults -currentHost read -g com.apple.keyboard.modifiermapping.${keyboard_id}
(
        {
        HIDKeyboardModifierMappingDst = 30064771300;
        HIDKeyboardModifierMappingSrc = 30064771129;
    },
        {
        HIDKeyboardModifierMappingDst = 30064771129;
        HIDKeyboardModifierMappingSrc = 30064771296;
    },
        {
        HIDKeyboardModifierMappingDst = 30064771129;
        HIDKeyboardModifierMappingSrc = 30064771300;
    }
)

ただシステムの環境設定と違い設定を反映させるには再起動が必要???でした。