HammerspoonでIMEのon/off切り替え

  • 4
    いいね
  • 0
    コメント

はじめに

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