はじめに
Karabinerが使えなくなってから、IMEのon/offの切替がかなキー一発でできなくなって非常に困っていた。
そこで、macOS Sierra で Karabiner が使えない問題にどう対処したか - Qiita を参考にKarabiner-ElementsでF13をかなキーに割り当てて使っていたのだが、どうも切替が遅い。
[かな]→[k]→[a]と入力すると、「kあ」とか入力されることが多々ある。
で、Hammerspoonでなんとかできないかと思って試行錯誤していたら、なんとか希望通り動くようになったので書いて見る。
駄目だった例
local function remapKey(modifiers, key, keyCode)
hs.hotkey.bind(modifiers, key, keyCode, nil, keyCode)
end
local kana = false
local function handleKana()
return function()
local keycode = 104
if kana then
keycode = 102
end
hs.eventtap.event.newKeyEvent({}, keycode, true):post()
hs.timer.usleep(1000)
hs.eventtap.event.newKeyEvent({}, keycode, false):post()
kana = not kana
end
end
remapKey({}, 104, handleKana())
ちなみに、104がかなキーのキーコードで、102が英数キーのキーコード。
これで、かなキーが押されるたびにかなキーと英数キーを交互に押したことになってめでたしめでたし、と思ったのだが、何故かかなキーを押したことにならない。
1回目:何も押してない
2回目:英数キーを押した
3回目:何も押してない
4回目:英数キーを押した
と言う感じ。(Karabiner-EventViewerで確認)
ちなみに、割り当てるキーコードが104以外(例えば、スペースキーとか)ならば期待通りに動く。同じキーだと駄目みたい。
うまく行った例
local kana = false
local function handleEvent(e)
local keyCode = e:getKeyCode()
local keyUp = (e:getType() == hs.eventtap.event.types.keyUp)
local result = false
if keyCode == 104 then
if kana then
if keyUp then
hs.eventtap.keyStroke({}, 102)
end
result = true
end
if keyUp then
kana = not kana
end
end
return result
end
eventtap = hs.eventtap.new({hs.eventtap.event.types.keyDown, hs.eventtap.event.types.keyUp}, handleEvent)
eventtap:start()
macOS SierraにアップデートしてHammerspoonでCommandキーにかなと英数を割り当てた | mizoguche.info を参考にしました。
ifがごちゃごちゃしているので、もうちょっとなんとかしたいんだけど、動いたから良いか。
インデントが場所によって違うのは、emacsのFundamentalモードで書いたから。(luaモードってあるのかな)
これで、他の設定と合わせてKarabiner-ElementsとHammerspoonを併用していたのを、Hammerspoonにまとめられそう。