ErgoDoxEZの日本語変換(英語QWERTY配列キーボード)※Windowsに限るはず

学生時代から英語キーボードを使ってきた。
最初は日本語キーボードだったのだが、Microsoftのエルゴノミクスキーボードが安く売り出されていたため、勢いで飛びついた。
しかし、よくよく見たら英語キーボードだったことから失敗したと思いつつ、それ以降英語キーボードを使うようになった。

如何せん、日本語切り替えが煩わしい。
それは、どのキーボードを使っていようが、英語キーボード設定であればつきまとう問題だ。
否。それはErgoDoxEZで解決できる。
ただし、WindowsOSに限るはず。同じ状態でMacOSで試したところ動かなかった(切り替え方法が異なるのだから当たり前だが)。

#注意事項
今回の日本語入力のオン／オフは、Altキーとグレイヴ(\`)キーの組合せを基本とする。
そして、C言語を多少なりとも触ることになる(マクロ定義で利用する程度なので、今回のプログラムを流用すれば問題ないはず)。

[wikipedia：QWERTY配列](https://ja.wikipedia.org/wiki/QWERTY%E9%85%8D%E5%88%97 "ウィキペディア")
他の配列で出来るのか知らないが、きっと出来るだろう。
前提は、
　　・WindowsOSであること。
　　・英語配列キーボードであること。
　　・ErgoDoxEZでQMKを使っていること。
　　・ほんの少しC言語が使えること(コピペできる読解力があれば問題ない)。

本題はこちら⇒[本題のプログラム(コピペで使える)](#keymapc)


#以下,前戯
##ErgoDoxEZ標準の日本語キーボード設定を流用
結論は、当然のように失敗する。

```ErgoDox:keymap.c
#include "keymap_jp.h"
　　・
　　・
　　・
JP_ZHTG　// ←どこかのキーに割り当てる(KC_Aと同じ使い方)
　　・
　　・
　　・
```

`JP_ZHTG`は、日本語切り替え(半角/全角)ボタンに相当するのだが、そもそもこれを使うには、日本語キーボードを設定しなければならなかった。
英語キーボードで使った場合、チルダ(?)キーが出力された。
失敗
さらに失敗したのは、キーボード設定をしたときに、OSを再起動したことだった。
![日本語切り替え.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/953ed02c-37f1-3505-c6ca-47a3bc8412d6.jpeg)
パスワードに記号を含めているため、ログインできずに焦った(狂った記号配列になることを忘れていた)。

##国際キー(?)
キーボードのキーにインターナショナルという割り当てがなされている。
これを使うことにした。

```ErgoDox:keymap.c
//　　今回includeは不要
// ↓どこかのキーに割り当てる(KC_Aと同じ使い方)
　　・
　　・
　　・
KC_INT1,
KC_INT2
　　・
　　・
　　・
```

ダメだった。
日本語キーボードの設定では、`KC_INT2`が日本語入力のOnの設定に切り替わったが、Offには出来なかった。
そもそもやりたいことは英語キーボードなので、趣旨が異なる。

今回のキーは、`KC_RO`・`KC_KANA`に別名が割り当てられているので、有名なキーコードなのかも知れない。

まさかと思い、`KC_INT3`を試したが、案の定ダメだった(日本語キーボードでは¥記号になる)。
`KC_INT4`では、ATOKを使っているからか確定文字を再変換するキーとして動いたが、やはり日本語キーボードにしているからであり、英語キーボードでは無反応だった。

それっぽい動きとして、`KC_INT5`は全角文字・片仮名・半角片仮名に切り替えられるが、英語には切り替えられない(ATOK特有？)。

##みんな大好きLANG

```ErgoDox:keymap.c
//　　今回includeは不要
// ↓どこかのキーに割り当てる(KC_Aと同じ使い方)
　　・
　　・
　　・
KC_LANG1,
KC_LANG2
　　・
　　・
　　・
```

[他で話題](https://qiita.com/miyaoka/items/e3f7242b4767cd599364 "変わり種ErgoDox紹介 + IME話")になっているとおり、私の環境(Windows10)でも変換できなかった。

しつこいようだが、`KC_LANG3`・`KC_LANG4`・`KC_LANG5`を試すが、全くトンチンカンなことをしているようで、無反応だった。

#OS側がこちらで任意に設定したキーコードで切り替える。
[Planckキーボード：MacとWindows（とiOS）で同じキーを使って日本語入力の切替。](http://leopardgecko.hatenablog.com/entry/2017/11/09/124103 "leopardgeckoのブログ")
[ErgoDox「この中でいらないキーにはIME 担当になってもらいまーーーすwww」](https://qiita.com/euxn23/items/c78c40869e4870690910 "@euxn23")
では、結構高度なことをしている。
[変換][無変換]などで切り替えることが可能なようだ。
しかし、私にそんな高度なことは出来ない。
そもそもOS側のIMEを設定するのは面倒だ。

#Tap The Last Show
幾日か前に、[AutoHotKeyでCtrl+Spaceを全角／半角切り替えを行う](https://qiita.com/chesscommands/items/bfef1fae2b21553bd5f6 "手前味噌の投稿")投稿をした。
しかし、ErgoDoxEZで使うには、支障をきたすようになった。
その組合せでは、押しやすい[キー配置](https://ja.wikipedia.org/wiki/キー配列 "ウィキペディア")にしていないためだ。
そのため、今回新たに日本語切り替えを模索したというわけだ。

##C言語と言うからには、マクロが使える。
[ErgoDoxでマクロを使う](https://qiita.com/teri_yakichan/items/db54589b67ba9330faed "@teri_yakichan")
申し訳ないが、何を言っているのか全く理解できない。
10年以上C言語に関わってきたが、この程度も理解できないとは・・・。

しかし、マクロを使わなければ、実装できそうにないのは分かった。
逆に言えば、マクロさえ使えれば、ワンタップで切り替えられると言うこと。
ならば、お見せしよう。
私のタップ ザ ラスト ショウの幕開けだ。

（C言語を使う場合、[ブラウザ](https://configure.ergodox-ez.com/keyboard_layouts/exvdnb/edit "ERGODOXEZ")でキーマッピングしたのが無駄になるという・・・）

##前準備省略
コンパイル環境などはありますよね。

##Keymap.c
ソースコードの下側に、`const macro_t *action_get_macro`らしき文字列が見えるはず。
これが関数の始まりを示す。
このなかに、今回やりたいことを記述していく。


※ここに記載しているやり方(MACRO)は古い。
※最新⇒[日本語英語切り替え方法](https://qiita.com/chesscommands/items/ce2883ad0a0c6c27c8de#日本語英語切り替え方法)


```ErgoDox:keymap.c
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
  // MACRODOWN only works in this function
  switch(id) {
//　　この辺りに既存のソースコードがあるはず(上側のも既存だが)。
//　　↓ここから今回追加したソースコード
	case 2:　// ←既存の番号とかぶらない番号を付ける必要がある(今回"2"を割り振った)。
		if (record->event.pressed) { // 日本語入力のオン／オフ（英語配列）
			return MACRO( D(LALT), T(GRAVE), U(LALT), END);
		}
		break;
//　　↑ここまで今回追加したソースコード
  }
  return MACRO_NONE;
};
```

これで、マクロの登録が完了したことになる。
今度は、このマクロを呼び出す必要がある。
呼び出し方法はよく分かっていないのだが、以下で使えるようになった。

```ErgoDox:keymap.c
　　・
　　・
　　・
KC_Q, M(2), KC_E
　　・
　　・
　　・
```

`M(2)`が今回追加したマクロ呼び出しのキーコードになる。
デフォルトのキー配列(qwerty)で言えば、`Wキー`を押した場合、日本語切り替えが可能になる。
括弧内の数字は、`case`の後ろで使った数字を当てはめるため、人によっては、16だったり128だったり様々だろう。

お察しの通り、タップするだけで切り替わるが、それは状態が常に変化するため、意識しなければ日本語変換できると思っていたのに英語入力のままだったと言うことになる。

#追記
今まで、\`記号をチルダだと思っていたが、グレイヴだった。
チルダ記号：~
グレイヴ　：\`

Altキーとグレイヴの組合せで、日本語／英語切り替えができる。

以上。