agentsclimarketplace

Ubuntu niri ricing

Skill tsaijamey/ubuntu-niri-ricing/skills/ubuntu-niri-ricing

在 Ubuntu 上安装并美化 niri 滚动平铺 Wayland compositor 的完整指南,搭配 DankMaterialShell (DMS)。涵盖 dankinstall 安装陷阱、PPA 配置、config.kdl 主配置编写、中文输入法 (ibus-rime) 在 niri 下的三大适配坑,以及一份实测得出的"错误调整避坑清单"。当用户提到 "niri"、"DankMaterialShell"、"DMS"、"ricing"、"Linux 桌面美化"、"滚动平铺 compositor"、"Wayland 美化"、"niri 中文输入法" 时使用。From its SKILL.md

Install
npx -y skills add tsaijamey/ubuntu-niri-ricing --skill ubuntu-niri-ricing

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its file declares

Copied from the file, not written here

The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

13.6 KB, ~4.9k tokens by cl100k_base, as published. Nobody here has run it

Ubuntu + niri 桌面美化(DankMaterialShell)

把 Ubuntu 从 GNOME 切换到 niri(滚动平铺 Wayland compositor)并用 DankMaterialShell 美化的完整工作方法。重点不在"装得上",而在把实测踩过的坑一次性绕开——尤其是中文输入法在 niri 下的一整套问题。

适用场景与前提

  • Ubuntu 24.04 / 26.04(本指南在 26.04 "resolute" + niri 26.04 上实测)。
  • 想要平铺式窗口管理 + 现成美化方案,又不想从零拼 dotfiles。
  • niri 只是 compositor(管窗口摆放和绘制),不是桌面环境。状态栏、通知、启动器、锁屏、主题色全部由 DankMaterialShell (DMS) 这套"软装"提供。niri + DMS 加起来才勉强对应 GNOME 的功能面。

概念定位(先搞清层级,少走弯路)

应用 (Firefox / ghostty / ...)
        │
DMS (DankMaterialShell)  ← 状态栏/通知/启动器/锁屏/主题,基于 quickshell
        │
niri (compositor)        ← 只摆窗口 + 画到屏幕,等价 sway/hyprland 那一档
        │
Wayland (协议)
        │
内核 / 显卡驱动

GNOME 是"精装公寓"(mutter compositor + 全套桌面组件 + 跟 ibus 的私有 D-Bus 集成)。niri 是"毛坯房",DMS 是你挑的那套软装。很多 GNOME 下"理所当然"的能力(比如输入法候选词跟随光标)其实是 gnome-shell 的私家特权,到了 niri 需要另想办法——这是后面输入法那节的根。

Phase 1:安装 niri + DMS

1.1 先升级系统

sudo apt update && sudo apt full-upgrade -y

1.2 用 dankinstall(DankLinux 官方安装器)

DankLinux 提供 TUI 安装器,会自动加 PPA、装 niri/DMS 全家桶并做基础配置。它会添加两个 PPA:

ppa:avengemedia/danklinux
ppa:avengemedia/dms

核心包列表(dankinstall 会装这些,记下来用于兜底):

dms niri quickshell ghostty matugen dgop xwayland-satellite

1.3 安装陷阱(实测必踩,提前知道)

陷阱 A — add-apt-repository 要密码。 它通常不在 nopasswd sudo 名单里,TUI 走到加 PPA 这步会停下等密码。在交互式终端(建议 tmux)里手动输一次登录密码即可;用经典 sudo(而非 run0/polkit)密码会缓存约 15 分钟,让后续 apt 一连串命令一次密码搞定。

陷阱 B — dankinstall 在 apt install 阶段中断。 报错形如 you are not allowed to set the following environment variables: DEBIAN_FRONTEND。根因是 installer 调用 sudo DEBIAN_FRONTEND=noninteractive apt install ...,而 sudoers 的 env_reset 拦掉了 DEBIAN_FRONTEND,不是 PPA 出问题。此时 PPA 和构建依赖通常已经装好了,直接手动把包列表装上即可绕过:

sudo apt update
sudo apt install -y dms niri quickshell ghostty matugen dgop xwayland-satellite

陷阱 C — dms setup 是完全交互式的。 它通过 /dev/tty 读输入,会无视管道 stdin,没法 echo ... | dms setup。用子命令逐项非交互部署,避开主向导:

dms setup colors
dms setup layout
dms setup alttab
dms setup cursor
dms setup outputs
dms setup windowrules
echo 1 | dms setup binds      # binds 仍需选 terminal,echo 选项号可解

dms setupusermod -aG input 是为了 Caps Lock OSD 读 /dev/input/event*,非核心功能,可跳过。

1.4 登录到 niri 会话

注销,在登录界面(GDM)右下角选择 niri 会话再登录。GNOME 的所有设置原封不动——随时能在 GDM 选回 "Ubuntu on Wayland" 退回去。

Phase 2:主配置 config.kdl

DMS 在 ~/.config/niri/dms/*.kdl 生成子配置(colors/layout/alttab/binds 等),带 "DO NOT EDIT" 头,dms 升级会覆盖,绝不要手改。你自己的定制全部写进主文件 ~/.config/niri/config.kdl,用 include 把 dms 子配置引进来。

niri 的 include 是合并语义(同名节点合并去重,不是覆盖),所以主文件可以另开 binds {} 追加自定义快捷键,不会冲掉 dms 的。

完整的 config.kdl 模板见 REFERENCE.md,关键骨架:

include "dms/colors.kdl"
include "dms/layout.kdl"
include "dms/alttab.kdl"
include "dms/binds.kdl"

environment {
    XDG_CURRENT_DESKTOP "niri"
    // 输入法环境变量(全部指向 ibus)
    GTK_IM_MODULE "ibus"
    QT_IM_MODULE "ibus"
    XMODIFIERS "@im=ibus"
    INPUT_METHOD "ibus"
    SDL_IM_MODULE "ibus"
}

input {
    touchpad { tap; natural-scroll; }
    focus-follows-mouse max-scroll-amount="0%"
}

// 候选词面板浮动,不抢 focus(详见 Phase 3)
window-rule {
    match app-id="^ibus-ui-gtk3$"
    open-floating true
    open-focused false
}

改完用以下命令校验并热加载(注意版本差异,见下):

niri validate -c ~/.config/niri/config.kdl
niri msg action load-config-file

版本差异: niri 26.04(Ubuntu 打包版)的子命令是 niri msg action load-config-file不是新版文档里的 reload-config。后者会报 unrecognized subcommand。另外这个版本的 window-rule 不支持 min-height/max-height/min-width/max-width 属性,写了 validate 会报 unexpected node

Phase 3:中文输入法适配(niri 三大坑)

基础的 ibus-rime + 雾凇拼音安装和配置(词库、横向候选、CAPS Lock 等)复用 skill ubuntu-wayland-input-method。这里只讲 niri 特有、GNOME 下不会遇到 的三个问题。处理顺序很重要:先让能输出中文,再调候选词外观,最后修切换键。盲目调顺序会把自己锁死在英文。

坑 1:能选输入法但打不出字

现象: 切到中文后按键被吃掉,什么都不出。 根因: niri/Wayland 会话不继承 GNOME 的 ibus 默认 engine,ibus 回退到默认的 libpinyin,但系统没装 libpinyin → 按键被 ibus 消费却没有引擎处理。 修复:

gsettings set org.freedesktop.ibus.general preload-engines "['rime']"
ibus engine rime

坑 2:候选词占半屏 / 输入时屏幕自动横向滚动

现象: 一打字屏幕"唰"地滑到右边,候选词框占了半个屏,松手又滑回来。 根因: ibus 的候选词面板是 ibus-ui-gtk3 进程创建的一个真正的 Wayland toplevel 窗口(App ID = ibus-ui-gtk3),niri 把它当成新 column 平铺进去并自动 focus 过去,于是横向滚动;候选词消失再滚回。它每次只存在几百毫秒,所以 niri msg windows 周期采样大概率抓不到——确认 app-id 的最快办法是输中文时截全屏,从左上角窗口列表读修复: 让候选窗浮动且不抢焦点:

window-rule {
    match app-id="^ibus-ui-gtk3$"
    open-floating true
    open-focused false
}

不要加 min/max 尺寸属性(这版 niri 不支持)。浮动后 ibus 自己决定尺寸(约 500x60 的小横条)。

坑 3:根本切不到中文(最隐蔽,最容易误判)

现象: 怎么按都停在英文,按 Shift 也没反应。 根因: ibus 激活/切换输入法的全局快捷键默认是 Super+Space,但 DMS 把 Super+Space (Mod+Space) 绑成了应用启动器。compositor 层级最高,niri 先把这个键截走,ibus 永远收不到激活信号。 这跟 ibus 进程、daemon、引擎都没关系——纯粹是快捷键被吃了。 修复: 把 ibus 切换键改到 niri/DMS 没占用的 Ctrl+Space:

# 先确认 Ctrl+Space 在 niri binds 里空闲
grep -iE "Ctrl\+Space|Control\+Space" ~/.config/niri/dms/binds.kdl ~/.config/niri/config.kdl || echo "Ctrl+Space 空闲"

gsettings set org.freedesktop.ibus.general.hotkey triggers "['<Control>space']"
ibus restart

诊断铁律(最重要的教训): 在 niri 下遇到"某快捷键无效",第一件事是 grep ~/.config/niri/dms/binds.kdl 看 compositor 是否占用了该键,因为 compositor 截获优先级最高。排查输入法别一上来就怀疑 ibus 进程/daemon,先确认激活键有没有被吃掉。坑 3 当初就是因为没先查这个,绕了一大圈。

Phase 4:重启稳定性(topbar / daemon 翻倍)

现象: 重启后出现两条状态栏、输入法变得不稳。 根因: im-config~/.xinputrcrun_im ibus)和 dms.service 都是 systemd user service,登录 niri 会话时 systemd 已经自动拉起 ibus-daemondms。如果你又在 config.kdl 里写 spawn-at-startup "ibus-daemon" / spawn-at-startup "dms" "run",就各启动两份——两个 quickshell 画两条 topbar,两个 ibus-daemon 互相 --replace 抢端点。

判断由谁启动(不能靠 ppid,niri spawn 的进程会被 reparent 到 systemd --user,要靠命令行参数区分):

  • systemd 的:dms run --sessionibus-daemon --daemonize --xim --replace
  • niri spawn 的:dms run(无 --session)、自定义参数的 ibus

处理: 原则上让 systemd 唯一负责,niri config 里删掉 dms / ibus 的 spawn-at-startup

但要诚实记一笔实测张力: 是否需要 niri 来 spawn ibus,取决于你这台机器上 systemd user service 在 niri 会话里到底有没有真把 ibus 拉起来。某些机器实测最终是靠 niri spawn-at-startup "ibus-daemon" "-d" "-r" "-x" 才稳定。正确做法是先删 spawn 重启验证:若 topbar 不再翻倍且输入法正常,就保持删除;若重启后 ibus 没起来,再把 ibus(且只有 ibus)那行加回,dms 的 spawn 始终交给 systemd。不要两个都 spawn。

错误调整避坑清单

以下是实测过程中走过的弯路,全部是错误调整,列出来是为了让你直接跳过:

  1. 盲加宽匹配的 window-rulematch app-id="^(ibus|rime|fcitx).*" open-floating true 配合关掉 focus-follows-mouse。这条规则没命中真正的候选词窗(它的 app-id 是 ibus-ui-gtk3),反而误命中别的东西、打断了 IME 焦点链,结果连英文都打不出。正解是精确匹配 ^ibus-ui-gtk3$,且不要关 focus-follows-mouse。
  2. 误判候选词走 input-method-v2 协议、不是窗口:据此推断"window-rule 没用"。实际 ibus 候选词就是 ibus-ui-gtk3 这个普通 GTK3 toplevel,window-rule 完全有效。
  3. 给 window-rule 加 min-height/max-height/min-width/max-width:这版 niri 不支持,validate 直接报错。删掉,让 ibus 自己定尺寸。
  4. 断言"ibus 在 niri 下 chrome 等 Wayland 应用接不上、是架构硬伤、必须换 fcitx5":错误。ibus 在 niri 下完全可用,根本不用换。
  5. 断言"候选词跟随光标在 ibus+niri 做不到、必须换 fcitx5":错误。open-floating 后候选词正常跟随输入框光标。(fcitx5 走 zwp_input_method_v2 确实更原生,但这不是"ibus 做不到"的理由,对一个已经能用的 ibus 用户而言换 IME 是越权折腾。)
  6. 试图安装 fcitx5 全家桶、迁移雾凇配置来"根治":方向全错。真正的病根只是坑 3 的切换键 Super+Space 被 DMS 占用,一行 gsettings 改键即可,完全不需要换输入法。
  7. 诊断顺序错:一上来就 pkill/重启 ibus、查 daemon 数量、怀疑引擎损坏。正确顺序是先查 compositor 有没有吃掉激活键(见 Phase 3 诊断铁律)。

一句话收口:niri 下输入法的绝大多数"诡异问题",根因要么是候选词被当普通窗口平铺,要么是快捷键被 compositor 截获——不是 ibus 坏了,别急着换 IME。

故障速查表

现象先查修复
切到中文打不出字ibus engine 是否 rimepreload-engines ['rime'] + ibus engine rime
打字时屏幕横向滚动候选词是否被平铺window-rule ^ibus-ui-gtk3$ open-floating
候选词占半屏/居中过大同上同上;别加 min/max 尺寸
怎么都切不到中文grep binds.kdl 看 Super+Spaceibus 切换键改 <Control>space
重启后两条状态栏pgrep -af quickshell 数量niri config 删 dms 的 spawn-at-startup
reload-config 报错niri 版本改用 niri msg action load-config-file
window-rule validate 报错是否用了 min/max-*删除这些属性

卸载退回 GNOME

sudo apt purge niri dms quickshell ghostty matugen dgop xwayland-satellite cliphist
sudo add-apt-repository -r ppa:avengemedia/dms
sudo add-apt-repository -r ppa:avengemedia/danklinux

GNOME 设置全程未动,GDM 选回 "Ubuntu on Wayland" 即可。

参考


关于

这份 skill 由 frago 沉淀产出 —— frago 是一个 Agent OS(agent 操作系统),把临时的 agent 运行固化成可复用的 recipe 和 skill,让 agent 用工程化能力快速达到目的。

安装 frago:uv tool install frago-cli 主页:https://frago.ai · 文档:https://docs.frago.ai · 源码:https://github.com/tsaijamey/frago

What ships with it: 1 file

7.3 KB alongside SKILL.md

Keep looking

Skills are one crate of 326,367. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.