2026-05-13T14:54

Arch_niri_noctalia配置

没啥用,越来越讨厌折腾了,还是回归macOS的怀抱吧

1580 words
13 sections

1. 安装所有依赖(官方仓库 + AUR)

# 更新系统
sudo pacman -Syu

# 安装基础构建工具(如果还没有 AUR helper,先装 paru)
sudo pacman -S --needed base-devel git
# 若未安装 paru,执行下面三行:
# git clone https://aur.archlinux.org/paru.git /tmp/paru
# cd /tmp/paru && makepkg -si

# 安装 niri 桌面基础组件 + Noctalia 系统依赖 + 字体
sudo pacman -S --needed \
  niri xwayland-satellite \
  xdg-desktop-portal xdg-desktop-portal-gtk xdg-desktop-portal-gnome \
  pipewire wireplumber polkit gnome-keyring \
  kitty fuzzel wl-clipboard cliphist \
  brightnessctl playerctl pavucontrol \
  networkmanager bluez bluez-utils upower \
  power-profiles-daemon wlsunset \
  qt6ct nwg-look papirus-icon-theme adwaita-icon-theme \
  nautilus ddcutil

# 安装字体(AUR)
paru -S --needed ttf-maple-mono-nf-cn

# 安装 Noctalia v5(AUR)
paru -S --needed noctalia-git

2. 启用系统服务

sudo systemctl enable --now NetworkManager
sudo systemctl enable --now bluetooth
sudo systemctl enable --now upower

3. 写入配置文件

3.1 Niri 配置

mkdir -p ~/.config/niri
cat > ~/.config/niri/config.kdl << 'EOF'
spawn-at-startup "noctalia"

environment {
    QT_QPA_PLATFORM "wayland;xcb"
    QT_QPA_PLATFORMTHEME "qt6ct"
    XDG_CURRENT_DESKTOP "niri"
}

input {
    keyboard {
        numlock
    }
    touchpad {
        tap
        natural-scroll
    }
}

output "eDP-1" {
	mode "2560x1600@120.017"
	scale 1.25
	position x=0 y=0
	transform "normal"
}

layout {
    gaps 16
    center-focused-column "never"
    preset-column-widths {
        proportion 0.33333
        proportion 0.5
        proportion 0.66667
    }
    default-column-width { proportion 0.5; }
    focus-ring {
        width 4
        active-color "#7fc8ff"
        inactive-color "#505050"
    }
    border {
        off
        width 4
        active-color "#ffc87f"
        inactive-color "#505050"
        urgent-color "#9b0000"
    }
    shadow {
        softness 30
        spread 5
        offset x=0 y=5
        color "#0007"
    }
}

screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"

window-rule {
    geometry-corner-radius 20
    clip-to-geometry true
}

window-rule {
    match app-id="dev.noctalia.Noctalia.Settings"
    open-floating true
    default-column-width { fixed 1080; }
    default-window-height { fixed 920; }
}

window-rule {
    background-effect {
        blur true
        xray false
    }
}

layer-rule {
    match namespace="^noctalia-backdrop"
    place-within-backdrop true
}

layer-rule {
    match namespace="^noctalia-(bar-main|notification|dock|panel)$"
    background-effect {
        blur true
        xray false
    }
}

blur {
    passes 2
    offset 3.0
    noise 0.03
    saturation 1.0
}

debug {
    honor-xdg-activation-with-invalid-serial
}

binds {
    Mod+Shift+Slash { show-hotkey-overlay; }
    Mod+T { spawn "wezterm"; }
    Mod+D { spawn "fuzzel"; }
    Super+Alt+S allow-when-locked=true { spawn-sh "pkill orca || exec orca"; }
    XF86AudioPlay allow-when-locked=true { spawn-sh "playerctl play-pause"; }
    XF86AudioStop allow-when-locked=true { spawn-sh "playerctl stop"; }
    XF86AudioPrev allow-when-locked=true { spawn-sh "playerctl previous"; }
    XF86AudioNext allow-when-locked=true { spawn-sh "playerctl next"; }
    Mod+O repeat=false { toggle-overview; }
    Mod+Shift+E { spawn "noctalia" "msg" "panel-toggle" "session"; }
    Mod+L { spawn "noctalia" "msg" "screen-lock"; }
    Mod+B { spawn "noctalia" "msg" "bar-toggle"; }
    Mod+Shift+T { spawn "noctalia" "msg" "theme-mode-toggle"; }
    XF86AudioRaiseVolume allow-when-locked=true { spawn "noctalia" "msg" "volume-up"; }
    XF86AudioLowerVolume allow-when-locked=true { spawn "noctalia" "msg" "volume-down"; }
    XF86AudioMute allow-when-locked=true { spawn "noctalia" "msg" "volume-mute"; }
    XF86AudioMicMute allow-when-locked=true { spawn "noctalia" "msg" "mic-mute"; }
    XF86MonBrightnessUp allow-when-locked=true { spawn "noctalia" "msg" "brightness-up"; }
    XF86MonBrightnessDown allow-when-locked=true { spawn "noctalia" "msg" "brightness-down"; }
    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+H { focus-column-left; }
    Mod+J { focus-window-down; }
    Mod+K { focus-window-up; }
    Mod+L { focus-column-right; }
    Mod+Ctrl+Left { move-column-left; }
    Mod+Ctrl+Down { move-window-down; }
    Mod+Ctrl+Up { move-window-up; }
    Mod+Ctrl+Right { move-column-right; }
    Mod+Ctrl+H { move-column-left; }
    Mod+Ctrl+J { move-window-down; }
    Mod+Ctrl+K { move-window-up; }
    Mod+Ctrl+L { move-column-right; }
    Mod+Home { focus-column-first; }
    Mod+End { focus-column-last; }
    Mod+Ctrl+Home { move-column-to-first; }
    Mod+Ctrl+End { move-column-to-last; }
    Mod+Shift+Left { focus-monitor-left; }
    Mod+Shift+Down { focus-monitor-down; }
    Mod+Shift+Up { focus-monitor-up; }
    Mod+Shift+Right { focus-monitor-right; }
    Mod+Shift+H { focus-monitor-left; }
    Mod+Shift+J { focus-monitor-down; }
    Mod+Shift+K { focus-monitor-up; }
    Mod+Shift+L { 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+H { move-column-to-monitor-left; }
    Mod+Shift+Ctrl+J { move-column-to-monitor-down; }
    Mod+Shift+Ctrl+K { move-column-to-monitor-up; }
    Mod+Shift+Ctrl+L { move-column-to-monitor-right; }
    Mod+Page_Down { focus-workspace-down; }
    Mod+Page_Up { focus-workspace-up; }
    Mod+U { focus-workspace-down; }
    Mod+I { focus-workspace-up; }
    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }
    Mod+Ctrl+Page_Up { move-column-to-workspace-up; }
    Mod+Ctrl+U { move-column-to-workspace-down; }
    Mod+Ctrl+I { move-column-to-workspace-up; }
    Mod+Shift+Page_Down { move-workspace-down; }
    Mod+Shift+Page_Up { move-workspace-up; }
    Mod+Shift+U { move-workspace-down; }
    Mod+Shift+I { move-workspace-up; }
    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+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+Ctrl+1 { move-column-to-workspace 1; }
    Mod+Ctrl+2 { move-column-to-workspace 2; }
    Mod+Ctrl+3 { move-column-to-workspace 3; }
    Mod+Ctrl+4 { move-column-to-workspace 4; }
    Mod+Ctrl+5 { move-column-to-workspace 5; }
    Mod+Ctrl+6 { move-column-to-workspace 6; }
    Mod+Ctrl+7 { move-column-to-workspace 7; }
    Mod+Ctrl+8 { move-column-to-workspace 8; }
    Mod+Ctrl+9 { move-column-to-workspace 9; }
    Mod+BracketLeft { consume-or-expel-window-left; }
    Mod+BracketRight { consume-or-expel-window-right; }
    Mod+Comma { consume-window-into-column; }
    Mod+Period { expel-window-from-column; }
    Mod+R { switch-preset-column-width; }
    Mod+Shift+R { switch-preset-column-width-back; }
    Mod+Ctrl+Shift+R { switch-preset-window-height; }
    Mod+Ctrl+R { reset-window-height; }
    Mod+F { maximize-column; }
    Mod+Shift+F { fullscreen-window; }
    Mod+M { maximize-window-to-edges; }
    Mod+Ctrl+F { expand-column-to-available-width; }
    Mod+C { center-column; }
    Mod+Ctrl+C { center-visible-columns; }
    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+V { toggle-window-floating; }
    Mod+Shift+V { switch-focus-between-floating-and-tiling; }
    Mod+W { toggle-column-tabbed-display; }
    Print { screenshot; }
    Ctrl+Print { screenshot-screen; }
    Alt+Print { screenshot-window; }
    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }
    Ctrl+Alt+Delete { quit; }
    Mod+Shift+P { power-off-monitors; }
}
EOF

3.2 Noctalia 配置

mkdir -p ~/.config/noctalia
cat > ~/.config/noctalia/config.toml << 'EOF'
[backdrop]
enabled = true
blur_intensity = 0.5
tint_intensity = 0.3

[theme]
mode = "dark"
source = "builtin"
builtin = "Noctalia"

[wallpaper]
enabled = true
directory = "~/Pictures/Wallpapers"
fill_mode = "crop"

[bar.main]
position = "top"
thickness = 55
background_opacity = 0.8
radius = 20

start = ["launcher", "wallpaper", "workspaces"]
center = ["clock"]
end = ["tray", "notifications", "volume", "battery", "session"]

[weather]
address = "harbin"

[dock]
enabled = true
position = "bottom"
icon_size = 25
auto_hide = false

[idle.behavior.lock]
timeout = 600
command = "noctalia:screen-lock"
enabled = true

[idle.behavior.screen-off]
timeout = 660
command = "noctalia:dpms-off"
resume_command = "noctalia:dpms-on"
enabled = true
EOF

4. 验证与生效

# 验证 niri 配置语法
niri validate

# 确保壁纸目录存在
mkdir -p ~/Pictures/Wallpapers

最后一步:注销当前会话,在显示管理器(如 SDDM/GDM/ly)中选择 niri 会话重新登录。Noctalia 会通过 spawn-at-startup 自动拉起,无需手动启动。


附:快速排错

现象 检查项
Noctalia 没自启 确认 niri validate 通过,且 spawn-at-startup "noctalia" 在配置最顶层
栏位/组件不显示 检查 ~/.local/state/noctalia/settings.toml 是否覆盖了配置,可临时移走该文件后重登录
电池/亮度图标缺失 确认 upower 服务已启用,且用户已在 power 组(或安装 brightnessctl
Qt 应用图标异常 运行 qt6ct 选择图标主题,并确保 niri environment 块中 QT_QPA_PLATFORMTHEME 已设置

5. 中文输入

  sudo pacman -S --needed \
    fcitx5 fcitx5-configtool fcitx5-gtk fcitx5-qt \
    fcitx5-chinese-addons fcitx5-pinyin-zhwiki \
    noto-fonts-cjk noto-fonts-emoji

  说明:

     fcitx5-chinese-addons:包含拼音、双拼、五笔等中文输入法。
     fcitx5-pinyin-zhwiki:中文维基词库,拼音体验会好很多。
     fcitx5-gtk / fcitx5-qt:给 GTK/Qt/XWayland 应用兜底。
     noto-fonts-cjk:避免中文显示方框。
     noto-fonts-emoji:候选框 Emoji 正常显示。

  如果你想用 Rime / 雾凇拼音

  可额外安装:

  sudo pacman -S --needed fcitx5-rime

  雾凇拼音通常在 AUR:

  paru -S rime-ice-git

  2. 在 niri 中自启动 Fcitx5

  编辑:

    ~/.config/niri/config.kdl

  加入:

  ~/.config/niri/config.kdl (EXCERPT)
  spawn-at-startup "fcitx5" "-d"

  如果你已经有很多 spawn-at-startup,放在 Noctalia 附近即可。例如:

  ~/.config/niri/config.kdl (EXCERPT)
  spawn-at-startup "fcitx5" "-d"
  spawn-at-startup "noctalia"

  3. 配置 niri 环境变量

  继续编辑 ~/.config/niri/config.kdl,加入或合并 environment 块。

  推荐配置:偏现代 Wayland,兼顾 Qt/XWayland

  ~/.config/niri/config.kdl (EXCERPT)
  environment {
      XMODIFIERS "@im=fcitx"
      QT_IM_MODULE "fcitx"
      QT_IM_MODULES "wayland;fcitx;ibus"
      GTK_IM_MODULE null
      SDL_IM_MODULE null
      GLFW_IM_MODULE null
  }

  解释一下:

     XMODIFIERS "@im=fcitx":让 XWayland/X11 程序能找到 Fcitx。
     QT_IM_MODULE "fcitx":照顾 Qt5、老 Qt、部分 XWayland Qt 应用。
     QT_IM_MODULES "wayland;fcitx;ibus":Qt 6.7+ 支持的 fallback 顺序,优先 Wayland,失败再用 fcitx。
     GTK_IM_MODULE null:不要强行让 GTK 走 fcitx module,优先让 GTK3/GTK4 使用 Wayland text-input。
     SDL_IM_MODULE null / GLFW_IM_MODULE null:避免部分游戏/SDL/GLFW 应用被全局 IM module 干扰。

  4. 验证 niri 配置

  保存后执行:

  niri validate

6. 字体配置

**在 Arch Linux + Niri 上安装并默认使用类似苹果的字体方案(SF Pro + 苹方 PingFang)**  
以下是完整整合指南,英文使用 **SF Pro**,中文优先使用 **苹方 (PingFang SC)**,实现 macOS-like 体验。

### 1. 安装字体(推荐 AUR)

```bash
# 安装 SF Pro 系列(包含 SF Pro Display/Text、SF Mono 等)
yay -S apple-sf-fonts

# 单独安装苹方(PingFang SC / HK 等)
yay -S otf-apple-pingfang
  • 如果 yay 未安装:
    sudo pacman -S --needed git base-devel && git clone https://aur.archlinux.org/yay.git && cd yay && makepkg -si
  • 安装完后刷新字体缓存:
    fc-cache -fv
    

手动安装(有 Mac 时):从 Mac 的 /System/Library/Fonts//Library/Fonts/ 复制 SF Pro 和 PingFang 相关 .otf/.ttc 文件到 ~/.local/share/fonts/,然后 fc-cache -fv

2. 综合 fontconfig 配置(核心)

创建用户配置文件:

mkdir -p ~/.config/fontconfig/conf.d
nano ~/.config/fontconfig/fonts.conf

推荐完整配置(SF Pro + 苹方优先):

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'urn:fontconfig:fonts.dtd'>
<fontconfig>

  <!-- 系统 UI / sans-serif 默认使用 SF Pro(英文/拉丁文字) -->
  <alias>
    <family>system-ui</family>
    <prefer>
      <family>SF Pro Display</family>   <!-- 大字号/UI -->
      <family>SF Pro Text</family>      <!-- 小字号/正文 -->
    </prefer>
  </alias>

  <alias>
    <family>sans-serif</family>
    <prefer>
      <family>SF Pro Display</family>
      <family>SF Pro Text</family>
      <family>PingFang SC</family>      <!-- 中文 fallback -->
    </prefer>
  </alias>

  <alias>
    <family>sans</family>
    <prefer>
      <family>SF Pro Display</family>
      <family>SF Pro Text</family>
      <family>PingFang SC</family>
    </prefer>
  </alias>

  <!-- 等宽字体(可选 SF Mono) -->
  <alias>
    <family>monospace</family>
    <prefer>
      <family>SF Mono</family>
    </prefer>
  </alias>

  <!-- 中文语言优先使用苹方(更精确控制) -->
  <match>
    <test name="lang" compare="contains">
      <string>zh</string>
    </test>
    <test name="family">
      <string>sans-serif</string>
    </test>
    <edit name="family" mode="prepend">
      <string>PingFang SC</string>
    </edit>
  </match>

  <match>
    <test name="lang" compare="contains">
      <string>zh</string>
    </test>
    <test name="family">
      <string>serif</string>
    </test>
    <edit name="family" mode="prepend">
      <string>PingFang SC</string>
    </edit>
  </match>

</fontconfig>

应用配置

fc-cache -fv

3. 字体渲染优化(类似 macOS 清晰度)

nano ~/.config/fontconfig/conf.d/99-apple-rendering.conf

内容:

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'urn:fontconfig:fonts.dtd'>
<fontconfig>
  <match target="font">
    <edit name="hinting" mode="assign"><bool>true</bool></edit>
    <edit name="hintstyle" mode="assign"><const>hintslight</const></edit>
    <edit name="antialias" mode="assign"><bool>true</bool></edit>
    <edit name="rgba" mode="assign"><const>rgb</const></edit>  <!-- 根据屏幕调整:rgb / bgr -->
    <edit name="lcdfilter" mode="assign"><const>lcddefault</const></edit>
  </match>
</fontconfig>

刷新:fc-cache -fv

4. 验证效果

fc-match sans-serif
fc-match system-ui
fc-match -s "你好,世界"   # 应该优先显示 PingFang SC
fc-list | grep -E "SF Pro|PingFang"

注意事项

  • Niri / Wayland:大多数现代应用(Firefox、Chrome、Alacritty、GTK/Qt)会遵循 fontconfig。部分终端或 Electron 应用可能需单独设置字体。
  • 语言切换:中文环境下 zh 匹配会优先苹方;英文/其他语言优先 SF Pro。
  • 备选:如果不想用 Apple 字体,可用 ttf-inter + adobe-source-han-sans-cn-fonts 替代。
  • 法律提醒:这些是 Apple 版权字体,仅限个人使用。
  • 高 DPI:在 Niri 配置中合理设置缩放,效果最佳。

重启相关应用或注销重进 Niri 后即可看到接近 macOS 的字体观感(英文锐利、中文苹方和谐)。

如果验证后中文仍未优先,或有特定应用问题,运行 fc-match --verbose sans-serif 并提供输出,我可以进一步调整配置!