使资源适用于 XTerm 和 UXTerm 类

使资源适用于 XTerm 和 UXTerm 类

为了将相同的资源应用于xtermuxterm,当前我的配置文件必须具有单独的重复条目:

XTerm*scrollBar:           true
UXTerm*scrollBar:          true

例如,对类名进行通配符不会同时选取它们:

! This works for xterm but not uxterm
*XTerm*scrollBar:          true

有没有一种方法可以使某些资源适用于两个程序(无论如何,它们实际上是同一个程序),同时保留将其他资源专门应用于一个或另一个程序的能力(这排除了总是xterm通过启动xterm -class UXTerm)?感谢您的任何想法。

答案1

通配符在您可能使用的 X 资源中不起作用全局shell 中的表达式。它更像是省略号“...”,替换小部件层次结构的零个或多个级别。

如果您仅使用 来消除类名,*scrollBar:true则这将适用于 xterm 和 uxterm(以及使用该资源名称的任何其他应用程序)。

答案2

如果您想要有多个 XTerm 配置并在调用时选择一个,则可以使用单个类和多个实例名称:

XTerm.VT100.background: Black
XTerm.VT100.scrollBar: true
light.VT100.background: White

根据这些定义,xterm -name light具有白色背景并具有滚动条。您可以通过这种方式获得两层配置,但如果您想要三层,这将无济于事。

在这种特定情况下,您也许可以使用

?.VT100.background: Black
Light.VT100.background: White

因为实际上,xterm 是唯一带有VT100小部件的应用程序。

一般来说,仅使用基本的 X 资源语法无法做到这一点。通配符匹配组件,而不是组件内的单个字符。*XTerm表示“XTerm在层次结构的任何级别”,而不是“以XTerm”结尾的任何名称。

解决方案是依靠预处理器xrdb(加载 X 资源的实用程序)使用C预处理器cpp) 默认情况下。不幸的是,cpp 对于 X 资源语法来说不是很方便。特别是,在 cpp 宏的扩展中不能有换行符,因此不能定义宏来扩展多个 X 资源。但是,您可以使用包含文件来解决 cpp 的问题。将XTerm和 的通用定义放在UXTerm单独的文件中xterm-common.Xresources。在主.Xresources文件中,包含xterm-common.Xresources两次,每个类名一次。

#include ".config/x11/xterm-common-Xresources"
#define XTerm UXTerm
#include ".config/x11/xterm-common-Xresources"
#undef XTerm
XTerm.font: my XTerm font
UXTerm.font: my UXTerm font

我用米4预处理我的 X 资源。这意味着我不能依赖 的默认加载~/.Xresources:我xrdb -cpp m4 ~/path/to/my/Xresources从我的.xinitrc或显式调用.xsession。我有代码可以为XTerm和申请一些资源UXTerm

define(`XTERM_class_settings', `

') dnl end of `XTERM_class_settings'

XTERM_class_settings
define(`XTerm', `UXTerm')
XTERM_class_settings
undefine(`XTerm')

相关内容