展示HN:Omacosy – 适用于macOS的Omarchy风格平铺桌面,无需SIP

Hacker News Top 工具

摘要

Omacosy是适用于macOS的Omarchy风格平铺桌面环境,提供Hyprland的dwindle布局、焦点跟随鼠标和统一主题切换等功能,具有低内存占用。

我使用omarchy在台式机上已近一年,就在它首次发布后不久。我非常喜欢它带来的体验,但我仍用MacBook进行日常工作,因此我想在MacBook上重现类似的体验。这就是我创建omacosy的原因,它是一个用于平铺窗口、自定义菜单栏、来自Omarchy的一些主题、焦点跟随鼠标、窗口周围的焦点环、具有Mac特色的触控板事件以及自定义的Mission Control工作区概览的设置。<p>我使用AeroSpace而非yabai作为平铺窗口管理器,因为我不想妥协于SIP这一Mac安全功能。它旨在像omarchy一样优先使用键盘来移动窗口、组织工作区等。该设置运行时占用约157MB内存,由AeroSpace、Karabiner(用于超级键)和五个自行构建的小型Swift二进制文件组成。<p>我每天在M1 Max MacBook上运行它,目前在macOS 26上。我没有在其他MacBook或macOS版本上进行过多测试。安装脚本会创建一个清单文件,备份之前安装的内容和它自身安装的内容,卸载脚本会据此将MacBook清理到安装前的确切状态。它需要相当多的权限才能实现其功能,这些权限已在项目README中详细说明。我希望能对使用哪些权限以及原因保持透明。<p>我很希望能得到一些反馈,或者看到有人尝试它并听取你的意见。主要是关于体验中哪些地方仍然不够流畅,或者你是否发现任何性能问题。
查看原文
查看缓存全文

缓存时间: 2026/08/20 19:18

paulsp94/omacosy 来源:https://github.com/paulsp94/omacosy # omacosy omakase + macOS + cosy。一个适用于 macOS 的 omarchy (https://omarchy.org) 风格配置:提供真正的 Super 键与 Hyprland 的 dwindle 布局的平铺窗口管理;专为其编写的主题化状态栏(单个进程包含状态栏、弹出窗口、滑块和屏幕调暗);焦点跟随鼠标;支持 Mission Control 风格工作区概览(含实时预览)的工作区触控板滑动手势;聚焦窗口边框环;以及可统一切换至壁纸的主题——全部从这一个仓库引导。 omacosy 桌面环境——主题状态栏搭配 osaka-jade 壁纸 整个桌面环境的物理占用(即 Activity Monitor 所称的内存)约为 157MB,涵盖窗口管理器、状态栏、三个后台守护进程、滑动守护进程和 Karabiner。驻留集大小(RSS)显示约 322MB,但 RSS 统计了每个进程对相同共享系统框架的占用,因此占用量才是更真实的数值。在外接第二台显示器的机器上测量,按占用量从大到小排列: | | 占用量 | RSS | |—|—|—| | omacosy-overview | 36MB | 46MB | | omacosy-bar | 32MB | 55MB | | AeroSpace | 24MB | 85MB | | Karabiner (4 个进程) | 24MB | 61MB | | omacosy-borders | 19MB | 29MB | | aerospace-swipe | 13MB | 22MB | | omacosy-ffm | 10MB | 24MB | 外接显示器并非免费:状态栏和边框覆盖层都会为每个屏幕绘制,AeroSpace 会加载第二套工作区集。在单显示器下,相同集合测量约为 155MB。 dwindle 守护进程曾在此列表中;现在分割方向由一个在焦点切换时运行的短小的 omacosy-helper 决定,因此没有驻留进程负责此事。这些数值会随运行时间变化,因此将其视为一个范围而非恒定值。omacosy-overview 是主要变量:它为显示的每个窗口缓存半分辨率捕获,因此启动时约 9MB,稳定后约 37MB——通过反复打开测量,它会在此处趋于平缓而非持续增长,因为缓存会在每次显示时为可见集合重新过滤。 AeroSpace 则相反,运行时间越长读数越高。 将状态栏打包为 .app(这是获取 Wi-Fi 网络名称所需)成本约 1MB——该包是一个目录和 Info.plist,而非任何内容的副本。它主要是自构建的:五个小型签名 Swift 二进制文件替代了本可能是一堆依赖项的东西(其中几个在 macOS 26 上已损坏——见下文)。 > 立场:为 macOS 26 (Tahoe) 在一张桌子上构建——一台 MacBook Pro > 加一台外接显示器。它有意做到通用(使用角色而非硬件名称,支持按显示器检测刘海屏),但“对我有用”是诚实的层级。权限设置是实际工作。欢迎提 issue 和 PR;> 不提供支持承诺。 ## 全新 Mac sh git clone https://github.com/paulsp94/omacosy.git ~/.local/share/omacosy && cd ~/.local/share/omacosy && ./install.sh 克隆位置很重要:配置文件通过符号链接指向仓库,macOS 隐私设置(TCC)会阻止 launchd 服务读取 ~/Documents~/Desktop~/Downloads——克隆到那里会导致安装程序回退到复制配置文件(仍然有效;但后续编辑需要重新运行 install.sh 才能应用)。 ## 更新 sh omacosy-update # 拉取更改,然后重新运行安装程序 omacosy-update --check # 仅告知是否有更新 install.sh 仅重新构建源代码已更改的二进制文件并重启其代理,因此更新就是拉取更改加重新运行,此命令封装了两者。它拒绝包含本地更改的克隆,也拒绝分支已分叉的克隆,而非替你做决定。没有后台更新检查。状态栏仅发起一个网络调用(天气),而按定时器轮询 GitHub 的守护进程会在机器唤醒时悄悄增加一次网络调用,同时广播唤醒状态。除非你运行,否则没有任何东西会接触网络。 幂等——拉取更改后重新运行。安装 Homebrew(如果缺失),运行 brew bundle,编译辅助二进制文件,根据你的应用选择生成 AeroSpace 配置,符号链接配置文件(备份任何要替换的文件),隐藏原生菜单栏,应用默认主题,并启动服务。请参阅 权限 部分了解它要求你授予的权限、每个权限的作用,以及没有它会出什么问题。 Karabiner-Elements 也会要求你批准其驱动扩展。 ## 权限 安装窗口管理器是一个侵入性很强的操作,因此这里是完整列表——每项权限、谁请求它、其用途,以及拒绝它会损失什么。这里的所有内容都可以拒绝;依赖权限的部分会隐藏自身,而非半途工作。 | 权限 | 谁请求 | 用途 | 没有它 | |—|—|—|—| | 辅助功能 | AeroSpace, AerospaceSwipe, omacosy-ffm | 移动、调整大小和聚焦其他应用的窗口。这是平铺功能本身,也是这里最广泛的权限。 | 无法平铺。实际上不可选。 | 输入监控 | Karabiner-Elements, AerospaceSwipe | Karabiner 读取按键以重映射 Caps Lock;AerospaceSwipe 读取原始触控板接触数据,因为 macOS 26 已停止在普通事件中携带触摸数据。 | 没有 Super 键,没有滑动手势。 | 屏幕录制 | omacosy-overview | 为概览卡片捕获每个窗口的缩略图——包括 AeroSpace 隐藏在屏幕外的窗口,因此它需要真实屏幕捕获,而非可见屏幕的截图。 | 卡片回退到应用图标和标题。 | 蓝牙 | omacosy-bar | 读取适配器电源和配对设备列表,用于蓝牙胶囊按钮及其菜单。 | 胶囊按钮会隐藏自身。 | 定位 | omacosy-bar | 读取 Wi-Fi 网络名称,macOS 将其归类为定位数据。不请求任何坐标;授权本身即解锁 CWInterface.ssid()。 | Wi-Fi 弹出窗口的标题行显示“wi-fi”而非你的网络名称。其他一切不受影响。 | 自动化 | omacosy-bar, theme-set | Apple Events 发送至 Spotify(当前播放内容;媒体胶囊按钮上的播放/暂停/下一首)和系统事件(从 Apple 菜单睡眠、锁定和重启;设置壁纸)。 | 媒体胶囊按钮隐藏;那些菜单行无效。 | 文件和文件夹 | omacosy-bar | 仅当你的克隆位于 ~/Documents~/Desktop~/Downloads 时——状态栏从仓库内的主题目录读取其调色板,而 macOS 会将 launchd 代理隔离在这些文件夹之外。 | 状态栏在启动时挂起等待提示。克隆到 ~/.local/share/omacosy 则永远不会出现此问题。 | 关于 定位——这个听起来最糟的权限:它仅购买一个字符串。macOS 将 Wi-Fi 网络名称归类为定位数据,因此这里没有任何东西能在没有它的情况下获取你的网络名称。状态栏请求授权然后读取 ssid()——它从不请求位置,不持有坐标,也不启动任何定位更新。需要两者同时满足:在 macOS 26.3 上测量,未打包的二进制文件无论如何授权都读取 nil,因此状态栏打包在一个最小的 .app 内。拒绝它你会失去名称,仅此而已。 ### 它不做什么 - 无遥测、无分析、无崩溃报告。 没有任何关于你或这台机器的信息被发送到任何地方。 - 一次网络调用:在长定时器上访问 https://wttr.in/?format=j1,用于天气胶囊。wttr.in 根据请求到达的 IP 推断你的城市——不收集或发送坐标,状态栏也不持有定位 API。删除天气胶囊,就没有数据离开机器。 - omacosy 自身的二进制文件从不以 root 运行。 install.sh 不使用 sudo,不安装 LaunchDaemon,它构建的每个辅助程序都以你的身份在你的登录会话中运行。 - Karabiner-Elements 会以 root 运行,你应该在安装前知道这一点。 它是这里的 Homebrew 依赖项,纯粹为了将 Caps Lock 变成 Super 键——它附带 DriverKit 系统扩展和以 root 运行的守护进程(Karabiner-VirtualHIDDevice-DaemonKarabiner-Core-Service)。这就是安装期间驱动扩展批准的作用。它是这个仓库在你的 Mac 上放入的唯一最具特权的东西,而且它是第三方的。如果这个权衡对你不合适,可以跳过它;你会失去 Super 键,但保留其他所有东西。 - 这里没有任何东西读取你的按键。 没有 omacosy 二进制文件打开键盘事件监听器——只有 Karabiner 能看到按键,这是重映射所固有的。AerospaceSwipe 的事件监听器仅用于手势且仅为监听模式(1 << NSEventTypeGesturekCGEventTapOptionListenOnly),因此它无法看到或修改按键。调试日志(/tmp/omacosy-*.log)包含窗口标题、应用名称和工作区编号——绝不会是输入内容。 权限绑定到二进制文件的代码签名。如果存在 Apple Development 身份,install.sh 会为每个辅助程序使用稳定标识符签名,以便重新构建时保留其权限;如果没有,macOS 会将每次重建视为新应用,每次安装后你都需要重新授权。 ## 应用选择 快捷键启动在 config/apps.conf 中定义的应用——默认为 Ghostty、Safari、Spotify、Slack(终端、浏览器、音乐、通讯工具)。在 config/apps.local.conf(git 忽略)中覆盖任何应用,然后重新运行 install.shsh # config/apps.local.conf — 你的选择优先于 apps.conf TERMINAL=Korren BROWSER=Arc 你的个人 shell 配置应位于 ~/.zshrc.local——仓库的 zshrc 会连接 CLI 堆栈并加载它。 ## 内部组件 | 组件 | 工具 | 配置 | |—|—|—| | 平铺窗口管理器 | AeroSpace (https://github.com/nikitabobko/AeroSpace) | config/aerospace/aerospace.template.toml | | Super 键 | Karabiner (https://karabiner-elements.pqrs.org) (Caps Lock → cmd+ctrl+alt) | config/karabiner/(复制,非符号链接——TCC) | | 状态栏、弹出窗口、调暗 | omacosy-bar(自编译 launchd 代理——一个进程绘制所有内容) | helper/bar.swift | | 窗口边框 + 全屏遮罩 | omacosy-borders(自编译 launchd 代理) | helper/borders.swift, config/borders.conf | | 焦点跟随鼠标 | omacosy-ffm(自编译 launchd 代理) | helper/ffm.swift, config/ffm-ignore | | 触控板滑动 | aerospace-swipe (https://github.com/acsandmann/aerospace-swipe) + 我们的补丁 | config/aerospace-swipe/config.json, patches/ | | 工作区概览 | omacosy-overview(自编译驻留守护进程) | helper/overview.swift | | Dwindle 布局 | 三条 on-window-detected 规则(无守护进程) | config/aerospace/aerospace.template.toml | | 工作区/窗口导航 | omacosy-ws, omacosy-cycle, omacosy-float | bin/ | | 暂停/恢复堆栈 | omacosy-toggle | bin/omacosy-toggle | | 系统粘合 | omacosy-helper(自编译) | helper/main.swift | | 提示符 | starship | config/starship.toml | | Shell | zsh | zsh/zshrc + 你的 ~/.zshrc.local | | CLI 堆栈 | fzf, eza, zoxide, ripgrep, bat, lazygit, btop | 在 zsh/zshrc 中连接 | 为何自构建:在 macOS 26 上,协作激活损坏了 AutoRaise(焦点跟随鼠标),CGEvent 监听器停止携带多点触摸数据(破坏了上游的 aerospace-swipe——修复 PR 为 #29 (https://github.com/acsandmann/aerospace-swipe/pull/29)/#30 (https://github.com/acsandmann/aerospace-swipe/pull/30)),而 JankyBorders 的每窗口位图消耗数百 MB。omacosy-ffm 通过 AeroSpace 使用的相同 SkyLight 调用来聚焦;omacosy-borders 绘制一个由窗口服务器光栅化的 CAShapeLayer,由窗口服务器自身的事件流驱动(用于聚焦、移动和调整大小的 SkyLight 通知——无轮询,边框随拖动平滑移动);omacosy-helper 覆盖壁纸(Apple Events 脚本在 macOS 14+ 中部分失效)、CoreAudio 输出切换、IOBluetooth 控制、光标位置和按显示器检测刘海屏。omacosy-overview 存在是因为调度中心无法看到虚拟工作区,因此无法以其他方式获得工作区概览。omacosy-bar 是状态栏本身:一个进程在内存中持有窗口模型并读取其自身的发布者——用于窗口变化的 SkyLight、用于连接的 IOBluetooth、用于网络的 SCDynamicStore、用于电池的 IOPS、用于音量的 CoreAudio、用于亮度的 DisplayServices、用于曲目的 Spotify 自身广播——因此它不轮询 macOS 会宣布的任何事情。它唯一的定时器是天气获取和时钟。工作区切换在 2.5 毫秒内重绘,因为它不需要询问任何人;它替代的 shell 状态栏需要 164 毫秒来响应相同事件。 ## 状态栏 一个进程绘制所有内容:状态栏、弹出窗口和滑块都是 helper/bar.swift 的表面。透明状态栏,所有内容都是扁平的圆角矩形胶囊。当指针在状态栏或弹出窗口内时,弹出窗口保持打开,当指针不在其中任何一处时关闭。当窗口占据整个显示器时,状态栏会隐藏——当你将指针移到最顶部边缘时它会回来,就像菜单栏一样,因此在观看影片时无需退出全屏即可调节亮度和音量。在显示时,它会位于全屏窗口之上,当指针离开时又降回所有内容之后。 - Apple 菜单 — 关于、系统设置、锁定、睡眠、重新启动、关机、下一个主题(隐藏的原生菜单栏原本提供的菜单)。 - 工作区 — 每个显示器一个分段胶囊,仅显示该显示器的工作区;聚焦的工作区用强调色胶囊标记;点击跳转。 - 媒体 — 上一首/播放-暂停/下一首 + 曲目标题(Spotify);在平坦显示器上居中,在刘海显示器上左集群(通过 NSScreen.safeAreaInsets 实现真实的按显示器刘海屏检测),当 Spotify 未运行时隐藏。 - 蓝牙 — 设备菜单(点击连接/断开)、电源开关。WiFi — 胶囊仅为图标;弹出窗口显示网络名称,并添加 IP 和路由器、带评级的信号、链路速率和安全代次、带其频段和宽度的频道。(名称在弹出窗口中,因为 SSID 宽度任意,而右集群是右对齐的——在刘海显示器上,长名称会将集群的远端推到刘海下面。)名称需要定位权限,因为 macOS 将 SSID 归类为定位数据(参见 权限)。天气 — wttr.in,带缓存详情的弹出窗口。音量 — 滚动调节,点击打开滑块 + 输出设备菜单,右键点击静音。亮度 — 滚动调节,点击打开滑块(DisplayServices,无依赖项)。滚动超过 0 后继续:遮罩通过缩放伽马值将显示器调暗至其硬件最小值以下,因此在 z 序中没有覆盖窗口,截图正常。它能在睡眠/唤醒后存活,并且安全失效:如果状态栏退出,伽马值会恢复。它也能作用于没有背光 API 的外部显示器。当设置进程退出时,伽马值会重置,因此崩溃或卸载会自行恢复屏幕。电池 / 时钟(日历弹出窗口) / 活动(浮动 btop) / 浮动窗口 — 仅当工作区持有浮动窗口时显示;点击显示下一个。 ## 快捷键 — Super = 按住 Caps Lock Karabiner 将 Caps Lock 重映射为 cmd+ctrl+alt(macOS 从未使用的组合),因此 omarchy 的方案可以逐字工作,而不会破坏打字或应用快捷键。单独点击 Caps Lock 是 Escape。 | 组合键 | 动作 | |—|—| | 导航 | | | Super+1..9 | 切换到此显示器的工作区 N | | Super+tab / Super+shift+tab | 在此显示器的集合内下一个/上一个工作区 | | Super+b | 在最近两个工作区之间来回切换 | | Alt+tab / Alt+shift+tab | 循环窗口在此工作区内,包括浮动窗口 | | Ctrl+Alt+tab | 在显示器间循环焦点 | | Super+箭头 | 聚焦该方向上的窗口 | | Super+s | 显示下一个浮动窗口(并将光标移过去) | 移动窗口 | | Super+shift+箭头 | 将窗口向该方向移动 | | Super+shift+1..9 | 将窗口移至工作区 N 并跟随 | | Super+shift+o | 将窗口抛到另一显示器的相同位置 | | Super+shift+space | 将整个工作区抛到另一显示器 | 布局 | | Super+w | 关闭窗口 | Super+t | 切换浮动 | Super+j | 切换分割方向 | Super+- / Super+= | 调整大小 | | Super+f | 全屏 — 在刘海显示器上

相似文章

Ombrelle

Product Hunt

Ombrelle 是一款适用于 macOS 的现代窗口调暗工具,旨在通过减少干扰帮助用户集中注意力。

Nehir:macOS 的平铺窗口管理器

Lobsters Hottest

Nehir 是一款适用于 macOS 的全新开源滚动平铺窗口管理器,基于 Niri 列布局范式构建,支持工作区管理、多显示器以及通过 nehirctl 进行 IPC 控制。

Tiles

Product Hunt

Tiles 是一款 macOS 工作区管理器,允许用户保存和恢复桌面布局,以优化工作流程并减少窗口杂乱。

hyprwm/Hyprland

GitHub Trending (daily)

Hyprland 是一个动态平铺的 Wayland 合成器,提供丰富的自定义选项、视觉特效,并支持最新的 Wayland 标准,旨在成为其他合成器的强大且独立的替代方案。