大枚はたいて 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_array_num.png

もし Kinesis に慣れてしまった場合に、qwerty が億劫になるはずで、そこまで Colemak になれたら携帯用のキーボードをつくるんだと思う。その時はいちおう 36key にしようと決めているので、そうなっても困らないマッピングにしておく。というか、36 key ありきの Mapping にする。これは、上の配列の情報を以下の用に再マッピングすればいい事になる。

kinesis_36_area.png

Figure 1: 紫の●はリセットボタン

参考として、Miryoku というレイアウトがあるらしいが、マウスやメディア操作はいらないかなと。それ以外だったら、ベンの 34key layout があるけど、日本語を打つ事を考えると多少考えないといけない。(36 がいいと思ったのもこの理由から。)

色々検討した結果、下記を目標にしようと思う。

kinesis_layout.png

このレイアウトに落ちついた経緯は少しづつ加筆していこう。

変更履歴

<2023-01-27 Fri>

  • esc がレイヤー 2 にしかなかったのが、つらいので、いくつかためしてみてる。
  • sticky shift あんまりつかってないから、そこも esc にしてみた。
  • グラフィックソフトを使う時にどうしても space と enter が、左手にあったほうが良いから、試す。

<2023-01-28 Sat>

  • 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>;
    };
  };

マッピングをメタプログラミング

colemak-DH

を基本にする。レイヤーきれいにひとつづつ整形してやってもいいけど、むしろこっちの方がわかりやすいかもという事で 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 が働いて、新しいファームウェアをコンパイルしてくれる。それをダウンロードする。

コンピュータとキーボードを接続して、リセットボタンをおすと、マウントされので、左右対応する方のファームウェアをドラッグドロップ。

Date: 2022-11-10 Thu 10:21