Ergodoxのキーマップ 〜2017版〜


気がついたら年が明けてもう一ヶ月が過ぎようとしています。去年は仕事面では色々ありましたが、技術面ではあまり出来なかった点は反省点です。

そんな中、PC環境における一番のハイライトは、Ergodox EZの購入だったかと思います。（[購入時の記事](http://qiita.com/derui@github/items/d7f4411eebe4e150cfb7)）

色々キーバインディングを試行錯誤して、ある程度固まったので紹介しておきます。

## Ergodox EZを利用する上での決断が必要な点 ##
Ergodox EZを使っていくうえで、いくつか決断するか、設定をしなければならない点があると思っています。

### USかJISか ###
Ergodo EZは、基本的にUSキーボードです。しかし、我々日本語を利用するユーザーは、大抵JISキーボードの環境で生活しています。こういった状況では、大体は以下のどちらかになるかと思います。

* PCの設定で、USキーボードを利用するように変更する
* Ergodox側のキーバインディングをJISキーボードに合うように変更する

これについては、

* かな入力するときに結構厳しい
* ノートPCを利用するときにオーバーヘッドがある
* USキーボードに特に思い入れがない

ということから、 **Ergodox側をJISキーボードに合うように変更する** ことにしました。

### 親指と修飾キー ###
Ergodox EZは、親指に6キー割り当てることが出来ます。しかし、他の方も言っているように、実際に常時利用できるキーは、各親指毎に2つずつくらいが関の山です。また、突き詰めていくと、小指の周辺等もあまり利用しないようになっていきます。

> こちらのブログで図解されてますが、ErgoDoxを運用していくと使いづらいキーというものがはっきりしてきます。特に文字配列を変更してホームポジション行を快適に利用できるようにしていく場合、ホームから遠いポジションや制御力に欠ける小指の運指を入れてしまうと台無しになってしまうのです。
[ErgoDoxならではの修飾キー配置を考える](http://qiita.com/miyaoka/items/36301f1f451364f6b7a1)

私はJIS配列を利用することを決めたので、必然的に小指あたりにいくつかの記号が入ってしまい、小指に修飾キーを割り当てる余裕は更になくなります。これに加えて、IME制御のためにキーを提供する必要があります。日本語入力自体の頻度も高いため、このキーもそれなりにいい場所に置かないと、結構辛いです。

ここは一番個性が出るところだとは思います。一例として、以下のような手段を取っている方がいました。

* 修飾キーは親指に集約
* 各修飾キーには、Tap/Hold/Tap Danceで異なる挙動をするように
  * TapしたらSticky、Holdしている間はそのキーが押されっぱなし、2回連続でタップするとHoldしたまま、という感じ

Ergodoxというか、内部で利用しているファームウェアの機能を最大限利用している形です。ここまで極まらなくても、ファームウェアで提供している機能を有効利用する、というのが、修飾キーをハンドリングするためには重要なようです。

### レイヤーの使い方 ###
Ergodox EZでは、初期状態で3つのレイヤーが用意されています。このレイヤーは、下のレイヤーのキーを活かしたまま、レイヤーを上書きしていく、ということが出来ます。これを利用すると、QWERTYとDvorakをさっと切り替える、というようなことも簡単に実現できます。

このレイヤーの切り替えも、修飾キーと同じような考え方が必要になると思います。レイヤーに記号類を割り当てる場合、プログラミングをしている時などは、やたら頻繁にレイヤー切り替えが必要になるケースが出てきます。

* レイヤー切り替えキーの場所
* レイヤー切り替えキーを独立させるかどうか

あんまり頻繁に利用するようなら、親指とかの一等地に置きたいところですが、一等地に置きたいキーは山とあるので、これもまた個性が出るところだと思います。

## 現在のキーマップ ##
さて、年末年始にキーマップを改めて見なおしてみました。こんな感じです。

```c:keymap.c
/* Keymap 0: Basic layer (For JIS)
 *
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 * |        |   1  |   2  |   3  |   4  |   5  |      |           |      |   6  |   7  |   8  |   9  |   0  |        |
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 * |        |   Q  |   W  |   E  |   R  |   T  |  [   |           |   ]  |   Y  |   U  |   I  |   O  |   P  |  @`    |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * | Tab/Arr|A/LSft|S/LCtl|D/LAlt|F/LGui|   G  |------|           |------|   H  |J/RGui|K/RAlt|L/RCtl|;+/Sft|  :*    |
 * |--------+------+------+------+------+------| Esc  |           | Esc  |------+------+------+------+------+--------|
 * |  Eisu  |   Z  |   X  |   C  |   V  |   B  | /L1  |           | /L1  |   N  |   M  |   ,  |   .  |  /?  |  Kana  |
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 *   |      |      |      |      | Bspc |                                       |  L1  |      |      |      |      |
 *   `----------------------------------'                                       `----------------------------------'
 *                                        ,-------------.       ,-------------.
 *                                        |      | +L2  |       | +L1  |      |
 *                                 ,------|------|------|       |------+------+------.
 *                                 |      |      | ~L2  |       | LEAD |      |      |
 *                                 | Space|  L1  |------|       |------|  L1  | Enter|
 *                                 |/Shift|      |      |       |      |      |/Shift|
 *                                 `--------------------'       `--------------------'
 */
/* Keymap 1: Symbol Layer
 *
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 * |   F11  |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |  F6  |  F7  |  F8  |  F9  |  F10 |   F12  |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * |        |   1  |   2  |   3  |   4  |   5  |------|           |------|   6  |   7  |   8  |   9  |   0  |        |
 * |--------+------+------+------+------+------|      |           | Del  |------+------+------+------+------+--------|
 * |        |   |  |  \   |   ~  |  ^   |      |      |           |      |      |  -   |   =  |   \  |   _  |        |
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 *   |      |      |      |      |      |                                       |      |      |      |      |      |
 *   `----------------------------------'                                       `----------------------------------'
 *                                        ,-------------.       ,-------------.
 *                                        |      |      |       |      |      |
 *                                 ,------|------|------|       |------+------+------.
 *                                 |      |      |      |       |      |      |      |
 *                                 |      |      |------|       |------|      |      |
 *                                 |      |      |      |       |      |      |      |
 *                                 `--------------------'       `--------------------'
 */
```

ベースはQWERTY（JIS配列）です。自分で書くのもどうかって思いますが、大分変態ですね・・・。以前はColemak配列を利用していましたが、周辺環境を全て揃える気力がなかったのと、かな入力との兼ね合いが厳しかったため、大人しくQWERTYに戻ってきました。この配列のポイントは以下の点です。

* 全体はJIS配列に
* ホーム行に配置した修飾キー
* 親指のクラスタは必要最小限に
  * 手の大きさから、一番端のキー以外は結構きつくて、頻度が高いと筋が痛くなってきたので・・・
* M/Bの下のキーを親指クラスタとする全体の構成
* JIS配列の記号（一部だけ）と数字をSymbolレイヤーに配置して、あまり指を派手に動かさなくても入力できるように
* Tab/CursorレイヤーをTap-Danceで切り替えられるように
* IME切り替え用の独立キー

一番のポイントは、ホーム行に配置したHold時の修飾キーです。これをやると、高速入力時に修飾キーが入力されてしまうんではないか、と思われますが、ファームウェア側の処理が絶妙に変わっています。タタン、というような打鍵をした場合は、ちゃんとアルファベットが入力されるようになっています。
ただし、ほぼ同時にキーを入れるような挙動をするとうまく効かないケースがある（事実上逆に入ってしまう）ケースもあったので、若干の慣れが必要です。

こうすることで、大抵の部分はほとんど無理な運指がない状態で行うことが出来るようになりました。ただ、まだ変更したばかりですんで、不満点もあります。

* JIS配列の記号が入りきらない
  * 普通のキーボード（ノートPC、HHKB）を使うケースもあるので、ここはあまり変えたくないところです
  * 今の時点で乖離しまくっている気が・・・
* Layer切り替えキーが遊んでいる
  * Tap-Danceとかoneshot modifierを使うなどして、無駄をなくしていきたいところです

利用できるキーそのものを削った弊害みたいなものなので、これから良く考えます・・・。

## キー配列をじっくり考えるということ ##
普通のキーボードでは、実現するのがいささか辛かったり、微妙だったりというキー配列でも、Ergodox（というよりもファームウェア）自体をいじることで実現できます。

一回設定してそれっきりになっている方は、ErgodoxのAdvent Calendarもありますたし、新しい年（もう一ヶ月過ぎそうだけど）の始めにじっくり向き合ってみてはどうでしょうか。やり過ぎるといつまで立っても終わらないので、それはそれで程々にやることをオススメします。