HammerspoonでRShiftを^と&にする

Sierra になってから Karabiner が使えなくなってしまったので、Hammerspoon で頑張るメモその1

今回は右の Shift を単押しで ^、 左の Shift を押しながらで & になるようにしたかったのでやってみた。

local LShift = false
module.rshiftKeymaps = hs.eventtap.new({hs.eventtap.event.types.flagsChanged}, function(e)
    local flags = e:getFlags()
    local keyCode = e:getKeyCode()

    if keyCode == 0x38 then
        LShift = flags.shift
    end
    if keyCode == 0x3C then
        local rawFlags = e:getRawEventData().CGEventData.flags
        if LShift and rawFlags == 131334 then -- 131334 = LShift+RShift
            return keyStroke({"shift"}, "6")() -- &
        elseif rawFlags == 131332 then -- 131332 = RShift
            return keyStroke({}, 0x18)() -- ^
        end
    end
end)
module.rshiftKeymaps:start()

Modifier Key に関しては keyDown / keyUp イベントが発火されないっぽいので、flagsChanged イベントで結構無理矢理頑張っていてちょっと辛い所。 あと、flagsChanged イベントだと、 keyDown / KeyUp 時両方とも発火されてしまうので、 rawEventData のフラグを見てどのキーが押されているのか判断している。