大枚はたいて kinesis 社の Advantage360 Pro というキーボードを買った。 どうせここまで来たなら、もうやけになって、新しいキーボードレイアウトも習得してしまおうと思う。(colemak DHにした。)
いろいろ変更する手順はあるんだけど、キーボード側でキーの挙動を定義する事が出来るので、ここでその手順を記録しておく。
web でマッピングを変更する
https://kinesiscorporation.github.io/Adv360-Pro-GUI に web アプリがあって、そこでかえたものを
https://github.com/yasushisakai/Adv360-Pro-ZMK/actions へ反映する権限をあたえれば、変更して自動でコミットしてくれる。
Kinesis Advantage 360 Pro は、zmk が基本になっていて、そのルールに従って変更すればいい。
keymap config をいじって変更する
手で(マニュアル?)かえる場合は基本的に下記の規則で記述していく。
kinesis 自体はこうゆう配列であって、
もし Kinesis に慣れてしまった場合に、qwerty が億劫になるはずで、そこまで Colemak になれたら携帯用のキーボードをつくるんだと思う。その時はいちおう 36key にしようと決めているので、そうなっても困らないマッピングにしておく。というか、36 key ありきの Mapping にする。これは、上の配列の情報を以下の用に再マッピングすればいい事になる。
Figure 1: 紫の●はリセットボタン
参考として、Miryoku というレイアウトがあるらしいが、マウスやメディア操作はいらないかなと。それ以外だったら、ベンの 34key layout があるけど、日本語を打つ事を考えると多少考えないといけない。(36 がいいと思ったのもこの理由から。)
色々検討した結果、下記を目標にしようと思う。
このレイアウトに落ちついた経緯は少しづつ加筆していこう。
変更履歴
- esc がレイヤー 2 にしかなかったのが、つらいので、いくつかためしてみてる。
- sticky shift あんまりつかってないから、そこも esc にしてみた。
- グラフィックソフトを使う時にどうしても space と enter が、左手にあったほうが良いから、試す。
- 34 key に挑戦
下は結局 このファイル として、書き出されます。
ヘッダ諸々
/* * Copyright (c) 2020 The ZMK Contributors * * SPDX-License-Identifier: MIT */ /* THIS FILE WAS GENERATED! * * This file was generated automatically. You may or may not want to * edit it directly. */ #include <behaviors.dtsi> #include <dt-bindings/zmk/keys.h> #include <dt-bindings/zmk/bt.h> #include <dt-bindings/zmk/rgb.h> #include <dt-bindings/zmk/backlight.h> / {
ビヘイビア(挙動)の定義
ホーム行の長押しもしくは、別のキーとの同時押しの場合の挙動は、 &hm
とする。これをキーボード界隈だと、home row mods というらしい。ただの長押しじゃあダメらしく、この挙動についての詳しい説明はここで読めます。なかなか奥が深い。
普通は &kp
普通の長押しは &hd
あとは、 &none, &trans, &sk
とかある。
behaviors { #include "macros.dtsi" hm: homerow_mods { compatible = "zmk,behavior-hold-tap"; label = "HOMEROW_MODS"; #binding-cells = <2>; tapping-term-ms = <200>; quick_tap_ms = <175>; flavor = "tap-preferred"; bindings = <&kp>, <&kp>; }; hml: homerow_layer_reset { compatible = "zmk,behavior-hold-tap"; label = "HOMEROW_MODS_LAYER_RESET"; #binding-cells = <2>; tapping-term-ms = <200>; quick_tap_ms = <175>; flavor = "tap-preferred"; bindings = <&kp>, <&to>; }; hd: hold { compatible = "zmk,behavior-hold-tap"; label = "HOLD"; #binding-cells = <2>; tapping-term-ms = <150>; quick_tap_ms = <0>; flavor = "tap-preferred"; bindings = <&kp>, <&kp>; }; td_mt: tap_dance_mod_tap { compatible = "zmk,behavior-tap-dance"; label = "TAP_DANCE_MOD_TAP"; #binding-cells = <0>; tapping-term-ms = <200>; bindings = <&mt LC(LS(LALT)) ESC>, <&to 1>; }; };
マッピングをメタプログラミング
を基本にする。レイヤーきれいにひとつづつ整形してやってもいいけど、むしろこっちの方がわかりやすいかもという事で python を使った。
で以下が吐き出されるので、そのまま 。
### constants layer_key_num = [14,14,18,20,16] TOTAL_NUM_KEYS = sum(layer_key_num) top_mapping = [i + sum(layer_key_num[0:1]) for i in [1,2,3,4,5,8,9,10,11,12]] middle_mapping = [i + sum(layer_key_num[0:2]) for i in [1,2,3,4,5,12,13,14,15,16]] bottom_mapping = [i + sum(layer_key_num[0:3]) for i in [1,2,3,4,5,14,15,16,17,18]] thumb_mapping = [i + sum(layer_key_num[0:4]) for i in [5,6,9,10]] def mapkey(keys, layout, mapping): for i in range(len(keys)): layout[mapping[i]] = keys[i] return layout def maplayer(top, middle, bottom, thumb, default): layer = [default] * TOTAL_NUM_KEYS layer = mapkey(top,layer,top_mapping) layer = mapkey(middle,layer,middle_mapping) layer = mapkey(bottom,layer,bottom_mapping) layer = mapkey(thumb,layer,thumb_mapping) return layer def makelayer(layer_name, top, middle, bottom, thumb, default='&none'): keys = maplayer(top, middle, bottom, thumb, default) mappings = ' '.join(keys) return f'{layer_name} {{\n bindings = <\n{mappings}\n >;\n }};' ### default layer top = [f'&kp {i}' for i in 'QWFPBJLUY'] + ['&hd MINUS SEMI'] middle = ['&kp A', '&hm LCTRL R', '&hm LALT S', '&hm LGUI T', '&kp G', '&hm LSHIFT M', '&hm RGUI N', '&hm LALT E', '&hm RCTRL I', '&hd EQUAL O'] bottom = [f'&kp {i}' for i in 'ZXCDVKH'] + ['&kp COMMA', '&kp DOT', '&kp FSLH'] thumb = ['&kp BSPC', '&hm LSHIFT ENTER', '&td_mt', '&kp SPACE' ] default_layer = makelayer('default_layer', top, middle, bottom, thumb) ### numbers and arrows top = ['&kp GRAVE'] + [f'&kp N{i}' for i in '7890'] + ['&trans']*2 + ['&kp LBKT', '&kp RBKT', '&kp BSLH'] middle = ['&kp TAB', '&hm LCTRL N4', '&hm LALT N5', '&hm LGUI N6', '&kp MINUS', '&kp LEFT', '&hm RGUI DOWN', '&hm LALT UP', '&hm RCTRL RIGHT', '&kp SQT'] bottom = ['&kp ESC'] + [f'&kp N{i}' for i in '123'] + ['&kp EQUAL'] thumb = ['&trans'] * 4 # this wil be used in the layer below as well thumb[2] = '&hml LC(LS(LALT)) 0' thumb[1] = '&hml LSHIFT 2' number_layer = makelayer('number_layer', top, middle, bottom, thumb, '&trans') ### functions top = ['&bt BT_SEL 0'] + [f'&kp F{i}' for i in range(7,11)] + ['&trans', '&kp C_VOL_DN', '&kp C_VOL_UP', '&kp C_MUTE', '&bt BT_CLR'] middle = ['&bt BT_SEL 1'] + [f'&kp F{i}' for i in range(4,7)] + ['&kp F11', '&kp LG(LS(TAB))', '&kp LC(LS(TAB))', '&kp LC(TAB)', '&kp LG(TAB)'] bottom = ['&bt BT_SEL 2'] + [f'&kp F{i}' for i in range(1,4)] + ['&kp F12', '&trans', '&bl BL_OFF', '&bl BL_ON'] function_layer = makelayer('function_layer', top, middle, bottom, thumb, '&trans') ### put it all together layers = '#+begin_src text :tangle ~/code/Adv360-Pro-ZMK/config/adv360.keymap\n' layers += f'keymap {{\n\n compatible = "zmk,keymap"; \n\n {default_layer} \n\n {number_layer} \n\n {function_layer}\n}};' layers += '};' # the last bracket to close the root object return layers
keymap { compatible = "zmk,keymap"; default_layer { bindings = < &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &kp Q &kp W &kp F &kp P &kp B &none &none &kp J &kp L &kp U &kp Y &hd MINUS SEMI &none &none &kp A &hm LCTRL R &hm LALT S &hm LGUI T &kp G &none &none &none &none &none &none &hm LSHIFT M &hm RGUI N &hm LALT E &hm RCTRL I &hd EQUAL O &none &none &kp Z &kp X &kp C &kp D &kp V &none &none &none &none &none &none &none &none &kp K &kp H &kp COMMA &kp DOT &kp FSLH &none &none &none &none &none &none &kp BSPC &hm LSHIFT ENTER &none &none &td_mt &kp SPACE &none &none &none &none &none >; }; number_layer { bindings = < &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp GRAVE &kp N7 &kp N8 &kp N9 &kp N0 &trans &trans &trans &trans &kp LBKT &kp RBKT &kp BSLH &trans &trans &kp TAB &hm LCTRL N4 &hm LALT N5 &hm LGUI N6 &kp MINUS &trans &trans &trans &trans &trans &trans &kp LEFT &hm RGUI DOWN &hm LALT UP &hm RCTRL RIGHT &kp SQT &trans &trans &kp ESC &kp N1 &kp N2 &kp N3 &kp EQUAL &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &hml LSHIFT 2 &trans &trans &hml LC(LS(LALT)) 0 &trans &trans &trans &trans &trans &trans >; }; function_layer { bindings = < &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_SEL 0 &kp F7 &kp F8 &kp F9 &kp F10 &trans &trans &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bt BT_CLR &trans &trans &bt BT_SEL 1 &kp F4 &kp F5 &kp F6 &kp F11 &trans &trans &trans &trans &trans &trans &kp LG(LS(TAB)) &kp LC(LS(TAB)) &kp LC(TAB) &kp LG(TAB) &trans &trans &trans &bt BT_SEL 2 &kp F1 &kp F2 &kp F3 &kp F12 &trans &trans &trans &trans &trans &trans &trans &trans &trans &bl BL_OFF &bl BL_ON &trans &trans &trans &trans &trans &trans &trans &trans &trans &hml LSHIFT 2 &trans &trans &hml LC(LS(LALT)) 0 &trans &trans &trans &trans &trans &trans >; }; };};
ファームウェアの更新
上で変更するなり、手打でかえるなり、コミットされると、actions が働いて、新しいファームウェアをコンパイルしてくれる。それをダウンロードする。
コンピュータとキーボードを接続して、リセットボタンをおすと、マウントされので、左右対応する方のファームウェアをドラッグドロップ。