跳过正文

Niri安装——从开始到放弃

·3134 字·7 分钟
好耶!
作者
好耶!
A little bit about you

前言
#

前些日子朋友配好了Niri给我展示。

我一看,沃日,好美观,好geek,不如我也来装一个吧?

[原教程](https://www.sakimidare.top/posts/niri-manual/)为Arch Linux下的安装教程,于是我萌生出了撰写Fedora版本的想法(因为我在用Fedora) 开写!

Niri 简介
#

ArchLinux Wiki: https://wiki.archlinux.org/title/Niri

Niri 和 我们熟悉的 Windows 桌面或 KDE Plasma 不同。他是一个水平式排列的窗口管理器。每当新打开一个窗口,便会显示在当前窗口的右侧(而非像 Windows 那样堆叠)。在 Niri 中,没有开始按钮、没有最小化、没有最大化,有的只是随心所欲用快捷键和触摸板切换窗口的流畅操作和炫酷动画!

准备
#

假设你已经安装过了Fedora Workstation 43及以上版本

添加软件源
#

sudo dnf install --nogpgcheck --repofrompath 'terra,https://repos.fyralabs.com/terra$releasever' terra-release #noctalia-shell
sudo dnf copr enable quadratech188/vicinae
sudo dnf copr enable solopasha/hyprland

安装必要软件包
#

sudo dnf install niri xdg-desktop-portal-gtk xdg-desktop-portal-gnome swaybg swayidle xwayland-satellite brightnessctl wireplumber grim flameshot fcitx5 fcitx5-qt fcitx5-chinese-addons blueman libnotify pipewire pipewire-pulse google-noto-sans-sc-fonts jetbrains-mono-fonts vicinae noctalia-shell hyprlock

Warning!

Niri 并不像 KDE Plasma 和 Xfce 一样附带了一系列 GUI 程序可以开箱即用。因此,你可能需要安装附加程序如 blueman 来管理蓝牙设备、dolphin 来浏览文件、alacritty 来运行终端、gwenview 来看图、 vlc 打开媒体、fcitx5 作为中文输入法、google-noto-sans-sc-fonts来显示中文字体等等。它们均可从Fedora软件仓库中被安装。

结束
#

使用原教程配置进行微调,

// 键盘鼠标触摸板等输入设备相关配置
input {
    keyboard {
        xkb {
            layout "us"
        }

        // 在启动上启用numlock,省略此设置会禁用它。
        numlock
    }

    touchpad {
        tap
        natural-scroll
        scroll-method "two-finger"
    }

    mouse {
        // 设置鼠标移动速度,-1到1之间由慢到快
        accel-speed 1
    }

    // niri默认接管电源按钮的功能是sleep,这里禁用以使用关机功能
    disable-power-key-handling
    // 切换mod键:正常使用alt,嵌套窗口内使用Super。
    mod-key "Super"
    mod-key-nested "Alt"
}

// 可以在niri实例中运行`niri msg outputs`找到显示器名称。
// 你也可以使用`xrandr`命令获取显示器信息
// output "HDMI" {
//     // 取消注释以禁用此显示器。
//     off

//     // 默认聚焦在这个显示器
//     focus-at-startup

//     // 格式为"<width>x<height>" 或者 "<width>x<height>@<refresh rate>".
//     // 如果省略了刷新率,niri将为分辨率选择最高的刷新率。
//     mode "3840x2160@60.000"

//     // 您可以使用整数或分数量表,例如,比例为150%。
//     scale 2

//     // transform允许逆时针旋转显示,有效值为:
//     // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.
//     transform "normal"

//     // 输出在所有显示器坐标空间中的位置。未明确配置位置的显示器将放置在所有已放置的显示器右侧。
//     // position x=1280 y=0
// }

// 如果 eDP-2 没有连接,将会默认聚焦在这个显示器
output "eDP-1" {
    // off
    focus-at-startup
    mode "3200x2000@164.99"
    transform "normal"
    position x=0 y=0
}

// 可以使用wev来查询特定的按键对应的XKB名称
binds {
    Alt+Tab { spawn "niri-switch"; }
    // Mod-Shift-/显示重要的热键列表(通常与 Mod-? 相同)。
    Mod+Shift+Slash { show-hotkey-overlay; }
    Mod+D hotkey-overlay-title="Open the File Manager" { spawn "nautilus"; }
    // Mod+L hotkey-overlay-title="Lock the Screen: swaylock" { spawn "/usr/bin/swaylock" "-f" "-i" "$HOME/.dotfiles/sway/.config/sway/lock.png"; }
    Mod+L hotkey-overlay-title="Lock the Screen: hyprlock" { spawn "/usr/bin/hyprlock"; }
    Mod+Return hotkey-overlay-title="Open a Terminal" { spawn "/usr/bin/ptyxis"; }
   // Mod+A hotkey-overlay-title="Run an Application" { spawn "/usr/bin/fuzzel"; }
    Mod+A hotkey-overlay-title="Run an Application" { spawn "/usr/bin/vicinae" "toggle"; }
    Mod+X hotkey-overlay-title="Open a browser: zen" { spawn "/usr/bin/firefox"; }
    // Mod+D hotkey-overlay-title="同步切换obs和mpv状态" { spawn "/usr/bin/touch" "/tmp/obs_mpv_toggle_pause"; }
    Mod+K hotkey-overlay-title="打开screenkey" { spawn "/usr/bin/wshowkeys" "-a" "right" "-a" "bottom" "-F" "ComicShannsMono Nerd Font 30"; }
    Mod+Shift+K hotkey-overlay-title="关闭screenkey" { spawn "/usr/bin/killall" "wshowkeys"; }
    // Mod+Shift+C hotkey-overlay-title="重启waybar" { spawn-sh "pkill waybar && waybar"; }

    // 音量控制 allow-when-locked=true 在锁屏时的按键也会生效。这里的wpctl是wireplumber包中附带的
    XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+"; }
    XF86AudioLowerVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-"; }
    XF86AudioMute        allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; }
    XF86AudioMicMute     allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; }

    // 亮度控制。brightnessctl 有独立的包
    XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "set" "+10%"; }
    XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "set" "10%-"; }

    // 开关overview
    Mod+Tab repeat=false { toggle-overview; }
    // 关闭窗口
    Mod+Q repeat=false { close-window; }

    // 窗口焦点切换,位置移动
    Mod+Left  { focus-column-left; }
    Mod+Down  { focus-window-down; }
    Mod+Up    { focus-window-up; }
    Mod+Right { focus-column-right; }
    Mod+N     { focus-column-left; }
    Mod+i     { focus-column-right; }
    Mod+Alt+Left { consume-or-expel-window-left; }
    Mod+Alt+Right {consume-or-expel-window-right; }
    // Mod+N     { spawn-sh "niri msg action focus-column-left && niri msg action center-column"; }
    // Mod+i     { spawn-sh "niri msg action focus-column-right && niri msg action center-column"; }
    Mod+Shift+Left  { move-column-left; }
    Mod+Shift+Down  { move-window-down; }
    Mod+Shift+Up    { move-window-up; }
    Mod+Shift+Right { move-column-right; }
    Mod+Shift+N     { move-column-left; }
    Mod+Shift+I     { move-column-right; }

    Mod+Home { focus-column-first; }
    Mod+End  { focus-column-last; }
    Mod+Shift+Home { move-column-to-first; }
    Mod+Shift+End  { move-column-to-last; }

    // workspace焦点切换,窗口在workspace之间移动
    Mod+Page_Down      { focus-workspace-down; }
    Mod+Page_Up        { focus-workspace-up; }
    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }
    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }
    // 上下移动整个workspace
    Mod+Shift+Page_Down { move-workspace-down; }
    Mod+Shift+Page_Up   { move-workspace-up; }

    // 上下方向共用的窗口、工作空间的焦点切换和位置移动
    Mod+E     { focus-window-or-workspace-down; }
    Mod+U     { focus-window-or-workspace-up; }
    Mod+Shift+E     { move-window-down-or-to-workspace-down; }
    Mod+Shift+U     { move-window-up-or-to-workspace-up; }

    // 显示器焦点切换
    Mod+Ctrl+Left  { focus-monitor-left; }
    Mod+Ctrl+Down  { focus-monitor-down; }
    Mod+Ctrl+Up    { focus-monitor-up; }
    Mod+Ctrl+Right { focus-monitor-right; }
    Mod+Ctrl+N     { focus-monitor-left; }
    Mod+Ctrl+E     { focus-monitor-down; }
    Mod+Ctrl+U     { focus-monitor-up; }
    Mod+Ctrl+I     { focus-monitor-right; }

    // 跨显示器移动窗口
    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }
    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }
    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }
    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }
    Mod+Shift+Ctrl+N     { move-column-to-monitor-left; }
    Mod+Shift+Ctrl+E     { move-column-to-monitor-down; }
    Mod+Shift+Ctrl+U     { move-column-to-monitor-up; }
    Mod+Shift+Ctrl+I     { move-column-to-monitor-right; }

    // 鼠标相关快捷键
    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }
    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }
    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }

    Mod+WheelScrollRight      { focus-column-right; }
    Mod+WheelScrollLeft       { focus-column-left; }
    Mod+Ctrl+WheelScrollRight { move-column-right; }
    Mod+Ctrl+WheelScrollLeft  { move-column-left; }

    Mod+Shift+WheelScrollDown      { focus-column-right; }
    Mod+Shift+WheelScrollUp        { focus-column-left; }
    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }
    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }

    Mod+TouchpadScrollDown { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+"; }
    Mod+TouchpadScrollUp   { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-"; }

    Mod+1 { focus-workspace 1; }
    Mod+2 { focus-workspace 2; }
    Mod+3 { focus-workspace 3; }
    Mod+4 { focus-workspace 4; }
    Mod+5 { focus-workspace 5; }
    Mod+6 { focus-workspace 6; }
    Mod+7 { focus-workspace 7; }
    Mod+8 { focus-workspace 8; }
    Mod+9 { focus-workspace 9; }
    Mod+0 { focus-workspace 10; }
    Mod+Shift+1 { move-column-to-workspace 1; }
    Mod+Shift+2 { move-column-to-workspace 2; }
    Mod+Shift+3 { move-column-to-workspace 3; }
    Mod+Shift+4 { move-column-to-workspace 4; }
    Mod+Shift+5 { move-column-to-workspace 5; }
    Mod+Shift+6 { move-column-to-workspace 6; }
    Mod+Shift+7 { move-column-to-workspace 7; }
    Mod+Shift+8 { move-column-to-workspace 8; }
    Mod+Shift+9 { move-column-to-workspace 9; }
    Mod+Shift+0 { move-column-to-workspace 10; }

    // 最大化和全屏
    Mod+W { toggle-windowed-fullscreen; }
    Mod+F { expand-column-to-available-width; }
    Mod+Shift+F { fullscreen-window; }

    // 未最大化的窗口居中
    Mod+C { center-column; }
    Mod+Ctrl+C { center-visible-columns; }

    // 在layout中预设的宽度和高度之间切换
    Mod+R { switch-preset-column-width; }
    Mod+Shift+R { switch-preset-window-height; }
    // 改变宽度单位可以有pixels、百分比
    Mod+Minus { set-column-width "-10%"; }
    Mod+Equal { set-column-width "+10%"; }

    // 改变高度
    Mod+Shift+Minus { set-window-height "-10%"; }
    Mod+Shift+Equal { set-window-height "+10%"; }

    // 切换悬浮窗,改变平铺和悬浮窗焦点
    Mod+Shift+Space       { toggle-window-floating; }
    Mod+Space { switch-focus-between-floating-and-tiling; }

    // 截图
    Alt+J { spawn-sh "grim -g \"$(slurp)\" - | satty --filename - --output-filename ~/$(date '+%Y%m%d-%H:%M:%S').png"; }
    Alt+Shift+J { spawn "flameshot" "gui"; }
    Print { screenshot show-pointer=false; }
    Ctrl+Print { screenshot-screen write-to-disk=true; }
    Alt+Print { screenshot-window write-to-disk=true; }

    // 针对虚拟机软件可能需要键盘控制权。allow-inhibiting=false 忽略当前快捷键本身
    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }

    // 退出niri将显示一个确认对话框,以避免意外退出。
    Mod+Shift+Q { quit; }

    // 关闭显示器。移动鼠标或按下任意按键恢复
    Mod+Shift+P { power-off-monitors; }
}

// 影响窗口的位置和尺寸的设置。
layout {
    // 在逻辑像素中设置Windows周围的缝隙。
    gaps 10
    background-color "transparent"
    // 存在多个窗口时,未最大化的窗口不自动居中,方便分屏
    center-focused-column "never"
    // 只有一个窗口时自动居中显示
    always-center-single-column

    // mod+r在预设之间切换的宽度。
    preset-column-widths {
        proportion 0.5
        proportion 0.2444
        proportion 0.7556
        // 固定设置逻辑像素的宽度精确设置。(受scale影响)
        // fixed 1920
    }

    preset-window-heights {
        proportion 0.5
        proportion 0.8
        proportion 1.0
    }
    // 关闭聚焦框
    focus-ring {
        // off
    }

    // 关闭边框
    border {
        off
    }
}

// 覆盖由niri启动的进程的环境变量
environment {
    QT_QPA_PLATFORMTHEME "qt5ct"
    ALL_PROXY "http://127.0.0.1:7890"
    LANG "zh_CN.UTF-8"
    LC_CTYPE "zh_CN.UTF-8"
    LC_NUMERIC "zh_CN.UTF-8"
    LC_TIME "zh_CN.UTF-8"
    LC_COLLATE "zh_CN.UTF-8"
    LC_MONETARY "zh_CN.UTF-8"
    LC_MESSAGES "zh_CN.UTF-8"
    LC_PAPER "zh_CN.UTF-8"
    LC_NAME "zh_CN.UTF-8"
    LC_ADDRESS "zh_CN.UTF-8"
    LC_TELEPHONE "zh_CN.UTF-8"
    LC_MEASUREMENT "zh_CN.UTF-8"
    LC_IDENTIFICATION "zh_CN.UTF-8"
    LC_ALL null
    // XDG_DATA_DIRS "$HOME/.local/share" "$XDG_DATA_DIRS"
    // GTK_IM_MODULE "fcitx"
    QT_IM_MODULE "fcitx"
    // https://fcitx-im.org/wiki/Using_Fcitx_5_on_Wayland#Sway
    XMODIFIERS "@im=fcitx"
    QT_IM_MODULES "wayland;fcitx"
    GTK_IM_MODULE null
    SDL_IM_MODULE null
    GLFW_IM_MODULE null
}
spawn-at-startup "niri-switch-daemon"

// 启动niri时自动启动的软件
spawn-at-startup "/usr/bin/fcitx5"
// spawn-at-startup "/usr/bin/v2rayn"
// spawn-at-startup "/usr/bin/waybar"
spawn-at-startup "/usr/bin/vicinae" "server"
spawn-at-startup "~/.cargo/bin/soteria"
spawn-at-startup "~/Desktop/tools/update_repositories.sh"
spawn-at-startup "qs" "-c" "noctalia-shell"
spawn-at-startup "/usr/bin/hyprlock"
// 要运行shell命令(带有变量,管道等),请使用spawn-sh-at-at-startup:
spawn-sh-at-startup "swaybg -i /home/cloudw233/.config/background -m fill"

hotkey-overlay {
    // 跳过“重要的热键”弹出窗口。
    skip-at-startup
}

// 设置截图保存的路径,null将会禁止保存到磁盘
screenshot-path "~/Pictures/ScreenShot/%Y-%m-%d %H-%M-%S.png"

// 忽略软件自带的装饰(例如标题栏)
prefer-no-csd

// 指定光标的主题和大小,打字时隐藏光标
cursor {
    // xcursor-theme "Dracula-cursors"
    xcursor-theme "breeze"
    xcursor-size 24
    hide-when-typing
}

// 使用`niri msg windows`查看Title和App ID等信息
window-rule {
    open-on-output "eDP-2"
    // default-window-height { proportion 0.9; }
    // default-floating-position x=100 y=200 relative-to="bottom-left"
    // default-column-width { proportion 0.7556; }
    geometry-corner-radius 20
    clip-to-geometry true
    border {
        // off
        on
        width 4
        active-gradient from="#bd93f9" to="#94b9fa" angle=135
        inactive-color "#505050"
        urgent-color "#9b0000"
        // active-gradient from="#80c8ff" to="#bbddff" angle=45
        // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
        // urgent-gradient from="#800" to="#a33" angle=45
    }

    focus-ring{
        off
    }
    // opacity 0.75
}
window-rule {
    open-on-output "eDP-2"
    match app-id="scrcpy"
    default-column-width { proportion 0.2444; }
}
window-rule {
    open-on-output "eDP-2"
    match app-id=r#"chrome"#
    default-column-width { proportion 0.8; }
    // border {
    //    on
    //    width 4
    //    active-color "#61AFEF"
    // }
    // open-focused false
}
window-rule {
    match app-id="com.gabm.satty" title="satty"
    border {
        on
        width 2
        active-color "#61AFEF"
    }
}

// `niri msg layers`显示有namespace可以在这里配置waybar透明度
layer-rule {
    match namespace="^quickshell-overview$"
    place-within-backdrop true
    //     opacity 0.75
}

// Put swaybg inside the overview backdrop.
layer-rule {
    match namespace="^wallpaper$"
    place-within-backdrop true
}

debug {
    honor-xdg-activation-with-invalid-serial
}
// 禁用鼠标左上角热脚
gestures {
    hot-corners {
        // off
    }
}

animations {
    // Uncomment to turn off all animations.
    // You can also put "off" into each individual animation to disable it.
    // off

    // Slow down all animations by this factor. Values below 1 speed them up instead.
    // slowdown 3.0

    // Individual animations.

    workspace-switch {
        spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001
    }

    window-open {
        duration-ms 150
        curve "ease-out-expo"
    }

    window-close {
        duration-ms 150
        curve "ease-out-quad"
    }

    horizontal-view-movement {
        spring damping-ratio=1.0 stiffness=800 epsilon=0.0001
    }

    window-movement {
        spring damping-ratio=1.0 stiffness=800 epsilon=0.0001
    }

    window-resize {
        spring damping-ratio=1.0 stiffness=800 epsilon=0.0001
    }

    config-notification-open-close {
        spring damping-ratio=0.6 stiffness=1000 epsilon=0.001
    }

    exit-confirmation-open-close {
        spring damping-ratio=0.6 stiffness=500 epsilon=0.01
    }

    screenshot-ui-open {
        duration-ms 200
        curve "ease-out-quad"
    }

    overview-open-close {
        spring damping-ratio=1.0 stiffness=800 epsilon=0.0001
    }
}

然后微调noctalia shell,得到这样一张图

screenshot_marked.png

说实在的,这确实好看,但是操作逻辑我真习惯不了…

结束结束
#

sudo dnf remove -y niri blueman vicinae noctalia-shell hyprlock

Thank you for reading this, have a nice day😊


 纪念孔佳豪君