$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

Karabinar-Elementsを使って特定のアプリケーションの時だけキーを入れ替える

IntelliJ IDEAを使っていて、バックスラッシュを入力したいのに円マークになって困っていた。また対応方法として、

あたりの記事も参考にしてみたが、これを有効にすると他のアプリケーションにまで波及してしまって、今度はEmacsでバックスラッシュが入力できなくなったりして困っていた*1


そんな時Karabinar-Elementsは特定のアプリケーションを起動時だけキーマップを変えられるという機能があることを発見した。これを使って解決してみたのでメモ。

Karabinar-Elements用のComplex Modifications用のjsonファイルを作成する

Karabinar-ElementsのComplex Modificationsを設定するには、定義を書いたjsonファイルを作成し、~/.config/karabiner/assets/complex_modifications/以下に配置すると良い。どのようにjsonファイルを書くかについてはkarabiner.json Reference Manual - Karabiner - Software for macOS が参考になる。また、https://github.com/pqrs-org/KE-complex_modifications/tree/master/docs/json あたりを参考にすると、いろんな参考例を探せて便利だった。

このjsonの設定でconditionsのfrontmost_application_ifという機能を利用することで、特定アプリケーションのときのみの変換ルールなどを書くことが出来る。

今回の場合IntelliJ IDEAでのみ円マークとバックスラッシュの入力を交換したかったので以下のような設定となった。


~/.config/karabiner/assets/complex_modifications/intellij-yen-mark.json

{
  "title": "Swap ¥ and \\ in IntelliJ IDEA on JIS Keyboards",
  "rules": [
    {
      "description": "Change ¥ to Alt+¥ in IntelliJ IDEA",
      "manipulators": [
        {
          "from": {
            "key_code": "international3"
          },
          "to": [
            {
              "key_code": "international3",
              "modifiers": [
                "option"
              ]
            }
          ],
          "type": "basic",
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "^com\\.jetbrains\\.intellij\\.ce$"
              ]
            }
          ]
        }
      ]
    },
    {
      "description": "Change Alt+¥ to ¥ in IntelliJ IDEA",
      "manipulators": [
        {
          "from": {
            "key_code": "international3",
            "modifiers": {
              "mandatory": [
                "option"
              ]
            }
          },
          "to": [
            {
              "key_code": "international3"
            }
          ],
          "type": "basic",
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "^com\\.jetbrains\\.intellij\\.ce$"
              ]
            }
          ]
        }
      ]
    }
  ]
}

Karabinar-Elementsで設定を有効にする

このようなjsonを正しく配置するとKarabinar-ElementsのComplex ModificationsのAdd rule内で定義したルールを使うことが出来るようになる。

f:id:shiba_yu36:20181212170147p:plain

あとはこの二つのルールをenableすればOK。これでIntelliJ IDEAでのみ円マークとバックスラッシュマークを入れ替えることが出来た。

より良い解決方法

やってみた後で気づいたのだけど、

  • 円マークとバックスラッシュの入れ替えはIME側で設定があり、それが有効になっていた
  • IntelliJ IDEAなどJetbrainのIDEでは、その設定が効かない

という話だったので、IME側の設定をオフにしKarabinarで全体を入れ替えで良いだけだった。まあKarabinar-Elementsで特定アプリケーションのみのキーバインド変更というテクニックが身についたので良いとする。

技術的Tips: 利用しているアプリケーションのBundle Identifierを調べるには

【OSX】利用しているアプリケーションのBundle Identifierを調べる - Qiita が参考になった。

まとめ

今回はKarabinar-Elementsを使って特定のアプリケーションの時だけキーを入れ替える方法についてメモをしてみた。最近のKarabinar-Elementsには他にもいろいろなカスタマイズ方法があるみたいなので試してみたい。

*1:いろいろ試した後になぜそうなっていたか気づき、より良い解決策はわかったけどその時は気づいてなかった