前言
切换窗口的低效体验
如果你有被开发或者写文章的时候需要在多个
app
之中来回切换,那么肯定会遇到一个头痛的问题,要高频率的使用alt
+tab
如果此时要切换的app
数量高于2
那么这个时候切换就会非常频繁且地效,所以需要一个系统化的解决方案来管理窗口之间的来回切换,而这个解决方案就是平铺窗口管理器 ,而今天要介绍的平铺窗口管理器 就是aerospace
为什么选择 Aerospace ?
对于当前的使用场景,肯定有人会问为什么不用
yabai
+shkd
的解决方案,对于yabai
来说,目前的使用场景下,会有需要关闭系统保护 ,个人认为不太安全,以及该软件在每次苹果更新系统之后还要等待适配,等待更新的过程是比较煎熬的,所以这里不考虑使用这个方案
安装
bash
brew install --cask nikitabobko/tap/aerospace
首次打开的时候可能会要求开启权限,这里直接到系统配置里面授权即可!
导入基础配置配置
- 官方提供了两种配置,一种是类
i3wm
的模式,还有一种就是app
默认启用的模式,这里我们使用app
默认启用的模式 - 配置文件可以放在两个地方,分别是:
~/.aerospace.toml
~/.config/aerospace/.aerospace.toml
- 我们这里选择官方默认的配置文件,我们有两种渠道可以获取:
- 直接从官网复制配置的内容到
.aerospace.toml
文件中------ Aerospace##default-config - 使用命令:
- 直接从官网复制配置的内容到
bash
cp /Applications/AeroSpace.app/Contents/Resources/default-config.toml ~/.aerospace.toml
- 现在文件的基本内容有有了
基本概念
工作区(Workspace)
工作区(Workspace) 是一个虚拟的桌面环境,用于组织和管理多个窗口。
每个工作区可以包含一组窗口和应用程序,用户可以在不同的工作区之间切换,从而提高工作效率和桌面管理的灵活性。
主模式(Main Mode)
- 目的 :主模式是用于管理窗口和工作区的默认模式。
- 使用场景 :在主模式下,你可以执行标准的窗口管理任务,如移动 、调整大小 和在窗口之间切换 。这个模式是你在使用窗口管理器时大部分时间所处的模式。
服务模式(Service-Mode)
- 目的 :服务模式用于执行特定的操作或命令 ,这些操作或命令与主要的窗口管理 任务无关。
- 使用场景 :在服务模式下,你可以执行诸如重新加载配置 、扁平化工作区树 或关闭除当前窗口之外的所有窗口 等命令。一旦命令执行完毕,模式通常会切换回主模式。
树状结构 (Tree)
Aerospace
使用的是树(Tree
)的结构表示窗口和工作区的层次结构
在 Aerospace
平铺窗口管理器中,每个非叶子节点被称为 "容器"(Container)。 比如👇这张图片中,根节点 root node
,就是一个所谓的容器
- 每个工作区都有自己的根节点
- 每个容器可以保护任意数量的子节点
- 窗口(Windows)是唯一可能的叶子节点。叶子节点是指没有子节点的节点
- 每个容器 都有两个属性 :
- 布局(Layout) :可能的值(
tiles
、accordion
) - 方向(Orientation) :可能的值(
horizontal
、vertical
)
- 布局(Layout) :可能的值(


手风琴模式与平铺模式
平铺模式
- 定义:窗口按指定方向(水平或垂直)排列,不重叠。
- 特点:所有窗口都可见,且占据屏幕的不同部分。
手风琴模式
- 定义:窗口叠放在一起,显示左右或上下的填充,以指示其他窗口的存在。
- 特点:只有一个窗口完全可见,其他窗口部分可见。
基本使用
聚焦不同的窗口
toml
[mode.main.binding]
alt-h = 'focus left'
alt-j = 'focus down'
alt-k = 'focus up'
alt-l = 'focus right'
可以使用 alt
+ hjkl
(对应左下上右 ,即 Vim
键位) 按照方位来切换当前想要聚焦的窗口
移动当前聚焦的定位
比如我们打开一个终端,这里我们使用 kitty
:
当前聚焦的是右侧黑色的终端 ,现在以这个状态作为初始状态,演示移动当前聚焦窗口定位后的状态

alt
+shift
+h
:将当前聚焦的窗口移到左侧

alt
+shift
+j
:将当前聚焦窗口移动到下方

alt
+shift
+k
:将当前聚焦的窗口移动到上方

alt
+shift
+l
,这个如果是初始状态 ,按下该快捷键后并不会有效果,所以我们把👆上面的3
作为4
的初始状态,按下对应的快捷键,此时就会回到一开始的状态,即当前聚焦的窗口回到了右侧:

手风琴模式和平铺模式之间来回切换
手风琴模式和平铺模式触发的快捷键对应的配置代码如下:
toml
alt-slash = 'layout tiles horizontal vertical'
alt-comma = 'layout accordion horizontal vertical'
在 [[#树状结构 (Tree)]] 中我们提到过:
- 每个容器 都有两个属性 :
- 布局(Layout) :可能的值(
tiles
、accordion
) - 方向(Orientation) :可能的值(
horizontal
、vertical
)
- 布局(Layout) :可能的值(
而这里的 tiles
对应平铺模式 ,accordion
对应手风琴模式
当我们按下 alt
+ slash
(斜杆 /
) 的时候就会触发平铺模式:
- 默认是
horizontal
也就是水平的摆放: - 再次按下
alt
+slash
(斜杆/
),就会切换到垂直摆放了:
当我们按下 alt
+ comma
(逗号 ,
) 的时候就会触发平铺模式:
-
默认是
horizontal
也就是水平的摆放: -
再次按下
alt
+slash
(逗号,
),就会切换到垂直摆放了:

合并两个窗口到一个容器中
比如现在我们有3个窗口:

树形结构如下:

现在希望将右侧的两个终端合成一个新的容器,我们可以这样操作:
- 切换到中间的
Terminal
alt + shift + ;
进入服务模式(Service Mode
)- 按下
alt + shift + l
意思是合并右侧的终端窗口到一个新的容器中
此时就会看到下面的结果:

此时的树形图如下:

!Tip\] 现在处于右侧的容器中,我们也可以按下 `alt` + `comma`(逗号 `,`)来切换右侧容器的显示模式为**手风琴模式** (当然 按下 `alt` + `slash` ,也是可以切换成**平铺模式**的)
下面我们来看一下这块内容中对应的代码配置 ,我们可以在 服务模式(Service Mode
) 的配置中找到如下的案件绑定:
toml
[mode.service.binding]
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']
可以看到当我们按下对应的快捷键的时候,其触发的命令为 join-with
命令配合 对应的方位来合并窗口到一个容器中,然后再回到 主模式 (Main Mode
)
取消合并的容器
如果想要取消之前合并的所有容器 ,可以使用 alt + shift + ;
进入 服务模式 (Service Mode
)然后输入 r
就可以复原到最初的状态了

对应的配置如下:
toml
[mode.service.binding]
r = ['flatten-workspace-tree', 'mode main'] # reset layout
关闭当前工作空间内除了焦距窗口以外的所有窗口
使用 alt + shift + ;
进入 服务模式 (Service Mode
)然后输入 backspace
(退格键) 就可以复原到最初的状态了
对应的配置:
ts
[mode.service.binding]
backspace = ['close-all-windows-but-current', 'mode main']
在不同工作空间中移动
通常情况下使用 alt
+ 标记
即可,配置项目有对应的快捷键,如果想要取消对应的配置,参考 [[#取消一些不需要的工作空间]] 章节
比如现在状态栏目上显示:

这表示现在我处于 workspace n
(工作空间 n
),中现在我希望能切换到 workspace 1
(工作空间 1
),所以就可以按下 alt + 1
toml
alt-1 = 'workspace 1'
alt-2 = 'workspace 2'
alt-3 = 'workspace 3'
alt-4 = 'workspace 4'
...
!Tip\] 使用建议 * 可以把一些常用的软件放到单独的工作区,比如浏览器 `Browser` ,就可以放到 `workspace b`(`b` 工作区),这样就可以实现按下 `alt + b` 立刻切换到浏览器的功能了,**提高工作效率**!
在工作空间中移动窗口
比如当前聚焦了上面使用建议中的浏览器窗口 ,我们想要将这个窗口移动到 workspace b
(b
工作区)中去我们就可以按下:alt
+ shift
+ b
移动当前聚焦窗口到 workspace b
(b
工作区)了!
对应的配置如下:
!Info\] 如果想要取消对应的配置,参考 \[\[#取消工作空间中移动窗口的快捷键\]\] 章节
toml
# See: https://nikitabobko.github.io/AeroSpace/commands#move-node-to-workspace
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-a = 'move-node-to-workspace A'
alt-shift-b = 'move-node-to-workspace B'
alt-shift-c = 'move-node-to-workspace C'
alt-shift-d = 'move-node-to-workspace D'
alt-shift-e = 'move-node-to-workspace E'
alt-shift-f = 'move-node-to-workspace F'
alt-shift-g = 'move-node-to-workspace G'
alt-shift-i = 'move-node-to-workspace I'
alt-shift-m = 'move-node-to-workspace M'
alt-shift-n = 'move-node-to-workspace N'
alt-shift-o = 'move-node-to-workspace O'
alt-shift-p = 'move-node-to-workspace P'
alt-shift-q = 'move-node-to-workspace Q'
alt-shift-r = 'move-node-to-workspace R'
!Tip\] 使用建议 可以只留下几个英文的助记符,如果要做除了助记符中表示的事情以外的事情的时候再用 `alt` + `1-9` 来切换对应的工作区,这样要工作区的时候就会非常好操作了!
toml
# Music
alt-m = 'workspace M'
# Terminal
alt-t = 'workspace T'
# Video Edition
alt-v = 'workspace V'
# Photo Editing
alt-p = 'workspace P'
# Broswer
alt-b = 'workspace B'
# Note
alt-n = 'workspace N'
# Coding
alt-c = 'workspace C'
# 表示 Browser
alt-shift-b = 'move-node-to-workspace B'
# 表示 Terminal
alt-shift-t = 'move-node-to-workspace T'
# 表示 Music
alt-shift-m = 'move-node-to-workspace M'
# 表示 Note
alt-shift-n = 'move-node-to-workspace N'
# 表示 Photo Editing
alt-shift-p = 'move-node-to-workspace P'
# 表示 Video Editing
alt-shift-v = 'move-node-to-workspace V'
# Coding
alt-shift-c = 'move-node-to-workspace C'
增加/减少当前聚焦窗口的可视面积
如果想要在主模式的时候增加/减少当前聚焦窗口的可视面积可以按下:
alt
+shift
+-
:减少当前聚焦窗口的可视面积alt
+shift
++
:增加当前聚焦窗口的可视面积
toml
# See: https://nikitabobko.github.io/AeroSpace/commands#resize
alt-shift-minus = 'resize smart -50'
alt-shift-equal = 'resize smart +50'
!Info\] 增加面积的方式取决于当前显示的方式,**分别** 对应**水平与垂直**方向上的变化
在之前聚焦的工作空间之间来回切换
当按下 alt + Tab
组合键时,窗口管理器会在当前工作区和上一个工作区之间来回切换。这使得用户可以快速返回到之前的工作区,提高工作效率。
对应的配置项如下:
toml
# See: https://nikitabobko.github.io/AeroSpace/commands#workspace-back-and-forth
alt-tab = 'workspace-back-and-forth'
将当前的工作区切换到另一个显示器上
当按下 alt + Shift + Tab
组合键时,当前工作区会移动到下一个显示器上。如果已经是最后一个显示器,则会循环回到第一个显示器。这对于多显示器设置的用户来说非常方便,可以轻松地在不同显示器之间移动工作区。
toml
alt-shift-tab = 'move-workspace-to-monitor --wrap-around next'
浮动窗口
如果要某个窗口浮动,可以输入 alt + shift + ;
进入 服务模式 (Service Mode
) ,然后输入 f
就可以将当前聚焦的窗口浮动起来了
!tip\] 当窗口浮动之后,还是可以使用 `alt` + `h/j/k/l` 来切换对应的窗口的!
toml
[mode.service.binding]
f = ['layout floating tiling', 'mode main'] # Toggle between floating and tiling layout
客制化配置
!Info\] 以下的内容都是修改上文\[\[#导入配置\]\]小节中的 `.aerospace.toml` 文件,只要到对应的地方,配置其配置项即可
如何让修改后的配置生效
通过快捷键 alt + shift + ;
就可以进入服务模式( service mode
),此时状态栏上会出现 [s]
表示现在进入了 服务模式(Service Mode
)

此时按下 esc
就可以加载修改后的 .aerospace.toml
配置了!
相应的,我们可以在 服务模式(Service Mode
) 的配置中找到对应该命令的配置:
toml
[mode.service.binding]
esc = ['reload-config', 'mode main']
这段配置的意思就是 按下 esc
之后依次执行 reload-config
重新加载配置,然后 切换回主模式 (Main Mode
)
开机启动
toml
# Start AeroSpace at login
start-at-login = true
修改窗口间距
笔者习惯的间距设置为 5
toml
[gaps]
inner.horizontal = 5
inner.vertical = 5
outer.left = 5
outer.bottom = 5
outer.top = 5
outer.right = 5
按键配置相关
在配置文件中:[mode.main.binding]
部分的内容都是按键配置相关的内容:
toml
[mode.main.binding]
# See: https://nikitabobko.github.io/AeroSpace/commands#layout
alt-slash = 'layout tiles horizontal vertical'
alt-comma = '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'
# 以下的内容省略
修改服务模式的名称
比如看下面这段配置:
toml
# See: https://nikitabobko.github.io/AeroSpace/commands#mode
alt-shift-semicolon = 'mode service'
# 'service' binding mode declaration.
# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes
[mode.service.binding]
这段配置描述了通过快捷键 alt + shift + ;
就可以进入服务模式( service mode
)
如果我们想要重新命名 service mode
变为 trigger mode
我们可以将上面的内容修改如下:
toml
# See: https://nikitabobko.github.io/AeroSpace/commands#mode
alt-shift-semicolon = 'mode trigger'
# 'service' binding mode declaration.
# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes
[mode.trigger.binding]
修改手风琴模式时窗口之间的间隔
当开启手风琴模式的时候窗口之前会有间隔,这样我们就能看到下面的窗口放的内容:

我们可以修改 accordion-padding
这个属性的数值来控制这个间隔的大小
toml
# 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
取消一些不需要的工作空间
切换工作空间的快捷键是 alt
+ 标记
,但是如果有时候和系统中其他全局快捷键冲突了就很不好了,笔者常用的截图快捷键是 alt
+ a
,所以笔者会将这个配置注释掉
toml
# See: https://nikitabobko.github.io/AeroSpace/commands#workspace
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-a = 'workspace A' # In your config, you can drop workspace bindings that you don't need
取消工作空间中移动窗口的快捷键
注释掉不需要的配置即可!
toml
# See: https://nikitabobko.github.io/AeroSpace/commands#move-node-to-workspace
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'
在工作空间中移动窗口并切换到对应的工作区
目前的使用场景中,如果将一个窗口移动到某个工作区之后,是不会自动切换到对应的工作区的,所以可以按照下面的写法修改配置信息:
toml
alt-shift-1 = ['move-node-to-workspace 1', 'workspace 1']
使用数组的方式来依次执行命令,这段代码的意思是:
move-node-to-workspace 1
:将窗口移动到workspace 1
workspace 1
:切换工作空间到workspace 1
中
可以根据自己的使用习惯配置!
使用回调函数来完成自动化操作
限定 app
打开的时候放入特定的工作空间
比如现在我希望我每打开一个终端,这个终端的窗口都能自动放入到 workspace t
中去,Aerospace
是有提供这样一个解决方案的,但是首先我们要确认我们使用的 app
对应的 app id
- 确认使用的
app-id
,在终端输入:
bash
aerospace list-apps
13911 | net.kovidgoyal.kitty | kitty
这里打印来我目前使用的 app
的基本信息,其中 net.kovidgoyal.kitty
就是我们需要的 app-id
- 配置回调,使用
[[on-window-detected]]
来配置对应的命令:
toml
[[on-window-detected]]
if.app-id = 'net.kovidgoyal.kitty'
run = 'move-node-to-workspace T' # mnemonics T - Terminal
所以我们可以根据这个配置规则来再配置一个浏览器新窗口自动放入到 workspace b
中
toml
[[on-window-detected]]
if.app-id = 'com.microsoft.edgemac'
run = 'move-node-to-workspace B' # mnemonics B - Broswer
详情的配置请参数:官方文档
鼠标在切换聚焦窗口的时候会移动到对应的窗口
当我们切换工作空间到对应的显示器的时候,会触发 on-focused-monitor-changed = ['move-mouse monitor-lazy-center']
这个的意思是会将 光标移动到对应的显示器上
如果我们想要当切换到新窗口的时候将光标移动到对应的应用上的时候,就可以添加代码 on-focus-changed = ['move-mouse window-lazy-center']
`
toml
# 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']
on-focus-changed = ['move-mouse window-lazy-center'] # Mouse lazily follows any focus (window or workspace)
配置窗口全屏功能
这个是笔者的配置方案,在服务模式 (Service Mode
)按下 z
全屏引用,如果再次输入相同的快捷键则取消全屏,如果自己想可以配置 fullscreen
到主模式的快捷键上
toml
[mode.service.binding]
z = ['fullscreen', 'mode main']
常见问题
出现调度中心的预览窗口太小的解决方案
如果你使用 ctrl
+ ↑
打开 mac
的调度中心的预览窗口太小的话:

在系统设置->桌面与程序坞->调度中心
中勾选 使窗口按照应用程序成组
就可以解决了!
