Karabiner-Elementsを使ってキーの２連打に処理を割り当てる方法


# 前書き

Karabiner-Elementsを使って、キーの２連打に処理を割り当てる設定方法を作成しました。
これまで、BetterTouchToolを使ってキーの２連打に処理を割り当てていましたが、複数のソフトでMacのカスタマイズを行うと管理が面倒でした。私の環境では、Karabiner-Elementsでキー２連打を設定できれば、キーボードのカスタマイズをKarabiner-Elementsに一本化できるため、この設定を作成しました。
本記事では、以下の2つの設定方法を紹介します。これを見れば、応用は十分可能だと思います。

1. 左controlキーを２回連続で押すとSafariが立ち上がる
1. Windowsのキーボードユーティリティーソフトの「秀Caps」にある「テンキー上のピリオド２回でコンマ入力」を実現

それぞれの実装方法は次のとおりです。

## 左controlキーを２回連続で押すとSafariが立ち上がる

実装方法としては、以下の点に注意して実装しました。

1. １回目の左controlタイプ時に、`set_variable`を使って`left_control_key`変数にフラグを立てる
1. 1.の変数の処理の後、`"key_code": "left_control"`を追加する。これを忘れると、左controlを左controlとして使えなくなります。
1. ２回目の左controlタイプ時に、`left_control_key`変数にフラグが立っていればSafariを立ち上げる。
1. `"to_delayed_action"`の`"to_if_invoked"`と`"to_if_canceled"`を使って、以下の2つの場合に`left_control_key`変数の値を初期化する処理を行う。
  1. 左controlを押してから一定の時間が経過した時
  1. 左controlと違うキーを押した場合に

```json
{
  "description": "Double tap 'left_control' to 'open -a 'safari'",
  "manipulators": [
    {
      "type": "basic",
      "from": { "key_code": "left_control" },
      "to": [
        { "shell_command": "open -a 'safari'" }
      ],
      "conditions": [
        { "type": "variable_if", "name": "left_control_key", "value": 1 }
      ]
    },
    {
      "type": "basic",
      "from": {
        "key_code": "left_control",
        "modifiers": { "optional": [ "any" ] }
      },
      "to": [
        { "set_variable": { "name": "left_control_key", "value": 1 } },
        { "key_code": "left_control" }
      ],
      "to_delayed_action": {
        "to_if_invoked": [
          { "set_variable": { "name": "left_control_key", "value": 0 } }
        ],
        "to_if_canceled": [
          { "set_variable": { "name": "left_control_key", "value": 0 } }
        ]
      },
      "conditions": [
        { "type": "variable_if", "name": "left_control_key", "value": 0 }
      ]
    }
  ]
}
```

## 「テンキー上のピリオド２回でコンマ入力」を実現

実装方法は、上記の左controlとほぼ同じですが、1つ工夫したところがあります。
それは、１回目のピリオド入力の時点で、変数にフラグを立てていったんピリオドを入力し、変数にフラグが立っている内に２回目のピリオドを入力したら、入力済みのピリオドを削除してからコンマを入力するようにしたことです。
これにより、"1.0"のような入力をする際に、タイプした通りに画面に入力した内容を表示することができるようになりました。

```JSON
{
  "description": "Double tap 'keypad_period' to 'comma'",
  "manipulators": [
    {
      "type": "basic",
      "from": { "key_code": "keypad_period" },
      "to": [
        { "key_code": "delete_or_backspace"},
        { "key_code": "comma" },
        { "set_variable": { "name": "press_period_key", "value": 0 } }
      ],
      "conditions": [
        { "type": "variable_if", "name": "press_period_key", "value": 1 }
      ]
    },
    {
      "type": "basic",
      "from": { "key_code": "keypad_period" },
      "to": [
        { "set_variable": { "name": "press_period_key", "value": 1 } },
        { "key_code": "keypad_period" }
      ],
      "to_delayed_action": {
        "to_if_invoked": [
          { "set_variable": { "name": "press_period_key", "value": 0 } }
        ],
        "to_if_canceled": [
          { "set_variable": { "name": "press_period_key", "value": 0 } }
        ]
      },
      "conditions": [
        { "type": "variable_if", "name": "press_period_key", "value": 0 }
      ]
    }
  ]
}
```

なお、この機能は、Windowsのキーボード便利ソフトの「秀Caps」にある機能を再現したものです。「秀Caps」には、他にも以下の機能があります。

> \- CapsLockの状態を画面に表示する
> \- 英数キーをCapsLockキーにする
> \- 英数キーを押した時にカナロックを解除する
> \- カーソル移動を加速する
> \- ひらがなキー、変換キー、無変換キー、右Altキー、右CtrlキーをSpaceキー、カナキー、漢字キーにしてしまう。
> \- Shiftなしで「_」が入力できるようにする
> \- かな漢字変換offにする前に自動的に変換文字列を確定する
> \- OASYS風のかな漢字変換モード切り替え
> \- テンキー上のピリオド２回でコンマ入力
> \- Windows Vistaの「開く」ダイアログボックスで、ファイル一覧のヘッダ部分にタブストップさせない機能
> \- その他いろいろ
> [秀まるおのホームページ(サイトー企画)－秀Caps](http://hide.maruo.co.jp/software/hidecaps.html)より引用


これらの機能のうち、「テンキー上のピリオド２回でコンマ入力」は地味ですが非常に強力な機能です。なぜなら、大量の数字入力を行う時はテンキーを使いますが、テンキーには".(ピリオド)"キーはあっても",(カンマ)"キーはないため、数字区切りを打たないといけない場合はテンキーから離れて","キーを押さないといけなくなります。これでは作業能率が落ちるため、テンキーだけで","が打てるようになることは大きな違いとなります。
そのため、この機能をMacで実現するべく、本設定を作成しました。