左手用キーボードとして使うErgoDox

この投稿は :calendar: [ErgoDox Advent Calendar 2016](http://qiita.com/advent-calendar/2016/ergodox) の 19日目の記事です。

----

![ergodox-with-mouse.jpg](https://qiita-image-store.s3.amazonaws.com/0/117743/f6795801-9674-c0a7-68c2-c8293670418e.jpeg)

# ❓ErgoDoxはゲーミングキーボードとして使えるか

古典的なPCゲームは`左手：キーボード`、`右手：マウス`という操作体系になっているのですが、その場合はキーボードを片手で使うことになるので普段とは少し勝手が違ってきます。そのため主にゲーミング向けに特化した左手用キーボードというジャンルもあるぐらいです。

ErgoDoxはセパレート式だし、ファームウェア書けばどうとでも設定ができるので、自分の理想の左手用キーボードを作ってみることができるのではないでしょうか

## ErgoDoxの弱点

まず、ゲーミング用途としてErgoDoxでは弱い点を挙げておきます。

### 左右分割されすぎ問題

セパレート式というのが一番の特徴である一方、ちょっとした弱点もあります。それは片手では操作できない（しづらい）ということです。

両手を使うことが前提で、左手と右手の役割がはっきり分かれてしまっているので、ちょっと数字部分を片手だけで入力したいといったときに、普通のキーボードなら問題無いところがやりづらかったりします。

ゲームの場合では左手操作前提であるものの、わりと右手部分のキーもアサインされていることが多いのでなんとかする必要があります。

### ファンクションキー問題

ファンクションキーは普段使わないので必要無いと思ってたんですが、ゲームによってはファンクションキーもけっこうフルに使います。なんとかしないといけません。

# 🏠ホームポジション設定：WASDかESDFか

PCゲームのスタンダードなホームポジションは`WASD`ですが、それ以前には標準のホームポジションを使う`ESDF`でした。📝 [Videogamedrome: FPSにおけるWASD設定の起源について2 [Quake覇者とHalf-Life編]](http://vgdrome.blogspot.jp/2015/11/fpswasd2-quakehalf-life.html)

ErgoDoxの場合だと、親指の2つの大きいキーを使うためには標準のホームポジションでないと難しいので、まずは原点の`ESDF`でのレイアウトを考えてみました。

## ESDFポジションでWASD入力する案

ESDFのポジションを使う場合、ほとんどのゲームはWASDがデフォルトなのでいちいちキー設定し直さないといけないのが面倒です。このため、ESDFのポジションを利用しつつもキーマップ上はWASDにすればゲーム上でのキー設定はそのままにできると考えました。

```
/* Keymap: Game
 *
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 * | Esc    |   1  |   2  |   3  |   4  |   5  |  `~  |           |      |      |      |      |      |      |        |
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 * | Tab    |      |   Q  |   W  |   E  |   R  | Enter|           |      |      |      |      |      |      |        |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * | LCtrl  |      |   A  |   S  |   D  |   F  |------|           |------|      |      |      |      |      |        |
 * |--------+------+------+------+------+------|  Tab |           |      |------+------+------+------+------+--------|
 * | LShift |   Z  |   X  |   C  |   V  |   B  |      |           |      |      |      |      |      |      |        |
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 *   |  F17 |  F18 |  F19 |  F20 | ESC  |                                       |      |      |      |      |      |
 *   `----------------------------------'                                       `----------------------------------'
 *                                        ,-------------.       ,-------------.
 *                                        |   N  |   M  |       |      |      |
 *                                 ,------|------|------|       |------+------+------.
 *                                 |      |      |      |       |      |      |      |
 *                                 | Space| LAlt |------|       |------|      |      |
 *                                 |/game2|      |      |       |      |      |      |
 *                                 `--------------------'       `--------------------'
 */
```

しかし、やってみると分かりにくいし、小指左側の余剰キーをどうするかいまいち有効に使えませんでした。

## ESDFでのShiftキー問題

アクション系では`Shift: スプリント`、`Space: ジャンプ`という操作がよくあります。

この動作をするには小指でShiftホールド、親指でSpaceタップと同時に使うわけですが、その状態で残った3本の指を`ESDF`ポジションで使おうとするのはかなり厳しい感じがしました。

特にErgoDoxは垂直な格子配列のため、**そもそも左Shiftキーが普通のキーボードよりも半キー分遠くて押しづらいポジション**になっています（普段の配列では親指でShiftを使っていますが、左手だけだと使えません）。

となると、やはりゲーム用には左にシフトしたWASDでないと無理そうに思えました。

## WASDでの親指キー問題

ホームポジションを左にシフトすると、その分ErgoDoxの親指2つのキーは遠くなって押すのが難しくなります。左側をホールドするのがぎりぎり、右側はタップまでが限界じゃないでしょうか。

そうなると親指ホールドで切り替えられるレイヤーは一つだけとなります。

# 🔢数字キー、ファンクションキーの設定

一番悩ましい問題かもしれません。なにしろキーが足りないのです。

アイテムスロット選択など、数字キーをフルに使うゲームもよくあります。`1-5`はいいとして、残りの`6-0`をどうするか。この点、普通のキーボードならちょっと左手を伸ばせば届きます。しかしErgoDoxは分割されているのでそれが厳しいのです。

またファンクションキーも同様に`F1-F10`まで使う場合もあります。

```
/* Keymap: Game layer2
 *
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 * |        |   6  |   7  |   8  |   9  |   0  |   Y  |           |      |      |      |      |      |      |        |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * |        |  F1  |  F2  |  F3  |  F4  |  F5  |------|           |------|      |      |      |      |      |        |
 * |--------+------+------+------+------+------|   H  |           |      |------+------+------+------+------+--------|
 * |        |  F6  |  F7  |  F8  |  F9  | F10  |      |           |      |      |      |      |      |      |        |
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 *   |      |      |      |      |      |                                       |      |      |      |      |      |
 *   `----------------------------------'                                       `----------------------------------'
 */
```

悩んだ結果、親指ホールドで別レイヤーに切り替えて使うことにしました。

左手ホームポジション周りは普段からCtrl-cなどホールド組み合わせのショートカットがよく使われているので、このへんなら結構制御しやすいかなと思います。

# 💬チャット問題

**諦めてもう一個キーボードを置いておきます**

# ☕番外：片手ブラウジング用

ErgoDoxの弱点に「両手で使うことが前提」というのを挙げたのですが、ゲーム以外の普段の利用でもちょっと片手で使いたいなと思うことが時々ありました。

右手でコーヒー飲みながらブラウジングしたり、右手でメモ取りながら左手でスクロールできると良くないですか？

自分の場合、カーソルやマウスの移動をレイヤーに割り当てているんですが、両手じゃないと使えない動作が多いので、それらを左手用に集約してみたのが以下のキーマップです。

## 左手用片手ナビレイヤー：カーソル

```
/* Keymap: Left nav
 *
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 * |        |      | PgUp |  Up  | PgDn | Home |      |           |      |      |      |      |      |      |        |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * |        |      | Left | Down | Right| End  |------|           |------|      |      |      |      |      |        |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * | MBtn1  |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 *   |      |      |      |      | BS   |                                       |      |      |      |      |      |
 *   `----------------------------------'                                       `----------------------------------'
 *                                        ,-------------.       ,-------------.
 *                                        |      |      |       |      |      |
 *                                 ,------|------|------|       |------+------+------.
 *                                 |      |      |      |       |      |      |      |
 *                                 | MBtn1|      |------|       |------|      |      |
 *                                 |/LNAV2|      |      |       |      |      |      |
 *                                 `--------------------'       `--------------------'
 */
```

左手ホームポジションが上下左右カーソル、その周囲にPgUp/Dn, Home/Endも配置します。
親指はタップでマウスクリック、ホールドでマウス用レイヤーを有効にする設定です。
左Shiftもマウスボタンになっているのはマウスホールド＋カーソル移動で範囲選択するためです。実際そこまでして使わないですが…

## 左手用片手ナビレイヤー：マウス

```
/* Keymap: Left nav2
 *
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 * |        |      | PREV | M_U  | NEXT | MH_U | MBtn3|           |      |      |      |      |      |      |        |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * |        |      | M_L  | M_D  | M_R  | MH_D |------|           |------|      |      |      |      |      |        |
 * |--------+------+------+------+------+------| MBtn2|           |      |------+------+------+------+------+--------|
 * | MBtn1  |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 *   |      |      |      |      |      |                                       |      |      |      |      |      |
 *   `----------------------------------'                                       `----------------------------------'
 *                                        ,-------------.       ,-------------.
 *                                        |      |      |       |      |      |
 *                                 ,------|------|------|       |------+------+------.
 *                                 |      |      |      |       |      |      |      |
 *                                 |      |      |------|       |------|      |      |
 *                                 |      |      |      |       |      |      |      |
 *                                 `--------------------'       `--------------------'
 */
```
親指ホールド中は左手ホームポジションがマウス移動になります。
`NEXT/PREV`と書いているのは`Ctrl+Tab`と`Shift+Ctrl+Tab`で、前後のタブ移動に使います。

# ソース

[qmk_firmware/keymap.c at 3c94ae94e7a43904f49c79814e3ebbc28accf1da · miyaoka/qmk_firmware](https://github.com/miyaoka/qmk_firmware/blob/3c94ae94e7a43904f49c79814e3ebbc28accf1da/keyboards/ergodox/keymaps/miyaoka/keymap.c)