「英数&かな」の親指キーバインドを提唱します（カーソル操作編）


言いたいことは次のとおりです。

- キーバインド・ツールを使って 「オリジナル・ショートカット」を作成しよう。
- キーバインドに`英数` & `かな`キーを活用すれば、PC操作が快適になります。

`英数` & `かな`、すなわち親指を活用します。
よって親指キーバインドです。

# 環境

Macを対象とします（Windows版は後日執筆予定）。
キーバインドツールには、Karabiner-Elements（カラビナ）を使用します。
また`英数` & `かな`を使用するので「JISキーボード」が前提です。

私の環境

- macOS 10.12.6
- Karabiner-Elements 12.8.0

# キーバインドとは？

キーバインドとは、キー押下に対し、特定の操作を割り当てることです。
「自分専用のショートカットキーを設定する」と言ったほうが伝わりやすいかもしれません。
たとえば、`Command` + `@` で、上下の文章を入れ替えるなんてこともできます。

# 親指キーバインドとは

`英数` & `かな`に注目してみましょう。
入力言語を切り替えるためのキーです。
重要な操作だけど、用途が限定的です。
`Command` よりも押しやすいのに、もったいないですよね。

この `英数` & `かな` の用途を増やしませんか？
キーバインドで、ショートカットに使ってみませんか？
それが親指キーバインドです。

# カーソル操作のキーバインドを最初にしよう！

カーソルの上下左右の移動操作を最初に設定しましょう。
具体的には 、`英数` + `H` で `←` カーソルを動作するようにします。
同じように、「`英数` + `J` で `↓`」、「`英数` + `K` で `↑`」、「`英数` + `L` で `→`」という風に動作させます。

なんでわざわざこんなことするのでしょうか？
カーソル操作の度に手を移動させたくないからです。
手をホームポジションに固定することで、PC操作は快適になるのです。
とくにVim ユーザーであれば、`H``J``K``L` カーソル移動の有用性に納得してくれるでしょう。
 
# キーバインドツールの設定方法

## Karabinerについて

Karabiner（カラビナ）というツールを利用します。
キーバインドを設定するためのツールです。
「Karabiner」のインストール・基本操作は、他記事をご参照ください。

本稿では、キーバインド（オリジナル・ショートカット）の設定内容を紹介します。
キーバインドは、全てVimの操作コマンドにちなんでいます。
気に入らなければ、好きなように設定しなおせばOKです。

なお設定ファイルはGistに公開しています。
インストール後にこの設定をコピペすれば、本記事で紹介しているキーバインドを再現できます。

- [karabiner.json (Gist) ](https://gist.github.com/KanamotoDeveloper/637051fd0045059f4d66b21c4b6bf859)

## 前準備：「英数」を補助キーに設定

さっそくですが、`英数`はキーバインドの補助キーとして使用できません。
`Command`や`Shift` は、当然、補助キーとして利用可能です。
でも`英数`はダメなのです。

よって、`英数`を利用するための裏技が必要になります。
まずはそれをやってしまいます。

具体的には、`英数`を`Option`の代理キーに設定します。
`Option`であば補助キーとして利用可能です。

Karabinerの設定は下記のとおりです。
ここでやっていることは、

- `英数`と他キーを同時に押したら、補助キーとして機能する。
- `英数`だけ押下したら、入力モードを英数に切り替える (本来の役割のまま)。

```JSON:karabiner.json(rules)
{
  "description": "英数キーを補助キー（option）に設定",
  "manipulators": [{
    "from": {
      "key_code": "japanese_eisuu",
      "modifiers": {
        "optional": [
          "any"
        ]
      }
    },
    "to": [{
      "key_code": "left_option"
    }],
    "to_if_alone": [{
      "key_code": "japanese_eisuu"
    }],
    "type": "basic"
  }]
}

※上記を[rules]キーの配列中にマージすればOKです。
```

## 「英数 + H / J / K / L 」で、上下左右移動

基本のキーバインドです。
ホームポジションから1ミリも動かないまま、上下左右のカーソル移動をできるようにします。

|     キー     | 動作 |           覚え方            |
| ------------ | ---- | --------------------------- |
| `英数` + `H` | `←`  | Vimの基本キーバインドと同じ |
| `英数` + `J` | `↓`  | 同上                        |
| `英数` + `K` | `↑`  | 同上                        |
| `英数` + `L` | `→`  | 同上                        |

<details><summary>設定ファイルの内容</summary><div>

```JSON:karabiner.json(rules)
{
  "description": "英数 + H/J/K/L = カーソル移動",
  "manipulators": [{
      "from": {
        "key_code": "h",
        "modifiers": {
          "mandatory": [
            "left_option"
          ],
          "optional": [
            "any"
          ]
        }
      },
      "to": [{
        "key_code": "left_arrow"
      }],
      "type": "basic"
    },
    {
      "from": {
        "key_code": "j",
        "modifiers": {
          "mandatory": [
            "left_option"
          ],
          "optional": [
            "any"
          ]
        }
      },
      "to": [{
        "key_code": "down_arrow"
      }],
      "type": "basic"
    },
    {
      "from": {
        "key_code": "k",
        "modifiers": {
          "mandatory": [
            "left_option"
          ],
          "optional": [
            "any"
          ]
        }
      },
      "to": [{
        "key_code": "up_arrow"
      }],
      "type": "basic"
    },
    {
      "from": {
        "key_code": "l",
        "modifiers": {
          "mandatory": [
            "left_option"
          ],
          "optional": [
            "any"
          ]
        }
      },
      "to": [{
        "key_code": "right_arrow"
      }],
      "type": "basic"
    }
  ]
}
```

</div></details>

## 「英数 + I / A 」で、カーソルを行末・行頭移動

カーソルを編集中の文章の行末・行頭に移動させます。
これで左右のカーソルを連打しなくて済みますね。

|     キー     |     動作     |               覚え方               |
| ------------ | ------------ | ---------------------------------- |
| `英数` + `I` | 行頭へ移動  | Insert at the begining of the line |
| `英数` + `A` | 行末へ移動 | Append at the end of the line      |

<details><summary>設定ファイルの内容</summary><div>

```JSON:karabiner.json(rules)
{
  "description": "英数 + I/A = 行頭・行末ジャンプ",
  "manipulators": [{
      "from": {
        "key_code": "i",
        "modifiers": {
          "mandatory": [
            "left_option"
          ],
          "optional": [
            "any"
          ]
        }
      },
      "to": [{
        "key_code": "left_arrow",
        "modifiers": "left_command"
      }],
      "type": "basic"
    },
    {
      "from": {
        "key_code": "a",
        "modifiers": {
          "mandatory": [
            "left_option"
          ],
          "optional": [
            "any"
          ]
        }
      },
      "to": [{
        "key_code": "right_arrow",
        "modifiers": "left_command"
      }],
      "type": "basic"
    }
  ]
}
```

</div></details>

## 「英数 + F / B」で、ページの上下スクロール。

ページを上下にスクロールさせます。
文章の編集中であれば、画面範囲外にカーソルをジャンプさせます。
`F`なら下にジャンプ、`B`なら上にジャンプです。

|     キー     |           動作           |            覚え方             |
| ------------ | ------------------------ | ----------------------------- |
| `英数` + `F` | ページスクロール         | Forward to the next location  |
| `英数` + `B` | ページスクロール（戻る） | Back to the previous location |

<details><summary>設定ファイルの内容</summary><div>

```JSON:karabiner.json(rules)
{
  "description": "英数 + F/B = ページスクロール",
  "manipulators": [{
      "from": {
        "key_code": "f",
        "modifiers": {
          "mandatory": [
            "left_option"
          ],
          "optional": [
            "any"
          ]
        }
      },
      "to": [{
          "key_code": "page_down"
        },
        {
          "key_code": "page_down",
          "modifiers": "left_option"
        }
      ],
      "type": "basic"
    },
    {
      "from": {
        "key_code": "b",
        "modifiers": {
          "mandatory": [
            "left_option"
          ],
          "optional": [
            "any"
          ]
        }
      },
      "to": [{
          "key_code": "page_up"
        },
        {
          "key_code": "page_up",
          "modifiers": "left_option"
        }
      ],
      "type": "basic"
    }
  ]
}
```
</div></details>

## 「英数 + G」で、ページの先頭・末尾へジャンプ

ページの一番上へジャンプします。
また、Shift + G で、末尾へジャンプします。

|          キー          |       動作       |        覚え方        |
| ---------------------- | ---------------- | -------------------- |
| `英数` + `G`           | ページ先頭へ移動 | Go to the first line |
| `英数` + `Shift` + `G` | ページ末尾へ移動 | 上記の逆             |

<details><summary>設定ファイルの内容</summary><div>

```JSON:karabiner.json(rules)
{
  "description": "英数 + G = ページ先頭ジャンプ",
  "manipulators": [{
      "from": {
        "key_code": "g",
        "modifiers": {
          "mandatory": [
            "left_option"
          ]
        }
      },
      "to": [{
        "key_code": "up_arrow",
        "modifiers": "left_command"
      }],
      "type": "basic"
    },
    {
      "from": {
        "key_code": "g",
        "modifiers": {
          "mandatory": [
            "left_option",
            "shift"
          ]
        }
      },
      "to": [{
        "key_code": "down_arrow",
        "modifiers": "left_command"
      }],
      "type": "basic"
    }
  ]
}
```
</div></details>

## 「英数 + O」で、新しい行の挿入

現在のカーソル位置の下に新しい行を挿入します。
また shift + Oで、上に新行を挿入します。

これもVim由来。
使えば意外と便利と気づく機能ですね。

|          キー          |           動作           |     覚え方      |
| ---------------------- | ------------------------ | --------------- |
| `英数` + `O`           | 新しい行の挿入           | Open a new line |
| `英数` + `Shift` + `O` | 新しい行の挿入（上側に） | 上記の逆        |

<details><summary>設定ファイルの内容</summary><div>

```JSON:karabiner.json(rules)
{
  "description": "英数 + O = 新行挿入",
  "manipulators": [{
      "from": {
        "key_code": "o",
        "modifiers": {
          "mandatory": [
            "left_option"
          ]
        }
      },
      "to": [{
          "key_code": "right_arrow",
          "modifiers": "left_command"
        },
        {
          "key_code": "return_or_enter"
        }
      ],
      "type": "basic"
    },
    {
      "from": {
        "key_code": "o",
        "modifiers": {
          "mandatory": [
            "left_option",
            "shift"
          ]
        }
      },
      "to": [{
          "key_code": "left_arrow",
          "modifiers": "left_command"
        },
        {
          "key_code": "return_or_enter"
        },
        {
          "key_code": "up_arrow"
        }
      ],
      "type": "basic"
    }
  ]
}
```
</div></details>

# 補足：デフォルトのキーバインドと何がちがう？

じつはMac、カーソル移動のキーバインドをすでに用意しています。
たとえば「`Control` + `P`で`↑`」、「`Control` + `F`で`→`」といった具合です。
でも、「`英数` +`H``J``K``L`」には、以下の利点があります。

- 押しやすい。
- ブラウザなどで、ページスクロールができる。

# 次回

`かな`を利用した、編集操作のキーバインドを紹介します。
具体的には、`Return`や`Delete`のショートカットを作成します。

「なぜ削除キーまでキーバインド？」って思うかもしれません。
でも、ホームポジションを維持したまま編集操作を行うことで、PC操作が快適になるんです。