2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Macのキーボード不具合を修理なしで(一部)解決する方法

Last updated at Posted at 2019-08-23

バタフライキーボードを採用している最近のMacbookでは、キーボードを押しても効かない、連打されてしまうなどの問題が多数報告されています。

参考: https://misc-log.com/macbookpro-butterfly-keybord/

私のMacbookではよりによってエンターキーがたまに勝手に連打されるようになってしまい、チャットの途中で打ち掛けのテキストが思いがけず投稿されるなど、この症状にかなり苦しめられました。
そこで、キーコンフィグを編集することによって、思わぬ連打をかなり精度よく防げるようになる方法を発見したのでここで共有します。

方法

Karabiner-ElementsのComplex Modificationsを利用します。

$HOME/.config/karabiner/assets/complex_modifications/配下にJSONファイルを作成し、以下のJSONを貼り付けます。

modification_example.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ボタンを押します。

スクリーンショット 2019-08-23 15.02.16.png

解説

Karabinerは、keypushのイベントが各プロセスに通知される前に所定のルールに従って起きるイベントを制御します。

今回の場合、

.json
          "from": {
            "key_code": "return_or_enter",
            "modifiers": { "optional": [ "any" ] }
          },
          "to": [
          ],

上記の"from"で指定したreturn_or_enter(エンターキー)が押された場合、"to"で指定したイベントが本来発行されるのですが、ここが空欄なので、keyが押された直後はなんのアクションも起きないことになります。
続いて、"to_delayed_action"の評価が走ります。

.json
          "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程度に設定するとさほど遅延を感じずに連打防止の効果も得られていい感じでした。

スクリーンショット 2019-08-23 15.18.59.png

まとめ

キーコードを変えれば任意のキーの連打防止に使えると思います。
これが悩めるMacユーザの助けになれば幸いです。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?