文章摘要
加载中...|
此内容根据文章生成,并经过人工审核,仅用于文章内容的解释与总结

在 上一篇(网络与包管理篇) 中,我们搞定了 CachyOS 的 v3/v4 架构优化源、梳理了 AUR 的正确使用姿势,并调通了 Flatpak 与各种代理分流。

网络地基打稳之后,接下来便要面对日常桌面的直接使用体验:中文字体渲染发扁别扭、打游戏时快捷键与输入法打架、笔记本喇叭声音单薄得像收音机,以及在 KDE Plasma 6 桌面下双击运行 Windows 软件时的种种别扭。

本文继续记录实操中的踩坑复盘与最终跑通的配置方案。


1. 办公软件避坑:WPS Office CN 为何装完依然是英文? ​

通过 AUR 安装国内办公必备的 WPS Office 时,很多人敲完 yay -S wps-office-cn 打开却是一头雾水:软件界面全是英文,且语言选项里找不到中文。

原因剖析 ​

AUR 维护者在打包 wps-office-cn 时使用了 Split Package(分包) 机制。PKGBUILD 在解压官方 deb 包后,为了让语言包模块化,执行了这样一行代码:

bash
rm -r "${pkgdir}/usr/lib/office6/mui/zh_CN"

中文语言资源被单独剥离到了 wps-office-mui-zh-cn 软件包中,而缺失字体则依赖 ttf-wps-fonts。

完整安装方案 ​

bash
yay -S wps-office-cn wps-office-mui-zh-cn ttf-wps-fonts

三者分工明确:

  • wps-office-cn:主执行程序二进制文件;
  • wps-office-mui-zh-cn:简体中文 MUI 界面语言包(解压至 /usr/lib/office6/mui/zh_CN/);
  • ttf-wps-fonts:公式、加粗等符号与常用字体库(防止界面提示缺字体)。

验证中文包是否已经放入系统:

bash
pacman -Q wps-office-cn wps-office-mui-zh-cn ttf-wps-fonts
pacman -Ql wps-office-mui-zh-cn | grep '/usr/lib/office6/mui/zh_CN'

2. 视觉与排版雕琢:字体渲染全面纠偏 ​

2.1 CJK 汉字国标字形偏差(Han Unification)与 Fontconfig 调优 ​

很多 Arch/CachyOS 用户会发现:明明系统语言设的是中文,为什么网页里“复”、“门”、“骨”、“关”等汉字的笔画长得怪怪的?

原因: Unicode 联盟在制定汉字编码时,推行了 Han Unification(中日韩统一表意文字),将中日韩含义相同或字源相近的汉字合并为同一个 Unicode 码位。如果系统 Fontconfig 未严格指定字体 fallback 优先级,引擎在渲染网页汉字时极易默认落入 Noto Sans CJK KR(韩文版) 或 JP(日文版) 字体,导致笔画呈现出日韩字形习惯。

终极解法:在用户级配置 ~/.config/fontconfig/fonts.conf 中为三大基础字体族(sans-serif、serif、monospace)显式锚定简体中文(SC)的最高优先级。

xml
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
  <!-- 默认无衬线字体优先顺序 -->
  <alias>
    <family>sans-serif</family>
    <prefer>
      <family>Noto Sans</family>         <!-- 西文字体 -->
      <family>Noto Sans CJK SC</family>  <!-- 简体中文最高优先级 -->
      <family>Noto Sans CJK TC</family>
      <family>Noto Sans CJK HK</family>
      <family>Noto Sans CJK JP</family>
      <family>Noto Sans CJK KR</family>
    </prefer>
  </alias>

  <!-- 默认有衬线字体优先顺序 -->
  <alias>
    <family>serif</family>
    <prefer>
      <family>Noto Serif</family>
      <family>Noto Serif CJK SC</family>
      <family>Noto Serif CJK TC</family>
      <family>Noto Serif CJK HK</family>
      <family>Noto Serif CJK JP</family>
      <family>Noto Serif CJK KR</family>
    </prefer>
  </alias>

  <!-- 默认等宽字体优先顺序 -->
  <alias>
    <family>monospace</family>
    <prefer>
      <family>Noto Sans Mono</family>
      <family>Noto Sans Mono CJK SC</family>
      <family>Noto Sans Mono CJK TC</family>
      <family>Noto Sans Mono CJK HK</family>
      <family>Noto Sans Mono CJK JP</family>
      <family>Noto Sans Mono CJK KR</family>
    </prefer>
  </alias>
</fontconfig>

更新字体缓存并验证:

bash
fc-cache -f
fc-match sans-serif
# 正确期望输出:NotoSansCJK-Regular.ttc: "Noto Sans CJK SC" "Regular"

完全重启 Chrome 或 Firefox 后,中文字形立即恢复标准的国标规范。


2.2 Flatpak Chrome 中文字体发窄与 Wayland 缩放修复 ​

在 Flatpak 沙盒模式下运行 Chrome/Chromium 时,往往会面临“三重灾难”:中文字形特别狭窄扁平、文字边缘发虚。

  • 灾难 1(沙盒隔离):Flatpak 默认无法读取宿主机的 ~/.config/fontconfig/fonts.conf,导致沙盒内又退化回日文优先;
  • 灾难 2(GPU 栅格化 BUG):Chromium 的 GPU Rasterization 在部分驱动下对 CJK 宽度测算出现偏差;
  • 灾难 3(Xwayland 模糊):在 KDE Plasma 6 Wayland 下如果使用了 125%/150% 分数缩放,X11 模式会被强制双线性拉伸。

三步彻底搞定:

  1. 同步 Fontconfig 到沙盒内部:
    bash
    mkdir -p ~/.var/app/com.google.Chrome/config/fontconfig
    cp ~/.config/fontconfig/fonts.conf ~/.var/app/com.google.Chrome/config/fontconfig/fonts.conf
    flatpak run --command=fc-cache com.google.Chrome -f -v
  2. 禁用 GPU 栅格化: 在 Chrome 地址栏访问 chrome://flags/#enable-gpu-rasterization,将 GPU Rasterization 选为 Disabled。
  3. 开启原生 Wayland 渲染: 在 Chrome 地址栏访问 chrome://flags/#ozone-platform-hint,将 Preferred Ozone platform 选为 Wayland。

重启浏览器后,字形饱满且拥有 1:1 的物理高分清晰度。


3. 游戏手感优化:Fcitx 5 模拟 Windows 语言包逻辑 ​

在 Linux(特别是 KDE Plasma 6)中打游戏,最痛的一点莫过于输入法冲突:

  • 玩《我的世界》(Minecraft) 或 FPS 游戏时,按 Shift(潜行/下蹲)容易误触中英文切换;
  • 按 Ctrl + Shift 经常卡出输入法候选框,导致游戏瞬间失控。

而在 Windows 下,按下 Alt + Shift 会切换至纯粹的“美式键盘(ENG)”,此时输入法处于完全休眠状态,任何游戏组合键都不会被拦截。

在 Fcitx 5 中,我们可以通过**配置两个独立的输入法群组(Groups)**完美复刻 Windows 的优雅体验:

1. 配置分组 (~/.config/fcitx5/profile) ​

ini
[Groups/0]
Name=English
Default Layout=us
DefaultIM=keyboard-us

[Groups/0/Items/0]
Name=keyboard-us
Layout=

[Groups/1]
Name=Chinese
Default Layout=us
DefaultIM=pinyin

[Groups/1/Items/0]
Name=pinyin
Layout=

[Groups/1/Items/1]
Name=keyboard-us
Layout=

[GroupOrder]
0=English
1=Chinese

2. 配置切换快捷键 (~/.config/fcitx5/config) ​

  • 组间切换(语言包切换):绑定 Alt + Shift;
  • 组内切换:绑定 Ctrl + Shift;
  • 彻底清空全局 TriggerKeys 和 AltTriggerKeys,剥离单按 Shift 的切换行为。
ini
[Hotkey]
EnumerateForwardKeys=Control+Shift+Shift_L,Control+Shift+Shift_R
EnumerateWithTriggerKeys=True

[Hotkey/TriggerKeys]
0=Control+space

[Hotkey/AltTriggerKeys]
# 留空:彻底杜绝游戏中按单个 Shift 误触发

[Hotkey/EnumerateGroupForwardKeys]
0=Alt+Shift_L
1=Alt+Shift_R

3. 桌面系统级设置(KDE Plasma 6) ​

进入 系统设置 -> 输入设备 -> 键盘 -> 布局,只保留一个“英语 (美国)”,移除其他所有系统键盘布局,将虚拟键盘切换权限 100% 交由 Fcitx 5 托管。

生效命令:

bash
killall fcitx5 && fcitx5 -d

至此:平时敲代码按 Alt+Shift 切换到 English 组,享受零干扰的极速响应;打游戏时高频狂按 Shift 和 Ctrl+Shift 再也不会弹窗断节奏!


4. 听觉重塑:Intel SOF 声卡与 DSP 算法调优 ​

很多 Dell 等品牌笔记本在安装 Linux 后,使用者常常吐槽“外放声音像收音机一样单薄干瘪,毫无低音”。

这不是 Linux 的锅,而是两个层面的断层:

  1. ALSA 硬件通道限流:出厂默认将 Speaker 物理增益卡在 53% 左右;
  2. 缺乏宿主 DSP 算法补偿:Windows 出厂自带 MaxxAudio 算法对物理小喇叭进行动态低音合成与响度提升,而 Linux 默认给的是干巴巴的 Raw Audio。

步骤一:拉满底层物理增益 ​

bash
# 解锁并拉满主声卡 Speaker 硬件通道
amixer -c 0 sset Speaker 100% unmute

步骤二:EasyEffects 算法链加持 ​

安装基于 PipeWire 的音效引擎:

bash
sudo pacman -S --noconfirm easyeffects lsp-plugins

打开 EasyEffects,启用开机后台运行,并在输出链路上挂载核心三大件:

  1. 低音增强器 (Bass Enhancer):将 Amount 设为 4.0 左右(利用虚拟低音心理声学原理补足微型喇叭的物理频响缺陷);
  2. 均衡器 (Equalizer):轻微拉高 100Hz 与 200Hz(增强饱满度),削弱 4000Hz - 8000Hz(消除塑料齿音);
  3. 多带压缩器 (Multiband Compressor) / 限制器 (Limiter):平衡全局响度,防止爆音。

声音层次瞬间拉满,找回甚至超越 Windows 平台下的原装声场表现。


5. 绝杀之作:KDE 6.28 + exFAT + Proton 10 全局无缝接管 Windows EXE ​

在 Linux 上直接双击运行 .exe,传统的 Wine 经常遇到乱码、DirectX 报错或缺乏现代 DXVK / VKD3D 优化,而 Valve 深度定制的 Proton 10 则是目前最强悍的 Windows 游戏与图形应用运行时。

然而,在 KDE Plasma 6 (Frameworks 6.28+) 环境下,将双击 EXE 统一路由到 Proton 10 却面临着极为棘手的底层冲突。

5.1 诡异的故障链剖析 ​

KDE Frameworks 6.28 对其核心网络/文件启动库 KIO::OpenUrlJob 进行了一项改动:

Openurljob: treat x-ms-dos-executable as a native binary if the executable bit is set.

这项改动的本意是让有执行权限的文件优先交给系统的 Linux 本地可执行文件机制处理。但这与外置 exFAT 数据盘发生了致命冲突:

  • exFAT 文件系统不支持 Unix 权限位,系统挂载时一般使用 fmask=0022 导致所有普通文件都被统一赋予了 755(带可执行位);
  • 当你在 Dolphin 中双击 exFAT 盘里的 .exe 时,KIO 判定该文件拥有执行位,绕过桌面级 MIME 关联,直接把文件丢给 Linux 内核的 binfmt_misc;
  • Linux 内核内置的 DOSWin 规则直接把参数丢给了 /usr/bin/wine;
  • 最终导致你无论怎么配置 .desktop 关联,双击永远唤醒的是老旧的系统级 Wine!
text
【典型失效链】
Dolphin 双击 EXE
  └──> KIO 发现具备执行位 (exFAT 导致)
        └──> 触发内核 binfmt_misc/DOSWin
              └──> 强制执行 /usr/bin/wine (彻底绕过任何桌面打开方式配置)

更糟糕的是,如果盲目创建自定义 MIME 类型,KDE 的 kdegraphics-thumbnailers 就无法识别标准的 PE 头部,导致 EXE 自带的高清程序内嵌图标全部丢失,变成白板图标。

5.2 终极解决方案:劫持 DOSWin,全局路由至 Proton 10 ​

我们要达成的目标是:

  1. 双击任何盘符(包括 exFAT)的 EXE,统一使用 Proton 10 运行;
  2. 完美保留 EXE 内嵌图标与 KDE 缩略图;
  3. 保留系统 Wine 供构建依赖,但不让它争抢执行权;
  4. 每个 EXE 自动哈希生成独立的 Proton Prefix 沙盒,杜绝程序间环境污染;
  5. 原生兼容 .NET Framework 程序(如 MusicTag)。

第一步:编写 Proton 10 核心包装脚本 ​

创建 ~/.local/bin/proton10-open-exe:

bash
#!/usr/bin/env bash
set -euo pipefail

steam_root_host="/home/zscgr/.var/app/com.valvesoftware.Steam/.local/share/Steam"

if [[ $# -lt 1 ]]; then
  printf 'Usage: %s /path/to/program.exe [args...]\n' "$0" >&2
  exit 64
fi

exe=$1
shift

if [[ ! -f "$exe" ]]; then
  printf 'proton10-open-exe: file not found: %s\n' "$exe" >&2
  exit 66
fi

exe=$(readlink -f "$exe")
exe_dir=$(dirname "$exe")

# 转换 Flatpak 路径映射
if [[ "$exe" == /home/zscgr/.var/app/com.valvesoftware.Steam/.local/share/Steam/* ]]; then
  exe_internal="/home/zscgr/.local/share/Steam/${exe#/home/zscgr/.var/app/com.valvesoftware.Steam/.local/share/Steam/}"
else
  exe_internal="$exe"
fi

# 兼容 Electron/Chromium 类程序渲染
if [[ "$(basename "$exe")" =~ ^(QQMusic|quark_cloud_drive)\.exe$ ]]; then
  if [[ ! " $* " =~ " --disable-gpu " ]]; then
    set -- "$@" --disable-gpu
  fi
fi

# 独立 Prefix 分配策略:优先复用 Steam 非 Steam 快捷方式 AppID,否则按绝对路径 Hash 生成独立沙盒
appid=$(/home/zscgr/.local/bin/proton-get-appid.py "$exe" 2>/dev/null || true)
if [[ -n "$appid" ]]; then
  prefix_id="$appid"
else
  hash_id=$(printf '%s' "$exe" | sha256sum | awk '{print $1}')
  prefix_id="proton10_exe_$hash_id"
fi

compatdata_host="$steam_root_host/steamapps/compatdata/$prefix_id"
mkdir -p "$compatdata_host"

cd "$exe_dir" || true

# 调起 Flatpak Steam 沙盒内的 Proton 10 运行环境
exec flatpak run \
  --filesystem="$exe_dir" \
  --env=STEAM_COMPAT_CLIENT_INSTALL_PATH=/home/zscgr/.local/share/Steam \
  --env=STEAM_COMPAT_DATA_PATH="/home/zscgr/.local/share/Steam/steamapps/compatdata/$prefix_id" \
  --command="/home/zscgr/.local/share/Steam/steamapps/common/Proton 10.0/proton" \
  com.valvesoftware.Steam run "$exe_internal" "$@"

赋予执行权限:

bash
chmod 755 ~/.local/bin/proton10-open-exe

第二步:覆盖内核 binfmt_misc 规则 ​

系统 Wine 的内核规则定义在 /usr/lib/binfmt.d/wine.conf 中。我们不要去修改该系统文件(防止 pacman 升级覆盖),而是使用 /etc/binfmt.d/wine.conf 进行配置覆盖:

text
# /etc/binfmt.d/wine.conf
# 将 MZ 幻数(PE 可执行文件)直接引导至我们的 Proton 10 启动器
:DOSWin:M::MZ::/home/zscgr/.local/bin/proton10-open-exe:

重启 binfmt 服务生效:

bash
sudo systemctl restart systemd-binfmt.service

验证内核当前的解释器:

bash
cat /proc/sys/fs/binfmt_misc/DOSWin
# 应当显示:interpreter /home/zscgr/.local/bin/proton10-open-exe

第三步:绑定桌面标准 MIME ​

创建 ~/.local/share/applications/proton10-exe.desktop,关联标准 PE 类型(确保 kdegraphics-thumbnailers 能正常提取内嵌图标):

ini
[Desktop Entry]
Type=Application
Name=Proton 10
Comment=Run Windows executables with Proton 10
Exec=/home/zscgr/.local/bin/proton10-open-exe %f
Terminal=false
NoDisplay=true
MimeType=application/x-ms-dos-executable;application/x-msdownload;application/vnd.microsoft.portable-executable;application/x-dosexec;
Categories=Game;Utility;
StartupNotify=false

刷新桌面 MIME 缓存:

bash
update-desktop-database ~/.local/share/applications
kbuildsycoca6 --noincremental

5.3 成果与验证 ​

现在,在 Dolphin 文件管理器中随便双击一个 Windows .exe(无论位于系统盘还是 exFAT 扩展盘):

  1. 图标完好无损:依然能够清晰看到程序内部嵌入的高清 Windows 图标;
  2. 底层纯正:通过 ps -ef | grep Proton 可以确认进程直接由 Flatpak Steam 下的 Proton 10.0/files/bin/wineserver 驱动,DXVK/VKD3D 自动就位;
  3. 环境独立:各个绿色软件互不干扰,即使运行崩溃也可以随时删除对应的 compatdata/proton10_exe_<hash> 目录一键回滚重置!

6. 总结与后续建议 ​

系统调优从来不是一蹴而就的盲目套用,而是清楚地知道“系统在哪个环节做了什么转换”:

  1. 中文字体与本地化:Linux 下的汉字字形问题很多时候不是“缺字体”,而是“匹配优先级”与“沙盒隔离”;
  2. 游戏手感:不要在快捷键冲突上委曲求全,利用 Fcitx 5 的独立群组,完全可以享受媲美 Windows 的原生打字与游戏分离体验;
  3. 兼容架构:遇到架构级冲突(如 KDE 6.28 执行位逻辑与 exFAT),顺应内核的 binfmt_misc 机制反客为主,往往比在桌面层层打补丁更加稳固优雅。

希望这篇基于实机打磨的经验复盘,能为你的 CachyOS 之旅带来顺滑如丝的桌面体验。

评论 隐私政策