MacBook Proのビルトインキーボードでレイヤーを使う

by

@wapa5pow

普段使いのPCはMacBook Proです。家ではUHK(Ultimate Hacking Keyboard)のキーボードを使っています。
出社や出張をするときに毎回キーボードを持ち歩くわけにはいかないので、その時はビルトインのキーボードを使っているのですがUHKとの違いで困った事がおきます。Karabiner-ElementsをUIだけで使っている場合はレイヤーが表現できないのです。

UHKではレイヤーを以下のように使っています。

assets/2023-05-05--using-layer-with-built-in-macbook-keyboard/layer1.png
assets/2023-05-05--using-layer-with-built-in-macbook-keyboard/layer2.png

レイヤーというのは、指定のとあるキーを押した時にキーボードのモードがかわり、モードが変わる前と変わる後では同じキーでも異なるキーのように振る舞う事ができます。たとえば普段はhですが、レイヤーを変えるキーを押しながらhを押すと左矢印と同じように振る舞わせる事ができます。先程の画像にあるとおりUHKではModボタンを押しながらh,j,k,lを押すと←,↓,↑,→の矢印へと変更させるように設定しています。

解決策

ビルトインキーボードでもレイヤーを表現するためにGokuを使いレイヤーを設定します。Karabiner-Elementsだけでも設定のjsonをいじれば同じように設定できますが結構書きにくいのでGokuを使います。Gokuの使い方はチュートリアルなどを見ていただければいいとしていきなり結果の設定ファイルを貼ります。

{
  :layers {
    :layer-mode {:key :left_command :alone {:key :vk_none}}
    :media-mode {:key :right_command :alone {:key :vk_none}}
  }
  :devices {
    :apple [{:product_id 0 :vendor_id 0}]
  }
  :main [
    {
    :des "Layer mode"
    :rules [:layer-mode
      ;; vim
      [:h :left_arrow]
      [:!Ch :!Cleft_arrow]
      [:!Sh :!Sleft_arrow]
      [:!Oh :!Oleft_arrow]
      [:j :down_arrow]
      [:!Cj :!Cdown_arrow]
      [:!Sj :!Sdown_arrow]
      [:!Oj :!Odown_arrow]
      [:k :up_arrow]
      [:!Ck :!Cup_arrow]
      [:!Sk :!Sup_arrow]
      [:!Ok :!Oup_arrow]
      [:l :right_arrow]
      [:!Cl :!Cright_arrow]
      [:!Sl :!Sright_arrow]
      [:!Ol :!Oright_arrow]
      ;; key
      [:delete_or_backspace :backslash]
      [:!Sdelete_or_backspace :!Sbackslash]
    ]},
    {
    :des "Media mode"
    :rules [:media-mode
      [:1 :f1]
      [:2 :f2]
      [:3 :f3]
      [:4 :f4]
      [:5 :f5]
      [:6 :f6]
      [:7 :f7]
      [:8 :f8]
      [:9 :f9]
      [:0 :f10]
      [:hyphen :f11]
      [:equal_sign :f12]
      [:a :volume_decrement]
      [:s :volume_increment]
      [:d :mute]
      [:z :display_brightness_decrement]
      [:x :display_brightness_increment]
    ]},
    {
    :des "built-in keyboard change" 
    :rules [:apple 
      [:backslash :delete_or_backspace]
      [:!Sbackslash :!Sdelete_or_backspace]
      [:!Obackslash :!Odelete_or_backspace]
      [:caps_lock :left_command]
      [:!Scaps_lock :!Sleft_command]
      [:!Ocaps_lock :!Oleft_command]
      [:delete_or_backspace :grave_accent_and_tilde]
      [:!Cdelete_or_backspace :!Cgrave_accent_and_tilde]
      [:!Sdelete_or_backspace :!Sgrave_accent_and_tilde]
      [:!Odelete_or_backspace :!Ograve_accent_and_tilde]
      [:grave_accent_and_tilde :escape]
      [:right_shift :right_control]
      ;; disable unnecessary keys
      [:escape :vk_none]
      [:f1 :vk_none]
      [:f2 :vk_none]
      [:f3 :vk_none]
      [:f4 :vk_none]
      [:f5 :vk_none]
      [:f6 :vk_none]
      [:f7 :vk_none]
      [:f8 :vk_none]
      [:f9 :vk_none]
      [:f10 :vk_none]
      [:f11 :vk_none]
      [:f12 :vk_none]
    ]},
  ]
}

:layersでレイヤーを設定しています。本来UHKでやっているようにleft_commandもright_commandもModキーみたいにレイヤーを変えるキーにしたいのですが、別のレイヤーにしなければいけないっぽいので別々に定義します。
:devicesで適用するキーボードを設定します。UHKを差しているときはこの設定を適用したくなかったのですが、レイヤーの設定のときに競合して同時には適用できないっぽかったので道半ばです。
レイヤーの設定のところで以下のように、hだけでなくcommand,shift,optionのときも設定しています。これはレイヤーと同時にそれらのキーを押してもちゃんと動くようにするためです。

[:h :left_arrow]
[:!Ch :!Cleft_arrow]
[:!Sh :!Sleft_arrow]
[:!Oh :!Oleft_arrow]

上記の設定はDefaultのプロファイルとして、UHKとは別のプロファイルにして設定しています。
毎回切り替えるのは面倒ですがまあしょうがないとおもっています。

assets/2023-05-05--using-layer-with-built-in-macbook-keyboard/profile.png

まとめ

GokuとKarabiner-Elementsを組み合わせることによりビルトインキーボードでもレイヤーを表現することができました。
これで外でも中でも同じ体験でキーボードがうてるようになりプログラミングがより楽しくなりました :)

参考