说到 Linux 桌面上的窗口管理,很多开发者朋友可能都会倾向于平铺式窗口管理器(Tiling Window Manager)。效率确实高,键盘驱动一切,窗口自动布局省心不少。但是,传统平铺管理器也有些让人头疼的地方,比如开新窗口时,其他窗口可能会被挤压变形,或者在多显示器环境下,窗口布局管理起来不太直观。有没有一种更灵活、更丝滑的平铺体验呢?
最近我在 GitHub 上逛的时候,发现了一个很有意思的项目,它就是今天要跟大家聊聊的 niri
。它同样是 Wayland 上的一个窗口管理器,但它走的路线不太一样,主打一个“可滚动平铺”(Scrollable Tiling),这个概念一听就让我觉得眼前一亮。
niri
把自己定位成一个可滚动平铺的 Wayland 合成器(compositor)。你可以把它想象成,你的每个显示器上都有一个无限宽的画布,窗口就像固定宽度的纸张一样并排放置在这张画布上,你可以左右滚动来查看不同的窗口,而不是让它们互相挤压来适应屏幕宽度。这种模式保证了窗口一旦打开,它的大小就不会随意变动,带来了一种更稳定、更可预测的布局体验。这个项目完全开源,而且是用内存安全著称的 Rust 语言从零开始构建的,技术栈听起来就很现代、很扎实。
从 GitHub 的数据来看,niri
还是挺受欢迎的。目前项目累计收获了 8173 个星标,今天一天就新增了 120 个星标,这个增长速度很健康啊。项目主要使用 Rust 语言开发,这符合当前许多高性能系统软件的趋势。项目的维护状态也看起来不错,有持续的更新和社区活跃度,README 里直接给出了 Matrix 社区的链接,说明维护者很欢迎大家来交流。很多用户反馈它已经可以作为日常使用的 Wayland 环境了,这让我挺有兴趣深入了解一下。
niri
提供的特性,除了核心的可滚动平铺之外,还有不少实用的亮点:
❤️ 独树一帜的滚动平铺
这是 niri
最核心的卖点。窗口在水平方向上平铺,形成一个可以左右滚动的条带。新窗口出现不会改变现有窗口的大小,只会添加到当前活动列的旁边或者你指定的位置。这种方式我觉得尤其适合需要同时开很多个终端、文档、代码窗口,但又不想让它们变得太小看不清内容的场景。
🖥️ 智能动态工作区
niri
的工作区是动态创建的,并且每个显示器都有自己独立的一套工作区。更妙的是,它能记住显示器和工作区的关系,即使你暂时拔掉显示器再插回去,之前的工作区也能回到对应的屏幕上,这个功能对于经常插拔显示器或者使用笔记本外接屏幕的用户来说太方便了。
🔍 直观的总览模式与手势
项目提供了一个总览模式(Overview),可以像 GNOME 那样把当前屏幕上的工作区和窗口都缩小展示出来,方便快速切换。而且它还支持触摸板和鼠标手势,比如用手势来切换工作区或者进入总览模式,这让操作更加流畅自然,尤其是在笔记本上,触摸板手势用起来感觉非常顺手。
📑 窗口分组 (Tabs)
你可以把多个相关的窗口组织到一个标签页组里,它们会堆叠在一起,只显示当前活动的那个窗口,但可以通过快捷键或手势在组内切换。这就像在同一个浏览器标签里打开多个网页一样,进一步节省了屏幕空间,也让窗口管理更有层次感。
⚙️ 灵活的布局与外观配置
虽然是平铺管理器,但 niri
提供了丰富的配置选项,包括窗口间的间隙、边框样式、甚至支持渐变边框(用 Oklab 和 Oklch 色彩空间),还有各种窗口动画。配置文件是实时加载的,你修改了配置保存一下,效果立马就能看到,这个调试体验我很喜欢,可以随心所欲地调整出自己喜欢的桌面风格。
📸 内建截图与录屏
作为一个 Wayland 合成器,niri
集成了截图功能,可以直接截取当前屏幕或者窗口。更实用的是,它支持通过 xdg-desktop-portal-gnome
进行屏幕录制和投屏,甚至可以配置哪些敏感窗口在录屏时被遮挡或排除,这个隐私保护功能考虑得很周全。
想要尝试 niri
的话,你需要一个支持 Wayland 的 Linux 环境。由于它是用 Rust 构建的,如果你想从源码安装,可能需要先安装好 Rust 开发环境和一些构建依赖,具体可以参考它 GitHub Wiki 上的 Getting Started 页面,那里有最详细和准确的步骤。一般来说,流程会是克隆仓库,然后使用 cargo build --release
进行编译。
# 首先确保你的系统安装了 Rust 和 Cargo
# 依赖项可能因发行版而异,请查阅 niri 官方 Wiki
git clone https://github.com/YaLTeR/niri.git
cd niri
# 编译项目
cargo build --release
# 编译成功后,可执行文件通常在 target/release/ 目录下
# 启动 niri 作为 Wayland session
# 这一步通常通过你的显示管理器 (Display Manager) 或 .bashrc/.zshrc 等启动脚本来完成
# 例如,如果你使用 greetd 作为显示管理器,编辑 greetd 的配置:
# [terminal]
# session_command = "niri"
# 如果从 TTY 启动,可能需要设置 WAYLAND_DISPLAY 等环境变量,具体方法请参考 niri 文档。
安装好之后,你需要配置一个启动器(比如 fuzzel
)和一个状态栏(比如 waybar
),因为 niri
本身只是一个窗口合成器,并不包含这些桌面环境的常用组件。它的配置主要通过一个配置文件来完成,你可以根据自己的喜好调整键绑定、布局参数、外观等等。遇到问题,优先查阅它的 Wiki 或者到 Matrix 频道里寻求帮助,社区成员通常都很乐心助人。
我觉得 niri
非常适合以下几种场景和用户:
- 需要高效多任务但厌倦窗口频繁重排的开发者:如果你习惯同时打开一堆终端、编辑器、浏览器窗口查阅资料,但又不喜欢传统平铺管理器里窗口为了挤进屏幕而变得太小,或者一个新窗口弹出来导致所有窗口大小都变一次,
niri
的滚动平铺模式会给你一个稳定且宽敞的视野,就像在一条长长的纸带上安排你的工作。 - 使用多显示器且追求顺滑体验的用户:
niri
对多显示器的原生支持,特别是每个显示器独立的工作区且能记住布局,解决了许多其他 WM 在多屏环境下可能遇到的痛点。如果你经常在不同的屏幕上组织不同的任务,这个特性会非常提升效率。 - Wayland 技术栈的探索者和 Rust 语言爱好者:如果你对 Wayland 的未来充满期待,或者对用 Rust 构建底层系统软件感兴趣,
niri
提供了一个非常好的学习和实践机会。它展示了 Wayland 环境下的窗口管理可以有哪些创新的玩法。
相较于 GNOME Shell 上的 PaperWM (niri 的灵感来源),niri 作为原生的 Wayland 合成器,集成度更高,尤其在多显示器处理上更加彻底,避免了在 GNOME Shell 架构上打补丁可能带来的一些限制。与其他基于 wlr-roots
或 wlroots
构建的平铺管理器(如 Sway、Hyprland)相比,niri
的滚动平铺模式提供了一种完全不同的交互逻辑,这算是一个独特卖点,是否适合就看个人习惯了。
总的来说,niri
提供了一种非常有创意的 Wayland 窗口管理体验。它用滚动的方式解决了传统平铺管理器在窗口数量多时带来的拥挤和大小不稳定问题,同时在多显示器支持、动态工作区等方面做得也很到位。虽然它不像一个完整的桌面环境那样开箱即用,需要你自己搭配一些工具,但这对于喜欢定制和折腾的开发者来说,反而是它的魅力所在。
如果你用腻了传统的平铺管理器,或者对 Wayland 的新玩法感兴趣,我强烈建议你花点时间尝试一下 niri
。也许它独特的滚动平铺模式,就是你一直在寻找的高效工作流。
项目地址在这里,大家可以去看看:
GitHub: https://github.com/YaLTeR/niri
试用之后有什么想法,也欢迎在评论区跟我交流呀!