Hammerspoon で、左右のコマンドキーに英数キー、かなキーのやつ

 ⌘英かなを利用して、コマンドキーを英数キー、かなキーとして使わせていただいております。ありがとうございます。
 同じことを Hammerspoon でやれば、SandS と一緒に使えて便利なんじゃね、ということで作ってみることにした。
 US キーボードにおいて、左のコマンドキーに英数キーの機能を、右のコマンドキーにかなキーの機能を付加する。


スポンサード リンク

 なんとか自力でやりたかったんだけど結局ググった。そのものズバリのページにめぐりあい、もう本当ごめんなさいって感じなんですけど、変数の部分と最初のほうの関数の部分を全コピーさせていただきました。
 こちらのページです。

macOS SierraにアップデートしてHammerspoonでCommandキーにかなと英数を割り当てた | mizoguche.info

init.lua


local simpleCmd = false
local leftSet = false
local rightSet = false

local leftCmd = 0x37
local rightCmd = 0x36
local eisuu = 0x66
local kana = 0x68

local function keyStroke(modifiers, character)
    hs.eventtap.keyStroke(modifiers, character, 5000)
end

local function eikanaEvent(event)
    local c = event:getKeyCode()
    local f = event:getFlags()
    if event:getType() == hs.eventtap.event.types.keyDown then  
        if f['cmd'] and c then
            simpleCmd = true
        end
    elseif event:getType() == hs.eventtap.event.types.flagsChanged then
        if f['cmd'] then
            if c  == leftCmd then
                leftSet = true
                rightSet = false
            elseif c == rightCmd then
                rightSet = true
                leftSet = false
            end
        else
            if simpleCmd == false then
                if leftSet then
                    keyStroke({}, eisuu)
                elseif rightSet then
                    keyStroke({}, kana)
                end
            end
                simpleCmd = false
                leftSet = false
                rightSet = false
        end
    end
end

eventtap = hs.eventtap.new({hs.eventtap.event.types.keyDown, hs.eventtap.event.types.flagsChanged}, eikanaEvent)

eventtap:start()

 下のほうは自分でやってみたんだけど。
 変数をやたら作ってフラグをこしらえて、if を重ねて重ねて条件をしぼっていくのって、小学生並みというか、たぶん可読性って意味でもあんまり感心されない? 感じなんだろうか。わかっちゃいるんだけど、こうなっちゃった。

 なにがしたかったのかというと、⌘ + S で保存したり、⌘ + Tab でアプリケーションを切替えたりする時、コマンドキーをコマンドキーとして使った時は、IM に影響を与えないようにしたかったんである。
 コマンドキーを単独で押した時だけ、英数キー、かなキー入力にしたかった。

 これを前に作った SandS に組みあわせると、スクリプトはぐちゃぐちゃになるけど、一応動く。


local spaceOn = false
local shiftOn = false

local simpleCmd = false
local leftSet = false
local rightSet = false

local leftCmd = 0x37
local rightCmd = 0x36
local eisuu = 0x66
local kana = 0x68

local function flagCheck(flag)
    local mods = {'fn', 'cmd', 'ctrl', 'alt', 'shift'}
    local modifier = false
    for i, value in ipairs(mods) do
        if flag[value] then modifier = true end
    end
    return modifier
end

local function keyStroke(modifiers, character)
    hs.eventtap.keyStroke(modifiers, character, 5000)
end

local function sandsEvent(event)
    local c = event:getKeyCode()
    local f = event:getFlags()
    if event:getType() == hs.eventtap.event.types.keyDown then
        if c == 49 then
            if flagCheck(f) == false then
                if spaceOn == false and shiftOn == false then
                    spaceOn = true
                    event:setKeyCode(-1)
                else
                    spaceOn = false
                    shiftOn = false
                end
            end
        elseif spaceOn and c ~= 49 then
            if flagCheck(f) == false then
                shiftOn = true
                event:setFlags({shift=true})
            end
        end
        if f['cmd'] and c then
            simpleCmd = true
        end
    elseif event:getType() == hs.eventtap.event.types.keyUp then
        if c == 49 and flagCheck(f) == false then
            if spaceOn and shiftOn == false then
                keyStroke({}, "space")
            else
                spaceOn = false
                shiftOn = false
            end
        end
    elseif event:getType() == hs.eventtap.event.types.flagsChanged then
        if f['cmd'] then
            if c  == leftCmd then
                leftSet = true
                rightSet = false
            elseif c == rightCmd then
                rightSet = true
                leftSet = false
            end
        else
            if simpleCmd == false then
                if leftSet then
                    keyStroke({}, eisuu)
                elseif rightSet then
                    keyStroke({}, kana)
                end
            end
                simpleCmd = false
                leftSet = false
                rightSet = false
        end
    end
end

eventtap = hs.eventtap.new({hs.eventtap.event.types.keyDown, hs.eventtap.event.types.keyUp,hs.eventtap.event.types.flagsChanged}, sandsEvent)
eventtap:start()

(※ 関数をグローバル変数に入れて実行する形にした。17-02-09)

 すげー長くなっちゃった。
 時々、まったく効かなくなってしまう、という不具合があるんだけど、それは直ってない。これが直ればけっこういい感じになりそう、と思うんだけどね。
 直ったかもしれない。

スポンサードリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です