My AeroSpace setup for QWERTZ layout
In a previous episode of the Comfort Zone podcast, Nilean proposed a challenge: use AeroSpace for a week. This application automatically reorganizes your application windows. Unlike classic window managers, you don’t decide where to place your windows with keyboard shortcuts. The program automatically resizes them as soon as they appear.
So, I tried to take on this challenge by installing the application, and I fell in love with it instantly.
The only small snag in all this is that I’m in Switzerland and therefore use a Swiss French keyboard, aka QWERTZ.

AeroSpace offers shortcuts by combining the ALT key and numbers. On Swiss French and French keyboards, the number keys are also used to type special characters. As a result, many key combinations don’t work because they are already used.. So, I had to rework the AeroSpace configuration a bit to be able to use it.
To use this configuration, it’s essential to use a hyper key. In my case, it’s Raycast that allows me to have a hyper key. Specifically, when I press the Caps Lock key, it simulates pressing Control + Option + Command simultaneously. Usually, hyper keys also include the Shift combination, but in my case, I prefer to have two possibilities, namely Caps Lock and Shift + Caps Lock.
Here is the configuration I use.
# Place a copy of this config to ~/.aerospace.toml
# After that, you can edit ~/.aerospace.toml to your liking
# This configuration is optimized for use with a hyper key
# (ctrl-alt-cmd modifier combination)
# Config version for compatibility and deprecations
# Fallback value (if you omit the key): config-version = 1
config-version = 2
# You can use it to add commands that run after AeroSpace startup.
# Available commands : https://nikitabobko.github.io/AeroSpace/commands
after-startup-command = []
# Start AeroSpace at login
start-at-login = true
# Normalizations. See: https://nikitabobko.github.io/AeroSpace/guide#normalization
enable-normalization-flatten-containers = true
enable-normalization-opposite-orientation-for-nested-containers = true
# See: https://nikitabobko.github.io/AeroSpace/guide#layouts
# The 'accordion-padding' specifies the size of accordion padding
# You can set 0 to disable the padding feature
accordion-padding = 30
# Possible values: tiles|accordion
default-root-container-layout = 'tiles'
# Possible values: horizontal|vertical|auto
# 'auto' means: wide monitor (anything wider than high) gets horizontal orientation,
# tall monitor (anything higher than wide) gets vertical orientation
default-root-container-orientation = 'auto'
# Mouse follows focus when focused monitor changes
# Drop it from your config, if you don't like this behavior
# See https://nikitabobko.github.io/AeroSpace/guide#on-focus-changed-callbacks
# See https://nikitabobko.github.io/AeroSpace/commands#move-mouse
# Fallback value (if you omit the key): on-focused-monitor-changed = []
on-focused-monitor-changed = ['move-mouse monitor-lazy-center']
# You can effectively turn off macOS "Hide application" (cmd-h) feature by toggling this flag
# Useful if you don't use this macOS feature, but accidentally hit cmd-h or cmd-alt-h key
# Also see: https://nikitabobko.github.io/AeroSpace/goodies#disable-hide-app
automatically-unhide-macos-hidden-apps = false
# List of wspaces that should stay alive even when they contain no windows,
# even when they are invisible.
# This config version is only available since 'config-version = 2'
# Fallback value (if you omit the key): persistent-workspaces = []
persistent-workspaces = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
# A callback that runs every time binding mode changes
# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes
# See: https://nikitabobko.github.io/AeroSpace/commands#mode
on-mode-changed = []
# Possible values: (qwerty|dvorak|colemak)
# See https://nikitabobko.github.io/AeroSpace/guide#key-mapping
[key-mapping]
preset = 'qwerty'
[key-mapping.key-notation-to-key-code]
# Créer des alias pour que les notations correspondent aux étiquettes Swiss-French
# Syntaxe: alias = 'notation-standard' (la notation standard réfère à la position US)
# Inverser Y et Z pour correspondre aux étiquettes physiques
y = 'z' # La touche étiquetée Y (position US de Z)
z = 'y' # La touche étiquetée Z (position US de Y)
# Gaps between windows (inner-*) and between monitor edges (outer-*).
# Possible values:
# - Constant: gaps.outer.top = 8
# - Per monitor: gaps.outer.top = [{ monitor.main = 16 }, { monitor."some-pattern" = 32 }, 24]
# In this example, 24 is a default value when there is no match.
# Monitor pattern is the same as for 'workspace-to-monitor-force-assignment'.
# See:
# https://nikitabobko.github.io/AeroSpace/guide#assign-workspaces-to-monitors
[gaps]
inner.horizontal = 10
inner.vertical = 10
outer.left = 10
outer.bottom = 10
outer.top = 10
outer.right = 10
# 'main' binding mode declaration
# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes
# 'main' binding mode must be always presented
# Fallback value (if you omit the key): mode.main.binding = {}
[mode.main.binding]
# All possible keys:
# - Letters. a, b, c, ..., z
# - Numbers. 0, 1, 2, ..., 9
# - Keypad numbers. keypad0, keypad1, keypad2, ..., keypad9
# - F-keys. f1, f2, ..., f20
# - Special keys. minus, equal, period, comma, slash, backslash, quote, semicolon,
# backtick, leftSquareBracket, rightSquareBracket, space, enter, esc,
# backspace, tab, pageUp, pageDown, home, end, forwardDelete,
# sectionSign (ISO keyboards only, european keyboards only)
# - Keypad special. keypadClear, keypadDecimalMark, keypadDivide, keypadEnter, keypadEqual,
# keypadMinus, keypadMultiply, keypadPlus
# - Arrows. left, down, up, right
# All possible modifiers: cmd, alt, ctrl, shift
# All possible commands: https://nikitabobko.github.io/AeroSpace/commands
# See: https://nikitabobko.github.io/AeroSpace/commands#exec-and-forget
# You can uncomment the following lines to open up terminal with alt + enter shortcut
# (like in i3)
# alt-enter = '''exec-and-forget osascript -e '
# tell application "Terminal"
# do script
# activate
# end
# '''
# See: https://nikitabobko.github.io/AeroSpace/commands#layout
alt-shift-comma = 'layout tiles horizontal vertical'
alt-shift-period = 'layout accordion horizontal vertical'
# See: https://nikitabobko.github.io/AeroSpace/commands#focus
alt-h = 'focus left'
alt-j = 'focus down'
alt-k = 'focus up'
alt-l = 'focus right'
# See: https://nikitabobko.github.io/AeroSpace/commands#move
alt-shift-h = 'move left'
alt-shift-j = 'move down'
alt-shift-k = 'move up'
alt-shift-l = 'move right'
# See: https://nikitabobko.github.io/AeroSpace/commands#resize
ctrl-alt-cmd-k = 'resize smart -50'
ctrl-alt-cmd-j = 'resize smart +50'
# See: https://nikitabobko.github.io/AeroSpace/commands#workspace
ctrl-alt-cmd-1 = 'workspace 1'
ctrl-alt-cmd-2 = 'workspace 2'
ctrl-alt-cmd-3 = 'workspace 3'
ctrl-alt-cmd-4 = 'workspace 4'
ctrl-alt-cmd-5 = 'workspace 5'
ctrl-alt-cmd-6 = 'workspace 6'
ctrl-alt-cmd-7 = 'workspace 7'
ctrl-alt-cmd-8 = 'workspace 8'
ctrl-alt-cmd-9 = 'workspace 9'
# See: https://nikitabobko.github.io/AeroSpace/commands#move-node-to-workspace
ctrl-alt-cmd-shift-1 = 'move-node-to-workspace 1'
ctrl-alt-cmd-shift-2 = 'move-node-to-workspace 2'
ctrl-alt-cmd-shift-3 = 'move-node-to-workspace 3'
ctrl-alt-cmd-shift-4 = 'move-node-to-workspace 4'
ctrl-alt-cmd-shift-5 = 'move-node-to-workspace 5'
ctrl-alt-cmd-shift-6 = 'move-node-to-workspace 6'
ctrl-alt-cmd-shift-7 = 'move-node-to-workspace 7'
ctrl-alt-cmd-shift-8 = 'move-node-to-workspace 8'
ctrl-alt-cmd-shift-9 = 'move-node-to-workspace 9'
# See: https://nikitabobko.github.io/AeroSpace/commands#fullscreen
ctrl-alt-cmd-space = 'fullscreen'
# See: https://nikitabobko.github.io/AeroSpace/commands#workspace-back-and-forth
ctrl-alt-cmd-tab = 'workspace-back-and-forth'
# See: https://nikitabobko.github.io/AeroSpace/commands#move-workspace-to-monitor
ctrl-alt-cmd-shift-tab = 'move-workspace-to-monitor --wrap-around next'
# See: https://nikitabobko.github.io/AeroSpace/commands#mode
ctrl-alt-cmd-s = 'mode service'
# 'service' binding mode declaration.
# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes
[mode.service.binding]
esc = ['reload-config', 'mode main']
r = ['flatten-workspace-tree', 'mode main'] # reset layout
f = [
'layout floating tiling',
'mode main',
] # Toggle between floating and tiling layout
backspace = ['close-all-windows-but-current', 'mode main']
# sticky is not yet supported https://github.com/nikitabobko/AeroSpace/issues/2
#s = ['layout sticky tiling', 'mode main']
alt-shift-h = ['join-with left', 'mode main']
alt-shift-j = ['join-with down', 'mode main']
alt-shift-k = ['join-with up', 'mode main']
alt-shift-l = ['join-with right', 'mode main']
I hope this article has been able to help people who want to use AeroSpace and don’t have a compatible keyboard.
This configuration may change over time. You can find the latest updated version on GitHub.