Ergodox EZ を使ってみよう

# Ergodox EZ

Ergodox EZ は、セパレート式が特徴のキーボードです。
最近、いろいろ記事が出ていたので、知っている方も多いと思われます。

- [漢(オトコ)のコンピュータ道: キーボードを新しくした話（ErgoDox）]
(http://nippondanji.blogspot.jp/2016/01/ergodox.html) 
- [ErgoDox EZが届いた · I Will Survive](http://blog.restartr.com/2016/03/31/got-my-ergodox-ez/)
- [ErgoDoxを購入して人生がバラ色になった - YAMAGUCHI::weblog](http://ymotongpoo.hatenablog.com/entry/2016/03/25/203734)
- [流行りにのってErgoDox EZを買ってしまった - タオルケット体操](http://hachibeechan.hateblo.jp/entry/first-impression-of-ergodox-ez)

この記事では紹介はそこそこに、「買ったあとどうやって使ってるの？」というところをメインに解説しようと思います。
すでにお持ちの方は、「カスタマイズはどうするの？」まで飛ばしても構いません。

![2016-04-28 08.50.32.jpg](https://qiita-image-store.s3.amazonaws.com/0/724/c5fa1e2d-5c1f-3915-a306-e3d25620c4c6.jpeg)


ちなみに私は、RubyKaigi 2015 の懇親会でアーロンさん（[@tenderlove](https://twitter.com/tenderlove)）たちとキーボードの話をしている時に知りました。`Z`キーの長押しで `Ctrl` が入るなど、かなり深くカスタマイズできるのが面白そうでした。アーロンさんは Ergodox を愛用していて、[Norman 配列](https://normanlayout.info/) で最適化していると話していました。
アーロンさんのセッティングについてはインタビュー記事があります。

- [The Setup / Aaron "tenderlove" Patterson](https://usesthis.com/interviews/aaron.patterson/)

外出用に、[Atreus Keyboard Kit](http://atreus.technomancy.us/) というキーボードを常に持参しているそうです。これもきになる...

 - [The Atreus is good for travel, but I wish it had a mouse nub so I didn't have to reach for the trackpad](https://www.instagram.com/p/yr3tpkAAXA/)

## Ergodox と Ergodox EZ は何が違うの？

[ErgoDox](http://ergodox.org/) は、キーボードの設計、コードをオープンにしているプロジェクトです。
Ergodox EZ は、プロジェクトの成果をベースに販売している完成品です。

# どうやって手に入れるの？どれ買えばいい？

こちらから注文できます。

- [ErgoDox EZ: An incredible mechanical keyboard | Indiegogo](https://www.indiegogo.com/projects/ergodox-ez-an-incredible-mechanical-keyboard#/)

クラウドファンディングの形式で販売していますが、現在はいつでも注文できます。バッチ生産っぽい(?)ので、注文してから届くまで少しタイムラグがあるようです。

上記サイトの右側メニューにいろいろとラインナップがありますが、バラしてみると以下のようになります。

- 本体
- キーキャップ(ブランク or 印刷済)の有無
- リストレストの有無
- ティルトキットの有無

私は「ErgoDox EZ Bundle: Blank($295)」を注文しました。これは上記全てがバンドルされている商品です。正直、リストレストとティルトキットは **必須** だと思います。本体自体の高さが結構あるのでリストレストがないと腕が落ち着かないのと、ティルトキットでキーボードの角度を決められるので自然な手の角度に調整できるためです。
さらに、キーの位置を自由にカスタマイズできる特性を考えると、個人的にはキーキャップもブランクをオススメします。

## キースイッチの種類は？

上記のサイトで注文後、メールで「どのキースイッチにする？」と尋ねるメールが届きます。記載されたサイトのフォームからキースイッチを選ぶことができます。

種類は、茶、赤、青、黒、白、黄と揃っています。詳しくは各自調査ください。私は軽さと静音を求めて赤にしました。

# 届いた！けど、慣れない...

到着おめでとうございます！早速マシンにつなげて体験しようとしたあなたは面喰らうでしょう。**キー配列が全然わからん**と。

## チートシートをみよう

はい、チートシートを見ましょう。デフォルトのキー配列は上記購入ページに載っています。

- [ErgoDox EZ: An incredible mechanical keyboard | Indiegogo](https://www.indiegogo.com/projects/ergodox-ez-an-incredible-mechanical-keyboard#/)

また、GitHub に大きめの画像があります。

- [qmk_firmware/default.png at master · jackhumbert/qmk_firmware](https://github.com/qmk/qmk_firmware/blob/9af995c59b2655fa347e43b1eab2122e72ef7fe3/keyboards/ergodox/keymaps/default/default.png)
- [qmk_firmware/default_highres.png at master · jackhumbert/qmk_firmware](https://github.com/qmk/qmk_firmware/blob/9af995c59b2655fa347e43b1eab2122e72ef7fe3/keyboards/ergodox/keymaps/default/default_highres.png)

最初の1週間はブラウザのタブの一つはこのページになることでしょう。おそらく段々と慣れてきて、デフォルト配列からカスタマイズをしたくなってきます。

## ティルトキットを調整しよう

キー配列のカスタマイズと同様に、ティルトキットのカスタマイズもしてみましょう。片側にそれぞれ3つある足の高さを調整することができます。私は、人差し指側を少し高めにして全体を山なりにしています。

# カスタマイズはどうするの？

だんだん慣れてくると、キー配列のカスタマイズをしたくなってきます。

## カスタマイズの手順

Ergodox EZ は [Teensy USB Development Board](https://www.pjrc.com/teensy/) を利用したプログラマブルなキーボードです。コンパイルしたファームウェアをキーボードに流し込んでキー配列を自由に決めることができます。

販売ページにも説明がありますが、ここでは二つの方法を解説します。

## 流し込み手順

どちらの場合でも、出来上がった `.hex` ファイルを本体に流し込む必要があります。なので、先にその方法を解説します。

[Teensy Loader Application](https://www.pjrc.com/teensy/loader.html) をダウンロードし、起動します。

![Teensy.png](https://qiita-image-store.s3.amazonaws.com/0/724/dcccc8ad-d304-943b-992e-a56df6fd1fab.png)

Ergodox EZ を USB 接続し、本体の右手上部にある小さな穴のスイッチを針などで押します。すると以下のようになります。

![Teensy.png](https://qiita-image-store.s3.amazonaws.com/0/724/065c39e4-aa0d-77c5-9e6b-f31d37648971.png)

この状態で、Open File（紫ボタン）から `.hex` ファイルを指定するか、アプリ上にファイルをドロップします。その後、Program（下矢印ボタン）を押し、Reboot（右矢印ボタン）を押すと、新しいファームウェアで再起動します。

# GUI でカスタマイズ

下記のサイトでは、GUI でキー配列を決め、コンパイルしたファームウェアをダウンロードすることができます。

- [Ergodox Configurator - Massdrop](https://keyboard-configurator.massdrop.com/ext/ergodox) 

# ファームウェアのコンパイル

GUI のカスタマイズでは、長押しした時の挙動など細かい挙動の定義ができません。そのような挙動を定義するには、ファームウェアを自分でコンパイルする必要があります。

とはいえ、手順はそんなに難しくありません。下記のリポジトリを clone し、ベースとなるファイルを変更してカスタマイズができます。

- [jackhumbert/qmk_firmware](https://github.com/jackhumbert/qmk_firmware) 

このリポジトリには、他のプログラマブルキーボードに加えて、Ergodox EZ 専用のプログラムがあります。[^1]

- [qmk_firmware/keyboard/ergodox_ez at master · jackhumbert/qmk_firmware](https://github.com/jackhumbert/qmk_firmware/tree/master/keyboard/ergodox_ez)

[^1]: fork 元の [tmk/tmk_keyboard](https://github.com/tmk/tmk_keyboard) は、様々なキーボードをプログラマブルにするプロジェクトです。qmk_firmware は、Ergodox EZ などに特化した fork で、Ergodox EZ の中の人も参加しています。

## 準備

ファームウェアをコンパイルするための環境をセットアップします。

- [qmk_firmware/docs/getting_started_build_tools.md](https://github.com/qmk/qmk_firmware/blob/master/docs/getting_started_build_tools.md)

Mac で homebrew を使っている場合は、以下で完了です。

```
brew tap osx-cross/avr
brew install avr-libc
brew install dfu-programmer
```

## カスタマイズしてコンパイル

[qmk_firmware/keyboard/ergodox_ez/keymaps](https://github.com/jackhumbert/qmk_firmware/tree/master/keyboard/ergodox_ez/keymaps) ディレクトリ以下に、すでにいろいろなキーマップが用意されています。
ここでは、デフォルト設定を元に変更をしてみます。

1. `keymaps/default/keymap.c` を、`keymaps/your_name/keymap.c` にコピーする
2. 編集する（詳しくは後述）
3. `keyboard/ergodox_ez` ディレクトリで、`make KEYMAP=your_name`  を実行する。
4. `keyboard/ergodox_ez` ディレクトリ に `ergodox_ez.hex` ができている。（ファイル名は固定されている。上書きされるので注意）

もしデフォルト設定に戻したい場合は、 `3.` の手順で `make` だけを実行すればデフォルト設定の `ergodox_ez.hex` が作成されるので、それを利用するとよいでしょう。

## キーマップのカスタマイズ

一番気になる、カスタマイズの方法です。
デフォルト設定から抜粋すると、以下のようになっています。

```
/* Keymap 0: Basic layer
 *
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 * |   =    |   1  |   2  |   3  |   4  |   5  | LEFT |           | RIGHT|   6  |   7  |   8  |   9  |   0  |   -    |
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 * | Del    |   Q  |   W  |   E  |   R  |   T  |  L1  |           |  L1  |   Y  |   U  |   I  |   O  |   P  |   \    |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * | BkSp   |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |; / L2|' / Cmd |
 * |--------+------+------+------+------+------| Hyper|           | Meh  |------+------+------+------+------+--------|
 * | LShift |Z/Ctrl|   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |   ,  |   .  |//Ctrl| RShift |
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 *   |Grv/L1|  '"  |AltShf| Left | Right|                                       |  Up  | Down |   [  |   ]  | ~L1  |
 *   `----------------------------------'                                       `----------------------------------'
 *                                        ,-------------.       ,-------------.
 *                                        | App  | LGui |       | Alt  |Ctrl/Esc|
 *                                 ,------|------|------|       |------+--------+------.
 *                                 |      |      | Home |       | PgUp |        |      |
 *                                 | Space|Backsp|------|       |------|  Tab   |Enter |
 *                                 |      |ace   | End  |       | PgDn |        |      |
 *                                 `--------------------'       `----------------------'
 */
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = KEYMAP(  // layer 0 : default
        // left hand
        KC_EQL,         KC_1,         KC_2,   KC_3,   KC_4,   KC_5,   KC_LEFT,
        KC_DELT,        KC_Q,         KC_W,   KC_E,   KC_R,   KC_T,   TG(SYMB),
        KC_BSPC,        KC_A,         KC_S,   KC_D,   KC_F,   KC_G,
        KC_LSFT,        CTL_T(KC_Z),  KC_X,   KC_C,   KC_V,   KC_B,   ALL_T(KC_NO),
        LT(SYMB,KC_GRV),KC_QUOT,      LALT(KC_LSFT),  KC_LEFT,KC_RGHT,
                                              ALT_T(KC_APP),  KC_LGUI,
                                                              KC_HOME,
                                               KC_SPC,KC_BSPC,KC_END,
        // right hand
             KC_RGHT,     KC_6,   KC_7,   KC_8,   KC_9,   KC_0,             KC_MINS,
             TG(SYMB),    KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,             KC_BSLS,
                          KC_H,   KC_J,   KC_K,   KC_L,   LT(MDIA, KC_SCLN),GUI_T(KC_QUOT),
             MEH_T(KC_NO),KC_N,   KC_M,   KC_COMM,KC_DOT, CTL_T(KC_SLSH),   KC_RSFT,
                                  KC_UP,  KC_DOWN,KC_LBRC,KC_RBRC,          KC_FN1,
             KC_LALT,        CTL_T(KC_ESC),
             KC_PGUP,
             KC_PGDN,KC_TAB, KC_ENT
    ),
```

[qmk_firmware/keymap.c at master · jackhumbert/qmk_firmware](https://github.com/jackhumbert/qmk_firmware/blob/master/keyboard/ergodox_ez/keymaps/default/keymap.c)

パッと見てわかる通り、基本的には該当するキーの位置に `KC_A` などを記述すればよいです。基本的なキーの定義は [keycode.h](https://github.com/jackhumbert/qmk_firmware/blob/master/tmk_core/common/keycode.h) にあります。

特殊なキーも設定できます。例としてデフォルト設定では、Z キーは長押しすると Ctrl キーとして動作します。上記で Z キーの箇所を見ると、

```
CTL_T(KC_Z)
```

と定義できます。長押しで動作を変えたいキーは上記のように定義します。
長押しできるキーは以下の通りです。

- `CTL_T(kc)` - 長押しで左Ctrlキー、タップで *kc* キー
- `SFT_T(kc)` - 長押しで左Shiftキー、タップで *kc* キー
- `ALT_T(kc)` - 長押しで左ALTキー、タップで *kc* キー
- `GUI_T(kc)` - 長押しで左GUI（MacのCommandキー、WindowsのWinキーなど）、タップで *kc* キー
- `ALL_T(kc)` - 長押しでHyperキー、タップで *kc* キー
  - Hyper キーは Alt+Ctrl+Shift+Cmd の同時押し状態。Hyper+キーを OS などのショートカットに登録することで、アプリにキー入力を取られずにショートカットを使うハック。詳しくは [A useful Caps Lock key - BrettTerpstra.com](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)
- `LCAG_T(kc)` - 長押しでCtrl+Alt+Guiキー、タップで *kc* キー
- `MEH_T(kc)` - 長押しで Alt+Ctrl+Shift キー、タップで *kc* キー
   - Hyper から Gui(Cmd/Win) を抜いたもの

また、レイヤーごとのキー設定もできます。`L1` （デフォルトでは右手人差し指あたり）と定義されたキーを押すと、キーボード全体がレイヤー1の状態になります。デフォルトでは、数字やカッコなどの記号が並んでいる状態になります。また `L2` （デフォルトでは `;` の長押し）も同様にレイヤー2の状態になります。もちろんレイヤー1,2のキーマップも上記と同じようにカスタマイズできます。

さらなる詳細は [jackhumbert/qmk_firmware](https://github.com/jackhumbert/qmk_firmware#quick-aliases-to-common-actions) の README.md をご覧ください。マクロの登録や、LED の状態変更などもできるようです。

# 私のカスタマイズ

最後に、私のやっているカスタマイズをお伝えします。以下のリポジトリで管理しています。

- [qmk_firmware/keymap.c at my-layout · kei-s/qmk_firmware](https://github.com/kei-s/qmk_firmware/blob/my-layout/keyboards/ergodox_ez/keymaps/osx_ja/keymap.c)

Mac で作業をする前提でカスタマイズをしています。

## RESET キーをアサインする

この設定は、一番にオススメする設定です。
先ほどからカスタマイズの方法を解説してきましたが、カスタマイズにおいて一番のネックになるのは、 **Ergodox EZのリセットボタンが非常に押しにくい**という点です。
リセットボタンの穴が小さい上にボタン位置が深いため、爪楊枝程度では押せず、裁縫針を使って押していました。

ありがたいことに、キーマップとして、このリセットボタンと同様の働きをする `RESET` というキーがあります。カスタマイズする際は、何より先にこのキーをどこでもいいのでアサインしましょう。私は、[レイヤー2で A キーの隣に配置しています](https://github.com/kei-s/qmk_firmware/blob/my-layout/keyboards/ergodox_ez/keymaps/osx_ja/keymap.c#L102)。

## 日本語変換

私は Ergodox EZ の前から、Macbook の英字配列を使っていました。日本語変換の「英数/かな」の切り替えには、[Karabiner](https://pqrs.org/osx/karabiner/index.html.ja)を使って、左右コマンドキーのタップで「英数/かな」が入るように設定していました。Ctrl+Spaceでも切り替えられますが、状態のトグルは人間の脳に負担が高いためです。
[Ergodox EZ でもこれが使えるようにしています](https://github.com/kei-s/qmk_firmware/blob/my-layout/keyboards/ergodox_ez/keymaps/osx_ja/keymap.c#L21)。

# 最後に

思いがけず長くなってしまいました。
ぜひ Ergodox EZ を手に入れて、使ってみてください。そして良いカスタマイズの知見があれば共有してください。