こんにちは、私はmacOSだけでなく、LinuxとWindowsでもコードを書いています。しかし、macOSは他のOSのショートカットやキーが若干違います。
基本的にWindowsやLinuxのショートカットは「コントロールキー+文字キー」か「コントロールキー+シフトキー+文字キー」の組み合わせのショートカットが多いが、macOSでは、Windowsと似たような操作で多くのショートカットはコントロールキー(^)ではなくコマンドキー(⌘)を使います。
Windows/LinuxとmacOSよく交代で使うと、無意識で違うショートカットを押す人は少なくないと思います。(私はよくその問題があります)
なので、今回はmacOSのショートカットとWindows/Linuxと統一化する方法を教えます。
修飾キー
まずmacOSでは外部ソフトを導入せずに修飾キーの割り当てを変更する方法があります。
macOSで修飾キーの割り当てを変更したい場合は、システム環境設定>キーボード>就職キー
で変更できます(macOS Ventura以降だと、システム環境設定>キーボード>ショートカット>修飾キー
)。
修飾キーの割り当て設定は、キーボード毎に設定できるので、新しいキーボードに変えたらここで設定する必要があります。
私の場合は、ほとんどのmacOSのショートカットをWindows/Linuxと合わせるように、コマンドキーとコントロールキーをスワップします。しかし、普段はHHKBを使っていますので、HHKBのコントロールキーの位置に慣れてしまいました。HHKBのコントロールキーの位置は、普通のキーボードでいうとキャップスロックキーがあります。なので、HHKBはコントロールとコマンドをスワップしますが、それ以外のキーボードはキャップスロックキーをコマンドにし、コマンドをコントロールにして、コントロールはキャップロックにします。
iTerm
コード書くときやターミナルを使うときに私はiTermを使っています。macOSの一般的なショートカットは、コマンドキーを使っていますが、ターミナルの操作は普通にコントロールキーを使います。これはたまに問題が発生しますね。
よくあるシナリオでいうと、Windowsのコピーのショートカットは「コントロール+C」ですが、macOSのコピーのショートカットは「コマンド+C」です。しかし、ターミナル上では、Windows(一部のターミナルの場合)もmacOSのターミナルも「コントロール+C」はSIGINT(割り込み信号)を送信するショートカットです。コピーのショートカットと被らないように多くのターミナルアプリは「コントロール+シフト+C」をコピーにします。Windows/LinuxでコピーとSIGINTはどちらもコントロールを使いますが、macOSは別のキー組み合わせになりますので、統一化する方法があればいいのではないかと思っています。
iTermでは全てのショートカットをカスタマイズできます。コマンドキーのショートカットをコントロールキーのショートカットのような操作にする方法は、まずPreferences > Keys
のところに行きます。それで、Key Bindings
のタブの左下のところで「+」を押して、Click to Set
を押してから設定したいキーの組み合わせを押します。最後に、Action
のドロップダウンでは、Send Hex Code
にします。iTermのSend Hex Code
機能を使えばターミナルに任意のキーやキーの組み合わせを送信することができます。
送信したいHEXコードの特定する方法はKey Codesというアプリを使います。Key Codesを起動したままの状態で、送信したいキーの組み合わせ押したら、Unicode
欄の0x
から始まる数字をiTermのHex Codeにします。
以下のの例は、「コントロール+C」を送信したいので、Key Codesで「コントロール+C」を押すと、HEXコードは0x3
のことが分かりました。iTermに0x3
を入力すれば「コマンド+C」は「コントロール+C」の操作になります。
以上のように設定すると、「コマンド+C」でSIGINTを送信することができます。よく使うショートカットをこの方法で繰り返せばターミナルを使用時に違和感なく操作できます。
注意点
「コントロール+スラッシュ」(<C-_>)は0x1f
のHEXコードを使います。
iTermの修飾キーの割り当て変更機能を使わない理由
iTermで設定をしてみた人は気づくかもしれませんが、iTermはiTermのみで修飾キーの割り当てを変える方法があります。この機能を使うと簡単に全てのコマンドキーのショートカットをコントロールキーのショートカットにすることはできますが、iTerm以外のショートカットは全て問題になりますね。例えば、言語変更のショートカットのiTermを使用中のみ変わっていて、他のアプリに移ると元に戻ります。こうなるとiTermで言語変更するときに他とアプリと統一にならないです。
おまけ:外部ソフトなしで他のキー割り当て変更方法
実は、修飾キー以外でも外部ソフトなしで割り当てを変える方法があります。しかし、もうちょっと複雑になってしまいますね。
そのやり方は、ターミナル上でhidutil
というコマンドを使います。割り当てを変更したいキーは以下のコードのように、キーのHEXコードをHIDKeyboardModifierMappingSrc
に入れて、そのキーの割り当てたいキーをHIDKeyboardModifierMappingDst
に入れます。以下の例は、""キー(0x31)とバックスペース(0x2A)キーをスワップします。キーボードを指定したい場合は--matching
フラグを追加し、キーボードのモデルに該当するProductIDを引数として渡す。(私の場合は0x340
)
hidutil property --matching '{"ProductID": 0x340}' --set '{"UserKeyMapping":
[{"HIDKeyboardModifierMappingSrc":0x700000031,
"HIDKeyboardModifierMappingDst":0x70000002A},
{"HIDKeyboardModifierMappingSrc":0x70000002A,
"HIDKeyboardModifierMappingDst":0x700000031}]
}'
キーの割り当てHEXコード値はアップル公式資料のこのページから参照できます。
この方法でキー割り当てを変えると、再起動時に設定が元に戻ってしまいますので、再起動してもキー割り当てを維持する方法はログインスクリプトを使います。
ログインスクリプト化する方法は以下のようなplistファイルを作成して~/Library/LaunchAgents/com.user.loginscript.plist
として保存します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.loginscript</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/hidutil</string>
<string>property</string>
<string>--matching</string>
<string>{"ProductID":0x340}</string>
<string>--set</string>
<string>{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000031, "HIDKeyboardModifierMappingDst":0x70000002A}, {"HIDKeyboardModifierMappingSrc":0x70000002A, "HIDKeyboardModifierMappingDst":0x700000031}]}</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
以上のスクリプトを有効するため、以下のコマンドを実行します。
launchctl load ~/Library/LaunchAgents/com.user.loginscript.plist
※この方法はmacOS 10.12 (Sierra)以上が必要です。
まとめ
macOSのシステム環境設定で修飾キーの割り当てを変えて、iTermのキーマップ設定をうまく使えば、普通のアプリでもターミナルでも違和感なくmacOSでも他のOSでもよく使うショートカットを統一化できました。hidutil
でキー割り当てを変更することもファイル化することができ、自分のdotfilesレポジトリに追加するこもできました。これで、macOSをクリーンインストールしてもすぐ自分の設定を戻せるようになりますので便利と思います。iTermの設定もエクスポートとインポートができるのでそれをちゃんと保存すれば開発環境をすぐ整えるようになります。
参考リンク集
hidutilで任意のキー割り当てを変える方法
https://apple.stackexchange.com/questions/281405/easy-way-to-remap-non-modifier-keys-on-mac