为了将相同的资源应用于xterm
和uxterm
,当前我的配置文件必须具有单独的重复条目:
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')