Amethyst is an Xmonad-style Tiling Window Manager (WM) for MacOS
TL;DR:
As of 2024-09-06, I am working towards a new workflow using Amethyst that seems promising. There are some minor issues that I still need to solve. It’s unclear if I will stick with this long-term.
Gratuitous details are below.
Context and motivation
I had been exposed to Amethyst several years back but dismissed it at the time as too complex, cumbersome, and seemingly broken. There were a couple of other attempts to use it but they ended in frustration.
MacOS does not come with window-snapping or sensible keymappings to efficiently manage multi-window desktops. So, folks have had to roll their own solutions.
Fallback: Tiles WM for MacOS (2016-2024)
In the interim, I wanted the screen-space-efficiency and keyboard-centric model of a tiling WM. So, I compromised with Tiles (a free and relatively simple tiling based WM for MacOS) for years. It was adding value - no more painful mouse resizing of windows, no more wasted screen space. It was quite similar in principle to standard MS Windows window management keymappings, minimizing friction when switching between MacOS and Windows.
However, Tiles has its limitations. IIRC, it makes no use of the virtual desktop feature in MacOS (‘spaces’ in MacOS terms). Moving around windows by individually resizing them is still somewhat clunky, even with a keyboard. Example: a layout of say (left half: terminal, upper right: notes, lower right: postman), is hard to preserve with Tiles. Tiles has no concept of a layout. I was using all my windows in a single virtual desktop and butchering my layout every time I needed to, say, open a browser or simply do anything new. This creates a continual layout-maintenance burden. It gets tiring, fast.
Habits of the desktop savage
Here are some desktop ‘antipatterns’ I lived with for years:
All my windows open (typically upwards of 12 distinct windows across 5+ applications) in a single virtual desktop. Tiles let me get away with this by having windows occlude each other. I would foreground them repeatedly as-needed. It was super clunky and wasted a lot of time/energy.
General confusion about how macOS handles windows and not diving deep into Tiles settings
MacOS mission control set to not group windows by application, creating more confusion/frustration
Need for reform
My aim was to reduce keystrokes, reduce clutter, and better structure my windows to improve productivity at work.
I dreamed of a world with mostly-terminal or vim-style window management. Everything keyboard driven, and opening apps and windows purely with a command-line style prompt. That doesn’t seem totally possible yet. I guess I could just live inside my terminal and open apps by using shell aliases. However, keeping those shell aliases would require ongoing work.
(Apple: perhaps just let cmd+space open files and windows as well as apps?)
Revisiting Amethyst for the nth time, 2024-09
I recently tried to re-acquaint myself with Amethyst.
Initial Impressions
The default layouts seemed wildly impractical. However, it later became clear that Amethyst really isn’t meant for more than 5 windows at a time per ‘space’. Naturally I wound up with Amethyst trying to open 12 windows in one swoop after install. It was a mess.
I found the default mod-1 keybinding (alt+shift) moderately unpleasant to perform repeatedly. The default mod-2 keybinding is really not for me. But, you can change this. NBD.
I don’t need to micro-adjust window sizes in fixed increments like Amethyst allows you to do with mod1+h/l.
What I need out of a WM:
Quickly open a specific window with minimal effort.
Organize windows by application into a clear list/tree structure.
Be able to specify visual, non-space wasting layouts with minimal effort and cleanly preserve them.
How does Amethyst fare?
Amethyst does not attempt to do (1) or (2) at all.
Amethyst is quite good at (3).
Amethyst Personal Pros/Cons
(Personal) Pros:
Provides key bindings to quickly moving windows between virtual desktops (‘spaces’), encouraging a multi-desktop workflow
Entirely keyboard driven
Vim-style keyboard defaults
Layouts reduce keystrokes compared to Tiles WM and are automatically maintained by the system
(Personal) Cons:
In practice, it cannot handle more than 4-5 windows per ‘space’ on my 27” screen, otherwise becomes a cluttered mess/nightmare because it positions all open windows at once in each layout.
This forces the switch to a multiple virtual desktop work style. This is actually not that bad per-se. You can isolate groups of windows from multiple apps per-project or as you see fit.
Poor explanation of certain concepts/model (esp. the 'main pane'). Related to this: no visual indicators for certain important changes, creating a lot of confusion. Example: you can enter into visually identical configurations in different layouts by increasing the number of windows in the main pane. But it’s not obvious how you got there, let alone what happened. Just a simple outlining of the main pane would clarify this.
Another example: toggling whether a window is no longer managed by Amethyst (floating/vs non-floating). You have to rely on short term memory only. There are no visual cues. This is frustrating.
Newly re-maximized windows (and certain similar edge cases that probably have similar OS-level causes) are not handled properly by the tiling algorithm. (Apparently briefly viewing other virtual desktops (workspaces or spaces) can cause it to re-integrate these dangling windows into the tiling algorithm. Still, inelegant and hacky solution that ought to not be necessary.)
Too many tiling layouts in the default rotation for my taste. Most are not for me. (Esp. ‘column’ and ‘wide’).
Slow/buggy/glitchy layout transitions. Weird interactions with certain apps (e.g., Electron with Devtools on). Windows take too long to adjust. These can be irritating/distracting.
De-facto lock-in. I realize this is almost certainly not the developer’s intention. There are a few alternatives in Windows:
Amethyst Windows (no longer maintained).
Other findings:
Amethyst settings actually allow you to configure a max no. of windows per layout. IDK what happens to the extra windows if there are any. Which are chosen to be kept in the layout? By which criterion?
I was also able to edit the layout rotation. Removed 'column' layout. Really only needed 'tall', 'wide', and 'full screen'. Set max num of windows per layout to 5. On the whole, this seems promising. I will keep tinkering with it.