Window manager built on top of Hammerspoon--the automation framework for macOS.
Download the latest release, decompress the file, and double click the Spoon, or run the following commands:
# Replace <v0.2.3> with your desired version
λ curl -L -O "https://github.com/cmpadden/wm.spoon/releases/download/v0.2.3/wm.spoon.zip"
# The Hammerspoon Console should open and indicate that plugin has loaded
λ unzip wm.spoon.zip && open wm.spoonRefer to the official documentation for more information on Spoons, and how to install them.
There are two primary concepts of wm.spoon: layouts and geometries. To use wm.spoon one must first define a layouts (or many), which is a table of geometries. A geometry is a built-in utility of Hammerspoon, hs.geometry, that represents the height, width, and x-and-y positions of a rectangle.
The user defines an table of layouts on config.layouts, which are bound to <prefix> + 1, 2, 3, ... n; using these hotkeys one can cycle through window layouts.
Then, the user can cycle the position of a window between the geometries of this layout using <prefix> + h, and <prefix> + l by default.
After moving windows to their desired positions, the state can be saved using the default binding of <prefix> + -.
When initializing wm.spoon, the user is required to define their layouts, however, they also have the option to tweak key bindings along with a variety of other options.
A collection of pre-defined geometries can be found in spoon.wm.builtins.
hs.loadSpoon("wm")
spoon.wm.config.layouts = {
-- ┌-----------─┐
-- | [ ] |
-- | [ ] |
-- └------------┘
{
spoon.wm.builtins.full,
spoon.wm.builtins.pip_bottom_right,
},
-- ┌-----------─┐
-- | [ ][ ] |
-- | [ ][ ] |
-- └------------┘
{
spoon.wm.builtins.padded_left,
spoon.wm.builtins.padded_right,
spoon.wm.builtins.pip_bottom_right,
},
-- ┌-----------─┐
-- | [ ] |
-- | [ ] |
-- └------------┘
{
spoon.wm.builtins.padded_center,
spoon.wm.builtins.pip_bottom_right,
},
-- ┌-----------─┐
-- | [ ] |
-- | [ ] |
-- └------------┘
{
spoon.wm.builtins.skinny,
spoon.wm.builtins.pip_top_right,
},
}
spoon.wm:init()
