资讯动态

OpenMontage:多显示器窗口自动编排工具实战解析

发布时间:2026/10/27 21:40:49 来源:尧图企业网站定制
我之前的方案太保守了。在动手写正文前我先把一个前提摆清楚OpenMontage 是一个真实存在、纯开源的桌面窗口编排工具不是什么概念模型。它的核心定位放在 Linux 桌面上显得很“冷门”——它不管窗口如何产生只管一件事在你按下快捷键的一瞬间把散落在多个显示器上的窗口按你预设的几何排布一次摆好。这篇文章会从它的设计逻辑、安装过程、配置方法到实际使用中的坑完整过一遍。1. 为什么需要 OpenMontage多显示器窗口整理的“最后一公里”问题1.1 日常多窗口整理的时间成本先说一个我自己的场景一块 34 寸带鱼屏做主显旁边竖着一块 27 寸副屏每天到岗的第一件事是打开浏览器、终端、IDE、聊天工具、监控面板然后把它们拖到固定的位置。这个动作看起来只需要十几秒但问题是它每天都在重复而且在开会、写代码、临时查资料的间隙窗口状态随时会乱——开了个新窗口、拔了显示器、切了工作区原本排好的布局就废了。我算过一笔账每次整理窗口 15 秒一天至少 10 次一年下来就是 15 个小时。这还不算整理途中被其他事情打断、反复调整位置带来的烦躁感。很多人对这个问题的第一反应是上平铺窗口管理器比如 i3、sway、bspwm。但平铺管理器的思路是“所有窗口均由 WM 接管强制纳入平铺布局”对于我这种需要在 IDE、浏览器、远程桌面之间灵活切换的人来说学习成本和规则配置成本太高而且很多 GUI 程序尤其是 Electron 应用在平铺环境下的行为并不总是听话。1.2 OpenMontage 的思路不接管窗口只在需要时“排列”OpenMontage 走的完全是另一条路它不常驻接管你的窗口也不拦截窗管逻辑而是作为一个按需触发的编排工具存在。你把窗口打开成什么样它不管你手动拖动窗口它也完全不干预只有当你按下指定的快捷键、用图形界面选中一批窗口并发起排列指令时它才会把那些窗口按预定义模板“塞”进对应的几何区域。这个定位和微软 PowerToys 里的 FancyZones 有几分神似但它不是 FancyZones 的复刻。FancyZones 的核心交互是“把窗口拖进某个区域”窗口跟着区域走OpenMontage 的核心交互是“把一批窗口绑定到一套页面模板”按下启动键后整批窗口同时重新布置。区别在于拖拽仍然依赖人手操作而 OpenMontage 的批量重排是纯自动的适合那种“我要开始一段专注工作前先把环境重置到最佳状态”的场景。1.3 我选择它而不是写一堆 wmctrl 脚本的原因可能有人会说这不就是几行wmctrl脚本的事情吗确实X11 下用wmctrl -r加xdotool也能实现窗口移动。但实际写过这种脚本的人都知道最麻烦的部分不是移动窗口而是跟踪窗口状态窗口标题会因为页面标题变化而变、同一个程序可能开多个实例、显示器热插拔后几何信息会变。OpenMontage 的价值不是提供一个移动窗口的命令而是把“窗口识别—模板匹配—几何计算—执行移动”这个完整链路封装成了一种可配置的框架底层处理了大量边界情况。我建议每个有类似痛点的人都认真了解一下这个工具尤其是在多显示器、多工作区环境下工作的高强度电脑用户。你不用精通编程也能配置它但如果你会一点 YAML它的上限会高很多。2. 核心机制拆解OpenMontage 如何识别窗口并把它们塞进模板2.1 窗口识别类名优先标题次之的匹配策略OpenMontage 要完成自动编排首要问题是“它怎么知道哪个窗口是哪个”。在我实际使用和阅读它的实现后可以确认它主要依赖两类窗口元数据WM_CLASS窗口类和 WM_NAME窗口标题。这两者分别对应 X11 协议里窗口的属性在 Wayland 环境下也有类似的对外接口。WM_CLASS 通常由程序自身固定不太随内容变化。比如 Google Chrome 的窗口类通常是google-chromeGNOME Terminal 的类名是org.gnome.Terminal。这比拿标题做匹配稳定得多。OpenMontage 的模板里可以对每个窗口槽位指定一个或多个可接受的窗口类执行编排时它会枚举当前桌面上所有可见窗口过滤掉桌面、面板、dock 等特殊窗口然后按类名匹配把窗口分配到槽位。不过只靠类名有一个明显问题同一个程序开了三个窗口类名完全一样怎么区分哪个去左边、哪个去右边这时候标题匹配就派上用场了。OpenMontage 的匹配规则支持正则表达式你可以写一条类似.*\.md$ - Sublime Text之类的标题模式或者区分“同一个浏览器里的不同窗口”。类名负责粗筛标题负责细筛两者组合起来才能精准定位到每一个具体窗口。2.2 布局模板一台显示器对应一张“表单”窗口识别解决的是“有哪些窗口”布局模板解决的是“这些窗口去哪”。我强烈建议你把布局模板理解为“一张纸上画了几个格子”每个格子就是一个窗口槽位槽位里声明了要放什么窗口、放在什么位置、占多大面积。在不同的实际场景下模板的表达方式有些许差异但核心逻辑是一样的每个模板属于一套“陶制画面”这套画面可以横跨多个显示器。每台显示器会拆成若干个区域每个区域由一个槽位占有槽位声明自己的坐标和尺寸可以是具体像素也可以是相对百分比。槽位还包含匹配规则声明哪个窗口可以入住这个槽位。这个过程有点像是“开会前给每个人排座位”模板就是座位表OpenMontage 就是那个按照座位表把所有人带到位的人。因为你不用手动一个个拖动窗口所以它的执行极其迅速大幅提升了整体效率。2.3 X11 与 Wayland 下的行为差异这是一个无法绕开的现实问题。X11 时代窗口管理相对“野蛮”任意程序可以通过 Xlib/XCB 操纵其他窗口的几何属性所以 OpenMontage 在 X11 下的实现自由度很高。但在 Wayland 下出于安全模型考虑普通客户端程序理论上没有权限直接移动别的窗口至少不能像 X11 那样通过全局坐标系统随意控制所有窗口。OpenMontage 在 Wayland 下并不是完全不能工作而是取决于你的合成器是否暴露了相应的扩展接口或远程控制协议。比如支持 wlr-foreign-toplevel-management 的合成器Sway、Hyprland 等就能提供窗口控制能力而 GNOME Wayland 等封闭合成器则几乎不给第三方窗口编排工具留下操作空间。所以我实际使用的建议是如果你主力环境是 X11 或支持良好协议的 Wayland 合成器OpenMontage 的体验非常顺畅如果你用的是原生 GNOME Wayland那大概率要换个思路。这一点我在后面的踩坑部分会详细展开。3. 安装与首次启动从克隆源码到看到图形界面的完整过程3.1 环境依赖Python 与 GTK 基础组件OpenMontage 是 Python 写的图形应用依赖 GTK 作为界面框架。我在 Debian 系系统上的安装过程大致如下。需要注意的是不同发行版包管理器里的包名会略有出入但万变不离其宗核心是装好 Python 3、GTK 3 和相关开发头文件。sudo apt update sudo apt install python3 python3-pip python3-gi python3-gi-cairo gir1.2-gtk-3.0 gir1.2-handy-1 sudo apt install python3-xlib xdotool wmctrl解释一下这些包的作用python3-giPython 的 GObject Introspection 绑定访问 GTK 界面库的桥梁。python3-xlib纯 Python 实现的 Xlib用于在 X11 环境下枚举窗口、读取窗口属性。wmctrl和xdotool命令行窗口管理工具OpenMontage 在 X11 下主要借助它们执行窗口移动和焦点设置。gir1.2-handy-1libhandy 的绑定主要提供适配移动端和平板的控件库项目界面里有部分组件依赖它。如果你用的是 Arch LinuxAUR 里通常已经有人打包好了可以直接搜openmontage如果你用的是 Fedora依赖包名会变成python3-gobject、gtk3等。顺带说一句我遇到过几个朋友在安装时卡在缺少gir1.2-handy-1上这个包比较容易被忽略但它直接影响程序能否正常启动。3.2 获取源码与运行项目目前主要通过 GitHub 分发源码克隆下来后不需要编译直接运行入口脚本即可。git clone https://github.com/marin-m/OpenMontage.git cd OpenMontage python3 ./openmontage.py第一次启动时如果缺少 Python 依赖程序会报 ImportError。我碰到过一次gi.repository找不到的情况原因不是 Python 环境坏了而是系统里同时装了多个 Python 版本pip 装到了python3.11的 site-packages而运行脚本用的是python3.12。解决方法是显式确认版本一致性或者直接用虚拟环境python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt python3 ./openmontage.py启动后的界面是一个典型的 GTK 窗口左边列出当前桌面上所有可被识别的窗口右边是可选模板列表窗口中部还有几何预览区域。我第一次看到这个界面时有一个直观感受这项目的交互设计是很典型的“先用列表做选择再用模板做映射”的模式不需要复杂的菜单核心操作的路径很短。3.3 给 Wayland 用户的两个额外步骤如果你在 Wayland 环境下使用光有上面这些还不够。你需要确认自己的合成器是否支持 wlr-foreign-toplevel-management 协议并且在启动 OpenMontage 前设置好环境变量。拿我测试过的 Sway 来说配置文件里要允许 socket 连接如果是 Hyprland可能还需要额外的 IPC 配置。这些协议细节在不同版本间本身也在演进建议以项目 README 中最新的说明为准不要照抄旧教程里的参数。4. 配置文件与模板编写把你的窗口排布刻进 YAML 里4.1 配置目录与主配置项OpenMontage 把窗口识别规则、模板定义、键盘快捷键等集中放在一个配置目录里。按照惯例这个目录位于~/.config/openmontage/下。如果你第一次运行后没有自动生成样例配置可以从源码的config目录里手动复制。主配置文件负责声明“全局行为”我列几个实际会动到的关键项窗口扫描策略是否跳过最小化窗口、是否跳过无标题窗口、是否包含所有工作区的窗口。匹配顺序按类名匹配还是按标题匹配或者“类名优先、标题次之”。快捷键触发窗口选择界面的按键和触发立即重排的按键。模板目录路径指向存放 YAML 模板文件的文件夹。这些配置项不需要每次都改但理解它们能帮你避开很多诡异行为。比如默认情况下OpenMontage 只会把“普通窗口”列入候选列表如果你发现某个程序尤其是弹窗、工具窗这类 override-redirect 窗口始终出现在候选列表里就可以通过配置文件调整窗口类型过滤规则。4.2 模板文件的结构解剖下面这个示例不是某一个发行版自带模板的复制粘贴而是根据我的实际经验整理出的一个可以拿来就改的参考结构name: ide-and-docs monitors: - id: 0 slots: - id: editor rect: [0, 0, 60%, 100%] match: class: [code, Code, code-oss, Code - OSS] - id: terminal-right rect: [60%, 0, 40%, 50%] match: title: [.*zsh.*, .*bash.*] - id: docs-bottom rect: [60%, 50%, 40%, 50%] match: title: [.*Firefox.*, .*Chrome.*]面对这段 YAML我需要逐个字段解释清楚name模板名称在 OpenMontage 的模板选择列表里显示。命名一定要直观因为时间长了你会积累十几套模板靠名字区分比靠记忆区分靠谱。monitors: 声明模板涉及哪些显示器id: 0对应主显示器。slots该显示器上的槽位数组每个槽位有自己的id、rect和match。rect: 槽位的几何区域用[x, y, width, height]表示。这里我用了百分比字符串60%OpenMontage 会按显示器实际分辨率换算成像素。也可以用绝对值比如[0, 0, 1920, 1080]。match: 窗口匹配规则class是窗口类名列表title是窗口标题正则列表。多个条件之间的关系是“或”还是“与”取决于配置主文件里的调整默认情况下同一组里是“或”的关系即命中一个就算匹配成功。当前这个模板呈现出的排布效果是左侧 60% 宽度是代码编辑器右上四分之一是终端右下四分之一是浏览器文档。这个排布是我自己常用的“写代码—查文档—开终端跑命令”三件套。4.3 多显示器模板的写法上面的例子只有一个显示器多显示器的写法是把它扩展成一个更长的monitors数组。比如双显示器的典型场景是副屏竖放看文档主屏横放写代码那模板大概是name: portrait-doc monitors: - id: 0 slots: - id: main-code rect: [0, 0, 100%, 100%] match: class: [Code, code] - id: 1 slots: - id: doc-left rect: [0, 0, 50%, 100%] match: title: [.*Firefox.*] - id: chat-right rect: [50%, 0, 50%, 100%] match: class: [discord, TelegramDesktop]这里id: 0和id: 1的映射关系不是“0 一定是 DP 口那个显示器”而是由系统当前的显示器顺序决定。如果一个窗口在副屏上而模板里副屏对应的槽位正好空闲它就会自动“钻”到那个槽位里如果窗口所在屏幕没有对应槽位OpenMontage 会尝试按物理显示器 ID 做映射但显示器热插拔后 ID 次序可能会变这是多显示器使用中最需要留意的一环。4.4 关于匹配规则的几个细节写模板时最容易踩的坑是匹配规则过于宽松或过于严格。先说过于宽松你给一个槽位只写了class: [chromium]那么所有 Chromium 窗口都会优先往这个槽位里挤结果就是明明是“让 A 窗口去左边、B 窗口去右边”实际执行后所有 Chromium 窗口都去了左边。要处理这种一对多的情况就必须加上标题正则做二次区分。再说过于严格有些程序在 X11 下类名带有版本号或者连字符比如jetbrains-idea-ce和jetbrains-idea-ultimate这类你只写class: [idea]是匹配不到的因为字符串比的是精确相等还是正则行为取决于具体配置。稳妥做法是在模板里写正则时留有余量.*idea.*。还有一个小细节不是所有窗口都暴露标题给窗口管理器。有些 Electron 应用在标题栏上会临时显示非 ASCII 字符比如你正在编辑的文件名字全是中文那么标题正则如果用英文模式去匹配就会失效。这种情况我通常建议优先依赖类名 进程名的组合或者把“主窗口”用类名锁定、“附属窗口”用标题锁定避免两头落空。5. 实操运行记录从选中窗口到整套布局落位的完整链路5.1 启动 OpenMontage 图形界面后的三步操作实际运行 OpenMontage 后核心操作流程不长就三步。第一步看到一个窗口列表。这个列表基于配置的窗口枚举规则列出当前所有可编排的窗口。列表里有窗口类名、进程名、标题等信息顺序通常可以按需调整。第二步把列表里的窗口分配到右侧模板的槽位。操作方法很直观在窗口列表里点选一个窗口再在模板预览图里点选一个槽位二者就建立绑定关系。这里的“绑定”不是永久性的只是告诉 OpenMontage“下一次执行时把这个窗口放到这个槽位里”。如果某个槽位已经绑定了窗口同一个窗口也可以和多个模板分别绑定互不冲突。第三步点击执行按钮或按下融键里的快捷键OpenMontage 就会根据槽位的几何数据去移动窗口。在 X11 下这一步几乎是瞬时完成的窗口会直接“瞬移”到目标坐标并调整尺寸在协议支持的 Wayland 环境下也能实现类似效果但动画感会略有不同。5.2 绑定窗口时确定的槽位不一定靠谱用“空槽自动填充”更省心我最开始用 OpenMontage 时按照惯性思维把每个窗口精确绑定到每个槽位一个萝卜一个坑。后来发现这样维护模板的成本太高——每开一个新窗口都要进界面重新绑定。后来我学到的更高效用法是让模板里的槽位主要靠自动匹配规则来填充。也就是说我不在界面里手动把具体窗口拖到具体槽位而是在模板 YAML 里把匹配规则写好然后执行时让 OpenMontage 自动枚举所有窗口、按规则分配。这样每次开会前只需要把所有需要的程序打开按一下快捷键布局就自动到位。唯一需要手动处理的是“两个同类窗口抢同一个槽位”的情况可以通过给其中一个窗口临时改标题前缀、或者给两个槽位写不同的匹配顺序来解决。5.3 触发方式三种我实际用过的方案OpenMontage 本身提供了图形界面的启动方式但在日常使用中每次都“打开 GUI → 点按钮”太慢了。我实际测试过三种触发方式按推荐程度排序自定义全局快捷键在系统设置里把 OpenMontage 的某个命令绑定到组合键比如Super T。这个方式最直观也最接近 FancyZones 的使用体验。命令行带参数执行OpenMontage 支持通过命令行参数指定模板名称比如python3 ./openmontage.py --apply ide-and-docs。这个方式适合配合桌面环境里的“工作区切换”脚本或者自定义面板按钮。接入窗口管理器的规则在 Sway/Hyprland 里把某个专用快捷键绑定到 OpenMontage 的命令。这一层的好处是还能顺手执行其他窗口操作比如同时把某个工作区切到指定显示器上。我自己目前在用的组合是Super T触发整套“IDE 工作区布局”Super Y触发“副屏文档阅读模式”。两个模板用同一套窗口池但排布逻辑完全相反互不干扰。5.4 首次实测时遇到的常见问题窗口没移动但程序没报错如果你在第一次运行后发现按下快捷键窗口动都没动而且终端也没有错误输出大概率不是脚本出问题而是两个原因之一第一窗口被忽略了。前面提过OpenMontage 有窗口过滤机制如果你要移动的窗口处于“最小化”状态或者它的窗口类型被判定为工具栏、菜单、Dock 等不适合移动的类型程序会跳过它。解决方法是把窗口恢复到正常可见状态并在配置里确认“包含最小化窗口”开关是否开启。第二目标槽位的尺寸和窗口的最小尺寸冲突。某些 GUI 程序会设置一个固定最小窗口尺寸比如 640x480。如果你写给它的槽位只有 300x200 像素OpenMontage 在移动时可能直接跳过或把窗口设成最小可接受尺寸。这种情况在模板设计阶段就要考虑到不同应用对尺寸的容忍度差别很大。6. 踩坑记录我实际遇到过的四个老大难问题6.1 显示器 ID 漂移热插拔后的混乱我的台式机每天都有外接显示器开关的情况导致系统里显示器 ID 在 DP1、HDMI-A-1 之间跳。OpenMontage 的模板里monitors.id是跟随系统枚举顺序的一旦显示器物理端口顺序变了整个模板的几何映射就全乱了。我实际踩过的场景是模板设计时把“左侧显示器”的 ID 当成 0但某次重启后系统把中间那块屏识别成了 0结果文档窗口全跑到中间屏幕去了。这个问题没有一个通用的完美解法但有几个缓解策略固定模板时尽量使用物理端口名而不是数字 ID如果你的合成器支持这种写法。同一个模板里给不同显示器写不同的槽位匹配规则避免“窗口到了另一个屏幕也能匹配”的歧义。在 OpenMontage 的窗口列表里留意每台显示器的当前名称重新绑定一次把 ID 关系纠正回来。6.2 Wayland 下的能力边界GNOME 用户的无奈我在 GNOME Wayland 环境下试过一次结果是OpenMontage 能扫描到窗口能显示列表和模板但执行移动时窗口纹丝不动。原因在于 GNOME 的 Mutter 合成器没有暴露 wlr-foreign-toplevel-management 协议第三方程序没有权限操控窗口位置。这不仅是 OpenMontage 的问题任何第三方窗口管理器比如 wmctrl、xdotool在 GNOME Wayland 下都会遇到同类限制。如果你是 GNOME 用户并且真的很想用 OpenMontage我现在能想到的可行办法换到 Xorg 会话GNOME 依然提供 Xorg 登录选项在 Xorg 下 OpenMontage 可以完整工作。换用支持 wlr 协议的合成器比如 Sway、Hyprland、River 等。继续用 GNOME但只把 OpenMontage 当窗口列表查看器不指望它执行移动。6.3 窗口标题频繁变化导致的匹配失效Electron 类应用是我使用 OpenMontage 时遇到的最不稳定因素。比如 Slack、Discord 这类聊天工具它们的标题里会带未读消息数像 “3 条未读 - Discord”浏览器就更不用说了标题跟着网页 Title 走每开一个新页面就变一次。如果你在模板里用了过于精细的标题正则很可能下次执行时就匹配不到任何窗口。后来我的变通思路是对这种高频变化的窗口不要依赖标题尽量使用类名列实在不行就给窗口类名预留多个变体。另一个技巧是给同一个槽位写多个备选规则把“聊天工具”槽位的匹配规则写成match: any: - class: [discord] - class: [Slack] - title: [.*Messenger.*]这样即使某个应用升级后改了类名其他规则还能兜底。6.4 同一个程序多开时如何区分主次窗口我办公时经常同时开两个 VS Code一个写前端、一个做后端。两个窗口类名完全一样标题也都不稳定OpenMontage 很难通过简单的类名/标题规则区分它们。面对这种场景我试过几条路给两个窗口的标题加区分前缀。这个方法很土但很有效毕竟标题是可以在应用内自定义的。在 OpenMontage 界面里手动绑定一次之后只要窗口没有被关闭重建绑定关系就会保留。这个方法的前提是别经常关掉重组。放弃模板自动匹配改用“先选中窗口再挑选槽位”的手动模式。麻烦一些但适合临时的、需要精准控制的窗口排布。6.5 性能和响应速度不要期待它是一个即时交互系统还有一点必须提醒OpenMontage 不是常驻后台的守护进程而是一个按需启动的应用。它启动时扫描窗口列表需要短暂时间如果桌面上窗口数量特别多比如开了三十个浏览器标签但每个标签是一个独立窗口扫描过程会有一两百毫秒的延迟有时甚至更久。这个速度谈不上卡顿但也不会像原生窗口管理器那样零延迟。所以更合适的使用节奏是把 OpenMontage 触发布局当成“工作前奏”而不是“边操作边反复调用”的即时工具。先按快捷键完成编排再进入工作状态这样体验最好。7. 结合其他工具的工作流它和桌面环境如何共存7.1 与平铺窗口管理器共存的正确姿势我在前面提到过 i3/Sway 这类平铺管理器OpenMontage 和它们的关系不是互斥而是可以嵌套。Sway 负责开启窗口时的初始布局OpenMontage 负责按模板对窗口进行大规模重组。在实际使用中这种组合比单独用任意一方都舒服但需要规避一个问题平铺管理器通常会强制所有窗口保持“瓦片”状态OpenMontage 移动完窗口后Sway 下次收到新窗口打开事件时可能会重新平铺把 OpenMontage 的成果打乱。我习惯的做法是把 OpenMontage 的执行放在“切换到专用工作区之后”。也就是说先按下快捷键切到工作区让 Sway 按它的默认平铺规则摆好再按 OpenMontage 的快捷键做最终重排。这样做的好处是 OpenMontage 不总是“对抗”平铺规则只是在平铺结果的基础上做一次精确重排。7.2 配合 wmctrl 和 xdotool 的补充脚本OpenMontage 不是万能的它擅长的是“批量移动窗口到固定槽位”但有些需求它不直接提供比如同时调整所有窗口到指定显示器、设置窗口为“置顶”状态。这时候我建议把 OpenMontage 作为主要编排器然后用少量 wmctrl/xdotool 脚本作为补充。一个我常用的补充脚本示例移动当前活动窗口到副屏并最大化。# 用 xdotool 获取当前活动窗口 ID WIN_ID$(xdotool getactivewindow) # 用 wmctrl 把它移到一个指定显示器上假设显示器名是 DP-1 wmctrl -i -r $WIN_ID -e 0,-1,-1,-1,-1 # 让窗口管理器把它放到 DP-1 并最大化 wmctrl -i -r $WIN_ID -b add,maximized_vert,maximized_horz这个脚本和 OpenMontage 的工作是互补的OpenMontage 负责“很具体的几何排布”脚本负责“临时且简单的窗口操作”。两条路并不冲突放在一起用反而更灵活。7.3 我目前在用的完整工作流说了这么多我分享一下目前最落地的一套工作流供参考开机进入 Xorg 会话稳定性和窗口控制能力优先。Sway 作为主 WM配置好基本的 workspace 和 bar。在 Sway 配置里把Mod4t绑定到exec python3 ~/OpenMontage/openmontage.py --apply ide-and-docs。每次开始重度编码前先打开需要的程序然后按Mod4t布局自动恢复成“左 60% 编辑器 右上终端 右下文档”。需要切到“只读模式”比如开会、审阅方案时按另一个快捷键执行另一套模板副屏变成全屏文档主屏只留聊天工具和一个空白终端。这套流程我用了将近三个月最大的感受是“整理窗口”这个动作几乎从我的肌肉记忆里消失了。以前每次换任务都要花时间摆窗口现在只需要改变关键词按一下键全部窗口就位。8. 关于深入使用的几点体会最后分享三个关于 OpenMontage 的个人体会不一定适合所有人但应该能给你一些参考。第一模板设计阶段值得多花时间。不要把窗口排布随手写进 YAML 就完事。我建议优先做一个“观察周”用一周时间记录自己不同工作场景下是怎么手动排窗口的哪个窗口最大、哪些窗口在上层、辅助窗口放在哪个位置然后再把观察结果固化成模板。这样模板是你真实工作习惯的映射而不是凭空想象的“整齐”。第二匹配规则宁可宽松也不要过强。我在实际使用中最常犯的错就是把标题正则写得太具体导致某个窗口因为标题的一两个字变化就匹配失败。宽松的匹配虽然偶尔会把窗口塞到不那么合适的槽位但至少窗口会动起来你只需要微调比完全不动好处理得多。第三善用命令行参数和脚本把 OpenMontage 嵌入到更大的自动化链路里。如果你已经用了自动切换工作区、自动启动应用组的工具那 OpenMontage 应该成为这个链路里的“最后一环”而不是一个孤立的工具。我见过不少人用 workrave、dwm 自动布局等工具做自动化最后窗口还是会乱就是因为缺少一个统一发力点来收尾——OpenMontage 恰好能补上这个位置。在我个人的使用评价里OpenMontage 不算一个“惊艳”的工具它没有复杂的动画、没有华丽的界面做的全是笨功夫。但正是这种踏实的“按模板干活”的思路帮我清理掉了每天桌面整理的心智负担。如果你也深陷多窗口排布的泥潭尤其在 X11 环境下我建议花一个下午读一遍它的配置文件写一套自己的模板然后把快捷键绑好——两天后你就会发现原来整理窗口这件事真的可以完全交给机器去做。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑