跳转至内容

X 资源

来自 ArchWiki
(从 .Xresources 重定向而来)

X 资源 文件 是一个用户级别的配置文件 点文件,通常位于 ~/.Xresources。它可以用于设置 X 客户端应用程序的配置参数。除其他外,它还可以用于

安装

安装 xorg-xrdb 包以获取 X 服务器资源数据库工具,并安装 xorg-docs 以获取 X.org 文档。

配置

X(7) § RESOURCESXrmGetDatabase(3) § FILE SYNTAX 提供了关于 X 资源 机制和文件语法的详细信息。

~/.Xresources 是一个约定俗成的文件名,xrdb 并不强制要求。你可以使用任何其他文件名,例如 ~/.config/X11/Xresources~/.config/X11/Xresources.d/application-name(另见 #示例#包含文件)。

基本语法

X 资源 文件的语法是一系列 资源行,如下所示:

application_name.Class.resourceName: value
      application_name.resourceName: value
                 Class.resourceName: value
      application_name*resourceName: value
                      *resourceName: value

application_nameClass 子字符串永远不包含点(.),resourceName 子字符串可能包含点。例如,Dialog.bodyFont 是一个 XScreenSaver 的内部资源,用于设置正文字体和回退字体。

xscreensaver-auth.default.Dialog.bodyFont: times new roman 12, dejavu serif 12
application_name
应用程序的名称,例如 urxvtxpdfxterm 等。也可能称为 实例名
Class
用于将资源分组的分类。类名通常是大写。
resourceName
要设置的资源的名称。资源名通常是小写字母,大写字母用于连接。
value
资源的实际值。它可以是以下三种类型之一:
  • 整数(整型数)
  • 布尔值(true/false,yes/no,on/off)
  • 字符串(字符序列)——例如一个词(white)、一个颜色(#ffffff)或一个路径(/usr/bin/firefox)。
分隔符
  • 点(.)是 紧密绑定,用于分隔紧邻的组件(换句话说,表示层次结构中的每一步下降)——在上面的例子中,我们从应用程序名开始,然后下降到类,最后到资源本身。
  • 星号(*)是 松散绑定,用于表示任意数量的中间组件,包括零个。
  • 冒号(:)用于分隔资源名和值。
  • 从资源文件语法的角度来看,冒号(:)之前的所有内容都是资源名。从用户的角度来看,我们通常只称最右边的组件为 资源。换句话说,资源名 是由 应用程序名资源名 子字符串组成的字符串。这可能是混淆的根源。
  • 资源命名模式完全取决于应用程序。虽然一个应用程序可能使用 application_name.Class.resourceName,但另一个应用程序可能只识别 application_name.resourceNameClass.resourceName

通配符匹配

问号(?)和星号(*)可用作通配符,使得编写一个规则可以应用于许多不同的应用程序或元素变得容易。? 用于匹配任何单个组件名,而 * 用于表示任意数量的中间组件,包括零个。

使用前面的例子,如果你想将相同的字体应用于所有包含类名 Dialog 且包含资源名 headingFont 的程序(不仅仅是 XScreenSaver),你可以这样写:

?.Dialog.headingFont:     -*-fixed-bold-r-*-*-*-100-*-*-*-*-iso8859-1

如果你想将此规则应用于所有包含资源名 headingFont 的程序,而不考虑其类名,你可以这样写:

*headingFont:    -*-fixed-bold-r-*-*-*-100-*-*-*-*-iso8859-1
  • 问号(?)类似于组件名,因此它旁边需要有 绑定字符——点(.)或星号(*)。
  • 星号(*)本身就是 绑定字符,不需要在其旁边放置点,并且点(.)和星号(*)的序列在文件处理期间将被替换为单个星号。

有关更多信息,请参阅 XrmGetResource(3) § MATCHING RULES

评论

以感叹号(!)开头的行将被忽略,例如:

! The following rule will be ignored because it has been commented out
!Xft.antialias: true
  • 感叹号必须是行中的第一个字符。
  • 如果你安装了 C 预处理器,例如 GNU CPPgcc),你可以使用 C 风格(///* … */)的注释(另见 #示例)。

在注释内部也识别两个字符序列 \newline(反斜杠后跟换行符),这允许值跨越多行。在下面的示例中,所有四行都被注释掉了,尽管只使用了一个感叹号:

! URxvt.font: xft:Input Mono:size=13:style=Regular, \
              xft:Font Awesome 6 Free:style=Solid,  \
              xft:Segoe UI Symbol:style=Regular,    \
              xft:Noto Emoji:style=Regular

包含文件

要将资源配置分散到多个文件中(例如,为每个应用程序使用自己的文件),请使用 C 预处理器 #include 指令

~/.config/X11/Xresources
#include "Xresources.d/fonts"
#include "Xresources.d/rxvt-unicode"
#include "Xresources.d/xscreensaver"
#include "Xresources.d/xterm"

如果用 #include 引用的文件在应用的配置文件目录中不可达,你需要传递一个目录供搜索。

$ xrdb -load -I${HOME}/.config/X11 ~/.Xresources

默认设置

要查看已安装的 X11 应用程序的默认设置,请查看 /usr/share/X11/app-defaults/

程序特定的详细资源信息通常在其 man 页中提供。 xterm(1) § RESOURCES 是一个很好的例子,因为它包含 X 资源及其默认值的列表。

要查看当前加载的资源

$ xrdb -query -all

示例

用法

加载资源文件

资源存储在 X 服务器中,因此只需读取一次。远程 X11 客户端(例如 通过 SSH 转发 的客户端)也可以访问它们。

加载资源文件(例如惯用的 .Xresources),替换任何当前设置。

$ xrdb ~/.Xresources

加载资源文件,并与当前设置合并。

$ xrdb -merge ~/.Xresources
  • 大多数 显示管理器 在登录时加载 ~/.Xresources 文件。
  • 较旧的 ~/.Xdefaults 文件在 X11 程序启动时读取,但前提是 xrdb 在当前会话中尚未被使用。 [1]

xinitrc

如果你使用默认 xinitrc 的副本作为你的 .xinitrc,它已经合并了 ~/.Xresources

如果你使用自定义的,请添加:

.xinitrc
[[ -f ~/.Xresources ]] && xrdb -merge -I$HOME ~/.Xresources
注意 不要将 ~/.xinitrc 中的 xrdb 命令设置为后台运行。否则,在 xrdb 完成加载资源之前启动的程序可能会寻找这些资源。

获取资源值

如果你想获取资源的值(例如,如果你想在 bash 脚本中使用它),你可以使用 xgetresAUR

$ xgetres xscreensaver.Dialog.headingFont
-*-fixed-bold-r-*-*-*-100-*-*-*-*-iso8859-1

故障排除

解析错误

GDM 这样的 显示管理器 可能会为 xrdb 使用 --nocpp 参数。

xrdb -query 没有输出

xrdb -query 输出为空的情况并不少见。请尝试按照上面的 #加载资源文件#xinitrc 进行操作。并注意那里提到的一些文件可能是空的。

参见