关注了就能看到更多这么棒的文章哦~
A tour of the niri scrolling-tiling Wayland compositor
By Joe Brockmeier
July 7, 2025
Gemini flash translation
https://lwn.net/Articles/1025866/
Niri 是一款相对较新的、基于 Rust 编写的 Wayland 合成器 (compositor),它对 平铺窗口管理 (tiling window management) 采用了不同的方法:窗口以“无限”行的方式在屏幕上放置,可以扩展超出可见工作区的边界。Niri 并非一个完整的桌面环境,但对于那些希望获得平铺功能并追求 Wayland 窗口管理器极简主义的 Linux 用户来说,它可能是一个合适的选择。
可滚动平铺
浮动窗口管理 (floating window management) 是 Linux 桌面环境(以及 macOS 和 Windows)的常态,但平铺窗口管理已经存在了很长时间,甚至可以追溯到 20 世纪 80 年代初的 Xerox Star 系统。有许多窗口管理器和合成器为 Linux 用户提供平铺功能:awesome、i3、ratpoison 和 sway,等等。
大约 13 年前,Jesse McClure 宣布 了一种略有不同的平铺窗口管理方法,即 ScrollWM 项目。它提供了一个单一的大型虚拟桌面,“可以平滑滚动”。自那时起,出现了许多其他可滚动平铺的实现,包括 PaperWM,这是一个为 GNOME 启用窗口可滚动平铺的扩展,LWN 在一月份 报道 了它。
受 PaperWM 启发,Ivan Molodetskikh 于 2023 年开始开发 niri 合成器。根据 niri 项目的 README 文件,Molodetskikh 喜欢 PaperWM 的窗口管理模式,但他决定编写自己的合成器(compositor),以克服 PaperWM 在将工作区独立到单个显示器方面的限制。Niri 则不同,每个显示器都有自己独立的、不重叠的工作区。
他通过使用 Smithay 加速了 niri 的开发,这是一个旨在加快合成器开发速度的 Rust 项目。它“以通用方式提供了几乎所有合成器都需要实现的对象和接口”。它似乎是 Wayland 合成器开发的一个相当受欢迎的起点,并被 其他几个项目 使用,包括新的 COSMIC 桌面环境,我们在 2024 年 8 月 对其进行了报道。Smithay 在 MIT 许可证下可用,而 niri 则在 GPLv3 许可证下发布。
获取 niri
Niri 在一些(但不是所有)主流 Linux 发行版中可用。其 入门 页面列出了支持 niri 的发行版,包括最新版本的 Alpine、Arch、Fedora、Gentoo、openSUSE Tumbleweed 等。目前,它在任何 Debian 仓库或 Ubuntu 中都不可用。当然,也提供了从源代码构建 niri 的说明。潜在用户可能需要注意 将 niri 与 NVIDIA 驱动配合使用 或 尝试在 Arm 系统(包括 Asahi Linux)上运行 的指南。
目前,niri 项目主要由 Molodetskikh 一人负责;虽然有 100 多人做出了少量贡献,但只有三位开发人员对该项目提交了十次以上的 commits,而 Molodetskikh 自 2023 年 8 月以来已提交了 1,900 多次。2025 年初,他 宣布 niri 已“功能足够丰富,可以从 v0.1 毕业”,并发布了 25.01 版本。该项目现在使用“年.月”的版本命名方案,但没有固定的发布时间表;新版本在他认为合适的时机发布。
niri 最新的主要版本是 v25.05,于 5 月 17 日宣布。它带来了一些重大变化,包括一个让用户能够查看所有开放窗口和工作区的 概览功能 (overview feature),以及在 屏幕录制 (screencasting) 时遮蔽特定窗口的功能。一个次要的“热修复 (hotfix)”版本 25.05.1 于 5 月 25 日宣布。
我在一台运行 Fedora 42 工作站并配备 Intel 显卡的笔记本电脑上安装了 niri 25.05.1。这使得 niri 在 GNOME 显示管理器 (GDM) 下成为一个选项,并为 niri 配置了 portal 和 systemd 服务。它还安装并设置了一些辅助程序,例如 fuzzel、mako 和 Waybar,以提供额外功能。Fuzzel 是 Wayland 的应用程序启动器,mako 实现了 Freedesktop.org 桌面通知规范,而 Waybar 是一个高度可定制的 Wayland 面板应用程序,类似于 GNOME 和 KDE Plasma 面板。从源代码安装 niri 的用户可能需要阅读 systemd 配置示例 文档以获取指导。
用户需要自行选择和配置通常随桌面环境提供的其他应用程序:文件管理器、终端模拟器、媒体播放器、包管理工具、图片查看器等等。
使用 niri
用户登录 niri 后首先会看到一个“重要快捷键”对话框,列出了一些最常用的移动和窗口管理按键。用户只需按下任意键、点击鼠标按钮或执行类似操作即可关闭该对话框。可以通过组合键 Super+Shift+/ 再次调出。Super 键通常是现代 PC 键盘上的 Windows 键;niri 将其用作标准修饰键(或 Mod 键),但如有必要,可以 更改 为其他修饰键。
Niri 的默认配置还会启动 Waybar 面板。它有自己的 配置 文件 ~/waybar/config.jsonc(在 Fedora 上),用于定义其大小、位置以及显示的 模块 及其操作方式。
Waybar 拥有大量的模块来增加功能,以及许多用户可以配置的选项。该项目有几个 示例,展示了如何配置 Waybar 以模仿 macOS 面板和 Dock、Windows 10 菜单,以及一些极其简洁的配置。为了不陷入定制化陷阱,到目前为止,我只对 Waybar 进行了少量更改——除了一个例外。
通常,我希望桌面面板上有一个用于挂起、重启或关闭系统的菜单——但 Fedora 上的 Waybar 默认不提供此功能,所以我将其添加到了 config.jsonrc 中。这需要对该配置文件进行两处更改——添加一个自定义模块,然后将该模块放置在 Waybar 上。模块定义如下所示:
"custom/power": {
"format" : " ⏻ ",
"tooltip": true,
"menu": "on-click",
"menu-file": "$HOME/waybar/power_menu.xml",
"menu-actions": {
"shutdown": "shutdown",
"reboot": "reboot",
"suspend": "systemctl suspend",
"hibernate": "systemctl hibernate"
}
一份示例的 power_menu.xml 配置文件可在 GitHub 上获取。
Waybar 模块可以放置在面板的右侧、左侧或中心。我将电源按钮添加到了面板的左侧,如下所示:
"modules-left": [
"custom/power"
],
请注意,Waybar 不会自动识别 配置文件的更改,因此在进行任何修改后需要重新启动它。
像大多数平铺窗口管理器一样,niri 旨在通过键盘驱动;所有移动和调整窗口大小的操作都可以在没有鼠标的情况下完成。然而,它不像某些窗口管理器(如 ratpoison)那样死板,只允许用户使用键盘操作窗口——如果用户更习惯用鼠标,也可以用鼠标移动和调整窗口大小。
假设 fuzzel 应用程序启动器已随 niri 安装,按下 Super+D 将调出其对话框以启动应用程序。它会显示一个可能的选项列表,例如 Firefox,可以使用方向键选择,或者用户可以开始输入程序名称,fuzzel 会尝试查找匹配的程序。
程序启动后,niri 会将其窗口放置在显示器上的一个列中,具有预设的宽度和高度。默认高度为显示器的 100%,宽度分别为显示器宽度的三分之一、二分之一和三分之二。用户可以使用 Super+R 切换窗口宽度;这将使窗口在可用的预设宽度之间循环。Shift+Super+R 将循环切换可用的预设高度,默认为显示器的 100% 或 50%。
每个新窗口都将放置在当前有焦点的窗口的右侧。如果窗口数量多于显示器工作区上的可用空间,niri 会将较旧的窗口“滚动”出屏幕左侧。Niri 还为每个显示器提供动态工作区,这些工作区垂直排列。它有用于将焦点移动到不同窗口、在工作区和显示器之间移动窗口等的快捷键绑定。例如,Super+H 将选择活动窗口左侧的窗口,Super+Ctrl 加方向键将分别向左或向右移动窗口,而 Super+C 将使活动窗口在显示器上居中并相应调整其他窗口。
用户也可以使用鼠标或触控板执行窗口管理,因此 niri 也适用于那些偏爱这种方法的人。
高级窗口放置
有时,人们可能希望拥有一个显示在平铺窗口顶部的 浮动窗口 (floating window);Super+V 会将一个窗口从平铺层中弹出,并将其显示在其他窗口之上。再次按下 Super+V 会将窗口返回到平铺层。Niri 会自动为对话框、文件选择器和其他子窗口执行此操作。
窗口也可以添加到 标签组 (tab group) 中。这会将多个窗口分组到一列中,并提供一个标签界面以在它们之间进行选择,很像网页浏览器窗口中的标签。
可以告诉 niri 应用程序的窗口应始终以浮动模式打开,等等。窗口规则 (window rules) 文档提供了设置窗口参数的完整示例列表,包括大小、装饰甚至不透明度。还可以设置 niri 所谓的 命名工作区 (named workspaces);这些工作区总是被创建,即使它们没有活动窗口。此功能的一个好处是,niri 可以配置为始终将某些应用程序窗口放置在命名工作区中,从而将特定类型的所有窗口分组到它们自己的一个工作区上。这对于将所有浏览器窗口放在一个工作区,或所有终端窗口放在一个工作区可能很有用。
Super+O 绑定将调用 niri 的新概览功能,以查看并使用方向键(或鼠标或触控板)在所有开放窗口和工作区之间导航。下图显示了 niri 概览的一部分——不幸的是,其内置的屏幕截图工具没有可以捕获跨多个显示器的完整概览的模式。
与桌面环境不同,niri 没有自动的省电功能,也不会在一段时间不活动后锁定屏幕。我已习惯 GNOME 默认执行这些操作。在 Fedora 上,swaylock 随 niri 默认安装用于屏幕锁定。Mod+Shift+P 快捷方式将关闭显示器;任何按键都会再次唤醒它们。要退出 niri,请使用 Super+Shift+E,然后在显示确认对话框时按下 Enter 键。
配置 niri
Niri 也缺少图形配置应用程序。任何设置更改都需要通过编辑使用 KDL 格式的纯文本配置文件来完成。在 Fedora 上,不进行任何额外配置也能“开箱即用”地使用 niri,但大多数人至少会希望对其设置进行一些微调。
默认情况下,niri 使用系统范围的配置;没有设置用户配置文件。要获取初始配置文件,请将 niri 中包含的 usr/share/doc/niri/default-config.kdl 文件复制到 ~.config/niri/config.kdl 。default-config.kdl 文件包含许多可能的配置选项,按 section 排序,例如 input、output 和 binds,并附有有用的注释。
对配置的更改通常在配置文件写入后立即生效。例如,niri 的初始设置使用 Mod+T 快捷键绑定来启动 Alacritty 终端。如果用户想将其更改为 Ghostty,配置将如下所示:
Mod+T hotkey-overlay-title="Open Ghostty" { spawn "ghostty"; }
第一个字段设置快捷键绑定,Mod+T。第二个字段 hotkey-overlay-title 设置在“重要快捷键”对话框中显示的标题。第三个字段 { spawn "ghostty"; } 指定应运行的命令。用户在设置 niri 的绑定时不仅限于键盘;它还支持鼠标点击、鼠标滚轮操作和触控板操作。例如,可以将 Mod 键与鼠标滚轮组合设置为在工作区之间向上或向下移动:
binds {
Mod+WheelScrollDown { focus-workspace-down; }
Mod+WheelScrollUp { focus-workspace-up; }
}
多显示器设置
niri wiki 上的 文档 总体来说非常出色;我注意到的唯一真正的空白是多显示器设置。它们虽然 有所涉及,但更多示例会更有益。Niri 会自动检测并尝试正确配置多个显示器,而无需用户调整配置。根据我的经验,它在设置显示器的正确分辨率方面表现良好,但由于 niri 无法知道显示器的物理排列方式,因此仍需要调整配置以进行位置设置。
Niri 确实能很好地处理不同分辨率、旋转和缩放的多显示器设置。如果设置复杂,需要一些试错才能正确配置。例如,我测试 niri 时使用了三显示器配置,包括一台笔记本电脑屏幕、一个高分辨率宽屏显示器和一个横向放置的较小高清显示器。
该项目有一个有用的命令(niri msg outputs)可以帮助解决这个问题。它显示它检测到的每个显示器的名称,以及诸如每个显示器的可用分辨率和刷新率等信息。
Xwayland
开箱即用,niri 不支持 X11 应用程序或 Xwayland。尽管 Xwayland 是一个 Wayland 客户端,但它 需要 Wayland 合成器的特殊支持——Molodetskikh 不打算 进行这项工作,因为用他的话说,“X11 非常糟糕”。然而,niri 可以与 xwayland-satellite 配合使用,后者将无根 Xwayland (rootless Xwayland) 作为独立应用程序实现,以运行 X11 应用程序。目前,xwayland-satellite 必须单独配置,但预计 将在 niri 的下一个主要版本中集成。目前,可以通过向 config.kdl 添加几行来启用它。第一行是启动 niri 时启动应用程序的选项:
spawn-at-startup "xwayland-satellite"
它还需要一个环境变量来设置 xwayland-satellite 的显示:
environment {
DISPLAY ":0"
}
到目前为止,我只尝试了几个带有 xwayland-satellite 的 X11 应用程序,但它似乎奏效了。
纯粹的想象
Niri 允许一些相当精巧的设置;对其可能性的主要限制可能取决于个人的想象力以及他们愿意花在调整配置上的时间。它与 GNOME 几乎完全相反——niri 面向更高级的用户,旨在让用户深入配置并随心所欲地进行调整。在 GitHub 上有一个展示页面,用户上传了他们的 niri 设置截图并链接了配置文件,这对于任何寻找想法或示例的人来说可能是一个很好的起点。
然而,用户不必花费大量时间配置 niri;我花了大约两天时间才对我的配置完全满意。使用 niri 变得高效并不需要大量工作,只需要一些与它的文档和文本编辑器相处的宝贵时间。
就目前而言,我可能会继续使用 niri。它似乎稳定、维护良好,并且定制的可能性几乎是无限的。可滚动平铺模型 (scrollable-tiling model) 至少对我而言,是管理大屏幕和小屏幕上窗口的理想方式。它易于导航,并有助于让我的双手保持在键盘上。
全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。
欢迎分享、转载及基于现有协议再创作~
长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~