ErgoDoxのキーマップをいじる時に見るチートシート

はじめに
---

ErgoDoxというかQMKのキーマップについて、です。READMEとかソースコードとかみてまわるのがつらいので対応表にしました。全てではなく、特殊なものだけ抽出しています。

_(簡単なものはREADME見ればすぐに理解できて覚えられると思います。)_

キーマップの変更方法は[ErgoDox EZのキーマップを変更する - Qiita](http://qiita.com/ReSTARTR/items/f84f8f3c4c51c876cb2f)を参照してください:bow:

キーマップ
----

- 大文字の場合はそのままの表記(そのままをキーマップに指定する)
- `mod` は何らかのmodifier(ctlやshiftのキー)を指す
- `kc`  は何らかのkey(aや;等のキー)を指す

| 機能                    | キーマップ | 詳細           |
|-------------------------|------------|----------------|
| Reset                   | `RESET`                                    | リセット（ピンで指すのと同じ)
| No action               | `KC_NO`                                    | 何もしない
| Transparent             | `KC_TRNS`    <br />`KC_TRANSPARENT`        | 下層レイヤーのキーマップを引き継ぐ
| Shift                   | `S(kc)`<br />`LSFT(kc)` | Shift + _kc_
| Function                | `F(n)`<br />`FUNC(n)`<br />`KC_FNn` | fn_actionsに登録された機能を呼びだす([1.5 Fn key](https://github.com/jackhumbert/qmk_firmware/blob/master/tmk_core/doc/keymap.md#15-fn-key)を参照)
| Modifier Tap            | `MT(mod, kc)`<br />`mod_T(kc)`             | 押しっぱなしで`mod`、タップで_kc_
| C\_S                    | `C_S_T(kc)`          | 押しっぱなしでCtrl + Shift、タップで_kc_
| Meh                     | `MEH_T(kc)`   | 押しっぱなしでCtrl + Alt + Shift、タップで_kc_
| Cag                     | `LCAG_T(kc)`  | 押しっぱなしでCtrl + Alt + Gui、タップで_kc_
| ALL                     | `ALL_T(kc)`                                | 押しっぱなしでCtrl + Alt + Shift + Gui、タップで_kc_
| Tap layer               | `LT(layer, kc)`                            | 押しっぱなしでレイヤーを一時的に切り替え、タップで_kc_
| Switch layer            | `MO(layer)` <br />`LT(layer, KC_TRNS)`     | 一時的にレイヤーを切り替え。キーを離せば元に戻る。（２つめはKC_NOでもほぼ同じ意味）
| Toggle layer            | `TG(layer)` <br />                         | レイヤーを切り替え。キーを押すたびにレイヤーを行き来する。切り替えた先のレイヤーにも同じ指定が必要(`KC_TRNS`で引き継げばOK)。
| Temporary default layer | `DF(layer)`                                | デフォルトレイヤーを切り替える。電源切れたら元に戻る。

補足事項
----

#### Guiキーについて

- MacならCommandに相当するもの

#### `mod_T(kc)`と`mod(kc)`は意味が異なるので注意

- `SFT_T(kc)`と`LSFT(kc)` の例でいうと
  - `LSFT(KC_J)` → Shift + J(大文字)
  - `SFT_T(KC_J)` → タップなら`j`(小文字), 長押しならShift
  - `MT(KC_LSFT, KC_J)` → タップなら`j`(小文字), 長押しならShift

#### マクロの独自定義

- `S(kc)`や`F(kc)`というのはエイリアス
  - 登録されていないものでも独自に定義が可能
- Modifierの組み合わせは論理和を使えば良い
  - 組み合わせるビット定義は[qmk_firmware/keymap.h at master · jackhumbert/qmk_firmware](https://github.com/jackhumbert/qmk_firmware/blob/master/quantum/keymap.h)を参照

エイリアスの定義

```c
// LALTのエイリアス
#define A(kc) LALT(kc)
```

独自Modifierの定義

```c
// `Gui + Shift + kc` (= `kc | 0x5000`でも可)
// quantum/keymap_common.hの以下記述を参考に設定している
//   #define LGUI(kc) kc | 0x0800
//   #define LSFT(kc) kc | 0x0200
#define G_S(kc) kc | 0x0800 | 0x0200 
```

こうすれば、`LGUI(LSFT(KC_4))`と入れ子にしていたのが`G_S(KC_4)`のように簡潔になる

参考資料
----

- 基本概念は下記を参照
  - [Keymap framework - how to define your keymap](https://github.com/qmk/qmk_firmware/blob/master/docs/keymap.md)
- KC_*の定義
  - [qmk_firmware/keycode.h at master · jackhumbert/qmk_firmware](https://github.com/jackhumbert/qmk_firmware/blob/master/tmk_core/common/keycode.h)
- Modifierとかの定義
  - [qmk_firmware/keymap.h at master · jackhumbert/qmk_firmware](https://github.com/jackhumbert/qmk_firmware/blob/master/quantum/keymap.h)