This will be a quick post. I am just enumerating all the tools I am using on my mac to avoid missing Arch too much. For work related reasons I moved to a M2 mac four months ago so I had to adapt a ton of stuff.
The Non-Negotiables
First, the good news: many of my essential tools (Neovim, VSCode, etc.) are cross-platform, so they came along for the ride. But some aspects of my workflow needed Mac-specific alternatives. Let's dive into what I'm using to make macOS feel more like home.
Without further ado, my picks:
AeroSpace: The i3-like Tiling Window Manager
The biggest gap to fill was a proper tiling window manager. AeroSpace has become my go-to solution. While it's not as configurable as XMonad, it brings several i3-like features that make it a solid alternative.
Aerospace does something insanely well. Something that grinds my gears in mac is that the animations on workspaces take about 500ms which is a huge waste of time. This completely ignores macos workspaces with its own implementation. Huge success.
Sort of scratchpads
Scratchpads are probably the feature I liked the most in XMonad. You can anyhow create a back and forth workspace so you can have something similar. Not perfect but good enough.
cmd-o = 'workspace --auto-back-and-forth O'
[[on-window-detected]]
if.app-id = 'md.obsidian'
run = 'move-node-to-workspace O'
With this I can have press cmd-o to go to obsidian workspace and pressing cmd-o again takes you back.
Keyboard driven window focus
And then set some shortcuts to focus common apps.
To do that I created a ~/.config/aerospace/focus.sh script that does:
#!/usr/bin/env bash
APP_NAME=$1
app_window_id=$(aerospace list-windows --all --format "%{window-id}%{right-padding} | %{app-name}" | grep $APP_NAME | cut -d' ' -f1 | sed '1p;d')
aerospace focus --window-id $app_window_id
aerospace move-mouse window-lazy-center
With that I can have the shortcut not to only focus on the app I want but move the mouse cursor to the middle of the window so I can deduct where the mouse is faster. I just have to add to the aerospace.toml the following
cmd-y = 'exec-and-forget ~/.config/aerospace/focus.sh Code'
cmd-u = 'exec-and-forget ~/.config/aerospace/focus.sh kitty'
cmd-i = 'exec-and-forget ~/.config/aerospace/focus.sh Firefox'
Small tweaks
I had to force Firefox's picture in picture to float
[[on-window-detected]]
if.app-id = 'org.mozilla.firefox'
if.window-title-regex-substring = 'Picture-in-Picture'
run = 'layout floating'
And then set some shortcuts to focus common apps.
Ice
I've used mac in the past and you end up with 9000 different menubar items you don't care about so using ice makes it easy for you to not clutter your menubar.
Alfred
There are more modern options but I had a perpetual license for this since forever. I don't want another subscription for this so Raycast was out of the question. If you combine with stuff like https://github.com/yohasebe/openai-chat-api-workflow you will have more than enough (text, audio and vision) with paying just for API usage.
Notable alternatives
There are some software I don't want to avoid to mention but in the end it did not make the cut.
apptivate
To recover from the lack of scratchpads this was my first option. Anyhow it looks insanely outdated. It has some cool options, like warning you if you are overriding a system shortcut.
yabai
Yabai supports proper scratchpads but I have not been able to set up workspaces that work instantly and I'd have to disable SIP. Anyway, it is super cool and maybe some of you find it useful.
Hammerspoon
A swiss army knife for automation. You can assign lua functions to events. I tried to use it to have keybindings to focus to apps like:
-- Function to focus on app or launch it if it's not running
function focusOrLaunch(appName, bundleID)
local app = hs.application.get(appName)
if app then
if app:isFrontmost() then
-- If the app is already focused, do nothing
return
else
-- Focus on the app
app:activate(true)
app:unhide()
end
else
-- Launch the app if it's not running
hs.application.launchOrFocusByBundleID(bundleID)
end
end
-- Define keyboard shortcuts
-- VSCode
hs.hotkey.bind({"cmd"}, "y", function()
focusOrLaunch("Code", "com.microsoft.VSCode")
end)
-- Kitty
hs.hotkey.bind({"cmd"}, "u", function()
focusOrLaunch("kitty", "net.kovidgoyal.kitty")
end)
-- Firefox
hs.hotkey.bind({"cmd"}, "i", function()
focusOrLaunch("Firefox", "org.mozilla.firefox")
end)
-- Obsidian
hs.hotkey.bind({"cmd"}, "o", function()
focusOrLaunch("Obsidian", "md.obsidian")
end)
But I ended up leveraging aerospace for this so one less software to run.
The veredict
While it's not exactly Arch Linux, this setup has made macOS feel surprisingly comfortable. I hope I gave you some ideas on this post on stuff you can do to feel a little bit better using your good old MacOS computer.
Have fun!