Karabiner-Elements：キーボードのアローキーをマウスにしてみた

#はじめに
Karabiner時代にキーボードをマウスにして喜んでいたのですが、macOSをHigh Sierraにして使えなくなって絶望しました。
しかし、最近Karabiner-ElementsのComplex Modificationsが熱いというのを耳にして調べてみると、なんだかマウスが実装できそう!

ということで、オリジナルJsonファイル作ってみました。

#機能
- アローキーでポインタを操作
- スラッシュで左クリック
- シフトキーで右クリック
- Mキー長押しでマウス機能のON/OFFトグル

こんな感じです。

#ソースコード
```json:
{
    "title": "Key-Mouse Rules",
    "rules": [
        {
            "description": "Use mouse pointing by ←↑→↓",
            "manipulators": [
                {
                    "conditions": [ { "name": "key_mouse_state", "type": "variable_if", "value": 0 } ],
                    "description": "turn on Key-Mouse",
                    "from": { "key_code": "m", "modifiers": { "optional": ["any"] } },
                    "parameters": {
                        "basic.to_if_alone_timeout_milliseconds": 250,
                        "basic.to_if_held_down_threshold_milliseconds": 250
                    },
                    "to_if_alone": [ { "key_code": "m" } ],
                    "to_if_held_down": [ { "set_variable": { "name": "key_mouse_state", "value": 1 } } ],
                    "type": "basic"
                },
                {
                    "conditions": [ { "name": "key_mouse_state", "type": "variable_if", "value": 1 } ],
                    "description": "turn off Key-Mouse",
                    "from": { "key_code": "m", "modifiers": { "optional": ["any"] } },
                    "parameters": {
                        "basic.to_if_alone_timeout_milliseconds": 250,
                        "basic.to_if_held_down_threshold_milliseconds": 250
                    },
                    "to_if_alone": [ { "key_code": "m" } ],
                    "to_if_held_down": [ { "set_variable": { "name": "key_mouse_state", "value": 0 } } ],
                    "type": "basic"
                },
                {
                    "conditions": [ { "name": "key_mouse_state", "type": "variable_if", "value": 1 } ],
                    "description": "/ -> left click",
                    "from": { "key_code": "slash" },
                    "to": [ { "pointing_button": "button1" } ],
                    "type": "basic"
                },
                {
                    "conditions": [ { "name": "key_mouse_state", "type": "variable_if", "value": 1 } ],
                    "description": "right shift -> right click",
                    "from": { "key_code": "right_shift" },
                    "to": [ { "pointing_button": "button2" } ],
                    "type": "basic"
                },
                {
                    "conditions": [ { "name": "key_mouse_state", "type": "variable_if", "value": 1 } ],
                    "description": "← -> mouse left",
                    "from": { "key_code": "left_arrow" },
                    "parameters": {
                        "basic.to_if_held_down_threshold_milliseconds": 800
                    },
                    "to": [ { "mouse_key": { "x": -1000 } } ],
                    "to_if_held_down": [ { "mouse_key": { "x": -2000 } } ],
                    "type": "basic"
                },
                {
                    "conditions": [ { "name": "key_mouse_state", "type": "variable_if", "value": 1 } ],
                    "description": "↑ -> mouse up",
                    "from": { "key_code": "up_arrow" },
                    "parameters": {
                        "basic.to_if_held_down_threshold_milliseconds": 800
                    },
                    "to": [ { "mouse_key": { "y": -1000 } } ],
                    "to_if_held_down": [ { "mouse_key": { "y": -2000 } } ],
                    "type": "basic"
                },
                {
                    "conditions": [ { "name": "key_mouse_state", "type": "variable_if", "value": 1 } ],
                    "description": "→ -> mouse right",
                    "from": { "key_code": "right_arrow" },
                    "parameters": {
                        "basic.to_if_held_down_threshold_milliseconds": 800
                    },
                    "to": [ { "mouse_key": { "x": 1000 } } ],
                    "to_if_held_down": [ { "mouse_key": { "x": 2000 } } ],
                    "type": "basic"
                },
                {
                    "conditions": [ { "name": "key_mouse_state", "type": "variable_if", "value": 1 } ],
                    "description": "↓ -> mouse down",
                    "from": { "key_code": "down_arrow" },
                    "parameters": {
                        "basic.to_if_held_down_threshold_milliseconds": 800
                    },
                    "to": [ { "mouse_key": { "y": 1000 } } ],
                    "to_if_held_down": [ { "mouse_key": { "y": 2000 } } ],
                    "type": "basic"
                }
            ]
        }
    ]
}
```
スクロールはmacに元からあるスペースキーのやつでできるので省きました。

#苦労
~~任意のキーを長押しで機能のトグルを行いたかったのですが、できませんでした。いい方法ありませんかね。~~←いい方法を教えていただきました。

#余談
インデントを弓括弧`{`や角括弧`[`のたびにしないと、Karabinerに読み込まれないようです。なぜなんでしょう．

#おわりに
Karabiner-Elements素晴らしいですね。開発陣あっぱれです。
これからも素敵なKarabinerライフを送りたいです。