バタフライキーボードを採用している最近のMacbookでは、キーボードを押しても効かない、連打されてしまうなどの問題が多数報告されています。
参考: https://misc-log.com/macbookpro-butterfly-keybord/
私のMacbookではよりによってエンターキーがたまに勝手に連打されるようになってしまい、チャットの途中で打ち掛けのテキストが思いがけず投稿されるなど、この症状にかなり苦しめられました。
そこで、キーコンフィグを編集することによって、思わぬ連打をかなり精度よく防げるようになる方法を発見したのでここで共有します。
方法
Karabiner-ElementsのComplex Modifications
を利用します。
$HOME/.config/karabiner/assets/complex_modifications/
配下にJSONファイルを作成し、以下のJSONを貼り付けます。
{
"title": "Mistaken enter double-tap to single tap",
"rules": [
{
"description": "mistaken enter double-tap to single tap",
"manipulators": [
{
"type": "basic",
"from": {
"key_code": "return_or_enter",
"modifiers": { "optional": [ "any" ] }
},
"to": [
],
"to_delayed_action": {
"to_if_invoked": [
{ "key_code": "return_or_enter" }
],
"to_if_canceled": [
]
}
}
]
}
]
}
続いて、Karabiner-Elementsの設定画面からComplex Modifications
タブを開き、➕Add rule
ボタンを押すと追加できるルール一覧が表示されますので、その中からmistaken enter double-tap to single tap
を選択し、➕Enable
ボタンを押します。
解説
Karabinerは、keypushのイベントが各プロセスに通知される前に所定のルールに従って起きるイベントを制御します。
今回の場合、
"from": {
"key_code": "return_or_enter",
"modifiers": { "optional": [ "any" ] }
},
"to": [
],
上記の"from"
で指定したreturn_or_enter
(エンターキー)が押された場合、"to"
で指定したイベントが本来発行されるのですが、ここが空欄なので、keyが押された直後はなんのアクションも起きないことになります。
続いて、"to_delayed_action"
の評価が走ります。
"to_delayed_action": {
"to_if_invoked": [
{ "key_code": "return_or_enter" }
],
"to_if_canceled": [
]
}
"to_if_invoked"
は、"from"
で指定したキーが押されて以降一定時間追加のキー入力がない場合に実行されます。
"to_if_canceled"
は、"from"
で指定したキーが押されて以降一定時間以内に追加のキー入力があった場合に実行されます。
キーボードの不具合による連打はほぼ即座に起きますから、連打が起こった場合は"to_if_canceled"
が実行され、最初のkeypressはなかったことになります。続いて、連打の2回目のkeypressが同様のルールで評価され、追加の入力がなかった場合はエンターキーの入力が有効になります。
delayed_actionの実行時間のチューニング
"to_delayed_action"
の評価が走るまでの時間が長すぎると、普通のユーザの入力によってもエンターキーが無効になってしまう恐れがあります。また、ちょっとだけ"to_delayed_action"
が走るまでのタイムラグを感じるようになります。
Karabiner-Elementsはそのタイムインターバルをパラメータとして指定できるので、自分の好みの数字に設定しましょう
この設定単体でいえば、to_delayed_action_delay_milliseconds
を15程度に設定するとさほど遅延を感じずに連打防止の効果も得られていい感じでした。
まとめ
キーコードを変えれば任意のキーの連打防止に使えると思います。
これが悩めるMacユーザの助けになれば幸いです。