Mac 窗口管理软件AeroSpace

1. 介绍

Mac 系统没有Windows 窗口自动贴合, 二等分, 四等分的功能, 一般可以用Rectangle, Moom 等软件, 通过快捷键控制应用窗口的位置和大小.
AeroSpace 不同于上述软件靠用户手动触发, 它可以根据用户设定自动管理应用窗口.
主要涉及到三个概念:
显示模式: AeroSpace 提供了平铺, 堆叠和悬浮 三种显示模式. 平铺就是所有打开的应用窗口平分当前屏幕, 像瓷砖一样一块接一块显示, 可以横向或者竖向平铺; 而堆叠模式下, 所有应用窗口全屏一层盖一层, 只有一个应用在最前端显示; 悬浮模式则类似Mac 现有的显示模式.
workspace: workspace 类似Mac 虚拟桌面, 每个workspace 可以有自己独立的显示模式
回调函数: AeroSpace 可以通过app id, window name 等匹配窗口, 自动将窗口全屏, 移动到特定的workspace, 悬浮展示等

与rectangle, raycast 等窗口管理软件的差别

AeroSpace 最大的特点是自动化, 比如我希望左半边屏幕显示idea 代码编辑器, 右半边屏幕显示浏览器, 用rectangle/raycast 的话, 需要鼠标点击idea, 然后按快捷键将idea 窗口置于左边, 再鼠标点击浏览器, 按快捷键把它置于右边; 而Aerospace 则是: 按快捷键将当前显示器设置成平铺模式, 然后idea 和浏览器就会自动等分显示了
除了管理窗口, Aerospace 还可以移动焦点, 基本可以全键盘操作

缺点与不足

也正是因为太过自动化, 导致Aerospace 的窗口管理是强制性的, 有时候就不是那么得心应手了. 有些软件还需要单独配置一下规则. 而且它使用了很多非官方的手段, 偶尔会抽风(新版本基本没遇到了),GitHub仓库地址 有问题可以向开发者反馈下,回复挺快的。注意开发者是jetbrains公司的,报秦始皇的名字可以打骨折:face_holding_back_tears:

2. 使用手册

安装

brew install --no-quarantine --cask nikitabobko/tap/aerospace

自定义配置

首先拷贝一份默认配置: cp /Applications/AeroSpace.app/Contents/Resources/default-config.toml ~/.aerospace.toml, 开始自定义修改:

# 修改了以下配置!
# 开机自启
start-at-login = true

# 修改堆叠模式的快捷键为option - ;(option键加上分号键), 跟后续的快捷键保持一致
#alt-comma = 'layout accordion horizontal vertical'
alt-semicolon = 'layout accordion horizontal vertical'
  
# 堆叠模式下窗口留白, 可以显示堆叠下的窗口, 方便快捷键切换. 设置为0或者50
# The 'accordion-padding' specifies the size of accordion padding
# You can set 0 to disable the padding feature
#accordion-padding = 30
accordion-padding = 50

# 默认布局模式, 推荐堆叠, 需要并行操作多个窗口时再手动平铺
# Possible values: tiles|accordion
default-root-container-layout = 'accordion'

# 调整窗口大小, 平铺布局下有效
alt-shift-minus = 'resize smart -50'
#alt-shift-equal = 'resize smart +50'
alt-shift-equal = 'resize smart +100'

# 设置快捷键ctrl + alt + enter, 将当前应用进入或退出全屏状态
# ctrl-alt-enter = 'fullscreen'
shift-alt-enter = 'fullscreen'

# 增加了以下配置!
# 分配工作空间, 一个工作空间对应一个屏幕, 同时把a-z 的快捷键都注释掉了, 0-9已经够用
[workspace-to-monitor-force-assignment]
1 = 'Built-in'
2 = 'Built-in'
3 = 'LS'
4 = 'LS'
5 = 'HDMI'
6 = 'LCD'

# 新窗口打开后的回调函数
# 使各类「设置」界面自动悬浮:
[[on-window-detected]]
if.window-title-regex-substring = '(setting|设置)'
run = 'layout floating'

# 使 Chrome 和 Firefox 等浏览器的画中画窗口自动悬浮:
[[on-window-detected]]
if.window-title-regex-substring = '(Picture-in-Picture|画中画)'
run = 'layout floating'

# 使微信所有窗口设为自动悬浮:
[[on-window-detected]]
if.app-id = 'com.tencent.xinWeChat'
#if.window-title-regex-substring = '^(?!WeChat \(Chats\)|微信 \(聊天\)).*$'
run = 'layout floating'

# 使jetbrans 相关窗口悬浮
[[on-window-detected]]
#if.app-id = 'com.jetbrains.pycharm'
if.app-name-regex-substring = '^(IntelliJ.*|PyCharm.*|Writerside.*)$'
if.window-title-regex-substring = '^(Commit.*|Welcome to.*|.*Diff.*|.*Clipboard.*|.*\(.*\).*)$'
run = 'layout floating'

回调函数里需要根据app name/app id/window title 等匹配特定窗口, 可以通过以下命令获取应用窗口信息

# 返回打开的所有app
aerospace list-apps
# 返回名称为 App Name 的应用程序的 bundle ID:
osascript -e 'id of app "App Name"'
# 列出名称为 App Name 的应用程序的所有窗口标题(需要给终端软件辅助应用权限):
osascript -e 'tell application "System Events" to tell process "App Name" to get name of every window'

mac 自带的输入法前换弹窗会导致aerospace bug, 通过以下命令然后重启可以禁用弹窗

# 禁用弹窗
sudo mkdir -p /Library/Preferences/FeatureFlags/Domain
sudo /usr/libexec/PlistBuddy -c "Add 'redesigned_text_cursor:Enabled' bool false" /Library/Preferences/FeatureFlags/Domain/UIKit.plist

# 恢复弹窗
rm /Library/Preferences/FeatureFlags/Domain/UIKit.plist

3. 常用快捷键

快捷键 说明
option - H/J/K/L 将焦点切换到左/下/上/右侧的窗口;
option - shift - H/J/K/L 将当前窗口向左/下/上/右侧移动
option - 0 将焦点切换到编号为0 的工作空间
option - tab 将焦点切换到上一个窗口
option - shift - 0 将当前窗口移动到编号为0的工作空间
option - shift - tab 将当前窗口移动到最近使用的工作空间
option - / 将当前布局横向/纵向平铺
option - ; 将当前布局横向/纵向堆叠
option - shift - =/- 将当前窗口增大/减小, 仅在平铺布局下有效
option - shift - ; 再按R(option + shift + R) 重置当前布局为等分平铺
option - shift - ; 再按F 将当前窗口改为悬浮
option - shift - ; 再按Backspace 关闭其他窗口
option - shift - / 再按H/J/K/L 将当前窗口与其左/下/上/右侧的窗口归为一组

4. 参考文档

介绍文档
使用手册

2 个赞

mark

感谢

以后好像用不到这类软件了吧。据说下一个版本自带。。。

可以可以,我一直在找这样的应用

:+1:

raycast 也带相关的功能,反正我要用 raycast,就不要安别的了

试了下,卡爆,不懂什么原因

可以去提下 issue