You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多模块NixOS环境下,如何隐藏Xorg相关选项的定义?

如何在NixOS中隐藏特定模块对services.xserver.config的定义

我之前也碰到过类似的需求——不想让synaptics模块自动给services.xserver.config追加触控板配置,但又不想丢掉其他模块的xserver设置。下面给你几个可行的方案,按需选择:

方案1:完全自定义覆盖(最简单直接)

如果想彻底掌控services.xserver.config的内容,直接用lib.mkForce强制替换所有模块生成的配置就行。这样synaptics模块的定义自然就被隐藏了:

services.xserver.config = lib.mkForce ''
  # 这里写你自己的完整xorg.conf配置内容
  Section "Device"
    Identifier "Card0"
    Driver "nvidia" # 举个例子,换成你的显卡驱动
  EndSection
  # 其他需要的配置段都可以加在这里
'';

这个方法的好处是简单直接,缺点是你得自己维护所有xserver配置,其他模块(比如显卡驱动模块)的自动配置也会被覆盖,需要手动补上。

方案2:精准移除synaptics模块的配置段

如果想保留其他模块的自动配置,只去掉synaptics添加的部分,可以通过字符串过滤实现。首先你可以去synaptics.nix里查看它默认添加的配置内容,或者用nixos-rebuild build后查看生成的xorg.conf,然后把那段内容从合并后的配置里剔除:

let
  # 从synaptics模块里复制出来的默认配置段,根据你的NixOS版本调整
  synapticsXConfig = ''
    Section "InputClass"
      Identifier "touchpad catchall"
      Driver "synaptics"
      MatchIsTouchpad "on"
      MatchDevicePath "/dev/input/event*"
      Option "TapButton1" "1"
      Option "TapButton2" "3"
      Option "TapButton3" "2"
      Option "VertEdgeScroll" "on"
      Option "VertTwoFingerScroll" "on"
      Option "HorizEdgeScroll" "on"
      Option "HorizTwoFingerScroll" "on"
      Option "CircularScrolling" "off"
      Option "CircScrollTrigger" "0"
      Option "EmulateTwoFingerMinZ" "40"
      Option "EmulateTwoFingerMinW" "8"
      Option "CoastingSpeed" "0"
      Option "FingerLow" "25"
      Option "FingerHigh" "30"
      Option "MaxTapTime" "180"
      Option "MaxTapMove" "220"
      Option "MaxDoubleTapTime" "180"
      Option "SingleTapTimeout" "180"
      Option "ClickTime" "100"
      Option "EmulateMidButtonTime" "75"
      Option "VertScrollDelta" "100"
      Option "HorizScrollDelta" "100"
      Option "LockedDrags" "off"
      Option "LockedDragTimeout" "5000"
      Option "RTCornerButton" "0"
      Option "RBCornerButton" "0"
      Option "LTCornerButton" "0"
      Option "LBCornerButton" "0"
      Option "ClickFinger1" "1"
      Option "ClickFinger2" "3"
      Option "ClickFinger3" "2"
      Option "CircularScrolling" "off"
      Option "CircScrollTrigger" "0"
      Option "PadTopEdge" "0"
      Option "PadBottomEdge" "0"
      Option "PadLeftEdge" "0"
      Option "PadRightEdge" "0"
      Option "HorizHysteresis" "10"
      Option "VertHysteresis" "10"
      Option "ClickPad" "off"
    EndSection
  '';
in
services.xserver.config = lib.mkForce (lib.strings.replaceStrings [synapticsXConfig] [""] config.services.xserver.config);

这个方法能保留其他模块的配置,但要注意:如果NixOS更新后synaptics模块的默认配置变了,你得同步更新这里的synapticsXConfig内容,否则过滤会失效。

方案3:通过模块覆盖禁用synaptics的配置注入

更优雅的方式是直接覆盖synaptics模块中对services.xserver.config的定义。创建一个自定义模块文件(比如./modules/disable-synaptics-xconfig.nix):

{ config, lib, ... }:

{
  # 用更高优先级的设置替换synaptics模块的config注入
  services.xserver.config = lib.mkOverride 1000 (
    lib.mkIf config.services.xserver.synaptics.enable ""
  );
}

然后在你的configuration.nix里导入这个模块:

imports = [
  ./modules/disable-synaptics-xconfig.nix
];

这个方法的好处是不用硬编码synaptics的配置内容,就算模块更新也能生效。原理是用lib.mkOverride 1000让我们的定义优先级远高于synaptics模块的mkAfter(默认优先级是50),这样当synaptics模块启用时,它给services.xserver.config加的内容会被我们的空字符串替换掉。

内容的提问来源于stack exchange,提问作者jorsn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:35:12