LoginSignup
2
0

More than 5 years have passed since last update.

Hammerspoon のイベント監視が止まるのはGCのせい

Posted at

Hammerspoon は Mac の OS イベントの割り込み処理を Lua で書けるソフトウェアです。

実は、公式ドキュメントのここ http://www.hammerspoon.org/go/#appevents らへんから始まるサンプルコードには罠があって、ちょっと注意が必要です。

本当のドキュメントはこの issue のほう Eventtap randomly stops intercepting events · Issue #1103 · Hammerspoon/hammerspoon

結果どうするべきかというと、GC に回収されないように注意して Lua を書かないといけないよということ。

こういうのはダメです:

local i = 0
hs.timer.doEvery(1, function()
    i = i + 1
    print(i)
end):start()
local i = 0
local secTimer = hs.timer.doEvery(1, function()
    i = i + 1
    print(i)
end)
secTimer:start()
2017-02-02 16:31:41: -- Loading ~/.hammerspoon/init.lua
2017-02-02 16:31:41: -- Loading extension: eventtap
2017-02-02 16:31:41: -- Loading extension: timer
2017-02-02 16:31:41: -- Done.
2017-02-02 16:31:42: 1
2017-02-02 16:31:43: 2
2017-02-02 16:31:44: 3
2017-02-02 16:31:45: 4
2017-02-02 16:31:46: 5
2017-02-02 16:31:47: 6
2017-02-02 16:31:48: 7
2017-02-02 16:31:49: 8
2017-02-02 16:31:50: 9
2017-02-02 16:31:51: 10

>  collectgarbage('collect')
0

GC 直後に hs.timer.doEvery():start() が死んでいます。

正解はこう:

local i = 0
-- これをグローバル変数にする
secTimer = hs.timer.doEvery(1, function()
    i = i + 1
    print(i)
end)
secTimer:start()
2017-02-02 16:32:57: -- Lazy extension loading enabled
2017-02-02 16:32:57: -- Loading ~/.hammerspoon/init.lua
2017-02-02 16:32:57: -- Loading extension: eventtap
2017-02-02 16:32:57: -- Loading extension: timer
2017-02-02 16:32:57: -- Done.
2017-02-02 16:32:58: 1
2017-02-02 16:32:59: 2
2017-02-02 16:33:00: 3
2017-02-02 16:33:01: 4
2017-02-02 16:33:02: 5
2017-02-02 16:33:03: 6
2017-02-02 16:33:04: 7
2017-02-02 16:33:05: 8
2017-02-02 16:33:06: 9
2017-02-02 16:33:07: 10

>  collectgarbage('collect')
0
2017-02-02 16:33:08: 11
2017-02-02 16:33:09: 12
2017-02-02 16:33:10: 13
2017-02-02 16:33:11: 14
2017-02-02 16:33:12: 15
2017-02-02 16:33:13: 16
2017-02-02 16:33:14: 17
2017-02-02 16:33:15: 18
2017-02-02 16:33:16: 19
2017-02-02 16:33:17: 20

IntelliJとかJVMのIDE使いでもKarabinerなしでバックスラッシュを片手入力したい

で修正したバグの詳細でした。

2
0
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
0