Estou brincando com xkeyboard-config. Atualmente, estou tentando entender os arquivos de regras.
Eu costumava xkbcomp
obter o mapa de teclado atual do servidor X e gravá-lo em um arquivo. Este mapa de teclado é o mapa de teclado padrão, que carrega sem erros quando setxkbmap
é executado sem nenhum argumento. Em seguida, coloquei os componentes individuais em seus próprios arquivos e coloquei os arquivos em uma estrutura de diretórios semelhante à estrutura de diretórios de configuração xkb.
Se parece com isso:
xkb
├── compat
│ └── current
├── geometry
│ └── current
├── keycodes
│ └── current
├── rules
│ ├── current
│ ├── current.lst
│ └── current.xml
├── symbols
│ └── current
└── types
└── current
Eu mesmo criei os arquivos no subdiretório de regras na tentativa de criar um conjunto mínimo de arquivos de regras capazes de carregar um único layout.
Quando aponto setxkbmap
para este diretório e tento carregar o mapa de teclado, recebo um erro, apesar de não ter alterado o conteúdo dos componentes.
$ 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
Se eu carregar o mapa de teclado adicionando a -print
opção setxkbmap
e canalizando o resultado para xkbcomp
, o mapa de teclado será compilado e carregado sem erros.
Como as únicas coisas que mudaram substancialmente, desde a forma como o servidor X carrega o mapa de teclado até como eu carrego o mapa de teclado, são os arquivos de regras usados e a organização dos componentes, presumo que a origem do erro resida lá. O que há de errado com a configuração que criei? Por que recebo um erro quando tento recarregar o mapa de teclado usando setxkbmap
?
Para referência, segue o conteúdo dos arquivos de regras.
xkb/regras/atual
! 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>
Responder1
Seu formato está desativado. Verseção 4.3 neste documento antigoou oSeção de regras desta versão mais recente. Guia não confiável de Doug Palmeré um pouco desatualizado, mas também é um bom recurso.
Você tentou:
! model layout variant = keycodes types compat symbols geometry
current current current = current current current current current
Especificamente, o lado direito do =
aceita um único argumento. Na !
linha, o lado direito é um único tipo de arquivo - apenas um de {códigos-chave, tipos, compatibilidade, símbolos, geometria} é permitido. Nas outras linhas, o lado direito é um único argumento que significa:
- um único arquivo encontrado notiposubdiretório (
test1
) - aestrofedefinido em tal arquivo (
test1(foo)
) - uma adição a uma correspondência anterior (
+test2
ou+test2(bar)
) - vários arquivos/estrofes unidos (
test1+test1(foo)+test2(bar)+test3(baz)
)
O lado esquerdo é um filtro; você pode incluir quantos quiser.
Basicamente, as regras criam conjuntos de arquivos separados para cada um desses tipos.
// 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
Com essas regras definidas, você pode brincar setxkbmap -print
para ver suas regras em ação:
$ 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" };
};
Essa é a base de como as regras funcionam, mas é claro que pode ficar muito mais complicado.
%l
e%v
são variáveis com oeutudo bem evariant (%m
também pode ser usado paraeumodelo)%(v)
envolve a expansão entre parênteses, então%l%(v)
produzlayout(variant)
- se vários layouts/variantes forem definidos, eles serão acessíveis como uma matriz e você precisará adicionar um índice:
%l[1]
(%l
não funcionará) - se vários layouts/variantes forem definidos, adicione
:2
(ou:3
ou:4
) para restringir os arquivos carregados ao 2º (ou 3º ou 4º) layout
Aqui está uma seção de regras muito básicas que irá extrair vários layouts corretamente:
// 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
Agora você pode carregar layouts de teste setxkbmap
e ver se eles estão sendo adicionados.
$ 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" };
};