Last year, I wrote a little script to cycle through window layouts via Hammerspoon. The cycling set I chose didn't stick, so here's another go.
function reframeFocusedWindow()
local win = hs.window.focusedWindow()
local maximizedFrame = win:screen():frame()
maximizedFrame.x = maximizedFrame.x + 15
maximizedFrame.y = maximizedFrame.y + 15
maximizedFrame.w = maximizedFrame.w - 30
maximizedFrame.h = maximizedFrame.h - 30
local leftFrame = win:screen():frame()
leftFrame.x = leftFrame.x + 15
leftFrame.y = leftFrame.y + 15
leftFrame.w = leftFrame.w / 2 - 15
leftFrame.h = leftFrame.h - 30
local rightFrame = win:screen():frame()
rightFrame.x = rightFrame.w / 2
rightFrame.y = rightFrame.y + 15
rightFrame.w = rightFrame.w / 2 - 15
rightFrame.h = rightFrame.h - 30
if win:frame() == maximizedFrame then
win:setFrame(leftFrame)
return
end
if win:frame() == leftFrame then
win:setFrame(rightFrame)
return
end
win:setFrame(maximizedFrame)
end
hs.hotkey.bind({"alt"}, "F", reframeFocusedWindow)
Looping through layouts is done with a global key-binding of option f
or, if familiar with a macOS keyboard, ⌥ f
.
For those unfamiliar with Hammerspoon… If you're a tinkerer and a macOS user, you'd love Hammerspoon. Like elisp gluing all things Emacs, Hammerspoon uses Lua to glue all things macOS. For example, here's a stint at writing a narrowing utility for macOS using chooser.