X11

使資源適用於 XTerm 和 UXTerm 類

  • July 28, 2020

為了將相同的資源應用於xtermand uxterm,目前我的配置文件必須具有單獨的重複條目:

XTerm*scrollBar:           true
UXTerm*scrollBar:          true

例如,通配類名稱不會同時選擇它們:

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

有沒有辦法讓某些資源適用於兩個程序(無論如何它們實際上是同一個程序),同時保留讓其他資源專門適用於一個或另一個的能力(排除,比如說,總是從xtermvia開始xterm -class UXTerm)?感謝您的任何想法。

如果您想擁有多個 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

我使用m4來預處理我的 X 資源。這意味著我不能依賴預設載入:我從 my or顯式~/.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')

萬用字元在 X 資源中不起作用,因為您可能在 shell 中使用*glob表達式。*它更像是一個省略號“…”,替換零個或多個小元件層次結構。

如果使用 just 消除類名,*scrollBar:true這將適用於 xterm 和 uxterm(以及使用該資源名稱的任何其他應用程序)。

引用自:https://unix.stackexchange.com/questions/600783