Karabiner-Elements おすすめ設定8選

# 1. 親指を Virtual modifier [^0] に

[^0]: https://pqrs.org/osx/karabiner/json.html#virtual-modifier

例えば JIS キーボードの場合は <kbd>Space</kbd> の幅が狭いため、<kbd>Space</kbd> の左右にあるキーは親指で押しやすいです。そのため、Virtual modifier として設定するのがおすすめです。

以下のように定義すると、<kbd>lang1</kbd> [^1] が押されている間は変数 `vk1` に `1` (離した時は `0`)が設定され、単体で押した場合は <kbd>かな</kbd> として動作するようになります。

[^1]: Apple Internal Keyboard の <kbd>Space</kbd> の右に配置されているキーです。キーボードによって異なると思いますので、[Karabiner-EventViewer](https://pqrs.org/osx/karabiner/document.html#eventviewer) を使ってご確認ください。

```json
{
  "type": "basic",
  "from": { "key_code": "lang1", "modifiers": { "optional": [ "any" ] },
  "to": [ { "set_variable": { "name": "vk1", "value": 1 } } ],
  "to_after_key_up": [ { "set_variable": { "name": "vk1", "value": 0 } } ],
  "to_if_alone": [ { "key_code": "japanese_kana" } ]
}
```

# 2. <kbd>vk1</kbd> + <kbd>H</kbd> / <kbd>J</kbd> / <kbd>K</kbd> / <kbd>L</kbd> でどこでもカーソル移動

以下の定義は、先程定義した `vk1` を使って <kbd>vk1</kbd> + <kbd>H</kbd> / <kbd>J</kbd> / <kbd>K</kbd> / <kbd>L</kbd> で上下左右にカーソル移動できるようにしたものです。これで、どのアプリにいても Vim 気分を味わうことができます。

```json
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk1", "value": 1 } ],
  "from": { "key_code": "h", "modifiers": { "optional": [ "any" ] } },
  "to": [ { "key_code": "left_arrow" } ]
},
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk1", "value": 1 } ],
  "from": { "key_code": "j", "modifiers": { "optional": [ "any" ] } },
  "to": [ { "key_code": "down_arrow" } ]
},
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk1", "value": 1 } ],
  "from": { "key_code": "k", "modifiers": { "optional": [ "any" ] } },
  "to": [ { "key_code": "up_arrow" } ]
},
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk1", "value": 1 } ],
  "from": { "key_code": "l", "modifiers": { "optional": [ "any" ] } },
  "to": [ { "key_code": "right_arrow" } ]
}
```

# 3. <kbd>vk1</kbd> + <kbd>N</kbd> / <kbd>M</kbd> / <kbd>,</kbd> / <kbd>.</kbd> でマウス移動

以下の定義は、先程の <kbd>H</kbd> / <kbd>J</kbd> / <kbd>K</kbd> / <kbd>L</kbd> からキーボードの行を一段下げた <kbd>N</kbd> / <kbd>M</kbd> / <kbd>,</kbd> / <kbd>.</kbd> でマウスを移動させるものです。同時に <kbd>Shift</kbd> も押している場合に移動距離を半分にすることで、低速モードを実現しています。

```json
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk1", "value": 1 } ],
  "from": { "key_code": "n", "modifiers": { "mandatory": [ "shift" ] } },
  "to": [ { "mouse_key": { "x": -1536 } } ]
},
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk1", "value": 1 } ],
  "from": { "key_code": "m", "modifiers": { "mandatory": [ "shift" ] } },
  "to": [ { "mouse_key": { "y": 1536 } } ]
},
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk1", "value": 1 } ],
  "from": { "key_code": "comma", "modifiers": { "mandatory": [ "shift" ] } },
  "to": [ { "mouse_key": { "y": -1536 } } ]
},
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk1", "value": 1 } ],
  "from": { "key_code": "period", "modifiers": { "mandatory": [ "shift" ] } },
  "to": [ { "mouse_key": { "x": 1536 } } ]
},
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk1", "value": 1 } ],
  "from": { "key_code": "n" },
  "to": [ { "mouse_key": { "x": -3072 } } ]
},
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk1", "value": 1 } ],
  "from": { "key_code": "m" },
  "to": [ { "mouse_key": { "y": 3072 } } ]
},
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk1", "value": 1 } ],
  "from": { "key_code": "comma" },
  "to": [ { "mouse_key": { "y": -3072 } } ]
},
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk1", "value": 1 } ],
  "from": { "key_code": "period" },
  "to": [ { "mouse_key": { "x": 3072 } } ]
}
```

また、以下のように、<kbd>vk1</kbd> + <kbd>/</kbd> で左クリック、<kbd>vk1</kbd> + <kbd>_</kbd> で右クリックというのもおすすめです。素早く二度入力すればダブルクリックできます。

```json
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk1", "value": 1 } ],
  "from": { "key_code": "slash", "modifiers": { "optional": [ "any" ] } },
  "to": [ { "pointing_button": "button1" } ]
},
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk1", "value": 1 } ],
  "from": { "key_code": "international1", "modifiers": { "optional": [ "any" ] } },
  "to": [ { "pointing_button": "button2" } ]
}
```

# 4. <kbd>vk1</kbd> + <kbd>F</kbd> で <kbd>Esc</kbd>

Vim を使う方は特に <kbd>Esc</kbd> は多用すると思います。Touch Bar になって物理キーがなくなっても安心です。

```json
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk1", "value": 1 } ],
  "from": { "key_code": "f" },
  "to": [ { "key_code": "escape" } ]
}
```

# 5. <kbd>vk1</kbd> + <kbd>P</kbd> / <kbd>O</kbd> で <kbd>Control+Tab</kbd> / <kbd>Control+Shift+Tab</kbd>

<kbd>Control+Tab</kbd> はブラウザ等でよく利用すると思います。

```json
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk1", "value": 1 } ],
  "from": { "key_code": "o" },
  "to": [ { "key_code": "tab", "modifiers": [ "control", "shift" ] } ]
},
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk1", "value": 1 } ],
  "from": { "key_code": "p" },
  "to": [ { "key_code": "tab", "modifiers": [ "control" ] } ]
}
```

『`iTerm2` がアクティブな場合は <kbd>Control+Tab</kbd> ではなく <kbd>Control+T</kbd>[^2] <kbd>Control+N</kbd> にバインドすることで `tmux` で次の Window を表示できるようにしたい』といった場合は、以下のようにして実現できます。

[^2]: デフォルトだと <kbd>C-b</kbd> だと思います。`~/.tmux.conf` で `unbind C-b; set -g prefix C-t; bind C-t send-prefix` して変えています。

```json
{
  "type": "basic",
  "conditions": [ { "type": "frontmost_application_if", "bundle_identifiers": [ "com.googlecode.iterm2" ] }, { "type": "variable_if", "name": "vk1", "value": 1 } ],
  "from": { "key_code": "o" },
  "to": [ { "key_code": "t", "modifiers": [ "control" ] }, { "key_code": "p", "modifiers": [ "control" ] } ]
},
```

# 6. セミコロンをエンターに

<kbd>;</kbd> を <kbd>Enter</kbd> にしてしまうのもおすすめです。何のために Enter が大きくなっているんだと思われるかもしれませんが、おすすめです。以下のように定義することで、<kbd>Control</kbd> + <kbd>;</kbd> でちゃんと `;` も入力できますし、<kbd>Shift</kbd> + <kbd>;</kbd> で`+` も入力できます。

```json
{
  "type": "basic",
  "from": { "key_code": "semicolon", "modifiers": { "mandatory": [ "control" ] } },
  "to": [ { "key_code": "semicolon" } ]
},
{
  "type": "basic",
  "from": { "key_code": "semicolon", "modifiers": { "mandatory": [ "shift" ] } },
  "to": [ { "key_code": "semicolon", "modifiers": [ "shift" ] } ]
},
{
  "type": "basic",
  "from": { "key_code": "semicolon", "modifiers": { "optional": [ "any" ] } },
  "to": [ { "key_code": "return_or_enter" } ]
}
```

# 7. アプリを一発呼び出し

`vk1` 同様、まずは以下のように <kbd>Space</kbd> の左側にあるキー <kbd>lang2</kbd> を Virtual modifier の `vk2` として定義します。

```json
{
  "type": "basic",
  "from": { "key_code": "lang2", "modifiers": { "optional": [ "any" ] },
  "to": [ { "set_variable": { "name": "vk2", "value": 1 } } ],
  "to_after_key_up": [ { "set_variable": { "name": "vk2", "value": 0 } } ],
  "to_if_alone": [ { "key_code": "japanese_eisuu" } ]
}
```

この状態で以下のように定義すると、<kbd>vk2</kbd> + <kbd>J</kbd> で Google Chrome を起動することができます。

```json
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk2", "value": 1 } ],
  "from": { "key_code": "j" },
  "to": [ { "shell_command": "open -a 'Google Chrome.app'" } ]
}
```

また、以下のように定義すると、<kbd>vk2</kbd> + <kbd>E</kbd> を押した時に、『Alfred 3 を起動して `snip ` が入力された状態にする』といったこともできます。

```json
{
  "type": "basic",
  "conditions": [ { "type": "variable_if", "name": "vk2", "value": 1 } ],
  "from": { "key_code": "e" },
  "to": [ { "shell_command": "osascript -e \"tell application \\\"Alfred 3\\\" to search \\\"snip \\\"\"" } ]
}
```

# 8. ホームポジションでの数字入力

<kbd>Space</kbd> の右 (`vk1`) のさらに右にあるキー <kbd>right_gui</kbd> も `vk3` として定義してしまいます。

```json
{
  "type": "basic",
  "from": { "key_code": "right_gui", "modifiers": { "optional": [ "any" ] },
  "to": [ { "set_variable": { "name": "vk3", "value": 1 } } ],
  "to_after_key_up": [ { "set_variable": { "name": "vk3", "value": 0 } } ]
}
```

この状態で以下のように <kbd>A</kbd>, <kbd>B</kbd>, ... <kbd>:</kbd> まで定義すると、

```json
{ "type": "basic", "conditions": [ { "type": "variable_if", "name": "vk3", "value": 1 } ], "from": { "key_code": "a" }, "to": [ { "key_code": "1" } ] },
{ "type": "basic", "conditions": [ { "type": "variable_if", "name": "vk3", "value": 1 } ], "from": { "key_code": "s" }, "to": [ { "key_code": "2" } ] },
{ "type": "basic", "conditions": [ { "type": "variable_if", "name": "vk3", "value": 1 } ], "from": { "key_code": "d" }, "to": [ { "key_code": "3" } ] },
{ "type": "basic", "conditions": [ { "type": "variable_if", "name": "vk3", "value": 1 } ], "from": { "key_code": "f" }, "to": [ { "key_code": "4" } ] },
{ "type": "basic", "conditions": [ { "type": "variable_if", "name": "vk3", "value": 1 } ], "from": { "key_code": "g" }, "to": [ { "key_code": "5" } ] },
{ "type": "basic", "conditions": [ { "type": "variable_if", "name": "vk3", "value": 1 } ], "from": { "key_code": "h" }, "to": [ { "key_code": "6" } ] },
{ "type": "basic", "conditions": [ { "type": "variable_if", "name": "vk3", "value": 1 } ], "from": { "key_code": "j" }, "to": [ { "key_code": "7" } ] },
{ "type": "basic", "conditions": [ { "type": "variable_if", "name": "vk3", "value": 1 } ], "from": { "key_code": "k" }, "to": [ { "key_code": "8" } ] },
{ "type": "basic", "conditions": [ { "type": "variable_if", "name": "vk3", "value": 1 } ], "from": { "key_code": "l" }, "to": [ { "key_code": "9" } ] },
{ "type": "basic", "conditions": [ { "type": "variable_if", "name": "vk3", "value": 1 } ], "from": { "key_code": "semicolon" }, "to": [ { "key_code": "0" } ] },
{ "type": "basic", "conditions": [ { "type": "variable_if", "name": "vk3", "value": 1 } ], "from": { "key_code": "quote" }, "to": [ { "key_code": "hyphen" } ] }
```

ホームポジションにいながら数字を入力できるようになります。電話番号を入力する際などに特に便利に感じます。

| 入力                          | 結果         |
| ---                           | ---          |
| <kbd>vk3</kbd> + <kbd>A</kbd> | <kbd>1</kbd> |
| <kbd>vk3</kbd> + <kbd>S</kbd> | <kbd>2</kbd> |
| <kbd>vk3</kbd> + <kbd>D</kbd> | <kbd>3</kbd> |
| <kbd>vk3</kbd> + <kbd>F</kbd> | <kbd>4</kbd> |
| <kbd>vk3</kbd> + <kbd>G</kbd> | <kbd>5</kbd> |
| <kbd>vk3</kbd> + <kbd>H</kbd> | <kbd>6</kbd> |
| <kbd>vk3</kbd> + <kbd>J</kbd> | <kbd>7</kbd> |
| <kbd>vk3</kbd> + <kbd>K</kbd> | <kbd>8</kbd> |
| <kbd>vk3</kbd> + <kbd>L</kbd> | <kbd>9</kbd> |
| <kbd>vk3</kbd> + <kbd>;</kbd> | <kbd>0</kbd> |
| <kbd>vk3</kbd> + <kbd>:</kbd> | <kbd>-</kbd> |

# まとめ

<del>こちらに載せていないすべての設定は https://github.com/hioki-daichi/Personal-Rules-For-Karabiner-Elements に公開しています。Ruby から JSON を生成していたりします。</del>

( 追記: Rust で生成、ついでにファイルの更新まで行うよう変更しました → https://github.com/hioki/karabiner-json-updater )

すでに `Karabiner-Elements` がインストール済みであれば、以下の URL をお使いのブラウザに貼り付けるだけで設定をインポートすることができます。よかったらお試しください。

```
karabiner://karabiner/assets/complex_modifications/import?url=https://raw.githubusercontent.com/hioki/karabiner-json-updater/master/personal_rules.json
```