Лучшее, что я могу сделать, это опубликовать свой собственный код для той же цели, которую я написал 3+ года go, и с тех пор он отлично работает как на внутренних, так и на внешних мониторах. Как видите, я использую win:setFrame
вместо :moveToUnit
. Извините, я не могу помочь в отладке вашей проблемы, но я уже забыл Lua и Hammerspoon ... Надеюсь, это поможет
function coords ()
return hs.window.focusedWindow(), hs.window.focusedWindow():frame(),
hs.window.focusedWindow():screen(), hs.window.focusedWindow():screen():frame()
end
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "left", function()
local win, wf, scr, sf = coords()
if wf.x <= sf.x and wf.w <= math.floor(sf.w/3) then
wf.x = sf.x
wf.w = math.floor(sf.w/4)
elseif wf.x <= sf.x and wf.w <= math.floor(sf.w/2) then
wf.x = sf.x
wf.w = math.floor(sf.w/3)
else
wf.x = sf.x
wf.w = math.floor(sf.w/2)
end
wf.y=sf.y
wf.h=sf.h
win:setFrame(wf, 0)
end)
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "right", function()
local win, wf, scr, sf = coords()
if wf.x >= math.floor(sf.x + sf.w/3) and wf.w <= math.floor(sf.w/3) then
wf.w = sf.w/4
wf.x = math.floor(sf.x + 3 * sf.w/4)
elseif wf.x >= math.floor(sf.x + sf.w/2) and wf.w <= math.floor(sf.w/2) then
wf.w = sf.w/3
wf.x = math.floor(sf.x + 2 * sf.w/3)
else
wf.w = sf.w/2
wf.x = math.floor(sf.x + sf.w/2)
end
wf.y=sf.y
wf.h=sf.h
win:setFrame(wf, 0)
end)
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "up", function()
local win, wf, scr, sf = coords()
win:setFrame(sf, 0)
end)
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "down", function()
local win, wf, scr, sf = coords()
if wf.x ~= math.floor(sf.x + sf.w/3) and wf.w ~= math.floor(sf.w/3) then
wf.w = math.floor(sf.w/3)
wf.x = math.floor(sf.x + sf.w/3)
else
wf.w = sf.w/2
wf.x = math.floor(sf.x + sf.w/4)
end
wf.y=sf.y
wf.h=sf.h
win:setFrame(wf, 0)
end)