ZMK firmwareの追加behavior定義

コメントでMod-tap機能を使用するとリピート付きのSpace and Shiftを定義できると教えてもらったので設定テスト。

以下のHold-Tapの説明を参考にして adv360.keymap に定義を追加する。 zmk.dev

behaviors{};の中にsands挙動を追加する。*1

この定義の後、keymap{};の中の狙ったキーの部分を「&sands LEFT_SHIFT SPACE」のように記載する。 最初のキー(LEFT_SHIFT)は長押し時の挙動で2番目のキー(SPACE)は単押し時の挙動なので、Space and Shiftの挙動になる。 behavior定義の際に flavor = "tap-unless-interrupted"; としているので、リピート機能付きになる *2

全体のイメージは以下の通り。

  behaviors {

    sands: space_and_shift {
    compatible = "zmk,behavior-hold-tap";
    label = "SPACE_AND_SHIFT";
    #binding-cells = <2>;
    flavor = "tap-unless-interrupted";
    tapping-term-ms = <200>;
    quick-tap-ms = <125>;
    global-quick-tap;
    bindings = <&kp>, <&kp>;
    };
    
  };

    keymap {
        compatible = "zmk,keymap";

        default_layer {
            bindings = <

       &sands LEFT_SHIFT SPACE
            >;
        };

設定の意味については以下を参考に。 zmk.dev

とりあえずはyamy(窓使いの憂鬱)の以下の設定と似た感じにはできた😊 *3

# Space and Shift
def option delay-of !!! = 5  # 最初のn回のリピートを無視
mod shift += !!!Space  # リピート有り
key ~R-*C-Space = Space
key R-*C-Space = &Ignore

*1: sandsは勝手に付けた名前。後でkeymapの定義の際に使用する

*2: The 'tap-unless-interrupted' flavor triggers a hold behavior only when another key is pressed before tapping-term-ms has expired. It triggers the tap behavior in all other situations.

*3: ZMK firmwareの方で空押しを無視する方法は不明

kinesis Advantage360 proのチャタリング

キーの押し方が悪いのか稀にチャタリングするようになった。ZMK firmwareの以下のページを参考にしてdebouncingのパラメータを変更した。 zmk.dev

./config/boards/arm/adv360 の下にある adv360_left_defconfig と adv360_right_defconfig に以下の設定を追加した。 (デフォルト値は両方とも5msなので、少し長くした)

CONFIG_ZMK_KSCAN_DEBOUNCE_PRESS_MS=7
CONFIG_ZMK_KSCAN_DEBOUNCE_RELEASE_MS=7

半分プラシーボ的な物もあるのかもしれんけど、チャタリングは出なくなった。 ファームウェアの更新はちょっと面倒だけど、こういう細かい調整ができるのがpro版の良いとこやね。

kinesis Advantage360のキーキャップ

twitterでキーキャップの形状について書いている人がいたので比較。

ホームポジションのキーで比較すると高さはほぼ同じだが形状が結構違う。 (上はAdvantage1の物、下はAdvantage360 pro(PBT)のもの)

旧キーキャップは全体に丸みがある。新キーキャップはかなり肉厚。 タイプ感は新の方がしっとりとしていて良い感じだが、ホームポジションに手を置いた感じは旧の方が好み(慣れの問題かも)。

kinesis社のパーツページを見ると、ホームポジション部分のキーキャップを$15で販売している。 国内で3,500円くらいで販売してくれれば買うかも。 kinesis-ergo.com

ホームポジションのキーキャップ

キーキャップの裏面

kinesis Advantage360のカスタマイズ

台風で家に籠っていたので、いろいろと設定した。

ビルド環境の用意

Kinesisのサポートページから Quick Start Guide と User's Manual をダウンロードする。 kinesis-ergo.com Quick Start Guideの「Custom Programing」 および USER'S MANUALの「6.0 Customizing your Keyboard」を参考にしてビルドできるところまで設定する。(後者の方が図入りで分かりやすい)

現在の設定

  • 親指部分はAdvantage2で使用していたのと同じ設定に
  • ESC単押しはESCのまま、他キーとの組み合わせ時はCTRLに (Mod-Tap)
  • Alt単押しはAlt+Tab、他キーとの組み合わせ時はAltに (Mod-Tap)
  • 左右のShiftとFnキーを入れ替え
  • ファンクションキーは数字のnとFnが一致するように
  • PageDownは日本語入力のON/OFFトグルに (Macro)
  • USBとBluetoothの両方で接続されている場合USBが優先になる。これだとモバイルバッテリに接続して充電中にキーボードが使用できないのでMod3+o を &out OUT_TOG にしてUSB/Bluetoothの切り替えができるように

layer_0
layer_2

困っている点

Space and Shiftが使いづらい

Shiftキーを多用するのでSpace and Shift(スペースキーを単押ししたらSpace, 他キーと同時に押したらShiftとして動作)を使用している。

この動作をAdvantage360に設定する場合、Mod-Tapを使用して &mt LSHIFT SPACE のように書けばとりあえずは動作する。 しかし、この設定だとSPACEを押し続けた場合にリピートしてくれない。キーを離した時に1つだけスペースが入力される。

yamy/窓使いの憂鬱だと柔軟に設定できるので、当面はこちらで設定することに。

GUIレイアウトツールで同時押しの設定ができない

キーコード一覧にあるように、モディファイヤはShif(S), Ctrol(C), Alt(A), Win(G)キーが左右(L/R)それぞれで定義されている。 zmk.dev たとえば、左Alt+TAB を定義したい場合、LA(TAB) と書けば良い。しかしGUIのレイアウト変更ツールではこの同時押しの設定ができない。 config/adv360.keymap を手動で編集する必要がある。 → 再度試したみたらできた、どうやら書き方の問題らしい。たとえばモディファイヤとして左シフトを使用したい場合、key codeとしてLEFT_SHIFTを指定すると単押しの設定しかできない。モディファイヤとして使用する場合にはLSのように略称の方のkey codeを選択する。これで&kp LS(🚫)みたいな表示になるので、カッコ内をクリックしてどのキーと組み合わせるかを指定できる。

GUIレイアウトツールによる上書き

あるキーを手動で &mt LALT LA(TAB) のように同時押しに設定したとしてもGUIレイアウトツールは同時押し部分を認識してくれない。

GUIツールを使用すると&mt LALT TABのようなキー設定が生成されてしまい同時押し設定が無くなってしまう。 GUIツールを使用して設定ファイルを生成した後、毎回手動でファイルを修正する必要がある。

とりあえずの逃げとして、キーの設定を &mtや&kpにせずに &macroに設定しておき、キーを押した時にマクロ側で同時押しになるように設定しておく。これだとGUIツールがconfig/adv360.keymapファイルを生成してもmacro側はそのまま残るので同時押し設定が消えることは無くなるがちょっと面倒。

kinesis Advantage360を買った

去年の12月くらいにdropで注文していたKinesis Advantage360が届いた。

$454(本体) + $25(パームレスト) = $479

当時のクレジットカードの決済レートを確認したところ$1=116円で56,000円、ここに受取り時の関税(?)が3,500円で合計約60,000円

  • 左右完全分離 (左右ユニット間のケーブルも無し)
  • ワイヤレス接続 (Bluetooth)
  • エルゴノミクスレイアウト
  • 高いカスタマイズ性 (ZMKファームウェア)
  • PBTキーキャップ

と欲しい機能はほぼ全部入り

オープン
同梱物
予備キーキャップ

Dell AW3418DWをSurface Book2に接続した際のメモ

これまでは 本体+2560x1440の外部モニタ環境で使ってきたが、手狭になってきたので3440x1440のモニタに置き替えた。 接続は以下のようにSurface dock経由で(mini)Display Portを使用。

[Surface Book2] -- [Surface dock] -- [モニタ]

購入前に気になっていた以下の点を確認したのでメモ。

本体+外部モニタ2枚の3枚構成で使えるか?

○ モニタの置き替え前にちょっとだけ3枚構成で試してみたが、少なくとも60Hzであれば問題なく使える。 気にしていたのは、公式ドキュメントにある外部モニタ2枚の時の最大画面解像度。公式にサポートされているのは 2560x1600 @60Hz x2枚まで。3840x1440 + 2560x1440 のモニタ2枚の場合でも60Hzで表示できるか心配だったがケーブルを接続するだけで問題なく使えた。

60Hz以上のリフレッシュレートで表示できるか?

○ 特別な設定なしでモニタ側仕様上限の120Hzまで使える。 Windowsのディスプレイの情報、AW3418DWのOSD表示、UFO Motion Tests

www.testufo.com

で確認したところ120Hzと表示される。画面表示も正常なので120Hzで正常に動いている。

2019-08-19追記

120Hzの状態で使っていると、surface book2本体ではなくsurface dockの側に問題が発生した。スリープからの復帰のタイミングで発生しやすい。症状は

  • surface dockに接続されている外部モニタを認識しない
  • 有線LANを認識できなくなる
  • オーディオデバイスSurface Dockでドライバーエラーが発生する (下図参照)
    f:id:kichi941:20190819222015j:plain
    Surface Dockドライバーエラー

などいろいろ。一旦この症状が発生すると、Surface Dockの電源を入れ直す必要がある。AW3418DW側の設定を変更してリフレッシュレートを115Hzにすると問題は発生しないので、115Hzで使用することにした。

nVIDIA G-SYNCは使用できるか?

× 当然使用できない。そもそもSurface Book2からDockにG-SYNC用の信号が出ているかさえ不明。

Dell Display Managerを使用できるか?

× AW3418DWはサポートされていない。最近のモニタなので当然サポートされていると思ったが、ソフトをインストールしても動作しない。 サポートされているモニタの一覧 www.dell.com によると、AlienwareでサポートされているのはAW2518HFのみ。

Surface Book2のキーボード設定 (その2)

以下のように設定したけど、Kinesisのテンキー部分がうまく動いていない。

suburi.hatenablog.com

suburi.hatenablog.com

emacsedit.mayuの設定でテンキー部分が設定されているっぽいので、.mayuで上書き定義した。これで完璧?

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 窓使いの憂鬱 - dot.mayu
# Copyright (C) 1999-2005, TAGA Nayuta <nayuta@users.sourceforge.net>
#

# まずキーボード定義を読み込む
if ( USE104 )
  include "104.mayu"        # 104 キーボード設定
  if ( USE109on104 )
    include "109on104.mayu" # 104 キーボードを 109 キーボード風に
  endif
else
  include "109.mayu"        # 109 キーボード設定
  if ( USE104on109 )
    include "104on109.mayu" # 109 キーボードを 104 キーボード風に
  endif
endif

if ( USEdefault )
  include   "default.mayu"  # Emacs ライクなさまざまな設定
endif

keymap Global

# このファイルをホームディレクトリにコピーしてから、
# 以下に自分の好みのキーバインディングを設定するとよい。
# このファイル自体を変更しないこと。

# IMEの制御
key A-Space = $ToggleIME    # Alt-' ' でIMEをON/OFF
#key S-SPACE = $ToggleIME       # Shift-' ' でもIMEをON/OFF
key IC-C-m = Enter   # かな漢字変換中でもC-mによる改行を有効にする


# MacOSっぽく、C-1, C-2で2枚の仮想デスクトップを切り替え
key C-_1 = C-W-Left
key C-_2 = C-W-Right


#
# ワンショットモディファイヤ
#
# Space and Shift
mod shift += !!!Space  # リピート有り
key R-*Space = &Ignore

# ESC + LeftControl
mod Control += !!Esc
key ~R-*C-Esc = Esc
key R-*C-Esc = &Ignore

# Enter + RightControl
mod Control += !!Enter
key ~R-*C-Enter = Enter
key R-*C-Enter = &Ignore

# Backspace + Alt
mod Alt += !!!Backspace  # リピート有り
key ~R-*C-Backspace = Backspace
key R-*C-Backspace = &Ignore

# Altを単体で押した場合はAlt-Tabにする  (なぜか右Altはうまく動かないのでAltは両方とも左Altにしておくこと)
mod Alt += !!LeftAlt
key ~R-*A-LeftAlt = A-Tab
key R-*C-LeftAlt = &Ignore

# C-[をEscに
key C-LeftSquareBracket = Esc Escape


#
# SurfaceBookキーボード用
#
# 変換・無変換をSpace and Shiftに
mod shift += !!変換
key R-*変換 = &Ignore
mod shift += !!E0無変換
key R-*E0無変換 = &Ignore

# ひらがなをLeftAltに
# key *E0ひらがな = $ToggleIME  # ひらがな でIMEをON/OFF
def subst    *E0ひらがな    = *LeftAlt
mod Alt += !!E0ひらがな
key ~R-*C-E0ひらがな = A-Tab
key R-*C-E0ひらがな = &Ignore

# 英数をEsc+Ctrlに
def subst    *E0英数      = *Esc
mod Control += !!E0英数
key ~R-*C-E0英数 = Esc
key R-*C-E0英数 = &Ignore

# Enterキーが遠いので「む」キーもEnterとして使用
def key kinesis_sp          =    0x56  # kinesisとの共存用に左手下の |\ は表記通りに使う
def subst *kinesis_sp = *YenSign
def subst *RightSquareBracket = *Enter

# Surface Pen
# def subst *LeftWindows = *RightWindows
def key pen_single = 0x6b  # 0x83 &VK (U-F20)
key pen_single = &VK(U-F20)
def key pen_double = 0x6a  # 0x82 &VK (U-F19)
key pen_double = &VK(U-F19)
def key pen_hold = 0x69    # 0x81 &VK (U-F18)
key pen_hold = &VK(U-F18)

key _0 Num0 = _0
key _1 Num1 = _1
key _2 Num2 = _2
key _3 Num3 = _3
key _4 Num4 = _4
key _5 Num5 = _5
key _6 Num6 = _6
key _7 Num7 = _7
key _8 Num8 = _8
key _9 Num9 = _9
key NumHyphenMinus NumMinus = NumMinus
key NumPlusSign NumPlus = NumPlus
key NumFullStop NumPeriod = Period
key NumLock = NumLock


#
# アプリ固有の設定
#
# web browser
window  Mozilla /:MozillaWindowClass$/ : EmacsEdit
window  Chrome /chrome\.exe:/ : EmacsEdit
window  Edge /ApplicationFrameHost\.exe:/ : EmacsEdit
  key End = C-Tab
  key Home = C-S-Tab

## MS-Office
window  Outlook /OUTLOOK\.exe:/ : EmacsEdit
window  POWERPNT /POWERPNT\.exe:/ : EmacsEdit
window  Excel /EXCEL\.exe:/ : EmacsEdit

## explorer
window  Explorer /Explorer\.exe:/ : EmacsEdit

## Evernote
window  Evernote /Evernote\.exe:/ : EmacsEdit

## Kindle
window  Kindle /Kindle\.exe:/ : EmacsEdit