{ pkgs, lib, config, home-dir, ... }: let cfg = config.custom.aerospace; in { options.custom = with lib; { aerospace = { enable = mkEnableOption "Enable aerospace"; logFile = mkOption { type = types.str; default = "${home-dir}/Library/Logs/aerospace.log"; description = "Filepath of log output"; }; }; }; config = lib.mkIf cfg.enable { launchd.user.agents.aerospace.serviceConfig = { StandardErrorPath = cfg.logFile; StandardOutPath = cfg.logFile; }; services.aerospace = { enable = true; settings = { enable-normalization-flatten-containers = false; enable-normalization-opposite-orientation-for-nested-containers = false; accordion-padding = 0; on-focused-monitor-changed = [ "move-mouse monitor-lazy-center" ]; default-root-container-layout = "tiles"; default-root-container-orientation = "auto"; gaps = { inner = { horizontal = 15; vertical = 15; }; outer = { left = 10; bottom = 5; top = [ { monitor."LG ULTRAWIDE" = 50; } { monitor."ZOWIE XL LCD" = 50; } 12 ]; right = 10; }; }; mode = { main = { binding = { alt-enter = let script = pkgs.writeText "ghostty.applescript" '' do shell script "open -n -a Ghostty" ''; in "exec-and-forget osascript ${script}"; # alt-enter = "exec-and-forget \"open -n -a /Applications/Slack.app\""; alt-shift-f = "fullscreen"; alt-shift-q = "close --quit-if-last-window"; alt-space = "layout floating tiling"; alt-e = "layout tiles horizontal vertical"; alt-t = "layout h_accordion"; alt-s = "layout v_accordion"; alt-v = "split vertical"; alt-shift-v = "split horizontal"; # alt-v = "join-with down"; # alt-shift-v = "join-with right"; alt-h = "focus --boundaries-action wrap-around-the-workspace left"; alt-l = "focus --boundaries-action wrap-around-the-workspace right"; alt-j = "focus --boundaries-action wrap-around-the-workspace down"; alt-k = "focus --boundaries-action wrap-around-the-workspace up"; alt-shift-h = "move left"; alt-shift-l = "move right"; alt-shift-j = "move down"; alt-shift-k = "move up"; cmd-h = [ ]; # Disable "hide application" cmd-alt-h = [ ]; # Disable "hide others" cmd-q = [ ]; # Disable "quit" cmd-shift-q = [ ]; # Disable "logout" 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" # "workspace 1" ]; alt-shift-2 = [ "move-node-to-workspace 2" # "workspace 2" ]; alt-shift-3 = [ "move-node-to-workspace 3" # "workspace 3" ]; alt-shift-4 = [ "move-node-to-workspace 4" # "workspace 4" ]; alt-shift-5 = [ "move-node-to-workspace 5" # "workspace 5" ]; alt-shift-6 = [ "move-node-to-workspace 6" # "workspace 6" ]; alt-shift-7 = [ "move-node-to-workspace 7" # "workspace 7" ]; alt-shift-8 = [ "move-node-to-workspace 8" # "workspace 8" ]; alt-shift-9 = [ "move-node-to-workspace 9" # "workspace 9" ]; alt-shift-0 = [ "move-node-to-workspace 10" # "workspace 10" ]; alt-shift-c = "reload-config"; alt-tab = "workspace-back-and-forth"; alt-shift-tab = "move-workspace-to-monitor --wrap-around next"; alt-r = "mode resize"; alt-shift-semicolon = "mode service"; }; }; service = { binding = { esc = [ "reload-config" "mode main" ]; r = [ "flatten-workspace-tree" "mode main" ]; f = [ "layout floating tiling" "mode main" ]; backspace = [ "close-all-windows-but-current" "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" ]; # down = "volume down"; # up = "volume up"; # shift-down = [ "volume set 0" "mode main" ]; }; }; resize = { binding = { h = "resize width -50"; j = "resize height +50"; k = "resize height -50"; l = "resize width +50"; enter = "mode main"; esc = "mode main"; }; }; }; workspace-to-monitor-force-assignment = { "1" = "main"; "2" = "main"; "3" = "main"; "4" = "main"; "5" = "main"; "6" = "main"; "7" = [ "2" "main" ]; "8" = "main"; "9" = "main"; "10" = [ "2" "main" ]; }; on-window-detected = [ # workspace # media { "if".app-id = "com.spotify.client"; run = [ "move-node-to-workspace 7" ]; } # browser { "if".app-id = "app.zen-browser.zen"; run = [ "move-node-to-workspace 10" ]; } { "if".app-id = "app.mozilla.firefox"; run = [ "move-node-to-workspace 10" ]; } { "if".app-id = "com.google.Chrome"; run = [ "move-node-to-workspace 10" ]; } { "if".app-id = "org.chromium.Chromium"; run = [ "move-node-to-workspace 10" ]; } # communications { "if".app-id = "com.tinyspeck.slackmacgap"; run = [ "move-node-to-workspace 9" ]; } { "if".app-id = "com.microsoft.teams2"; run = [ "move-node-to-workspace 9" ]; } # special app's layout ## tiling { "if".app-id = "com.mitchellh.ghostty"; run = [ "layout tiling" ]; } ## floating { "if".app-id = "com.renfei.SnippetsLab"; run = [ "layout floating" ]; } { "if".app-id = "com.colliderli.iina"; run = [ "layout tiling" ]; } { "if".app-id = "com.apple.ActivityMonitor"; run = [ "layout floating" ]; } { "if".app-id = "com.apple.calculator"; run = [ "layout floating" ]; } { "if".app-id = "com.apple.finder"; run = [ "layout floating" ]; } { "if".app-id = "com.1password.1password"; run = [ "layout floating" ]; } ]; }; }; }; }