惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Hacker News
The Hacker News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy & Cybersecurity Law Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
TaoSecurity Blog
TaoSecurity Blog
C
CERT Recently Published Vulnerability Notes
S
Security @ Cisco Blogs
Google DeepMind News
Google DeepMind News
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Tenable Blog
O
OpenAI News
NISL@THU
NISL@THU
AI
AI
T
Threat Research - Cisco Blogs
Know Your Adversary
Know Your Adversary
V
Vulnerabilities – Threatpost
Schneier on Security
Schneier on Security
W
WeLiveSecurity
P
Privacy International News Feed
Cisco Talos Blog
Cisco Talos Blog
S
Secure Thoughts
D
Docker
博客园 - 三生石上(FineUI控件)
T
Troy Hunt's Blog
T
Threatpost
C
Cyber Attacks, Cyber Crime and Cyber Security
Vercel News
Vercel News
H
Hacker News: Front Page
B
Blog
S
SegmentFault 最新的问题
H
Heimdal Security Blog
T
The Blog of Author Tim Ferriss
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
G
GRAHAM CLULEY
AWS News Blog
AWS News Blog
N
News and Events Feed by Topic
L
LINUX DO - 热门话题
小众软件
小众软件
爱范儿
爱范儿
T
The Exploit Database - CXSecurity.com
Hacker News: Ask HN
Hacker News: Ask HN
Recent Announcements
Recent Announcements
Recent Commits to openclaw:main
Recent Commits to openclaw:main
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
PCI Perspectives
PCI Perspectives
I
Intezer
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed

pseudoyu

周报 #106 - OpenClaw 实践、搬家与生活的能量 周报 #105 - 打破无聊的社会 2025 年末回顾 - Anything different is good 周报 #104 - 被遗忘的生活一隅 周报 #103 - 工作随想与被吞噬的生活 周报 #102 - 我是如何使用 AI 的 周报 #101 - 消失了三个月,我的生活发生了什么变化 周报 #100 - 过去这十年 周报 #99 - 离开 RSS3,迷茫与重启人生 周报 #98 - 生活之书与 Agentic Coding 周报 #97 - 日本旅行小记 28 岁的自白:去找寻自己 周报 #96 - 基于 Roo Code/Cursor 的 iOS 开发工作流 周报 #95 - All AI 与 No AI 周报 #94 - 生活的界限与真实感 周报 #93 - 婚礼纪录片与失落的电影院 周报 #92 - 数码产品 Porn 与断舍离 周报 #91 - 一席、消失的时代与自由意志 周报 #90 - OVH 服务器、Coolify 与对 AI Coding 的思考 周报 #89 - 博客改版与 TheWan App 发布 周报 #88 - 方大同、《回留》与人生清单 周报 #87 - 我们主持了自己的宝可梦婚礼,还为它办了一个展 周报 #86 - 用影像打败时间 周报 #85 - 京华烟云 Moment in Peking 周报 #84 - 想起他们 Echos of Reverie 周报 #83 - 年初收纳(房间、设备、服务、软件) 周报 #82 - Brand New Year 与写日记 2024 年末回顾 - 不完美的日子 周报 #81 - Engaged -> Married 与时间的尺度 周报 #80 - 关于求婚、爱情与婚姻 求婚誓言 | 爱的本质是被看见 周报 #79 - 清迈旅居、曼谷之行与 Follow RSSHub 开发实践 #01:Telegram 频道 RSS 订阅实现与部署方案 Follow —— 信息获取的另一种形态 周报 #78 - NAS、Chromebook 与 Zeabur 折腾小记 周报 #77 - 一间只属于自己的房间(对亲密关系的思考) 周报 #76 - 关于 Adulting 的思考 周报 #75 - 回答 Dayu 关于独立博客的 9 个问题 周报 #74 - 清迈异闻录 周报 #73 - 《社交网络》、Ego 与中秋的现充生活 周报 #71 - Indie App 体验计划 周报 #70 - 消失的附近,Burnout 与 Boreout 周报 #69 - AI Coding 体验与学习的源动力 周报 #68 - 关于写博客这件事与我生活的色彩 使用 GoatCounter 与 Zeabur 搭建网站数据统计系统 周报 #67 - 使用 follow 重塑我的信息输入系统 周报 #66 - 10x 工程师、技术热情与个人工具箱 从零开始搭建你的免费博客评论系统(Remark42 + fly.io) 周报 #65 - Adventure X 体验、Apple Notes 笔记实践与 EpubKit 周报 #64 - 生活在此处(《斯通纳》与《Normal People》) 使用 WebP Cloud 与 Cloudflare WAF 为你的图床添加隐私和版权保护 当云服务器崩溃时,我是如何救援重要数据的 周报 #63 - 不愉快的订花经历、商家和消费者与日渐 AI 化的人 从零开始搭建你的免费图床系统(Cloudflare R2 + WebP Cloud) 2024 年了,我的博客有了什么变化 周报 #62 - 香港之行、5am club 计划与 Rust 学习 周报 #61 - 好朋友的婚礼与对婚姻的思考 27 岁的自白:成长是一件很扫兴的事 周报 #60 - 虫子旁、教育理念与 EpubKit 周报 #59 - 沙漠之行、家庭与家人 周报 #58 - 远程工作这一年 周报 #57 - 生活在别处(巴厘岛之行) 周报 #56 - 面基 Randy 与考科目二 周报 #55 - 油画体验、博客系统升级与对 self-hosting 的思考 周报 #54 - 漂流计划、钱包被盗与 Home Server 周报 #53 - 空白的三个月、生活漂流与春节 周报 #52 - 自谦型人格与感情的另一个视角 周报 #51 - 追星小鹿 Lawrence 与生病 周报 #50 - 天坛漫步、重拾阅读和费曼学习法 周报 #49 - 烧焦的键盘、庞贝神话展、健康调整与神奇的梦 周报 #48 - 内蒙之行、清迈游民、重启的周报与生活 周报 #47 - 采访、拳击与工作状态 周报 #46 - 告别长发、周报初心与合约开发 个人信息获取与知识管理系统(Heptabase + Logseq + Readwise) 周报 #45 - 读书笔记、知识管理与双城生活 周报 #44 - 静寂工人、xLog 与日常 周报 #43 - In the Mood for Love 周报 #42 - 感情观、生活状态与自我 周报 #41 - 生日的仪式感、时间管理与北京之行 26 岁的自白:推石头的人 周报 #40 - 开源之夏、代码之外与流逝的睡眠 周报 #39 - 初患新冠、过去的心绪与失而复得的分享欲 周报 #38 - Foundry、Logseq 与 Surge Ponte 周报 #37 - 浮生半月闲( 武汉 | 香港 | 五月天) 周报 #36 - 肠胃炎、捏捏近况与新的旅途 周报 #35 - 登报、搬家和生病的捏捏 周报 #34 - Don't Stop the Clocks 周报 #33 - 北京 x 故事 x 离别 周报 #32 - 武汉、久别重逢与流动的心绪 周报 #31 - 开源、前端开发与 ChatGPT 实践 周报 #30 - 开源预算、写作初心与对技术的谦卑 Cosmos 区块链架构与 Tendermint 共识机制 周报 #29 - 日语学习经验、Steam Deck 与居酒屋 周报 #28 - Mastodon、故乡与捉迷藏的猫 周报 #27 - 何以为家 周报 #26 - 博客、客制化键盘和新服务器 周报 #25 - 基于 Crossbell 的个人信息输出与同步系统(重构) 摄影集 #02 - Moment In Peking (The Autumn) 摄影集 #01 - Cat In The Box 2022 年末回顾 - 迷茫、低谷与改变
让窗口管理也能自动化,基于 yabai+skhd 的 macOS 窗口管理系统
pseudoyu · 2022-06-04 · via pseudoyu

前言

从 2017 年暑假攒钱买了第一台 MacBook Pro 开始,我使用 macOS 已经五年了。随着工作学习需要,也逐渐开始使用多屏工作流。因为随时都需要开很多窗口,如 IDE、文本编辑工具、终端、IM 软件、邮件客户端等,稍没注意就很乱,得不停地切换来找到需要的窗口,很不方便,于是我开始了自己的窗口管理方案探索之路。

窗口管理方案需求

首先,我梳理了一下自己的窗口管理需求,列出了以下几个核心要点:

  1. 每次打开一个新窗口后会在当前桌面自动进行智能分屏,如只有单窗口就全屏,两个窗口就二等分,以此类推
  2. 通过快捷键对分屏布局进行调整或恢复初始化布局
  3. 通过快捷键在不同窗口之间跳转
  4. 通过快捷键移动/交换不同窗口位置
  5. 通过快捷键便捷地对当前窗口作一些操作,如全屏、居中、发送到某个特定的桌面等
  6. 切换速度快

针对这些需求,我开始调研目前比较流行的几款窗口管理工具。

窗口管理工具

市面上已经有很多相对成熟的窗口管理工具解决方案,比如 MagnetBetterTouchTool 附带的窗口吸附功能等,我都有购买使用,总体来说还是觉得不太适合自己的工作流。

Magnet 主要依赖于快捷键,尽管可以自己定制符合习惯的快捷键,但记忆成本很高,且如果有多台设备也需要用自己的帐号下载后重新配置才可以继续使用,并不方便。

magnet_keyshotcuts

BetterTouchTool 则是依赖于鼠标移动到窗口各个触发角,优势是不需要自己设置快捷键,仅需将鼠标移动到窗口边缘即可实现分屏。但与 Magnet 有着同样的弊端是,每次打开一个新窗口后还是需要自己手动去实现分屏,在很忙或者窗口很多的时候也常常会忘记,不便于管理。

bettertouchtool_setting

既然现有的软件都无法完全满足我的需求,作为一个爱折腾的程序员,目标转向了开源社区一些可高度定制化的解决方案。

开源解决方案

Hammerspoon

Hammerspoon 是一个强大的 macOS 自动化工具,可以通过自己编写一些 lua 脚本实现窗口管理功能,并且可以自定义快捷键,除了窗口管理外,还可以实现例如休眠控制、剪贴板工具等丰富的功能。我配置使用了一阵子后,发现和 Magnet 类似,也没办法很好地实现智能分屏(或许有写好的脚本,但需要对很多软件进行单独配置,实现起来比较麻烦),于是也弃用了。

yabai + skhd

经过一番调研,从 YouTuber Josh Medeski 的 <Blazing Fast Window Management on macOS> 视频中找到了一个解决方案,开源、免费、定制化强,仅需一个配置文件就可以完美实现我的所有需求。

yabai

yabai 是 macOS 内置窗口管理工具的一个开源拓展,可以通过命令行工具实现自由控制窗口和多显示器。它最主要的特色是使用 binary space partitioning 算法自动修改窗口布局,使我们能够专注于窗口内容,不需要主动进行管理,仅需打开对应软件窗口,实现自动编排,工作流不会受到干扰。

skhd

skhd 是一个 macOS 快捷键管理工具,能够通过配置文件来调用绑定其他程序/命令,如 yabai 的窗口管理命令,实现高度定制化的窗口操作。skhd 的实现很注重性能,响应速度很快。

我的窗口管理配置

yabai

安装与基础配置

yabai 的安装很容易,按照其官方 wiki 说明安装即可。

个人推荐通过 brew 进行安装,如果没有安装过 brew 可以先通过官方一键脚本进行安装。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

安装完 brew 后,即可继续通过命令进行安装与基本配置。打开终端,输入以下命令:

brew install koekeishiya/formulae/yabai

安装脚本插件:

sudo yabai --install-sa
sudo yabai --load-sa

启动 yabai 服务:

brew services start yabai

注:如果是 macOS Big Sur 或 Monterey 系统,因为需要通过 API 注入的方式来调用脚本,需要配置一下 root 权限与开机自启,官方也提供了详细的操作方法:

编辑 /private/etc/sudoers.d/yabai 文件:

sudo visudo -f /private/etc/sudoers.d/yabai

在打开的文件中添加以下内容:

<user> ALL = (root) NOPASSWD: <path> --load-sa

上述 <> 内的 userpath 可以通过 whoamiwhich yabai 命令获取。

see_user_and_config_yabai_sudo

完成以上配置后,后续在 yabai 的 .yabairc 配置文件中加入下述两行:

sudo yabai --load-sa
yabai -m signal --add event=dock_did_restart action="sudo yabai --load-sa"

自定义配置

yabai 的配置文件由用户在 $HOME 目录下的 .yabairc 文件进行管理,通过编辑器或命令行工具进行编辑:

vi ~/.yabairc

以下是我的个人配置,可以复制之后自己进行定制化修改。我已经将我的个人配置放在了 GitHub 代码托管平台,可以点击这里查看。

# !/usr/bin/env sh

sudo yabai --load-sa
yabai -m signal --add event=dock_did_restart action="sudo yabai --load-sa"

# 全局配置
yabai -m config mouse_follows_focus          off
yabai -m config focus_follows_mouse          off
yabai -m config window_origin_display        default
yabai -m config window_placement             second_child
yabai -m config window_topmost               off
yabai -m config window_shadow                on
yabai -m config window_opacity               off
yabai -m config active_window_opacity        1.0
yabai -m config normal_window_opacity        0.90
yabai -m config window_border                off
yabai -m config window_border_width          6
yabai -m config active_window_border_color   0xff775759
yabai -m config normal_window_border_color   0xff555555
yabai -m config insert_feedback_color        0xffd75f5f
yabai -m config split_ratio                  0.50
yabai -m config auto_balance                 off
yabai -m config mouse_modifier               fn
yabai -m config mouse_action1                move
yabai -m config mouse_action2                resize
yabai -m config mouse_drop_action            swap

# space 配置
yabai -m config layout                       bsp
yabai -m config top_padding                  15
yabai -m config bottom_padding               15
yabai -m config left_padding                 15
yabai -m config right_padding                15
yabai -m config window_gap                   15

# 忽略的 app
yabai -m rule --add app="^System Preferences$" manage=off
yabai -m rule --add app="^Archive Utility$" manage=off
yabai -m rule --add app="^Logi Options+$" manage=off
yabai -m rule --add app="^Alfred Preferences$" manage=off

我的配置基本仅在官方提供的示例上进行了部分修改,使用 bsp 算法智能分屏,并调整了 space 为 15,这样的间距更舒服。

我还添加了一些自定义的规则,可以在打开系统配置、解压工具等无法自定义窗口的应用时候忽略。

整体呈现如下(以下效果为打开应用窗口后算法自动编排,且新增窗口会自动重排):

my_layout_1

skhd

配置好了 yabai 后,我们已经实现了智能分屏,但是有时候算法提供的窗口位置不满足我们的需求,或是我们需要频繁在各个窗口之间切换/调整,那就需要用到 skhd 工具来定制一些快捷键配置。

安装

skhd 也可以通过 brew 包管理工具进行安装,很方便:

brew install koekeishiya/formulae/skhd

安装完成后启动即可:

brew services start skhd

自定义配置

与 yabai 类似,skhd 的配置是通过 $HOME/.skhdrc 配置文件进行管理的,通过编辑器或命令行工具进行编辑即可。

vi ~/.skhdrc

以下是我的个人配置,可以复制之后自己进行定制化修改。我已经将我的个人配置放在了 GitHub 代码托管平台,可以点击这里查看。

# 窗口聚焦
alt - h : yabai -m window --focus west
alt - j : yabai -m window --focus south
alt - k : yabai -m window --focus north
alt - l : yabai -m window --focus east

# 交换窗口
shift + alt - h : yabai -m window --swap west
shift + alt - j : yabai -m window --swap south
shift + alt - k : yabai -m window --swap north
shift + alt - l : yabai -m window --swap east

# 移动窗口
shift + alt + ctrl - h : yabai -m window --warp west
shift + alt + ctrl - h : yabai -m window --warp south
shift + alt + ctrl - h : yabai -m window --warp north
shift + alt + ctrl - h : yabai -m window --warp east

# 旋转窗口布局
alt - r : yabai -m space --rotate 90

# 全屏
alt -f : yabai -m window --toggle zoom-fullscreen

# 设置/取消窗口 space
alt - g : yabai -m space --toggle padding; yabai -m space --toggle gap

# 挂起窗口至屏幕中央/取消挂起窗口
alt - t : yabai -m window --toggle float;\
          yabai -m window --grid 4:4:1:1:2:2

# 修改窗口切分方式
alt - e : yabai -m window --toggle split

# 重置窗口布局
shift + alt - 0 : yabai -m space --balance

# 移动窗口至特定桌面
shift + alt - 1 : yabai -m window --space 1; yabai -m space --focus 1
shift + alt - 2 : yabai -m window --space 2; yabai -m space --focus 2
shift + alt - 3 : yabai -m window --space 3; yabai -m space --focus 3
shift + alt - 4 : yabai -m window --space 4; yabai -m space --focus 4
shift + alt - 5 : yabai -m window --space 5; yabai -m space --focus 5
shift + alt - 6 : yabai -m window --space 6; yabai -m space --focus 6
shift + alt - 7 : yabai -m window --space 7; yabai -m space --focus 7
shift + alt - 8 : yabai -m window --space 8; yabai -m space --focus 8
shift + alt - 9 : yabai -m window --space 9; yabai -m space --focus 9

# 增加窗口大小
shift + alt - w : yabai -m window --resize top:0:-20
shift + alt - d : yabai -m window --resize left:-20:0

# 减少窗口大小
shift + alt - s : yabai -m window --resize bottom:0:-20
shift + alt - a : yabai -m window --resize top:0:20

简单来说,我配置了与 vim 快捷键操作逻辑类似的配置,实现了以下常用功能:

  • <Option> + hjkl 在不同的窗口之间聚焦
  • <Option> + <Shift> + hjkl 交换不同窗口
  • <Option> + <Shift> + 0 重置窗口布局
  • <Option> + <Shift> + <1~9> 快速将当前窗口移动到特定桌面
  • <Option> + f 全屏
  • <Option> + t 挂起窗口至屏幕中央/取消挂起窗口
  • <Option> + g 设置/取消窗口 space
  • <Option> + r 旋转窗口布局
  • <Option> + e 修改窗口切分方式

其中 hjkl 是 vim 编辑器常用的操作,大家也可以修改为上下左右或其他自己喜欢的键位。

完成以上配置后,我们就实现了 yabai 智能窗口管理以及通过简单的快捷键进行窗口操作,接下来我们对 macOS 系统进行一些配置,来优化一下我们的窗口管理系统吧。

macOS 桌面管理

macOS 提供了多桌面管理的强大功能,可以理解为每个桌面区域都是一个工作区,可以独立摆放不同的窗口,如下图所示:

macos_desktop_management

我们可以通过桌面来区分自己的工作区,如桌面 1 作为自己开发 IDE、终端,桌面 2 作为浏览器查询、写文档,桌面 3 用于处理微信、邮件等通讯工具,桌面 4 作为休闲娱乐、视频播放等,这样我们仅需在几个桌面间切换,实现自己的工作流逻辑,而不需要担心窗口聚焦问题。

为了进一步优化,更快速地完成桌面之间的切换,我们可以通过 AlfredRaycast 等启动器来快速启动/聚焦应用,也可以通过 AltTabManico 等窗口切换软件提供的快捷键对已开启的应用进行快速切换。

除此之外,macOS 系统设置里也提供了自定义切换的快捷方式,我把 <Option> + <1~9> 修改为了特定的桌面,这样平时工作的时候按对应快捷键就可以迅速到对应的工作区,很快就能形成肌肉记忆。

打开 系统偏好设置 - 键盘 - 快捷键 - 调度中心,我们可以为不同的桌面设置对应快捷键,如果没有显示,则可以先打开 9 个空桌面进行配置,之后关闭桌面后仍会保留配置。

keyboardshortcut_to_change_desktop

除此之外,还有一个我喜欢的小设置,打开 系统偏好设置 - 辅助功能 - 显示 - 显示器 - 减弱动态效果,这样会把不同桌面之间的窗口切换动画效果减弱,提高切换速度,配合我们的自动分屏和快捷键,实现快速强大的多工作区切换。我是速度效率优先,喜欢 macOS 动效的这一步可以不进行设置。

reduce_display_effect

总结

以上就是我当前的 macOS 窗口管理解决方案,我是一个很爱折腾软件和各项配置的人,有时候常常为了一个小小的需求折腾好几天,一直追求自己的最佳实践。

也许很多配置并不能为我在之后的工作中节省非常多的时间,窗口整理切换也就是几秒钟的差异,但当我在日常工作学习中使用自己当初花了很多心思调研和优化的系统后,或当一个突发的需求使用到了我之前的一个折腾过的软件/配置时,会莫名地很开心、很有成就感,这大概就是折腾的意义吧,也希望大家都能享受到这样的快乐。

我在 GitHub 上维护了一个工具箱项目 『GitHub - pseudoyu/yu-tools』,记录了很多其他软硬件的选择,也在不断更新优化,有感兴趣的也欢迎交流,我也会逐步出一些对应的配置/使用教程。

注:本文由本人授权首发于『少数派』,原文地址为:『让窗口管理也能自动化,基于 yabai+skhd 的 macOS 窗口管理系统』。

参考资料

  1. Blazing Fast Window Management on macOS
  2. yabai 项目地址
  3. skhd 项目地址
  4. pseudoyu/yu-tools 个人工具箱项目地址