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

2018年11月25日

 ⌘英かなを利用して、コマンドキーを英数キー、かなキーとして使わせていただいております。ありがとうございます。
 同じことを 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)

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

スポンサードリンク