Loop macOS 窗口管理指南:用环形菜单三步摆好任意窗口
【免费下载链接】LoopWindow management made elegant.项目地址: https://gitcode.com/GitHub_Trending/lo/Loop
按下触发键、把光标划向左方、松手,浏览器窗口便停靠到屏幕左半边。这是 Loop,一款开源的 macOS 窗口管理器:环形菜单取代了一长串需要记忆的快捷键,你只负责指方向,窗口负责自己就位。
功能全景:Loop 窗口管理能做什么
| 能力 | 一句话说明 |
|---|---|
| 环形菜单停靠 | 按住触发键指向方向,松手即完成停靠或缩放 |
| 预览框 | 松手前先显示目标区域,确认无误再执行 |
| 键盘快捷键 | 触发键加方向键直接停靠,全程不用鼠标 |
| Cycles 循环 | 连按同一组合键,在半屏、三分之一、三分之二间轮换 |
| Stash 窗口暂存 | 把窗口推到屏幕边缘,鼠标靠近时自动弹出 |
| 外观与边距 | 强调色、圆角、窗口与屏幕边缘的间距均可调整 |
环形菜单深度拆解:从光标角度到窗口定位
交互原理:按住触发键(默认Fn)后,Loop 记录光标位置为原点。移动光标时,程序实时计算原点到当前光标的角度与距离;距离超过 50 点时,360° 被均分为 8 个扇区,每个扇区对应一个窗口动作(上下左右半屏、四角四分之一等);距离落在 10 到 50 点之间则视为中心动作。松开按键后,对应的WindowAction被应用到当前窗口,预览框会提前展示目标区域。
关键代码在 MouseInteractionObserver.swift,下面这段完成了角度换算与扇区命中判断:
let angleToMouse = initialMousePosition.angle(to: currentMousePosition) let distanceToMouse = initialMousePosition.distance(to: currentMousePosition) if distanceToMouse > Self.directionalActionDistance { let index = Int((angleToMouse.normalized().degrees + halfAngleSpan) / actionAngleSpan) newAction = actions[index % actions.count] } else if distanceToMouse > Self.noActionDistance { newAction = radialMenuActions.last // 中心动作 }用户可感知的效果:菜单是一个跟随光标的悬浮层(macOS 26 上也可固定到屏幕中央),扇区随方向实时点亮并附带触觉反馈,松手后窗口带动画到位。整个流程不需要背任何快捷键,方向与动作一一对应。
🛠 三步完成安装与触发键设置
安装这一步用 Homebrew 一条命令即可:
brew install loop- 启动 Loop,按系统提示授予"辅助功能"权限;没有它,窗口控制全部失效。
- 点菜单栏图标进入设置,在 Behavior 标签页确认触发键(默认
Fn),也可改成任意修饰键组合。 - 测试:聚焦任一窗口,按住触发键把光标指到右半边再松手,窗口应占满右半屏;再试试触发键加左右方向键,即可触发默认循环。
想从源码构建的话,执行git clone https://gitcode.com/GitHub_Trending/lo/Loop,用 Xcode 打开Loop.xcodeproj编译即可。
两个工作流示例:分屏与暂存
示例 1:左右分屏写文档
场景:浏览器放参考资料,编辑器要主区域。
- 按住触发键,光标指向左侧,松手,浏览器停靠左半屏。
- 按住触发键按右方向键并松手,编辑器占右半屏;再按一次可循环到三分之一、三分之二。
- 想要 1/3 对 1/2 的布局,到 Keybinds 标签页建一条指向三分之一动作的自定义按键。
效果:两块区域各就各位,全程没有拖动标题条。
示例 2:把聊天窗口先藏起来
场景:聊天窗口频繁弹出来抢焦点。
- 聚焦该窗口,触发 Stash 动作(在 Keybinds 里把某个按键绑定到 Stash)。
- 窗口滑向屏幕边缘,只留出一条窄边。
- 需要时把鼠标移到边缘那条窄边上,窗口自动展开;移开后自动收回。
效果:窗口被"藏"起来而非关闭,随时取用。实现逻辑在 StashManager.swift。
环形菜单进阶技巧与常见坑
- 用 Caps Lock 当触发键:macOS 系统占用该键,需先在"系统设置 → 键盘"里把它重映射为 Control,再到 Loop 里选择对应键,否则触发键无法被捕获。
- 全屏窗口默认被忽略:Loop 不会移动原生全屏窗口,需要控制它们时在设置里关闭"忽略全屏"选项。
- 嫌菜单视觉干扰:环形菜单可以整体关闭,或单独关掉方向指示器,只保留光标加预览框的极简模式。
Loop 把窗口管理从"背组合键"推进到"指一下、松手",所有设置还支持 iCloud 同步。遇到使用问题,直接到仓库提 issue 与维护者讨论。
- 官方文档:README.md
- 关键源码:RadialMenuController.swift
- 问题反馈:CONTRIBUTING.md
【免费下载链接】LoopWindow management made elegant.项目地址: https://gitcode.com/GitHub_Trending/lo/Loop
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考