AeroSpace is an i3-like tiling window manager for macOS
Project homepage: https://github.com/nikitabobko/AeroSpace
Do you have a cool automatization, AeroSpace integration, or workflow?
Feel free to open an issue or pull request to add it to this list!
The source code of the page can be found in the ./docs
directory.
1. Move windows by dragging any part of the window
defaults write -g NSWindowShouldDragOnGesture -bool true
Now, you can move windows by holding ctrl + cmd
and dragging any part of the window (not necessarily the window title)
2. Highlight focused windows with colored borders
To highlight the focused window with colored border you can use JankyBorders.
You can also use after-startup-command
to start JankyBorders together with AeroSpace
after-startup-command = [
# JankyBorders has a built-in detection of already running process,
# so it won't be run twice on AeroSpace restart
'exec-and-forget borders active_color=0xffe1e3e4 inactive_color=0xff494d64 width=5.0'
]
3. AeroSpace Raycast extension
There is a third party Raycast extension for AeroSpace. https://www.raycast.com/limonkufu/aerospace
If you struggle remembering shortcuts, it’s useful to search for commands until they become muscle memory.
4. Disable windows opening animations
Observable in Google Chrome
defaults write -g NSAutomaticWindowAnimationsEnabled -bool false
5. Use trackpad gestures to switch workspaces
You can use BetterTouchTool to assign trackpad gestures to switch workspaces
The following commands focus next or previous workspaces on monitors where the mouse is located
aerospace workspace "$(aerospace list-workspaces --monitor mouse --visible)" && aerospace workspace next
aerospace workspace "$(aerospace list-workspaces --monitor mouse --visible)" && aerospace workspace prev
Beware that you might need to specify full path to aerospace executable https://community.folivora.ai/t/how-to-execute-terminal-command-to-switch-workspaces-with-aerospace/35914
6. Show AeroSpace workspaces in Sketchybar
You can integrate AeroSpace workspace indicators with Sketchybar. Use these snippets as a starting point.
# Run Sketchybar together with AeroSpace
# sketchbar has a built-in detection of already running process,
# so it won't be run twice on AeroSpace restart
after-startup-command = ['exec-and-forget sketchybar']
# Notify Sketchybar about workspace change
exec-on-workspace-change = ['/bin/bash', '-c',
'sketchybar --trigger aerospace_workspace_change FOCUSED_WORKSPACE=$AEROSPACE_FOCUSED_WORKSPACE'
]
sketchybar --add event aerospace_workspace_change
for sid in $(aerospace list-workspaces --all); do
sketchybar --add item space.$sid left \
--subscribe space.$sid aerospace_workspace_change \
--set space.$sid \
background.color=0x44ffffff \
background.corner_radius=5 \
background.height=20 \
background.drawing=off \
label="$sid" \
click_script="aerospace workspace $sid" \
script="$CONFIG_DIR/plugins/aerospace.sh $sid"
done
#!/usr/bin/env bash
# make sure it's executable with:
# chmod +x ~/.config/sketchybar/plugins/aerospace.sh
if [ "$1" = "$FOCUSED_WORKSPACE" ]; then
sketchybar --set $NAME background.drawing=on
else
sketchybar --set $NAME background.drawing=off
fi
7. Open a new window with AppleScript
Invoking Safari/Terminal with a command the obvious way (exec-and-forget open -a Safari
) results in an outcome that is probably not the intended one.
Namely, that any workspace already containing an instance of Safari/Terminal is brought in focus.
Opening a new window of a program that can supports multiple windows (such as Safari or Terminal.app) can be accomplished with an AppleScript inlined in aerospace.toml
as follows:
-
Safari
ctrl-g = '''exec-and-forget osascript -e ' tell application "Safari" make new document at end of documents activate end tell' '''
-
Terminal
ctrl-g = '''exec-and-forget osascript -e ' tell application "Terminal" do script activate end tell' '''
8. Disable annoying and useless "hide application" shortcut
If automatically-unhide-macos-hidden-apps
isn’t enough, you can disable cmd-h
altogether (which will make this hotkey unavailable for apps that might use it for other purposes)
[mode.main.binding]
cmd-h = [] # Disable "hide application"
cmd-alt-h = [] # Disable "hide others"
9. Colemak keys remap
[key-mapping.key-notation-to-key-code]
q = 'q'
w = 'w'
f = 'e'
p = 'r'
g = 't'
j = 'y'
l = 'u'
u = 'i'
y = 'o'
semicolon = 'p'
leftSquareBracket = 'leftSquareBracket'
rightSquareBracket = 'rightSquareBracket'
backslash = 'backslash'
a = 'a'
r = 's'
s = 'd'
t = 'f'
d = 'g'
h = 'h'
n = 'j'
e = 'k'
i = 'l'
o = 'semicolon'
quote = 'quote'
z = 'z'
x = 'x'
c = 'c'
v = 'v'
b = 'b'
k = 'n'
m = 'm'
comma = 'comma'
period = 'period'
slash = 'slash'
10. i3 like config
# Reference: https://github.com/i3/i3/blob/next/etc/config
# i3 doesn't have "normalizations" feature that why we disable them here.
# But the feature is very helpful.
# Normalizations eliminate all sorts of weird tree configurations that don't make sense.
# Give normalizations a chance and enable them back.
enable-normalization-flatten-containers = false
enable-normalization-opposite-orientation-for-nested-containers = false
# Mouse follows focus when focused monitor changes
on-focused-monitor-changed = ['move-mouse monitor-lazy-center']
[mode.main.binding]
# See: https://nikitabobko.github.io/AeroSpace/goodness#open-a-new-window-with-applescript
alt-enter = '''exec-and-forget osascript -e '
tell application "Terminal"
do script
activate
end tell'
'''
# i3 wraps focus by default
alt-j = 'focus --boundaries-action wrap-around-the-workspace left'
alt-k = 'focus --boundaries-action wrap-around-the-workspace down'
alt-l = 'focus --boundaries-action wrap-around-the-workspace up'
alt-semicolon = 'focus --boundaries-action wrap-around-the-workspace right'
alt-shift-j = 'move left'
alt-shift-k = 'move down'
alt-shift-l = 'move up'
alt-shift-semicolon = 'move right'
# Consider using 'join-with' command as a 'split' replacement if you want to enable normalizations
alt-h = 'split horizontal'
alt-v = 'split vertical'
alt-f = 'fullscreen'
alt-s = 'layout v_accordion' # 'layout stacking' in i3
alt-w = 'layout h_accordion' # 'layout tabbed' in i3
alt-e = 'layout tiles horizontal vertical' # 'layout toggle split' in i3
alt-shift-space = 'layout floating tiling' # 'floating toggle' in i3
# Not supported, because this command is redundant in AeroSpace mental model.
# See: https://nikitabobko.github.io/AeroSpace/guide#floating-windows
#alt-space = 'focus toggle_tiling_floating'
# `focus parent`/`focus child` are not yet supported, and it's not clear whether they
# should be supported at all https://github.com/nikitabobko/AeroSpace/issues/5
# alt-a = 'focus parent'
alt-1 = 'workspace 1'
alt-2 = 'workspace 2'
alt-3 = 'workspace 3'
alt-4 = 'workspace 4'
alt-5 = 'workspace 5'
alt-6 = 'workspace 6'
alt-7 = 'workspace 7'
alt-8 = 'workspace 8'
alt-9 = 'workspace 9'
alt-0 = 'workspace 10'
alt-shift-1 = 'move-node-to-workspace 1'
alt-shift-2 = 'move-node-to-workspace 2'
alt-shift-3 = 'move-node-to-workspace 3'
alt-shift-4 = 'move-node-to-workspace 4'
alt-shift-5 = 'move-node-to-workspace 5'
alt-shift-6 = 'move-node-to-workspace 6'
alt-shift-7 = 'move-node-to-workspace 7'
alt-shift-8 = 'move-node-to-workspace 8'
alt-shift-9 = 'move-node-to-workspace 9'
alt-shift-0 = 'move-node-to-workspace 10'
alt-shift-c = 'reload-config'
alt-r = 'mode resize'
[mode.resize.binding]
h = 'resize width -50'
j = 'resize height +50'
k = 'resize height -50'
l = 'resize width +50'
enter = 'mode main'
esc = 'mode main'
11. List of popular and built-in applications IDs
The list is useful to compose custom on-window-detected callback.
Application name | Application ID |
---|---|
1Password |
|
Activity Monitor |
|
AirPort Utility |
|
Alacritty |
|
Android Studio |
|
App Store |
|
AppCode |
|
Arc Browser |
|
Audio MIDI Setup |
|
Automator |
|
Battle.net |
|
Books |
|
Brave |
|
CLion |
|
Calculator |
|
Calendar |
|
Chess |
|
Clock |
|
ColorSync Utility |
|
Console |
|
Contacts |
|
Dictionary |
|
Disk Utility |
|
Docker |
|
FaceTime |
|
Figma |
|
Find My |
|
Finder |
|
Firefox |
|
Freeform |
|
GIMP |
|
Google Chrome |
|
Grapher |
|
Home |
|
Inkscape |
|
IntelliJ IDEA Community |
|
IntelliJ IDEA Ultimate |
|
Karabiner-Elements |
|
Keychain Access |
|
Keynote |
|
Kitty |
|
|
|
Maps |
|
Marta |
|
Messages |
|
Music |
|
Notes |
|
Obsidian |
|
Pages |
|
Photo Booth |
|
Photos |
|
Podcasts |
|
Preview |
|
PyCharm Community |
|
PyCharm Professional |
|
QuickTime Player |
|
Reminders |
|
Safari |
|
Shortcuts |
|
Slack |
|
Spotify |
|
Steam |
|
Stocks |
|
Sublime Merge |
|
Sublime Text |
|
System Settings |
|
TV |
|
Telegram |
|
Terminal |
|
TextEdit |
|
Thunderbird |
|
Time Machine |
|
Todoist |
|
Tor Browser |
|
Transmission |
|
VLC |
|
Visual Studio Code |
|
VoiceMemos |
|
VoiceOver Utility |
|
Weather |
|
WezTerm |
|
Xcode |
|
iMovie |
|
iTerm2 |
|
kdenlive |
|