Helixファームウェアのカスタマイズ 2

「Helixファームウェアのカスタマイズ 1」より

●フォルダ名を変更しても大丈夫な「five_rows_jis」

さて、前回までで、遊舎工房のファームウェアについてのガイドに書いてある通りに、/keyboards/helix/rev2/keymaps/ にある defaultフォルダを複製、その名前を変更した上で/keyboards/helix/rev2/keymaps/ にペーストし、
make git-submodule
make helix:変更した名前
でビルドする……というやり方では、エラーが出てしまってうまくできない、ということが判明した。

これは「1. QMKファームウェア一般の問題」なのか、それとも「2. Helixのファームウェア一般の問題」なのか、それとも「3. defaultファームウェア固有の問題」なのだろうか。
試しに今度はdefaultと同じく/keyboards/helix/rev2/keymaps/ にある、defaultとは別のフォルダの一つ、「five_rows_jis」でフォルダ名の書き換えを試してみることにした。
まず何も変更せず、
make helix:five_rows_jis
と入力すると、問題なくビルドに成功した。
次にこのフォルダの名前を「kubota」に変更し、
make helix:kubota
と入力すると……
お? ビルドに成功した。

どうもdefaultフォルダをベースにして名前を変えるとビルドに失敗してしまうが、five_rows_jisをベースにすると、名前を変えても成功するようだ。
なぜなのかはわからない。
遊舎工房のファームウェアについてのガイドには「defaultフォルダの名前を変えろ」とあるのだから、こんなことが起こるのは筆者のPCだけなのかもしれない。
だとしたら何が理由なのだろう。
まあ素人が考えても仕方のないことだ。

●「QMK Configurator」で「default」のカスタマイズに成功

ここで、改めてQMK Configuratorの動作を検証してみた。
QMK Configuratorのサイトで、「きーぼーど」一覧から「helix_rev2」を選択し、何も変えずに「COMPILE」ボタンをクリックし、ビルドされたファームウェアをダウンロードした。
そのファームウェアの名前を変えた上で、QMK Toolboxで書き込みしてみたところ、問題なく動作した。

そこで今度はサイト上でキーマップを少しだけ変更した上で、ビルド、ダウンロード、書き込みしてみた。
と……無事に書き込みできた。
実際にキーボードを使ってみても、こちらの変更した通りに入力できている。
成功だ。
そこで、少しずつ変更を増やしながら、何度かビルド、ダウンロード、書き込みを繰り返した。
問題なく書き込め、入力もできる。
思い切って完全にカスタマイズして、ビルド、ダウンロード、書き込み。
問題ない。
普通に書き込みでき、動作も正常なファームウェアができた。

ええ? しかし、なんで?
前のときは全く同じようにやって、異常動作を起こしてしまったのに。
まあしかし、これでとりあえず、キーマップのカスタマイズに成功したわけである。
どうも釈然としないが……前回は何がいけなかったのだろう。

さて、QMK Configuratorによるキーマップのカスタマイズはできたわけだが、問題は残っている。
まずQMK Configuratorでカスタマイズすると、hexファイルはできるのだが、こちらでいじれるようなテキストの形では手元に残らない。
それとQMK Configuratorでベースに使った「helix_rev2」は以前にダウンロードした「helix_rev2_default_oled_underglow.hex」とは異なり、UnderglowもOLEも使用しない前提になっているらしく、照明も表示も消えてしまった。

遊舎工房のガイドによれば、キーマップフォルダ内の rules.mk の記述「LED_UNDERGLOW_ENABLE」を no から yes に変更し、
LED_UNDERGLOW_ENABLE = yes
とし、同じく「OLED_ENABLE」も、
OLED_ENABLE = yes
と変更してやれば、どちらも使えるようになるとのこと。
だがそれには、ビルド前のテキストファイルをエディタで書き換えてビルドしなければならない。
というわけで、今度はdefaultではなくfive_rows_jisをベースとして、もう一度msys2でのカスタマイズにチャレンジすることにした。

●five_rows_jisベースでカスタマイズ

筆者がカスタマイズしたキーマップを含むフォルダを「kubota」として、その中のkeymap.cのカスタマイズを始める。
まずは上記のように、遊舎工房のガイドに従ってkubotaフォルダ内のrules.mk にある、
LED_UNDERGLOW_ENABLE を no から yes に変更。
同じくrules.mk にある、
OLED_ENABLE を no から yes に変更。

ここまではいい。
以後は慎重に、いろいろ試しながら進めていった。
まず、kubotaフォルダのkeymap.cを削除し、defaultフォルダのkeymap.cをコピペした上でmsys2を起動し、

cd /C/Users/QZB13/OneDrive/Downloads/QMK/qmk_firmware/
make git-submodule
make helix:kubota

としてみた。
と、これがビルドできず、以下のような表示が出て、エラーになってしまう。

Compiling: keyboards/helix/rev2/keymaps/kubota/keymap.c keyboards/helix/rev2/keymaps/kubota/keymap.c:93:4: error: ‘_SYMBOLS’ undeclared here (not in a function)
[_SYMBOLS] = LAYOUT( \
^
keyboards/helix/rev2/keymaps/kubota/keymap.c:93:4: error: array index in initializer not of integer type
keyboards/helix/rev2/keymaps/kubota/keymap.c:93:4: note: (near initialization for ‘keymaps’)
[ERRORS] |
|
|
make[1]: *** [tmk_core/rules.mk:380: .build/obj_helix_rev2_kubota/keyboards/helix/rev2/keymaps/kubota/keymap.o] エラー 1
Make finished with errors
make: *** [Makefile:574: helix:kubota] エラー 1

確認のため、ここでkeymap.cをもとのfive_rows_jisフォルダのkeymap.cに戻してから、

cd /C/Users/QZB13/OneDrive/Downloads/QMK/qmk_firmware/
make git-submodule
make helix:kubota

と入力すると、予想通り問題なくビルドできた。

理由はわからないが、five_rows_jisのフォルダにdefaultフォルダのkeymap.cを使うと、何かと衝突して機能しなくなってしまうようだ。
言い換えると、defaultと同様、five_rows_jisにはfive_rows_jisで何らかの制限があって、好きなようにkeymap.cをいじることはできないということだ。

●石橋を叩いてカスタマイズ

となると問題は、five_rows_jisのkeymap.cをどこまでカスタマイズできるか、である。
やっていいことといけないことがあるのは確かなのだが、どこをどう直すと何と衝突してエラーになるのか、現状では皆目見当がつかない。
自分がプログラマーの人は、カスタマイズにこだわらないで一からオリジナルのファームウェアを書いたほうが早いかもしれない。
残念ながら筆者は非プログラマーなので、トライ&エラーでkeymap.cのカスタマイズを進めることにする。

とりあえずkubotaフォルダにあるfive_rows_jisのkeymap.cをエディタで変更し、
Qwerty JIS Exchange L and R
Lower JIS Exchange L and R
Raise JIS Exchange L and R
以上3つのキーマップを削除してみた。
ここで確認のため、
make helix:kubota
としてみたところ、無事にビルド成功した。

続いて同じkeymap.cの、
Qwerty JIS Normal のキー配列を変更してみた。
ここで再び、
make helix:kubota
としてみたところ、ビルド成功した。
なんというか、壊れそうな石橋を叩きつつ、一歩一歩進んでいる気分である(笑)。

さらにkeymap.cの変更を続け、
Lower JIS Normal のキー配列を変更してみた。
これもビルド成功。
うん、調子が出てきたぞ。

続いてkeymap.cの、
_BAS_E,
_LOW_E,
_RAI_E,
及び
#define DL_BASE DF(_BAS_E)
#define ML_LOWE MO(_LOW_E)
#define ML_RAIE MO(_RAI_E)
等を削除してみた。
ここで
make helix:kubota
すると……
残念ながら、エラーが出てしまった。
keymap.cの定義文を勝手に削ると、どこか別のファイルの記述と矛盾してしまうらしい。
しかたない、この記述は放置しよう。
この変更を元に戻すと、ビルドに成功した。

ここまでの変更を反映したhexファイルをQMK ToolboxでPro Microに書き込みしてみた。
結果は成功。
それまで消えていた底面のUnderglow LEDとOLEDモジュールも点灯するようになった。

●ショートカットを定義するのに一苦労

さて、ここまでで一応、筆者オリジナルの親指シフトが使えるようになった。
ちょっと使ってみると、文書の先頭と最後に飛ぶショートカット(普通はCtrl+HOMEとCtrl+END)がなくなってしまったことに気がついた。
そこでkeymap.cの、Lower JIS Normal のスペースキーと変換キーをそれぞれ、
LCTL(HOME)……Ctrl+HOME
LCTL(END)……Ctrl+END
と、してみた。
だがこれでビルドしようとするとエラーになってしまう。
何か書き方が間違っていたのか?
で、
LCTL(HOME)をLCTL(KC_HOME)に
LCTL(END)をLCTL(KC_END)に
にしてみたが、やっぱりエラーになる。
続いて、
LCTL(KC_HOME)をC(KC_HOME)に、
LCTL(KC_END)をC(KC_END)に、
それぞれ書き換えたら、今度はうまくビルドできた。

やれやれ。
何かと気難しいね、QMKファームウェア。
ともあれこれでなんとか、実用的なオリジナル親指シフトの配列が完成した。

もともと合計で6つあったfive_rows_jisのkeymap.cのレイヤーのうち、
「Qwerty JIS Exchange L and R」「Lower JIS Exchange L and R」「Raise JIS Exchange L and R」の3つは削除。
「Lower JIS Normal」と「Raise JIS Normal」の2つで配列を変更。
「Adjust (Lower + Raise) Common map for Normal and Exchange」はそのまま残してある。
以下が変更した2つのレイヤーのkeymapになる。

●次なる挑戦は……少し先に(笑)

変更後の配列も、基本は一般的なQWERTY配列となっている。というのも、実際はこのまま使うのではなく、「DvoraqJ」で改めて配列を変更して、筆者オリジナルの親指シフトで使っているからだ。
メインで使っているDELLのL100キーボードと併用するには、そのほうが使いやすい。キーボードを変えるたびにDvoraqJをオン・オフしていたのでは、面倒でしかたがない。
筆者以外にも、HelixをQWERTY配列で使い、DvoraqJで親指シフトしている人はいる。たとえばこちらの「自作キーボードで親指シフトを設定する方法【Helix】」という方。

ただHelixキーボードの場合、DvoraqJのようなWindows用のキーリマップアプリを使わなくても、QMKファームウェア側で親指シフトを実現でき、既にそのように使っている人もいる。たとえばこちら、「iPad Proで親指シフト入力」。
こちらの方は「eswaiさん https://twitter.com/eswai が実装した、QMK Firmwareで親指シフト入力を実現する機能をHelixに移植しました。」とのこと。
筆者も実は、外出時などタブレットやスマホに親指シフト入力するのにHelixを使えないかと思っているので、次はそちらにチャレンジしてみたい。
ただ、ここまででちょっとくたびれてしまったので(笑)、少し先ということで。

  ≪