一 月
30
水曜日

macOS Mojaveのキーリピートで困った話

過去記事『Karabiner-ElementsからKeyRepeatタブが消失』の通り、自環境では システム環境設定 キーボード からの指定できる最速のキーリピート間隔では遅いと感じるため defaults コマンド経由でキーリピート値をより小さい値で調整していた。

それまでは特に違和感なく使えていたのだが、昨年末にmacOSをMojaveをクリーンインストールしたあたりからキーを押下し続けた際の挙動に違和感を覚えるようになった。


症状

標準Terminal、iTerm2、Spacemacs等での発生を確認。

キーを押下し続けた場合、実際はキーリピートによって入力が続いているにも関わらず画面にそれが描画されない。
キーを離したタイミングで一括で描画される。

例えば a キーを押下し続けると、 aaaaaaaaaaaaaaaaaaaaaaaa あたりまで画面に描画されるが途中でぱたりと止まり、キーを離すと一気に描画され残りの aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa が表示される。
また面白いことに delete / return キーや矢印キーでは発生しない。

この事象、実に痛恨なのがvimのキーバインド。
h l j k でカーソルを移動しようとすると途中で移動が止まりキーを離すと一気に移動する。

発生条件

色々と試すうちに以下二つ条件が満たされると問題が発生する事がわかった。

  1. defautlsコマンドでGUIから設定できる最小のキーリピート値よりも小さい値を設定している。
  2. 外部ディスプレイに接続している(自環境ではLG UltraFine 4K Display)

暫定対応策

外部ディスプレイを繋がない or キーリピート値をGUIで設定可能な範囲に留める

どちらも相応の痛みを伴うので避けたい!

iTerm2限定 謎のまじない

iTerm2はメニューの iTerm2 Preferences でプリファレンスダイアログを開くとなぜか症状が抑制される。
しかし別アプリのウインドウを触りiTerm2のウインドウからフォーカスが外れるとまた再発する。
完全に意味が分からない。

恒久対応案

問題が発生しないターミナルエミュレータに乗り換える

とりあえず現状での恒久対応は問題が発生しないターミナルエミュレータに乗り換え、SpacemacsについてもCUIモードで使うしか無さそうだ。
シンプルでGPUを利用した描画に最適化したターミナルエミュレータである Alacritty を試したところ問題は発生せず!
Alacrittyは現状IMEで入力中の文字がインラインで表示できない制約があり日本語の文章作成等には向かないが、プログラミング作業は支障なさそうなので使ってみようと思う。