QMK Configuratorで日本語環境用のキーマップをビルドしたい話—Windowsで自作キーボードを簡単に使うための小ネタ—

さて、日本語環境(特にWindowsの)で自作キーボードを使うとき、日本語配列/英語配列問題に悩まされることはありませんか?

f:id:at_you_key:20210211011631j:plain

具体的にどういうことかっていうと、自作キーボードのファームウェアとしてよく使われる「QMKファームウェア」でキーマップを設定すと、英語配列(101/102)キーボードとしてのキーコードが設定されます。

そしてそれをOSが日本語配列(106/109)キーボードとして認識してしまうと、一部の記号が正しく入力できません。たとえば"["を打とうとしたはずが"@"になったりします。

www.nagasaki-gaigo.ac.jp

そんな時どうすればいいか? OSの言語設定をいじったり、レジストリをいじったり、ULE4JISという変換ソフトを使ったり、QMKファームウェアでkeymap_jp.hを使ったり、いろいろな対策方法があります。

しかし今のところ、どの方法も一長一短という感じ。 ちなみに僕はULE4JISを使ってるんですが、なにか他に入れているソフトと相性が悪いのか、近ごろ挙動が不安定で小さなストレスを感じます。

www.creativity-ape.com

そんな、混迷を極めるQMK&日本語配列問題ですが、さらにひとつ新しい選択肢を提案したいと思います。

こんな人におすすめ

  • 日本語Windowsを使っている。
  • 職場のPCなどで、いちいち設定を切り替えたくない。
  • QMK環境のセットアップがめんどくさい、挫折した。
  • 正攻法じゃなくても動けばいいよ。

この記事を書いてる途中で知ったんですか、QMK MSYSというのを使うと、すごく簡単にQMK環境をセットアップできるようなので、この記事の意義は大幅減です。 けど、環境のセットアップせずWebツールだけでキーマップ設定できるのはまだメリットだと思うので、めげずに書きました。

QMKコンフィギュレーターとは?

Webアプリ上でキーマップの編集からファームウェアのコンパイルまでできちゃう素敵ツールで、これさえあれば自分でQMK環境を用意しなくても、自作キーボードのキーマップをカスタマイズできます。

salicylic-acid3.hatenablog.com

コンパイルしたファームウェアは、QMK Toolboxというソフトを使えば、簡単に書き込めます。

docs.qmk.fm

「じゃあそれ使うだけオッケーじゃん👌」とはまだならなくて、QMKコンフィグレーターは、簡単に使える代わりに、あまり細かいカスタマイズができません(アップデートにより徐々に増えていますが)。

例によってkeymap_jp.hを使う設定っていうのも、いまのところはできないようです。

記号が違うところだけ置換したらいいんじゃない?

ちょっと汚いやり方ですが、たとえば"@"を設定したいキーをあらかじめ"["として設定しておけば、日本語配列として認識された時に"@"が入力できるというわけです。

そんなわけで、まずはkeymap_jp.hを参考にして、置き換えが必要な記号キーをリストアップしました。

    const jp_us_list = [
        ['KC_ZKHK', 'KC_GRV'], // Zenkaku ↔︎ Hankaku ↔ Kanji (半角 ↔ 全角 ↔ 漢字)
        ['KC_CIRC', 'KC_EQL'], // ^
        ['KC_YEN', 'KC_INT3'], // ¥
        ['KC_AT', 'KC_LBRC'], // @
        ['KC_LBRC', 'KC_RBRC'], // [
        ['KC_EISU', 'KC_CAPS'], // Eisū (英数)
        ['KC_COLN', 'KC_QUOT'], // :
        ['KC_RBRC', 'KC_NUHS'], // ]
        ['KC_BSLS', 'KC_INT1'], // (backslash)
        ['KC_MHEN', 'KC_INT5'], // Muhenkan (無変換)
        ['KC_HENK', 'KC_INT4'], // Henkan (変換)
        ['KC_KANA', 'KC_INT2'], // Katakana ↔ Hiragana ↔ Rōmaji (カタカナ ↔ ひらがな ↔ ローマ字)
        ['KC_HASH', 'S(KC_3)'], // #
        ['KC_AMPR', 'S(KC_6)'], // &
        ['KC_QUOT', 'S(KC_7)'], // '
        ['KC_LPRN', 'S(KC_8)'], // (
        ['KC_RPRN', 'S(KC_9)'], // )
        ['KC_EQL', 'S(KC_MINS)'], // =
        ['KC_PEQL', 'S(KC_MINS)'], // =
        ['KC_TILD', 'S(KC_EQL)'], // ~
        ['KC_PIPE', 'S(KC_INT3)'], // |
        ['KC_GRV', 'S(KC_LBRC)'], // `
        ['KC_LCBR', 'S(KC_RBRC)'], // {
        ['KC_PLUS', 'S(KC_SCLN)'], // +
        ['KC_PPLS', 'S(KC_SCLN)'], // +
        ['KC_ASTR', 'S(KC_QUOT)'], // *
        ['KC_PAST', 'S(KC_QUOT)'], // *
        ['KC_RCBR', 'S(KC_NUHS)'], // }
        ['KC_UNDS', 'S(KC_INT1)'], // _
        ['KC_ZHTG', 'KC_GRV'], // Zenkaku ↔︎ Hankaku ↔ Kanji (半角 ↔ 全角 ↔ 漢字)
        ['KC_DQUO', 'S(KC_2)'], // "
        ['KC_MEISU', 'KC_LANG2'], // Eisū (英数) on macOS
        ['KC_MKANA', 'KC_LANG1'] // Kana (かな) on macOS
    ]

Javascriptで変換してみよう

そもそも開発環境のセットアップが面倒というモチベーションでやってるので、ブラウザさえあればすぐ動かせるるjavascriptを使って、サクッと作っていきましょう。

あんまり綺麗なコードではないですが、こんな感じで変換してみます。

    let us4jp = (keymap) => {
        // 置換のためにいったん文字列にする
        let layers = JSON.stringify(keymap.layers, null, 3);

        // keymap_jp.hをもとにキーコードを置換する
        jp_us_list.forEach(key => {

            // 置換したキーは、二重置換を防ぐためにいったんフラグをつけておく
            layers = layers.replace(`"${key[0]}"`, `"${key[1]}🍣"`);
        });

        // フラグを外す
        layers = layers.replace(/🍣/g, '');

        // keymap書き戻して
        keymap.layers = JSON.parse(layers);

        // 変換を掛けたバージョンだってわかるようにメモして
        keymap.keymap = keymap.keymap + '-jis-like';

        return keymap
    }

Webアプリっぽく整えて公開

最近Github Pagesというのを使ってみたかったので、Webアプリっぽく動くように整えて公開してみました。

https://atsuyuki.github.io/qmk-configrator-jis-like-converter/?atsuyuki.github.io

QMKコンフィギュレーターからエクスポートしたJSONの中身をテキストボックスに張り付け、ボタンを押せば変換済みのJSONをダウンロードできます。

あとはQMKコンフィギュレーターにインポートし直してビルドすれば、日本語配列対応のファームウェアの完成です!

そしてキーボード自作熱の再来

そんなことをやっていたら、久しぶりにキーボード自作のモチベーションが上がってきたので、普段使いしているDactyl Manuformのバックアップ機を作ることにしました。

f:id:at_you_key:20210207102248j:plain

名付けて「Dactyl Manuform Skelton Edition 4x5(仮)」3Dプリントパーツを小分けに分割することで、プリント失敗のリスクを分散する狙いです。

これも、近いうちにビルドログを書くつもりなのでお楽しみに。