karabiner-elements でアプリケーションを切り替えるホットキーを実現する

macでは`cmd + tab`でアプリを切り替える人が多いと思うが、特定のアプリを開きたい時にはホットキーを設定しておくと便利。
`cmd + tab`では「アプリの並びをみる」「tabを複数回押して開きたいアプリ」を選ぶという２段階の作業が必要になる。
しかも、アプリを開いている順番によって何回`tab`を押せばいいかが変わってくる。結構めんどい。

![Screen Shot 2019-10-10 at 13.28.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28792/174e2fae-74ba-808e-48f8-6b8583b94ddb.png)

ホットキーを設定しておくと、別のアプリに切り替えたいときに特定のホットキーを押すだけでそのアプリに切り替えることができる。
現在の状態に依存しないので、早く切り替えられるし脳の負荷も減る。

Karabiner-Elementsでhotkeyを設定するにはcomplex modificationsを定義する。

以下のようなjsonファイルを作り `~/.config/karabiner/assets/complex_modifications` 以下に配置する。
私の例では、

- ctrl + 3 : Slack
- ctrl + 4 : Dictionary
- ctrl + 5 : MacVim
- ctrl + 6 : iTerm
- ctrl + 7 : Preview
- ctrl + 8 : Mail
- ctrl + 9 : Google Chrome
- ctrl + 0 : Inkdrop

というように割り当てている。

```json:hotkeys_switch_app.json
{
  "title": "hotkeys to switch app",
  "rules":
  [
    {
      "description": "ctrl-3 to Slack",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "3",
            "modifiers": {
              "mandatory": [
                "control"
              ]
            }
          },
          "to": [
            {
              "shell_command": "open -a 'Slack'"
            }
          ]
        }
      ]
    },
    {
      "description": "ctrl-4 to Dictionary",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "4",
            "modifiers": {
              "mandatory": [
                "control"
              ]
            }
          },
          "to": [
            {
              "shell_command": "open -a 'Dictionary'"
            }
          ]
        }
      ]
    },
    {
      "description": "ctrl-5 to MacVim",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "5",
            "modifiers": {
              "mandatory": [
                "control"
              ]
            }
          },
          "to": [
            {
              "shell_command": "open -a 'MacVim'"
            }
          ]
        }
      ]
    },
    {
      "description": "ctrl-6 to iTerm2",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "6",
            "modifiers": {
              "mandatory": [
                "control"
              ]
            }
          },
          "to": [
            {
              "shell_command": "open -a 'iTerm'"
            }
          ]
        }
      ]
    },
    {
      "description": "ctrl-7 to Preview",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "7",
            "modifiers": {
              "mandatory": [
                "control"
              ]
            }
          },
          "to": [
            {
              "shell_command": "open -a 'Preview'"
            }
          ]
        }
      ]
    },
    {
      "description": "ctrl-8 to mail",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "8",
            "modifiers": {
              "mandatory": [
                "control"
              ]
            }
          },
          "to": [
            {
              "shell_command": "open -a Mail"
            }
          ]
        }
      ]
    },
    {
      "description": "ctrl-9 to chrome",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "9",
            "modifiers": {
              "mandatory": [
                "control"
              ]
            }
          },
          "to": [
            {
              "shell_command": "open -a 'Google Chrome'"
            }
          ]
        }
      ]
    },
    {
      "description": "ctrl-0 to inkrop",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "0",
            "modifiers": {
              "mandatory": [
                "control"
              ]
            }
          },
          "to": [
            {
              "shell_command": "open -a 'Inkdrop'"
            }
          ]
        }
      ]
    }
  ]
}
```

このようなjsonファイルを配置した後で、Karabiner-Elementsのcomplex modificationsで設定を有効にすればOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28792/fa71179a-a96a-b7f7-dcb2-c8f8de6acf89.png)

以後、どのアプリにいても"ctrl+数字"のホットキーを押せばアプリを切り替えられる。

## (追記)ホットキーを押した時に表に表示するアプリを複数の候補から選ぶ

Ctrl-5を押した時に、

- MacVimが起動していたらMacVimを表示
- Clionが起動していたらClionを表示
- RubyMineが起動していたらRubymineを表示

というように挙動を切り替える。`ps`コマンドでプロセス一覧を取ってきて判定している。

```json
   {
      "description": "ctrl-5 to MacVim or clion or rubymine",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "5",
            "modifiers": {
              "mandatory": [
                "control"
              ]
            }
          },
          "to": [
            {
              "shell_command": "ps ux | grep -o -e '[M]acVim' -e '[c]lion' -e '[r]ubymine' | head -1 | xargs open -a"
            }
          ]
        }
      ]
    },
```

## 参考

- https://pqrs.org/osx/karabiner/json.html
- https://qiita.com/yohm/items/de35f3874fd0e679ccdf
- https://qiita.com/yohm/items/d7a15b26ba2cb41f9af5