Karabiner-Elementsで特定アプリの使用時のみキーバインドを変更する

2020-05-11

はじめに

みなさんは、caps lock をそのままの機能として使っていますか?
私は、使っておりません。
もともと、このキーがなんのために存在しているのかもわかっていません。
ということで、Mac 使いの私は今までそれを command に割り当てていました。
これは、OSのメニューで以下から手軽に行うことができます。

[システム環境設定]->[キーボード]->[装飾キー]

話は変わって、最近コーディングの際に Vim のキーバインドを使うようになりました。
Vim では esc をよく使用します。
この esc が遠いことがフラストレーションになっていました。
何か良い方法は無いかと考えていたところ、「現状 command に割り当てられている caps lock が、esc になれば幸せになれる!」ということに気が付きました。
とはいえ、コーディング時以外では今まで通りの command が良いのです。
つまり幸せの条件は、

条件caps lock の割り当て
特定のアプリesc
それ以外のアプリcommand

ということになります。

いろいろ調べたら、Karabiner-Elements というアプリがそんな問題を解決してくれるものだとわかりました。

Karabiner-Elementsについて

Karabiner-Elements は、Mac のキーボードをカスタマイズするアプリです。
今までそのアプリの存在自体は知っていたんですが、以前はカスタマイズするようなニーズが無く使用していませんでした。
今回、以下の機能に魅力を感じ使ってみることにしました。

  • キーの変更ができる
  • 変更の条件を細かく指定できる

ちなみに、このアプリ単に変更するだけなら以下のように簡単にできます。

Simple Modificationsの説明ページ

これで足りない場合は、自分で定義ファイルを用意しアプリに読み込ませ使用します。
今回はこの定義ファイルを使用した方法を紹介します。

手順

以下の手順に従って進めていきます。

  1. Karabiner-Elementsのインストール
  2. 定義ファイルの作成
  3. ファイルの配置と設定

バージョン情報

本記事公開時のそれぞれのバージョンは以下です。

ソフトウェアバージョン
macOS Catalina10.15.4
Karabiner-Elements12.9.0

Karabiner-Elementsのインストール

アプリケーションは以下からダウンロードします。

Karabiner-Elementsのトップページ

インストールは公式サイトの以下を参考にしてください。
画面キャプチャも豊富でわかりやすいです。

Karabiner-Elementのインストール方法

定義ファイルの作成

定義ファイルを作成します。
jsonファイルとして作成したら、名前はなんでも構いません。
仮に以下のようにしておきます。

change_caps_lock_to_x.json

定義の記述

以下で示されているように記述していきます。

カスタムjsonファイルの構造

おおまかな構造は以下になっています。

{
    "title": "ここがメニューに表示されます。"
    "rules": [
        {
            "description": "上記titleの子要素として表示され、この単位でカスタマイズの有効化が可能になります。",
            "manipulators": [
              ...
            ]
        },
        {
            "description": "...",
            "manipulators": [
                ...
            ]
        },
        ...
    ]
}

上記ではルールが2個の場合です。
今回は1個のルールで記述します。

マニピュレータの定義

実際のキー変更の定義になります。
以下のような構造になっています。

マニピュレータの定義

今回の設定に必要な部分は以下です。

"manipulators": [
    {
        "type": "basic",
        "from": {...},
        "to": [...],
        "conditions": [...],
        "description": "自分用メモとして使用できます。"
    },
    ...
]

それぞれの意味は以下のようになっています。

設定項目意味備考
type"basic"ここは固定です。
from変更したいキー同時にインストールされるEventViewerで調べたりします。
to変更後のキー同時にインストールされるEventViewerで調べたりします。
conditions変更のための条件今回ではアプリの指定に使用します。
description説明書きどんな変更か後で思い出せるように記述

特定のアプリのときに発動する条件の書き方

変更のための条件についての記述ですが、以下では「IntelliJVisualStudioCode のアプリを使用しているとき」という条件になります。

"conditions": [
  {
    "type": "frontmost_application_if",
    "bundle_identifiers": [
      "^com\\.jetbrains\\.intellij$",
      "^com\\.microsoft\\.VSCode$"
    ]
  }
],

bundle_identifiersは、Karabiner-Elementsに付属のEventViewerで調べます。
詳しくは以下に記載があります。

conditionsの記述方法

条件の記述

これで、材料は揃いました。
どのような動作にさせたいかをもう一度確認します。

条件caps lock の割り当て
特定のアプリesc
それ以外のアプリcommand

特定のアプリは以下としておきます。

  • IntelliJ IDEA
  • Visual Studio Code

特定のアプリでの記述

特定のアプリの場合は以下のようになりました。

{
  "type": "basic",
  "from": {
    "key_code": "caps_lock"
  },
  "to": [
    {
      "key_code": "escape"    }
  ],
  "conditions": [
    {
      "type": "frontmost_application_if",      "bundle_identifiers": [
        "^com\\.jetbrains\\.intellij$",
        "^com\\.microsoft\\.VSCode$"
      ]
    }
  ],
  "description": "caps_lock to escape if intellij"
}

特定のアプリ以外での定義

それ以外の場合の定義は以下のようになりました。

{
  "type": "basic",
  "from": {
    "key_code": "caps_lock"
  },
  "to": [
    {
      "key_code": "left_command"    }
  ],
  "conditions": [
    {
      "type": "frontmost_application_unless",      "bundle_identifiers": [
        "^com\\.jetbrains\\.intellij$",
        "^com\\.microsoft\\.VSCode$"
      ]
    }
  ],
  "description": "caps_lock to left_command unless intellij"
},

全体の記述

全体的には以下のような記述になりました。

{
  "title": "change caps_lock to X",
  "rules": [
    {
      "description": "escape or command",
      "manipulators":
      [
        {
          "type": "basic",
          "from": {
            "key_code": "caps_lock"
          },
          "to": [
            {
              "key_code": "left_command"
            }
          ],
          "conditions": [
            {
              "type": "frontmost_application_unless",
              "bundle_identifiers": [
                "^com\\.jetbrains\\.intellij$",
                "^com\\.microsoft\\.VSCode$"
              ]
            }
          ],
          "description": "caps_lock to left_command unless intellij"
        },
        {
          "type": "basic",
          "from": {
            "key_code": "caps_lock"
          },
          "to": [
            {
              "key_code": "escape"
            }
          ],
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "^com\\.jetbrains\\.intellij$",
                "^com\\.microsoft\\.VSCode$"
              ]
            }
          ],
          "description": "caps_lock to escape if intellij"

        }
      ]
    }
  ]
}

ファイルの配置と設定

作成したファイルを以下の場所に配置します。

~/.config/karabiner/assets/complex_modifications/change_caps_lock_to_x.json

ファイルの配置が終わったら、念のため Karabiner-Elements を一度再起動します。
起動したらアプリケーションから設定を行います。

設定方法の流れは以下に記述があります。

Use more complex rules

まずは、Step1から Add Rule のボタンを押下します。

Step1

ルールのインポートは行わないので、Step2とStep3は省略し、Step4を行います。
ここで作成したルールを見つけてください。

Step4

作成したルールが表示されていない場合は、定義ファイルの記述に問題がある可能性があります。
記述を確認してください。
表示されている場合は、目的のルールの Enable ボタンを押下して終了です。
これで目的の動作になっているはずです。

おわりに

Karabiner-Elementsを今回始めて使いましたが、カスタマイズ項目の多さに驚きました。
さすが老舗のアプリですね。
今回は機能のごく一部しか触りませんでしたが、他にもいろいろ便利そうなカスタマイズ項目がありました。

なにはともあれ、とりあえずは目的は達成できて左手の小指が楽になりました。
よりコーディングが捗ります。