Window managers seem to be a hot topic again, but as Mac users, we always get to miss out on the latest innovations from the linux world. For those of us on Mac or Windows, managing windows has stayed consistent for many years. Apple has tried to bring innovation withe Stage Manager in 2022, but for me, this is not an effective tool for my workflow.
Tiling window managers are currently the goto system, again linux has all the best options including i3 and the promising hyperland. Macs too have had a lot of innovations with services like Yabai and Aerospace. However, for me, tiling window managers have not quite hit the mark. My current workflow is very simple, with no need to learn dozens of short cuts to navigate the system.
There is however 1 golden rule: Only have a single window per application. This enforces 2 levels of navigation, and requires each app to have an effective means to quickly switch to the correct content i.e., browser tabs, but this constraint also provides a few side effects:
- Less clutter
- when switching apps, I don't need to worry about the window I need to navigate too, I just need to go directly the only window for that app.
- If that window starts to get too complicated to then find the tab I need, that is really and issue that there is already too much going on in that app, and that I should be closing some tabs. For Safari, this often means closing tabs that I have open because I want to return to, but this just highlights that I should really be recording the url in my Obsidian Daily Notes, so it's never lost.
Last, I want total control of each window, if I set it left 50%, I want it to stay there. I don't mind if it gets covered by another window, as each app is only a hotkey away. What I don't want is the window manager to rearrange the size and position because I've opened another window.
Having said all that, I will create multiple windows for quick dedicated tasks. Multiple finder windows are useful when copying files, an extra iTerm2 window is handy to quickly try a cli utility. But these extra windows are close as soon as they've done their job.
Arranging Windows
Widow arrangement is handled entirely via the Raycast window management plugin.
Full screen
ctrl
+alt
+enter
Full screen just means make the current window fit the available space between the menu bar and the dock (which is anchored to the bottom of the screen). I've never got on well actual fullscreen apps that move to their own exclusive desktop, as I still want to see the menu bar, status bar, and dock.
Move windows
ctrl
+alt
+left
ctrl
+alt
+right
ctrl
+alt
+up
ctrl
+alt
+down
Each shortcut here moves the window to use 50% of the screen and anchored in that direction. Multiple uses will cycle the window through 33% then 66%. These shortcuts make ti very quick to create my preferred layout of iTerm taking the left 66%, and Safari taking the right 33%.
ctrl
+alt
+r
ctrl
+alt
+f
r
and f
are a bit special and make the current window take up the middle 33% and 66% of the screen, these can be nice if the content of the window works better in a narrow window, or if I want to create a thirds based window layout.
Switching apps
Using Raycasts ability to run a script for a keyboard shortcut, I have several custom scripts to launch/open each app, and that script is assigned to a hotkey in Raycast. The real trick to making this work is that I only have a single window for each application open at any one time. Therefore, I can ctrl
+ §
to ask claud a coding question, jump to my development environment instantly with ctrl
+ 2
, and then quickly switch to Safari to check changes have applied correctly.
ctrl
+§
Cluadectrl
+1
Safarictrl
+2
iTerm2ctrl
+3
Slackctrl
+4
Obsidianctrl
+5
Zoomctrl
+0
Finder
In addition, I like to replicate this same order for the icons in the dock. So far, these are my most used apps, other apps might get added to higher to numbers, but at that point, the shortcut becomes harder to access.
Switching Workspaces in iTerm2
I use Tmux to be able to have multiple terminal prompts open in a single iTerm2 window. My default preference is to use a tmux session per project, then each session has shells that run vim, as well as other shells to handle bash commands, servers, and any devcontainer sessions. Each shell typically runs as a tmux window, but occasionally I'll use split panes e.g., running claude code cli side by side with vim. Switching tmux windows is handled by the built in tmux command:
ctrl
+a
,[window number]
For switching to other projects, as each project is it's own tmux session, I have setup a tmux binding, double ctrl
+ a
, that uses a simple fzf script to search running tmux sessions and switch:
ctrl
+a
,ctrl
+a
# Simple tmux session switcher
bind C-a display-popup -E "tmux list-sessions | sed -E 's/:.*$//' | grep -v \"^$(tmux display-message -p '#S')\$\" | fzf --reverse | xargs tmux switch-client -t"
As an extra power user tip, the default prefix hotkey for tmux is ctrl
+ b
, but this is a very awkward combination to hit. ctrl
+ a
is the classic prefix key from screen, the multiplexer that predates tmux. To make this hotkey even easer to hit, I swap the caps lock key to control (via the Mac System Settings).
For me, this script really demonstrates the power that a terminal multiplexer like tmux, and some simple bash scripting, can be a force multiplier for productivity. With it, I can get to any terminal shell, from anywhere in Mac OS, with only a handful keystrokes. when combined with my other shortcuts, I only need my keyboard to navigate and control every thing I need to handle on a day-to-day basis.