LoginSignup
6
3

More than 5 years have passed since last update.

HammerspoonでIMEのon/off切り替え

Last updated at Posted at 2017-01-28

はじめに

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

6
3
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
6
3