Karabiner-Elementsを使って特定のアプリでショートカットキーを上書きする

# はじめに

Karabiner-Elementsのcomplex modificationsを使うと、特定のアプリでのみ有効になるショートカットキーを定義することができる。

ここではMS officeのショートカットキーを上書きする。
というのも、MS officeはいわゆるemacsキーバインドで使うキーにショートカットが割り当てられているのだが、emacsキーバインドに慣れていると`ctrl+n`,`ctrl+f`,`ctrl+h`などのキーを押した時に、新しい書類が作られたり、検索画面が出てきたり、ヘルプが出てきたりして、ストレスが尋常じゃない。

これを通常のemacsキーバインドに戻して、普通のmacアプリのような使い勝手を実現する。

# 手順

## 手順1: キーリマップを定義したJSONファイルの準備

以下のようなjsonファイルを`~/.config/karabiner/assets/complex_modifications`ディレクトリに配置する

```json:emacs_in_msapps.json
{
  "title": "emacs keybind in MS apps",
  "rules":
  [
    {
      "description": "emacs keybind in skype & office",
      "manipulators": [
        {
          "conditions": [
            {
              "bundle_identifiers": [
                "^com\\.skype\\.skype$",
                "^com\\.microsoft\\."
              ],
              "type": "frontmost_application_if"
            }
          ],
          "from": {
            "key_code": "h",
            "modifiers": {
              "mandatory": [
                "control"
              ]
            }
          },
          "to": [
            {
              "key_code": "delete_or_backspace"
            }
          ],
          "type": "basic"
        },
        {
          "conditions": [
            {
              "bundle_identifiers": [
                "^com\\.microsoft\\."
              ],
              "type": "frontmost_application_if"
            }
          ],
          "from": {
            "key_code": "d",
            "modifiers": {
              "mandatory": [
                "control"
              ]
            }
          },
          "to": [
            {
              "key_code": "delete_forward"
            }
          ],
          "type": "basic"
        },
        {
          "conditions": [
            {
              "bundle_identifiers": [
                "^com\\.microsoft\\."
              ],
              "type": "frontmost_application_if"
            }
          ],
          "from": {
            "key_code": "f",
            "modifiers": {
              "mandatory": [
                "control"
              ]
            }
          },
          "to": [
            {
              "key_code": "right_arrow"
            }
          ],
          "type": "basic"
        },
        {
          "conditions": [
            {
              "bundle_identifiers": [
                "^com\\.microsoft\\."
              ],
              "type": "frontmost_application_if"
            }
          ],
          "from": {
            "key_code": "b",
            "modifiers": {
              "mandatory": [
                "control"
              ]
            }
          },
          "to": [
            {
              "key_code": "left_arrow"
            }
          ],
          "type": "basic"
        },
        {
          "conditions": [
            {
              "bundle_identifiers": [
                "^com\\.microsoft\\."
              ],
              "type": "frontmost_application_if"
            }
          ],
          "from": {
            "key_code": "p",
            "modifiers": {
              "mandatory": [
                "control"
              ]
            }
          },
          "to": [
            {
              "key_code": "up_arrow"
            }
          ],
          "type": "basic"
        },
        {
          "conditions": [
            {
              "bundle_identifiers": [
                "^com\\.microsoft\\."
              ],
              "type": "frontmost_application_if"
            }
          ],
          "from": {
            "key_code": "n",
            "modifiers": {
              "mandatory": [
                "control"
              ]
            }
          },
          "to": [
            {
              "key_code": "down_arrow"
            }
          ],
          "type": "basic"
        },
        {
          "conditions": [
            {
              "bundle_identifiers": [
                "^com\\.microsoft\\."
              ],
              "type": "frontmost_application_if"
            }
          ],
          "from": {
            "key_code": "e",
            "modifiers": {
              "mandatory": [
                "control"
              ]
            }
          },
          "to": [
            {
              "key_code": "end"
            }
          ],
          "type": "basic"
        },
        {
          "conditions": [
            {
              "bundle_identifiers": [
                "^com\\.microsoft\\."
              ],
              "type": "frontmost_application_if"
            }
          ],
          "from": {
            "key_code": "a",
            "modifiers": {
              "mandatory": [
                "control"
              ]
            }
          },
          "to": [
            {
              "key_code": "home"
            }
          ],
          "type": "basic"
        }
      ]
    }
  ]
}
```

ここでポイントとなるのは以下のキーのリマップの条件が有効になる条件を定義した部分。
特定のアプリが最前面に出てきている時だけ有効化している。

```json
"conditions": [
            {
              "bundle_identifiers": [
                "^com\\.microsoft\\."
              ],
              "type": "frontmost_application_if"
            }
          ]
```

アプリ名を調べるには、Karabiner-EventViewerを起動して"Frontmost application"という画面のログをみる。
実際にそのアプリを全面に出すと、その時のログが残る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28792/b43d0ee4-8d47-b5a5-3e6e-399d3026d222.png)


## 手順2: Karabiner-Elementsで有効にする

JSONで定義を書いたら、そのキーリマップを有効にする。
[こちら](https://qiita.com/yohm/items/d7a15b26ba2cb41f9af5)と全く同じ手順でできる。

# 参考
- [Karabiner-Elementsを使ってセミコロンエンターを実現する](https://qiita.com/yohm/items/d7a15b26ba2cb41f9af5)
- [公式ドキュメント](https://pqrs.org/osx/karabiner/json.html)
- [Karabiner-Elementsの設定項目をまとめました](https://qiita.com/s-show/items/a1fd228b04801477729c)