Karabiner-Elementsでcaps lockをescape, control, 矢印キーに変換する

[ブログ](https://aoirohn.hatenablog.com/)からの転載です

# 背景
USキーボードのMacBook ProのTouch Barモデルを使っているのですが、escキーが無いので、caps_lock単体を押したときはesc、他のキーと組み合わせたときはcontrolになるようにしていました

これでそこそこ満足していたのですが、それに加えてcaps_lock + hjklキーでカーソル移動がしたくなったので設定を作りました

# Karabiner-elementsの設定

以下の設定を`~/.config/karabiner/karabiner.json`の`complex_modifications`に記述します


caps_lockを単体で押したときはescキー。 hjklと組み合わせた場合は矢印キーに、その他のキーと押したときはcontrolになります

```json
{
    "description": "caps lockを単体で押したときに、escキーを送信する。 hjklと組み合わせた場合は矢印キーに、その他のキーと押したときはcontrolにする。",
    "manipulators": [
        {
            "conditions": [
                {
                    "name": "caps_lock pressed",
                    "type": "variable_if",
                    "value": 1
                }
            ],
            "from": {
                "key_code": "h",
                "modifiers": {
                    "mandatory": [
                        "left_control"
                    ],
                    "optional": [
                        "any"
                    ]
                }
            },
            "to": [
                {
                    "key_code": "left_arrow"
                }
            ],
            "type": "basic"
        },
        {
            "conditions": [
                {
                    "name": "caps_lock pressed",
                    "type": "variable_if",
                    "value": 1
                }
            ],
            "from": {
                "key_code": "j",
                "modifiers": {
                    "mandatory": [
                        "left_control"
                    ],
                    "optional": [
                        "any"
                    ]
                }
            },
            "to": [
                {
                    "key_code": "down_arrow"
                }
            ],
            "type": "basic"
        },
        {
            "conditions": [
                {
                    "name": "caps_lock pressed",
                    "type": "variable_if",
                    "value": 1
                }
            ],
            "from": {
                "key_code": "k",
                "modifiers": {
                    "mandatory": [
                        "left_control"
                    ],
                    "optional": [
                        "any"
                    ]
                }
            },
            "to": [
                {
                    "key_code": "up_arrow"
                }
            ],
            "type": "basic"
        },
        {
            "conditions": [
                {
                    "name": "caps_lock pressed",
                    "type": "variable_if",
                    "value": 1
                }
            ],
            "from": {
                "key_code": "l",
                "modifiers": {
                    "mandatory": [
                        "left_control"
                    ],
                    "optional": [
                        "any"
                    ]
                }
            },
            "to": [
                {
                    "key_code": "right_arrow"
                }
            ],
            "type": "basic"
        },
        {
            "from": {
                "key_code": "caps_lock",
                "modifiers": {
                    "optional": [
                        "any"
                    ]
                }
            },
            "to": [
                {
                    "set_variable": {
                        "name": "caps_lock pressed",
                        "value": 1
                    }
                },
                {
                    "key_code": "left_control",
                    "lazy": true
                }
            ],
            "to_after_key_up": [
                {
                    "set_variable": {
                        "name": "caps_lock pressed",
                        "value": 0
                    }
                }
            ],
            "to_if_alone": [
                {
                    "key_code": "escape"
                }
            ],
            "type": "basic"
        }
    ]
}
```

とりあえずcaps lockが押されたら`caps_lock pressed`の変数を1にして、それ見て条件分岐するようにしました。
もっといい方法があれば教えてください

# 矢印キーへの変換がいらない人向け

caps lockを単体で押したときはescキーとして使い、他のキーと押したときはcontrolにしたいだけの場合は下のようにすれば十分です

```json
{
    "description": "caps lockを単体で押したときに、escキーを送信する。 他のキーと押したときはcontrolにする。",
    "manipulators": [
        {
            "from": {
                "key_code": "caps_lock",
                "modifiers": {
                    "optional": [
                        "any"
                    ]
                }
            },
            "to": [
                {
                    "key_code": "left_control",
                    "lazy": true
                }
            ],
            "to_if_alone": [
                {
                    "key_code": "escape"
                }
            ],
            "type": "basic"
        }
    ]
}
```

# 参考

[Karabiner-Elementsの設定項目をまとめました](https://qiita.com/s-show/items/a1fd228b04801477729c)
https://pqrs.org/osx/karabiner/complex_modifications/