5 分钟装好 niri:可滚动平铺 Wayland 合成器的完整配置指南
【免费下载链接】niriA scrollable-tiling Wayland compositor.项目地址: https://gitcode.com/GitHub_Trending/ni/niri
niri 是一个可滚动平铺的 Wayland 合成器:窗口不用你拖,它自动排好,还能像书页一样横向滚动、工作区上下滚动。这篇文章按「先跑起来 → 再理解 → 后定制 → 最后排障」的顺序带你走完一遍:从装依赖、第一次登录,到 KDL 配置、快捷键、工作区、多屏,再到卡了怎么办,最后聊聊录屏与开机自启。
1. 快速上手:5 分钟装好并登录 niri
这一节只解决一个问题:让 niri 出现在你的登录列表里,并且你能用键盘把它开起来。
装依赖与获取二进制
最省事的路线是直接用发行版或社区仓库的包,Fedora 和 Arch 都有现成的。如果你坚持要自己编译,依赖大致长这样(Ubuntu/Debian 为例,Fedora 包名把-dev换成-devel即可):
# Ubuntu 24.04 编译依赖 sudo apt-get install -y gcc clang libudev-dev libgbm-dev libxkbcommon-dev \ libegl1-mesa-dev libwayland-dev libinput-dev libdbus-1-dev libsystemd-dev \ libseat-dev libpipewire-0.3-dev libpango1.0-dev libdisplay-info-dev # 再装一个稳定版 Rust,然后: git clone https://gitcode.com/GitHub_Trending/ni/niri cd niri && cargo build --release装好之后登出,在显示管理器里选 Niri 重新登录;不用显示管理器的话,直接在 TTY 里跑niri --session。第一次进来别慌,窗口已经替你排好了——下面这些默认键先记几个:Mod+T开终端(Alacritty)、Mod+D开启动器(fuzzel)、Mod+Q关当前窗口、Mod+H/L/J/K在列和窗口之间挪焦点、Mod+Shift+E退出。
先跑一次配置体检
改任何配置之前,养成一个习惯:niri validate。它会检查~/.config/niri/config.kdl的语法,报错会精确到行号,比「重启后黑屏」这种反馈友好得多。后面每节改完都跑一遍,不费事。
2. niri 凭什么:可滚动平铺到底好在哪
这一节帮你理解 niri 和传统平铺器最核心的差异,之后你改配置时就知道自己在调什么。
传统平铺(i3、sway 那套)把屏幕切成固定几格,窗口多了就得换布局或者缩得很小。niri 的思路是:窗口按「列」堆叠,一屏放不下?往两边滚就行;纵向还有「工作区」,可以继续往上往下滚。屏幕永远只画得下的部分,但窗口可以无限多——这就是「可滚动」的含义。
它带来两个很实用的操作习惯。一是列宽:Mod+R在几档预设宽度(1/3、1/2、2/3)之间循环,Mod+-/Mod+=每次微调 10%,Mod+M直接把当前列撑满。二是焦点和移动是同一套键加Ctrl:Mod+Ctrl+H就是把当前列挪到左边那列的位置,不用单独记第二组键。想动手前先看一眼 官方 Overview,概念对上了,后面配置就是细节活。
3. 改哪里:KDL 配置文件快速认识
这一节解决「配置文件到底长什么样、我该往哪写」。
所有配置都在一个文件里:~/.config/niri/config.kdl,格式是 KDL——介于配置和代码之间,注释用//,值可以是不带引号的数字或带引号的字符串,大括号套一层就是一组设置。装完 niri 会生成一份带注释的默认配置,每个可选项都被注释掉了,相当于内置说明书,建议就地打开改,别另起炉灶。
几个最关键的顶层块,记住名字就行:binds {}放快捷键(注意它是少数不会自动生成默认值的块,删了就没了)、input {}放键盘鼠标、layout {}放窗口排列、animations {}放动画、output管每台显示器。另外两个查询命令要熟:niri msg outputs列出显示器名(配置里就是拿这个名字做匹配的),wev能帮你查某个键的 XKB 键名——绑键写错键名是新手第一大坑。
// ~/.config/niri/config.kdl 的最小骨架 binds { Mod+T { spawn "alacritty"; } Mod+Q { close-window; } } layout { gaps 10 preset-column-widths { proportion 0.33333 proportion 0.5 } }语法细节和每个块的完整选项,官方文档分块写得很细,入口在 Configuration: Introduction,需要时按块名检索即可。
4. 键盘与指针:输入设备个性化
这一节回答三件事:键盘布局和重复速度怎么调、触摸板手感和滚轮方向怎么设、Mod这个键到底是谁。
niri 的输入配置按设备「类型」分组,而不是按具体设备——keyboard、touchpad、mouse各写一次,对同类型的所有设备生效。键盘部分核心是xkb块(透传给 libxkbcommon,layout/variant/options的语义和你系统里其他合成器一致),再加repeat-delay/repeat-rate控制重复延迟和频率。触摸板侧则是几个开关式的行为:点按、自然滚动、加速曲线、三指滚动之类的,开哪个写哪个,不需要写on。
这里有个坑:Mod不等于写死的 Super。它在 TTY 下就是 Super,而 niri 以窗口模式跑在别的桌面里时会自动变成 Alt,方便你在不登出的情况下试玩。想换主修饰键,在input {}里写mod-key "Super"即可。
input { keyboard { xkb { layout "us" variant "colemak_dh_ortho" } repeat-delay 500 repeat-rate 30 } touchpad { tap natural-scroll accel-speed 0.2 } }不确定某个键叫什么名字时,终端里跑wev按一下目标键,输出里的sym:后面就是 XKB 键名。
5. 窗口布局:工作区、列宽与手势
这一节把「列、工作区、命名工作区、拖拽手势」串起来,是 niri 配置里内容最多的一块。
先说默认行为:窗口开进来就进列,列与列之间用Mod+H/L切焦点;上下方向(Mod+J/K)在列内的窗口之间切。纵向的工作区用Mod+U/Mod+I切换,加Ctrl则是把当前列搬过去。命名工作区用顶层的workspace "名字"声明,它和普通工作区的区别是「永远存在」——空着也不会被回收,很适合固定成「浏览器区」「聊天区」:再配一条open-on-workspace的窗口规则,对应应用开起来就直接落位,不用每次手动搬。
layout {}块里除了上文的gaps和preset-column-widths,还有center-focused-column(换列时是否自动居中)和background-color(间隙透出的底色)这类氛围项。拖拽手势方面,gestures {}控制两件和鼠标边沿有关的事:拖文件到屏幕边沿时滚动视图、在概览里把鼠标怼上下边沿切换工作区,trigger-width是触发区域大小,max-speed是滚多快,手速快的把两者调大即可。
想系统看一遍手势行为(三指、热区之类),直接读 Gestures 文档 最省事。
6. 视觉打磨:动画、缩放与多屏摆放
这一节让桌面看起来顺眼:动画快慢、每台显示器的刷新率与缩放、以及多屏怎么摆。
动画分两种类型:easing(给个duration-ms和曲线)和 spring(给damping-ratio/stiffness这类物理参数)。想全局降速就在animations {}里加一行slowdown 3.0,想全关就一行off。单条动画单独设的话,例如让窗口打开更快、工作区切换更「跟手」,就分别改写对应的子块。
多屏摆放先拿名字:niri msg outputs会告诉你每台显示器的连接名(笔记本内屏一般叫eDP-1)。配置时给这个名写一个output块:mode "2560x1440@143.912"锁分辨率和刷新率(刷新率要和niri msg outputs里的数字精确一致,高刷屏幕经常默认停在 60Hz,不手动写就白买了)、scale设缩放、position x=... y=...定相对位置。改完想先试试?niri msg output <名字> mode "1920x1080"可以临时生效,不落盘,方便你试完再决定写什么。
7. 卡了 / 不生效:高频问题速查表
这一节是排障用的:对照症状找原因,别从头猜。
| 症状 | 大概率原因与处理 |
|---|---|
| 改了配置没反应 | 保存后会自动重载,但语法错时整份新配置不生效——先niri validate,它会指出出错行 |
| 包装了,登录菜单却没有 Niri | 手动装的话要确认 session 文件放对了位置;或直接 TTY 里niri --session验证程序本身没问题 |
| 窗口里试 niri,快捷键全是 Alt | 没错,窗口模式Mod就是 Alt;TTY 下才是 Super,见 Key-Bindings 文档 |
| 快捷键连按失控(比如滚动绑键) | 绑定默认会随按键重复触发,加repeat=false或cooldown-ms=500 |
| NVIDIA 下黑屏 | 驱动要新到支持 GBM,并确认内核开启了nvidia-drm.modeset=1 |
| 配置里写了输出名但不生效 | 名字要小写敏感地匹配连接名,拿不准就niri msg outputs抄一遍 |
| 登录进来两条任务栏 | 默认配置会拉起 waybar,和你自己的栏撞了——删掉spawn-at-startup "waybar"那行 |
顺带一提:如果怀疑是渲染管线的问题,Development: Redraw Loop 里那张状态图能帮你判断 niri 当前卡在哪个环节,不至于只会怪显卡。
8. 进阶:录屏、开机自启与更新
最后一节聊日常维护:查系统状态、录屏、让 niri 开机自动起来、以及版本怎么跟。
先给niri msg系列一个整体印象——它是对着正在运行的 niri 发消息:niri msg outputs/workspaces/windows各列各的,niri msg pick-color拿鼠标点一下屏幕取色(做主题配色很好用),niri msg casts看当前有哪些录屏会话。录屏本身走 xdg-desktop-portal,KDE Spectacle 这类工具在 niri 里能直接抓到画面;不想让某些图层(比如密码输入栏)入镜,可以用layer-rule做 block-out。
开机自启方面,从包管理器装的 niri 通常自带 systemd user 服务,systemctl --user add-wants niri.service之后显示管理器里就有 Niri 会话可选了;源码手工装的话,把resources/目录里的niri-session、niri.desktop、niri.service按 Getting Started 那张文件清单表拷到对应系统目录即可。更新维护同理两条路:包管理器用户直接 upgrade,源码用户git pull后重新cargo build --release覆盖二进制,niri msg version随时确认跑的是哪个版本。
装好、改顺、排完障之后,还有几件事值得排进日程:给每个常用应用写open-on-workspace规则,把「哪个窗口落在哪」彻底自动化;读一读 IPC 文档,用脚本给 niri 发指令,做自己的快捷工具;最后通读 docs/wiki/ 下的完整文档,把window-rule和layer-rule这两个万金油块吃透——到那一步,这套桌面就真正长在你手上了。
【免费下载链接】niriA scrollable-tiling Wayland compositor.项目地址: https://gitcode.com/GitHub_Trending/ni/niri
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考