前置き
マウスホイールを備えていないトラックボール等でスクロールを容易に行うためのカスタマイズとして右クリック長押し状態での操作をスクロールに割り当てるというものがある。
HammerspoonというmacOS用のオートメーションツールを使ってこれを実現している例があり、Webを探すといくつか記事が見つかる。 おそらくKarabinerのissueに付けられたコメント(Help Enabling virtual scroll wheel on Sierra. · Issue #814 · pqrs-org/Karabiner-archived)が最初で、どれもこれを参照していたりこれと同様の設定している。元は2017年のコメントだが、現在のHammerspoonにそのまま設定しても概ね問題なく動作する。
このスクリプトによるスクロール操作はかなりスムーズで反応も良く気に入っている。例えばKarabinerでもmouse_motion_to_scrollという設定(mouse_motion_to_scroll | Karabiner-Elements)を使うことで似たようなことが可能だが、それに比較するとスムーズさが段違いである。
ただ、多少気になる点があったため若干の修正をした。
準備
Hammerspoonをインストールして起動しておく。
やること
以下の設定をHammerspoonの設定ファイルに追加する。設定ファイルはOpen Configで開き、Reload Configで反映する。
説明
当初のスクリプトに対して3点ほど修正している。
hs.mouse.setAbsolutePosition,hs.mouse.getAbsolutePositionをhs.mouse.absolutePositionに差し替え。- deprecatedなので。動作には影響なし。
- デバウンス処理の追加
- 最近使っているcocot38mini(cf. cocot38miniのキーマップ設定 - もうカツ丼はいいよな)やpicot O44と特定のアプリ(例えばVisual Studio Code)の組み合わせだと、スクロール挙動が非常に重くなる場合がある。
- ログを仕込んだりして様子をみた感じ、スクロールイベントが短時間に非常に多く発火しているのが原因のように思われたので、イベントの発生間隔に制限を加えて対処した。
- 今のところうまく動いている。
- モディファイアキー対応
- 一部のアプリはCmd+スクロールが拡大倍率の調整などに割り当てられている事がある(Adobe XDなど)。
- 元のスクリプトではCmd含むモディファイアキーの押下が反映されなかった。
hs.eventtap.event.newScrollEventのドキュメント(Hammerspoon docs: hs.eventtap.event)を確認したところ、モディファイアキーを受け付ける引数があったのでそれを設定できるようにした。