# AeroSpace config - https://nikitabobko.github.io/AeroSpace/guide # # Keybinding philosophy: # alt+* = AeroSpace (focus, workspaces, layout) # alt+shift+* = AeroSpace (move, modes) # ctrl+h/j/k/l = Karabiner vim nav (arrows, scroll) - DO NOT USE # ctrl+1-6 = Karabiner app launchers - DO NOT USE # alt+w = tmux prefix (via Karabiner Right Cmd) - DO NOT USE # C-h/j/k/l = nvim window nav (inside terminal) - no conflict # zsh ctrl+j/k = autosuggestion nav (inside terminal) - no conflict config-version = 2 start-at-login = true # Normalizations enable-normalization-flatten-containers = true enable-normalization-opposite-orientation-for-nested-containers = true # Layout defaults default-root-container-layout = 'tiles' default-root-container-orientation = 'auto' accordion-padding = 30 # Mouse follows focus when switching monitors on-focused-monitor-changed = ['move-mouse monitor-lazy-center'] # Gaps between windows [gaps] inner.horizontal = 10 inner.vertical = 10 outer.left = 10 outer.right = 10 outer.top = 10 outer.bottom = 10 # ------------------------------------------------------------------- # Main keybindings # ------------------------------------------------------------------- [mode.main.binding] # Focus windows: alt + h/j/k/l alt-h = 'focus left' alt-j = 'focus down' alt-k = 'focus up' alt-l = 'focus right' # Move windows: alt+shift + h/j/k/l alt-shift-h = 'move left' alt-shift-j = 'move down' alt-shift-k = 'move up' alt-shift-l = 'move right' # Switch workspaces: alt + number 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' # Move window to workspace: alt+shift + number 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' # Layout toggles alt-slash = 'layout tiles horizontal vertical' alt-comma = 'layout accordion horizontal vertical' # Fullscreen (replaces Rectangle: Option+F maximize) alt-f = 'fullscreen' # Float toggle (replaces Rectangle: Option+Shift+F almost-maximize) alt-shift-f = 'layout floating tiling' # Balance window sizes alt-shift-b = 'balance-sizes' # Last workspace (using backtick instead of tab to preserve macOS app switcher) alt-backtick = 'workspace-back-and-forth' # Monitor focus/move (replaces Rectangle: Ctrl+Option+Cmd+Space next display) alt-period = 'focus-monitor next' alt-shift-period = 'move-node-to-monitor next' alt-shift-comma = 'move-workspace-to-monitor next' # Modes alt-shift-r = 'mode resize' alt-shift-semicolon = 'mode service' # Screenshot to clipboard alt-shift-s = 'exec-and-forget screencapture -i -c' # ------------------------------------------------------------------- # Resize mode: alt+shift+r to enter, esc to exit # ------------------------------------------------------------------- [mode.resize.binding] h = 'resize width -50' j = 'resize height +50' k = 'resize height -50' l = 'resize width +50' minus = 'resize smart -50' equal = 'resize smart +50' enter = 'mode main' esc = 'mode main' # ------------------------------------------------------------------- # Service mode: alt+shift+; to enter, esc to exit # ------------------------------------------------------------------- [mode.service.binding] r = ['reload-config', 'mode main'] f = ['flatten-workspace-tree', 'mode main'] b = ['balance-sizes', 'mode main'] esc = 'mode main' backspace = ['close-all-windows-but-current', 'mode main'] # ------------------------------------------------------------------- # Auto-assign apps to workspaces # ------------------------------------------------------------------- # Browsers -> workspace 1 [[on-window-detected]] if.app-id = 'com.apple.Safari' run = 'move-node-to-workspace 1' [[on-window-detected]] if.app-id = 'company.thebrowser.Browser' run = 'move-node-to-workspace 1' # Terminals -> workspace 2 [[on-window-detected]] if.app-id = 'com.apple.Terminal' run = 'move-node-to-workspace 2' [[on-window-detected]] if.app-id = 'com.mitchellh.ghostty' run = 'move-node-to-workspace 2' [[on-window-detected]] if.app-id = 'com.googlecode.iterm2' run = 'move-node-to-workspace 2' # Editors -> workspace 3 [[on-window-detected]] if.app-id = 'com.microsoft.VSCode' run = 'move-node-to-workspace 3' [[on-window-detected]] if.app-id = 'dev.zed.Zed' run = 'move-node-to-workspace 3' # Chat -> workspace 4 [[on-window-detected]] if.app-id = 'com.tinyspeck.slackmacgap' run = 'move-node-to-workspace 4' [[on-window-detected]] if.app-id = 'ru.keepcoder.Telegram' run = 'move-node-to-workspace 4' [[on-window-detected]] if.app-id = 'org.whispersystems.signal-desktop' run = 'move-node-to-workspace 4' [[on-window-detected]] if.app-id = 'com.apple.MobileSMS' run = 'move-node-to-workspace 4' # Media -> workspace 5 [[on-window-detected]] if.app-id = 'com.spotify.client' run = 'move-node-to-workspace 5'