资讯动态

niri 深度解析:这款滚动平铺 Wayland 合成器,让新窗口再也不会挤动旧窗口

发布时间:2026/9/4 12:44:57 来源:尧图企业网站定制
niri 深度解析这款滚动平铺 Wayland 合成器让新窗口再也不会挤动旧窗口【免费下载链接】niriA scrollable-tiling Wayland compositor.项目地址: https://gitcode.com/GitHub_Trending/ni/niriniri 是一款用 Rust 编写的滚动平铺scrollable-tilingWayland 合成器。它的核心机制一句话就能说清窗口按列排布在一条无限向右延伸的横带上打开新窗口时已有窗口一律不改尺寸。下面不急着装环境先把它是什么、凭什么值得了解、适合谁讲明白。它解决了什么真实痛点传统平铺窗口管理器有一个长期存在的副作用每开一个新窗口整列窗口都要重新计算高度并互相挤压。你在终端里写代码随手开一个浏览器查文档原来所有窗口的大小和位置都变了——焦点窗口甚至会自己动一下。多窗口重度用户对此的抱怨可以归成一句话我的窗口为什么自己会动niri 的回答是横向上不再挤压。新窗口作为新的一列出现在带子上向左右滚动即可看到需要并排对照的窗口手动合并进同一列此时才等分高度。窗口大小只在你主动决定合并/拆分时变化其余时间纹丝不动。这种思路不是凭空来的GNOME 扩展 PaperWM、KDE 的 karousel、i3/sway 上的 papersway 都实现过类似工作流但 niri 是少数从第一天起就把滚动平铺当作核心设计的合成器而不是在现成桌面环境上打补丁。心智模型横带 纵向动态工作区理解 niri只需要记住两个轴向。横向是一条无限滚动带每个显示器拥有独立的窗口带窗口永远不会溢出到隔壁显示器——这是作者写 niri 的直接动机之一因为作为 GNOME 扩展的 PaperWM 受限于 Shell 的全局坐标空间很难真正隔离多显示器。纵向是工作区但它是动态的而非传统的预设 9 个编号桌面每个显示器独立拥有一组工作区垂直排列每列工作区的最下方永远留着一个空工作区窗口开满也不会无处安放中间的空工作区在你切走后自动消失断开外接显示器时它的工作区会迁往其他屏幕重新接入后又自动迁回。这套模型带来一个很实际的好处得益于横向滚动已经能容纳大量窗口多数人需要的工作区数量比静态桌面少得多。作者自己的习惯是浏览器常驻最上层每个项目一个工作区再配合把工作区上下挪动把最常用的项贴近焦点。想要更稳定的锚点时可用命名工作区named workspace给工作区起名之后按名字跳转且不会因变空而消失。详见 docs/wiki/Workspaces.md。设计原则为什么眼不见为净是特性而不是偷懒niri 的 docs/wiki/Development:-Design-Principles.md 把几条硬性原则写在明面上值得逐条体会打开新窗口不得影响任何已有窗口的尺寸。这是滚动平铺的立身之本。焦点窗口不得自行移动。消除窗口自己会跳这一平铺管理器的经典槽点。所有操作即时生效。不做延迟确认式的交互按键即结果。视觉特效关闭时不得拖累性能开启时也不得过度渲染。动画、模糊、渐变边框都可以整体关掉桌面回到纯工具状态。代码层面布局与窗口的核心逻辑集中在 src/layout/工作区、列、窗口、滚动、浮动窗口的状态机配置解析独立成 niri-config/ 子 crate渲染效果在 src/render_helpers/ 里以着色器方式实现。这种分层让布局引擎配置层渲染层各自可测仓库里的快照测试src/tests/snapshots/就大量覆盖窗口打开时的全屏/最大化边界组合。配置哲学KDL 热重载 一切皆规则niri 的配置文件~/.config/niri/config.kdl使用 KDL 语法且保存即生效键位、输出设置、窗口规则、动画参数全部实时热加载不需要重启会话。想检查语法niri validate可以提前解析报错。几个典型的规则驱动能力layout {}控制间距gaps、边框、阴影、焦点环、预设列宽还可以用struts在屏幕边缘留出固定边距window-rule {}按应用 ID、标题等条件给单个窗口下指令初始工作区、默认列宽、全屏、甚至把敏感窗口从屏幕录制中屏蔽边框支持 Oklab/Oklch 色彩空间的渐变窗口与层壳表面支持背景模糊全屏与最大化是两种独立状态最大化让整列占满工作区同列多窗口共存全屏则独占整个工作区视图进阶玩家还可以关注 docs/wiki/IPC.mdniri 通过 Unix socket 提供 IPC 与事件流event stream第三方工具可以订阅焦点窗口变化工作区变化等事件做状态栏和指示器时不用轮询这是它作为可编程合成器的重要一环。三个真实使用场景场景一长时间多项目并行开发。编辑器、终端、文档浏览器各占一列向左右滚动切换需要并排 diff 时把两个终端合并进同一列。全程窗口不再互相挤动注意力成本显著降低。场景二动态工作区 总览视图。按项目切分工作区用move-workspace-up/down把当前工作区挪到焦点下方一次按键来回。配合 Overview可四指上滑或热角落唤起所有工作区缩成缩略图直接拖拽窗口跨工作区移动——全程鼠标也能完成。场景三窗口标签化。同一列窗口可以切换为标签tab显示多个窗口共享同一尺寸、只占一块空间适合多个同类窗口、很少同时看的情况比如开着一堆后台下载或聊天窗口。列内还能多标签全屏。同类工具横向对比平铺世界里 niri 的定位可以这样概括sway / i3经典的静态工作区 BSP 式平铺规则严谨、生态成熟但开新窗即全局重排且没有滚动布局这一维度i3 系的 papersway 是社区补丁实现。Hyprland高度可定制、动效丰富内置了滚动布局选项但滚动平铺不是其默认心智模型需要额外配置才能接近 niri 的体验。GNOME PaperWM在不离开 GNOME 的前提下获得滚动平铺适合 GNOME 重度用户缺点是受 Shell 全局坐标空间束缚多显示器隔离不彻底——这正是 niri 想要正面解决的问题。niri更激进——从底层把无限横带 动态工作区 多显示器完全隔离作为第一性原理并原生支持触控板/鼠标手势、Overview、标签列、动态工作区迁移。代价是它不是完整桌面环境需要搭配状态栏、启动器等组件。上手建议与进阶方向入门路径其实很轻主流发行版已有包Fedora COPR、Arch 等装完在登录管理器选 niri 会话即可没有显示管理器时在 TTY 里运行niri-session。若从源码构建仓库地址为 https://gitcode.com/GitHub_Trending/ni/niri cargo build --release之后产物在target/release/。注意 niri 本身不带动效完整的桌面壳社区常见搭配是 Quickshell 类桌面如 README 提到的 DankMaterialShell、Noctalia或 LXQt。完整文档在 docs/wiki/建议顺序是Getting-Started → Configuration: Introduction → Configuration: Layout。进阶方向有三条值得走一是用命名工作区 window-rule把常用应用的落点固化下来二是研究 IPC 事件流给自己的状态栏或脚本接上实时状态三是关注动画与自定义着色器src/render_helpers/shaders/下的开源/关闭/缩放特效链这是少数把视觉特效可编程做到合成器内核层的平铺项目。结语niri 值得了解的核心理由是它对平铺窗口管理器一个老问题的正面回应窗口不该自己乱动。用无限横带 动态纵向工作区这套心智模型它把开窗、切窗、找窗的路径都压短了同时把多显示器隔离、手势、总览、标签这些体验做进了内核而非补丁。如果你受够了一开窗口全桌抖或者一直在 GNOME 之外寻找更顺手的平铺方案这个项目值得花一个下午认真体验。【免费下载链接】niriA scrollable-tiling Wayland compositor.项目地址: https://gitcode.com/GitHub_Trending/ni/niri创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价