🐼

ZMKキーボードで接続先に応じてデフォルトレイヤーを切り替える方法

2024/12/30に公開

はじめに

はじめましてshakupan(https://x.com/shakupan_)です。
昨年keyball39を買い、自分で無線化してから自作キーボード沼にどっぷり浸かっております。
今年度はmoNaというkeyballライクな完全無線分割キーボードをpooh.poloさん(https://x.com/Pooh_pol0) 作っており沼には底がないことを痛感しています。
ありがたいことにmoNaはたくさんの反響を頂き、日夜頒布と改良に明け暮れており、今回の記事はそのうちの1つです。
以下に販売ページとサポートサーバーを載せておきます。

booth

https://shakupan.booth.pm

moNaのdiscord

https://discord.gg/SZ3EMRdk9N

1. 本題

moNaは無線運用を前提としたZMKfirmwareを採用しており、複数端末をペアリングしてキー1つで接続先(PC,タブレット,スマホ)を切り替えられる利便性があります。

その一方で、keyballのようにキーマップを端末によって切り替えるといった機能がないため、Windows/MacやPC/iPadを使い分けるシチュエーションでいまいち使い勝手が良くないといった懸念点がありました。

今回はZMKfirmwareにおいても接続先に応じてキーマップ(デフォルトレイヤー)を切り替える方法の紹介になります。

2. 実現方法

接続先を認識してそれに応じて処理をするというのはちょっとハードルが高いので、今回はシンプルな方法で実現できないか?を考えました。
そこで思いついた方法が、

「接続先切り替えキーにトグルレイヤーをくっつけてマクロ化する」

です。
PCからiPadへ接続を切り替えたい際、必ずiPadへの接続切り替えキーを押すのでそこにトグルレイヤーをくっつけて任意のデフォルトレイヤーで固定してしまえばキーボードが接続先を認識する必要がありません。(もう少しZMKに詳しくなったらもっとスマートな方法に変えます)

さらっと手順を書いていきます。

1. トグルレイヤーをON/OFFで指定できるように変更

トグルレイヤーは通常ON/OFFの切り替えキーなので明示的にON/OFFで指定できるよう変更します。
.keymapファイルのbehavior部分に下記のtoggle_on/off部分を追加してください。

2. 機種毎のデフォルトレイヤーを定義

接続先0〜Nに合わせてレイヤー0〜Nを定義していきます。
ZMKは高いレイヤーが優先されるため、デフォルトレイヤーは他のレイヤーよりも低い位置に設定しておく必要があります。接続先に合わせて0〜Nで設定しておくのが良いと思います。
自分の設定は以下。(動作確認のため左側のキーマップを微妙に変えている)

接続先 端末 レイヤー
0 Mac 0
1 windows 1
2 iPad 2

3. 機種&レイヤー切り替えのマクロ定義

各デフォルトレイヤーの定義ができたら、切り替えマクロの定義をしていきます。
マクロの内容は以下です。(wait時間は適当です)

  1. 全てのデフォルトレイヤーのトグルをOFF
  2. ちょっと待つ
  3. 接続先切り替えコマンドを実行
  4. 接続先に紐づいたレイヤーのトグルをON(レイヤー0の場合は不要)

4. キーマップに切り替えキーを設定

最後に、作成した切り替えマクロをキーマップに割り当てて終わりです。
デフォルトレイヤー毎に移動先レイヤーを別で定義すれば完全にキーマップを分けることもできると思います。(未確認)
もしかすると電源ON時に、接続先とデフォルトレイヤーが不整合になることがあるかもしれないですが、その際は再度切り替えマクロを押してください。

Discussion