我正在玩 xkeyboard-config。目前,我正在嘗試理解規則文件。
我曾經xkbcomp
從 X 伺服器獲取當前的鍵盤映射並將其寫入檔案。此鍵盤映射是預設鍵盤映射,在setxkbmap
不帶任何參數運行時加載不會出現錯誤。然後,我將各個元件提取到它們自己的檔案中,並將這些檔案放入類似於 xkb config 目錄結構的目錄結構中。
它看起來像這樣:
xkb
├── compat
│ └── current
├── geometry
│ └── current
├── keycodes
│ └── current
├── rules
│ ├── current
│ ├── current.lst
│ └── current.xml
├── symbols
│ └── current
└── types
└── current
我自己在規則子目錄中建立了文件,試圖建立能夠載入單一佈局的最小規則文件集。
當我指向setxkbmap
此目錄並嘗試加載其中的鍵盤映射時,我收到錯誤,儘管根本沒有更改組件的內容。
$ setxkbmap -Ixkb -v 10 -rules current -layout current -model current -variant current
Setting verbose level to 10
locale is C
Warning! Multiple definitions of rules file
Using command line, ignoring X server
Warning! Multiple definitions of keyboard model
Using command line, ignoring X server
Warning! Multiple definitions of keyboard layout
Using command line, ignoring X server
Trying to load rules file ./rules/current...
Trying to load rules file /usr/share/X11/xkb/rules/current...
Trying to load rules file xkb/rules/current...
Success.
Applied rules from current:
rules: current
model: current
layout: current
variant: current
Trying to build keymap using the following components:
keycodes: current
types: current
compat: current
symbols: current
geometry: current
Error loading new keyboard description
-print
如果我透過將選項新增setxkbmap
至並將結果透過管道傳輸到 來載入鍵盤映射xkbcomp
,則鍵盤映射將被編譯並加載,不會出現任何錯誤。
由於從 X 伺服器加載鍵映射的方式到我加載鍵映射的方式唯一發生重大變化的是正在使用的規則文件和組件的組織,因此我假設錯誤的根源就在那裡。我創建的設定有什麼問題?當我嘗試使用 重新載入鍵盤映射時,為什麼會出現錯誤setxkbmap
?
作為參考,規則文件的內容如下。
xkb/規則/目前
! model layout variant = keycodes types compat symbols geometry
current current current = current current current current current
xkb/rules/current.lst
! layout
current Current Layout
xkb/rules/current.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xkbConfigRegistry SYSTEM "xkb.dtd">
<xkbConfigRegistry version="1.1">
<modelList>
<model>
<configItem>
<name>current</name>
<description>Current Model</description>
<vendor>Zistack</vendor>
</configItem>
</model>
</modelList>
<layoutList>
<layout>
<configItem>
<name>current</name>
<description>Current Layout</description>
<languageList>
<iso639Id>eng</iso639Id>
</languageList>
</configItem>
<variantList>
<variant>
<configItem>
<name>current</name>
<shortDescription>current</shortDescription>
<description>current</description>
<languageList>
<iso639Id>eng</iso639Id>
</languageList>
</configItem>
</variant>
</variantList>
</layout>
</layoutList>
</xkbConfigRegistry>
答案1
你的格式已關閉。看這個舊文檔中的第 4.3 節或者此新版本的規則部分。 道格·帕爾默的不可靠指南有點過時,但也是很好的資源。
您嘗試過:
! model layout variant = keycodes types compat symbols geometry
current current current = current current current current current
具體來說, 的右側=
採用單一參數。就!
行而言,右側是單一類型的文件—只有 {鍵碼、類型、相容性、符號、幾何形狀} 被允許。在其他行中,右側是單一參數,意義:
- 中找到的單一文件類型子目錄 (
test1
) - A節在這樣的文件中定義 (
test1(foo)
) - 對較早配對的補充 (
+test2
或+test2(bar)
) - 多個檔案/節連接在一起 (
test1+test1(foo)+test2(bar)+test3(baz)
)
左側是過濾器;您可以新增任意數量的這些內容。
基本上,這些規則為每種類型建立單獨的文件集。
// KEYCODES SECTION
// load keycodes based on model specified
! model = keycodes
test1 = test1
// ^^^^^^^^^^^^^^
// "if model=test1,
// load the default in the file keycodes/test1"
// load keycodes based on layout specified
! layout = keycodes
test1 = +test1(us)
// ^^^^^^^^^^^^^^
// "if layout=test1,
// also load stanza "us" in the file keycodes/test1"
// all at once
! model layout variant option = keycodes
test2 test2 test2 test2 = test1+test1(de)+test1(var2)+test1(opt2)
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// "if model=test2 and layout=test2 and... ,
// load the default stanza in file keycodes/test1,
// then load stanza "de" in file keycodes/test1, ...
////////////////
// GEOMETRY SECTION
// load geometry based on model specified
! model = geometry
test1 = test1
* = test3 // any other model
定義這些規則後,您可以嘗試setxkbmap -print
查看規則的實際效果:
$ setxkbmap -I/path/to/my/xkb -rules test1 -model test1 -print
xkb_keymap {
xkb_keycodes { include "test1" };
xkb_geometry { include "test1" };
};
// no xkb_symbols or other sections of the map with only the rules above
$ setxkbmap -I/path/to/my/xkb -rules test2 -model test1 -layout test1 -print
xkb_keymap {
xkb_keycodes { include "test1+test1(us)" };
xkb_geometry { include "test1" };
};
$ setxkbmap -I/path/to/my/xkb -rules test2 -model test2 -layout test2 -variant test2 -option test2 -print
xkb_keymap {
xkb_keycodes { include "test1+test1(us)+test1(var1)+test1(opt2)" };
xkb_geometry { include "test3" };
};
這是規則運作的基本原理,但當然它可能會變得更加複雜。
%l
和%v
是變數我阿尤特和variant(%m
也可用於米奧德爾)%(v)
將展開式括在括號中,因此%l%(v)
產生layout(variant)
- 如果定義了多個佈局/變體,它們可以作為數組訪問,並且您需要添加索引:(
%l[1]
不起作用%l
) - 如果定義了多個佈局/變體,請新增
:2
(或:3
或:4
) 以限制載入到第二個(或第三個或第四個)佈局的文件
這是一個非常基本的規則部分,它將正確引入多個佈局:
// setxkbmap -layout foo -variant foo1
! model layout = symbols
* * = %l%(v)
// setxkbmap -layout foo,bar -variant foo1,bar1
! model layout[1] = symbols
* * = %l[1]%(v[1])
// setxkbmap -layout foo,bar -variant foo1,bar1
! model layout[2] = symbols
* * = +%l[2]%(v[2]):2
// setxkbmap -layout foo,bar,baz -variant foo1,bar1,baz1
! model layout[3] = symbols
* * = +%l[3]%(v[3]):3
// setxkbmap -layout foo,bar,baz,bat -variant foo1,bar1,baz1,bat1
! model layout[4] = symbols
* * = +%l[4]%(v[4]):4
現在您可以載入測試佈局setxkbmap
並查看它們是否已新增。
$ setxkbmap -I/path/to/my/xkb -rules test -model test1 \
-layout test1,test2,test3 \
-variant test1,testA,testB -print
xkb_keymap {
xkb_keycodes { include "test1+test1(us)" };
xkb_symbols { include "test1(test1)+test2(testA):2+test3(testB):3" };
xkb_geometry { include "test1" };
};