Edited at

HammerspoonでIMEのon/off切り替え

More than 1 year has passed since last update.


はじめに

Karabinerが使えなくなってから、IMEのon/offの切替がかなキー一発でできなくなって非常に困っていた。

そこで、macOS Sierra で Karabiner が使えない問題にどう対処したか - Qiita を参考にKarabiner-ElementsでF13をかなキーに割り当てて使っていたのだが、どうも切替が遅い。

[かな]→[k]→[a]と入力すると、「kあ」とか入力されることが多々ある。

で、Hammerspoonでなんとかできないかと思って試行錯誤していたら、なんとか希望通り動くようになったので書いて見る。


駄目だった例


init.lua

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以外(例えば、スペースキーとか)ならば期待通りに動く。同じキーだと駄目みたい。


うまく行った例


init.lua

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にまとめられそう。