告别混乱多屏工作流:niri多显示器独立会话配置指南
你是否曾在多显示器工作时遭遇窗口管理噩梦?主屏幕挤满文档,副屏视频会议被工作窗口遮挡,想要专注编码却找不到正确的窗口分组?niri作为一款滚动平铺式Wayland合成器(Wayland compositor),通过创新的多会话管理功能彻底解决这些痛点。本文将带你从零开始配置多显示器独立会话,实现工作、娱乐、沟通场景的物理隔离,让每个屏幕都成为专注的独立工作区。
核心概念:输出设备与命名工作区
niri通过输出设备(Output) 和命名工作区(Named Workspaces) 的组合实现多屏独立会话。输出设备对应物理显示器,可通过连接器名称(如eDP-1、HDMI-A-1)或制造商信息进行识别;命名工作区则是持久化的虚拟桌面,可绑定到特定输出设备并保存独立布局配置。
设备识别技巧:运行
niri msg outputs命令可列出所有输出设备的详细信息,包括连接器名称、分辨率和支持的刷新率。配置文件示例可参考docs/wiki/Configuration:-Outputs.md和docs/wiki/Configuration:-Named-Workspaces.md。
第一步:输出设备基础配置
识别与命名显示器
编辑niri配置文件(通常位于~/.config/niri/config.kdl),首先通过设备唯一标识定义输出设备。以下示例配置笔记本内置屏幕(eDP-1)和外接显示器(HDMI-A-1):
// 笔记本内置屏幕 - 1920x1080@120Hz,200%缩放
output "eDP-1" {
mode "1920x1080@120.030"
scale 2
focus-at-startup // 启动时自动聚焦此显示器
backdrop-color "#1a1a2e" // 深色背景用于工作场景
}
// 外接HDMI显示器 - 2560x1440@144Hz,100%缩放,旋转90度
output "HDMI-A-1" {
mode "2560x1440@143.912"
scale 1
transform "90" // 竖屏模式适合文档阅读
position x=960 y=0 // 定位在内置屏幕右侧(考虑缩放后逻辑坐标)
backdrop-color "#0f3460" // 蓝色调背景用于创意工作
}
关键参数说明:
mode:指定分辨率和刷新率,需与niri msg outputs显示的格式完全匹配position:定义显示器在全局坐标系中的位置,影响窗口拖拽和光标移动逻辑transform:支持"normal"(默认)、"90"、"180"、"270"等旋转选项
配置每显示器独立布局
niri支持为不同输出设备定义独特的窗口布局规则。以下示例为外接显示器配置更宽松的窗口间距和特殊列宽:
output "HDMI-A-1" {
// ...基础配置省略...
layout {
gaps 24 // 更大的窗口间距
default-column-width { proportion 0.3 } // 更窄的默认列宽
always-center-single-column false // 单窗口时不居中
border {
width 3
color "#e94560" // 红色边框区分不同显示器窗口
}
}
}
第二步:创建绑定到特定显示器的命名工作区
定义跨显示器独立会话
使用workspace指令创建持久化工作区,并通过open-on-output绑定到特定显示器。以下配置创建三个独立会话:
// 主显示器工作区 - 绑定到内置屏幕
workspace "coding" {
open-on-output "eDP-1"
layout {
gaps 16
default-column-width { proportion 0.5 } // 双列布局适合代码编辑器
struts { top 48 } // 为顶部状态栏预留空间
}
}
// 外接显示器工作区 - 绑定到HDMI显示器
workspace "design" {
open-on-output "HDMI-A-1"
layout {
gaps 32
default-column-width { proportion 1.0 } // 单列居中布局适合设计工具
always-center-single-column true
}
}
// 浮动窗口工作区 - 可在任一显示器打开
workspace "media" {
layout {
floating-only true // 所有窗口默认浮动
}
}
命名工作区优势:
- 始终存在即使无窗口,避免动态工作区的序号变化问题
- 支持
open-on-workspace窗口规则,实现应用自动归类- 布局配置完全隔离,修改一个工作区不影响其他
第三步:实现窗口自动分流与切换
配置应用窗口规则
通过窗口规则(Window Rules)实现应用自动打开到指定工作区:
window-rule {
match app-id="code" // VS Code
open-on-workspace "coding"
}
window-rule {
match app-id="gimp" // GIMP图像编辑器
open-on-workspace "design"
floating true // 设计软件强制浮动窗口
}
window-rule {
match title="YouTube" // 浏览器YouTube标签页
open-on-workspace "media"
floating { width 1280 height 720 } // 指定浮动窗口尺寸
}
配置工作区切换快捷键
在配置文件中添加键盘绑定,实现跨显示器工作区快速切换:
binds {
// 切换到指定工作区(无论在哪个显示器)
bind "Mod4 Shift 1" { focus-workspace "coding" }
bind "Mod4 Shift 2" { focus-workspace "design" }
bind "Mod4 Shift 3" { focus-workspace "media" }
// 将当前窗口发送到指定工作区并跟随切换
bind "Mod4 Ctrl 1" { move-window-to-workspace "coding"; focus-workspace "coding" }
// 在当前显示器循环切换工作区
bind "Mod4 Tab" { focus-workspace next }
bind "Mod4 Shift Tab" { focus-workspace previous }
}
高级技巧:动态工作区管理与故障排除
多显示器窗口迁移
使用niri提供的IPC接口可实现高级窗口管理,例如将当前窗口移动到另一显示器的活动工作区:
# 将当前聚焦窗口移动到HDMI-A-1显示器
niri-msg send "move-window-to-output 'HDMI-A-1'"
相关实现代码位于niri-ipc/src/lib.rs,通过Unix域套接字与合成器通信。
常见问题解决
-
显示器位置错乱:检查
position参数是否考虑了缩放因素,高DPI屏幕的逻辑坐标需除以缩放值。例如200%缩放的1920px宽度屏幕,逻辑宽度为960px。 -
工作区切换卡顿:尝试禁用有问题显示器的VRR功能:
output "HDMI-A-1" { // variable-refresh-rate on-demand=true // 注释掉此行禁用VRR } -
窗口规则不生效:使用
niri msg windows命令检查窗口的实际app-id和title,确保匹配规则准确。
配置效果展示与扩展思路
完成配置后,系统将实现以下工作流隔离:
- 内置屏幕(eDP-1):"coding"工作区运行代码编辑器和终端,采用紧凑双列布局
- 外接显示器(HDMI-A-1):"design"工作区运行设计软件,单列居中布局
- 跨显示器共享:"media"工作区可通过快捷键在任一显示器打开,自动适应目标屏幕布局
进阶扩展建议:
- 为每个工作区配置独立的背景程序:
window-rule { match workspace="media"; spawn "swaybg -i ~/wallpapers/media.jpg" }- 使用
layer-rule为不同工作区配置独立的状态栏:docs/wiki/Configuration:-Layer-Rules.md- 通过niri IPC开发自定义工作区切换脚本:niri-ipc/src/lib.rs
通过这套配置,你的多显示器系统将从混乱的窗口堆转变为井然有序的独立工作环境,每个屏幕都能专注于特定任务而不相互干扰。niri的滚动平铺特性让窗口管理更高效,而命名工作区则确保了工作流的持久化和可预测性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考





