en
3/13/2023
macOSとLinux/Windowsのよく使うショートカット統一化してみた
Tags:

こんにちは、私は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機能を使えばターミナルに任意のキーやキーの組み合わせを送信することができます。

iTermでHEXコードを送信する設定

送信したいHEXコードの特定する方法はKey Codesというアプリを使います。Key Codesを起動したままの状態で、送信したいキーの組み合わせ押したら、Unicode欄の0xから始まる数字をiTermのHex Codeにします。

以下のの例は、「コントロール+C」を送信したいので、Key Codesで「コントロール+C」を押すと、HEXコードは0x3のことが分かりました。iTermに0x3を入力すれば「コマンド+C」は「コントロール+C」の操作になります。

iTermのHEXコードの決め方

以上のように設定すると、「コマンド+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

キーのHEXコード一覧
https://developer.apple.com/library/archive/technotes/tn2450/_index.html#//apple_ref/doc/uid/DTS40017618-CH1-KEY_TABLE_USAGES

Made with by Naborisk