Úvod
Poté, co jsem se naučil psát všemi deseti, jsem zatoužil po tom, mít přizpůsobeno rozložení kláves přesně svému cítění. Hlavním cílem byla co nějvětší podobnost s anglickou klávesnicí stejně jako možnost psát česká nabodeníčka. Po prohlédnutí několika souborů pro program xmodmap jsem víceméně metodou pokus-omyl vytvořil své vlastní mapování, které jsem ke své spokojenosti používal více než rok. Když jsem ale přešel k prostředí KDE, přestal jsem tato rozšíření používat, neboť KDE již staví na moderní knihovně XKB (prostřednictvím přepínače rozložení kláves – programu kxkb). V čase zkoušek jsem ale začal pátrat po způsobu, jak má stará dobrá mapování převést pod XKB.
Narazil jsem při tom na dokument An Unreliable Guide to XKB Configuration. Doporučuji všem k přečtení, protože popisuje mnohem více, než by se vešlo do tohoto článku. V první řadě se podíváme na to, jak by měl vypadat cíl našeho snažení:
- Pro anglickou verzi najdeme na klávesách 1 až 9 a 0 jednotlivé číslice, po stisknutí Shiftu pak klasické symboly !@#$%^&*(). Pro psaní občasných českých písmen s diakritikou (ěščřžýáíé) a znaménka plus stačí stisknout pravý Alt. Konečne vedle nuly najdeme znaménko minus a po stisknutí Shiftu podtržítko. Poslední klávesa před Backspacem je rovnítko, v kombinaci se Shiftem znaménko plus. Při stisku pravého Altu vygeneruje mrtvou čárku, a přidáme-li ještě Shift, mrtvý háček. Win klávesy na levé a pravé straně jsou mapovány na levou resp. pravou meta klávesu.
- U české verze pak píši namísto číslic česká písmenka s nabodeníčky, číslice v kombinaci se shiftem a symboly s pravým altem. Z klávesy vedle Backspace se rovnítko přestěhovalo k mínusu a podtržítku (kombinace s pravým Altem) a na této klávese zůstaly pouze mrtvé klávesy. Navíc přibyla dlouhá U, čárkované píši v kombinaci s pravým Altem (případně Shiftem pro velké Ú) klávesou vpravo vedle P, kroužkované stejným způsobem vedle L.
Výše zmíněný popis má svou logiku – pokud mám nastavenu anglickou klávesnici, mám stále možnost psát českou diakritiku (anglická klávesnice je pouze rozšířena), naopak u české verze mi na pravé ruce nijak nepřekáží české mapování symbolů (nikdy jsem na první pokus netrefil pravou a levou závorku). Akcentovaná U jsem přidal až do třetí a čtvrté úrovně z prostého důvodu: jako zanícený uživatel ViM jsem chtěl mít pod pravým malíčkem dvojtečku :)
Jemný úvod do XKB
Na začátek bych chtěl podotknout, že nejsem žádný velký odborník na XKB, a tedy vítám každou připomínku ke článku a každé upřesnění zde předložených informací.
Začněme nejprve stručným popisem XKB. XKB je složeno z několika vrstev, které umožňují vysokou flexibilitu. První z těchto vrstev nese jméno keycodes. Stará se o překlad mezi scankódy, které generuje klávesnice na symbolická jména. Pro jeden scankód může existovat i více symbolů. Zde rovněž najdeme výčet všech „světýlek“, která na klávesnici najdeme.
Po příchodu scankódu (tj. po stisku klávesy) se tento přeloží na symbolické jméno a dále se zpracuje ve vrstvě symbols. Ta jednotlivým symbolickým jménům přiřazuje konkrétní symboly nebo, chcete-li, znaky, které se po stisku této klávesy předají X serveru.
O některé klávesy se může starat vrstva compat, která obsluhuje zámky modifikátorů (CapsLock, ScrollLock), v této vrstvě lze také nastavit pohyb kurzoru myši pomocí kláves (pokud používáte výchozí nastavení, zkuste stisknout Shift+NumLock a pomocí numpadu budete skutečně moci pohybovat kurzorem), případně upravit „rozsvěcování“ kontrolek klávesnice.
Trochu stranou od těchto vrstev pak stojí vrstva geometry, které popisuje fyzické rozložení klávesnice. Zkuste si spustit příkaz xkbprint :0.0 a ve výstupním PS souboru uvidíte, jakou má váš X server představu o podobě vaší klávesnice.
Nakonec je zde ještě vrstva types, která silně spolupracuje s vrstvou symbols. Pomocí této vrstvy se provádějí všechna kouzla s modifikátory, jako je Shift nebo alt apod. Zde se definují módy kláves, počty úrovní a modifikátory, které se starají o jejich přepínání.
Konfigurační soubory pro tyto vrstvy jsou uvedeny v příslušných podadresářích hlavního adresáře XKB (pro mého Woodyho /etc/X11/xkb). Kromě těchto souborů zde najdete i další soubory, které se starají o vytvoření předpřipravených rozložení apod. Pokud si nechcete zrovna vytvořit své vlastní mapování kláves, doporučuji přečíst si odpovídající pasáž z výše uvedené příručky a použít již připravenou konfiguraci.
Úrovně a skupiny
Tyto pojmy souvisí s vrstvou types. Ta pracuje s levels (úrovně) a groups (skupiny). Stručně řečeno, každá klávesa může mít několik úrovní. První úroveň jsou základní symboly, na druhou úroveň přepneme přidržením modifikátoru (většinou Shift, lze ale nastavit i jiný…), který dočasně změní symbol klávesy (napsání velkého písmena apod.). Úrovní může být i větší počet než dvě.
Zatímco úrovně se používají spíše k menším změnám, skupiny jsou používány většinou pro změnu jazyka. První skupinou je například výchozí jazyk a přidržením modifikátoru se změní skupina, čímž dojde ke změně jazyka. Pokud se podíváme na typickou českou klávesnici, pak klávesa s číslem 7 má v levém dolním rohu symbol 7 a nad ním &, což je první a druhá úroveň první skupiny. Napravo pak najdeme symboly ý a 7, jež jsou první a druhou úrovní druhé skupiny.
Naše konfigurace
Nyní si uvedeme příklad naší konfigurace. Použijeme pouze vrstvu symbols. Dále jsem se rozhodl pro tříúrovňovou hiearchii kláves. Nejprve tedy anglická klávesnice:
default partial alphanumeric_keys
xkb_symbols "basic" {
name[Group1]= "honza/us";
key.type = "THREE_LEVEL";
key <AE01> { [ 1, exclam, plus] };
key <AE02> { [ 2, at, ecaron] };
key <AE03> { [ 3, numbersign, scaron] };
key <AE04> { [ 4, dollar, ccaron] };
key <AE05> { [ 5, percent, rcaron] };
key <AE06> { [ 6, asciicircum, zcaron] };
key <AE07> { [ 7, ampersand, yacute] };
key <AE08> { [ 8, asterisk, aacute] };
key <AE09> { [ 9, parenleft, iacute] };
key <AE10> { [ 0, parenright, eacute] };
key <AE11> { type = "TWO_LEVEL", [ minus, underscore] };
key <AE12> { type = "FOUR_LEVEL", [ equal, plus, dead_acute, dead_caron] };
key <LWIN> { type = "ONE_LEVEL", [ Meta_L ] };
key <RWIN> { type = "ONE_LEVEL", [ Meta_R ] };
key <RALT> { type = "ONE_LEVEL", [ ISO_Level3_Shift ] };
modifier_map Mod3 { <RALT> };
};
Teď ještě české rozložení:
default partial alphanumeric_keys
xkb_symbols "basic" {
name[Group1]= "honza/cz";
key.type = "THREE_LEVEL";
key <AE01> { [ plus, 1, exclam] };
key <AE02> { [ ecaron, 2, at] };
key <AE03> { [ scaron, 3, numbersign] };
key <AE04> { [ ccaron, 4, dollar] };
key <AE05> { [ rcaron, 5, percent] };
key <AE06> { [ zcaron, 6, asciicircum] };
key <AE07> { [ yacute, 7, ampersand] };
key <AE08> { [ aacute, 8, asterisk] };
key <AE09> { [ iacute, 9, parenleft] };
key <AE10> { [ eacute, 0, parenright] };
key <AE11> { [ minus, underscore, equal] };
key <AE12> { type = "TWO_LEVEL", [ dead_acute, dead_caron] };
key <AD11> { type = "FOUR_LEVEL", [ bracketleft, braceleft, uacute, Uacute] };
key <AC10> { type = "FOUR_LEVEL", [ semicolon, colon, uring, Uring] };
key <LWIN> { type = "ONE_LEVEL", [ Meta_L ] };
key <RWIN> { type = "ONE_LEVEL", [ Meta_R ] };
key <RALT> { type = "ONE_LEVEL", [ ISO_Level3_Shift ] };
modifier_map Mod3 { <RALT> };
};
Začneme popisovat pěkně od začátku. První řádek první slovo – default – říká, že bude-li se v souboru nacházet více rozložení, bude toto výchozí. Následující partial sděluje XKB, že jde pouze o částečnou definici rozložení, pro definování celé klávesnice musí být složena s jiným souborem. Poslední alphanumeric_keys informuje o typech kláves, které dané rozložení definuje. Druhý řádek říká, že definujeme XKB vrstvu symbols a varianta rozložení bude basic.
Následuje řádek definující jméno rozložení (Group1 v hranatých závorkách definuje jméno první skupiny). Přiřazení key.type = „THREE_LEVEL“ značí, že všechny dále definované klávesy budou mít tři úrovně. Nyní každé klávese nadefinuje tyto tři potřebné úrovně:
key <AE01> { [ 1, exclam, plus] };
kde key je klíčové slovo a za ním následuje symbolické jméno, které je definováno vrstvou keycodes. Poté následuje ve složených závorkách výraz popisující symboly přiřazené tomuto tlačítku. V našem případě to je jednička, vykřičník a znaménko plus. Můžeme též definovat i méně než tři úrovně, jež jsme si určili na začátku přiřazením key.type, tlačítko pak v kombinaci z modifikátory pro další úrovně nebude generovat žádný symbol (spustíte-li si například program xev, uvidíte, že stisk tohoto tlačítka sice bude zachycen, ale bude mu přiřazeno NoSymbol). Jednotlivá jména symbolů nalezneme v souboru /usr/X11R6/include/X11/keysymdef.h, kde jsou definována makra, jejichž jména jsou totožná se jmény symbolů, pouze mají předponu XK_.
Kromě toho můžeme v definici symbolu ještě uvést typ, pokud se liší od výchozího, pomocí klíčového slova type. To jsme použili pro definici Meta kláves a modifikátoru ISO_Level3_Shift, jež mají pouze jednu úroveň. Dále můžeme k definici symbolu přidat i dodefinování symbolů pro další skupinu apod. O tom však více v druhé části článku.
Jak již bylo řečeno, na klávesu pravý Alt jsme namapovali symbol ISO_Level3_Shift. Pokud se podíváte na definici typu THREE_LEVEL (soubor types/iso9995), vidíme, že se zde používá virtuální modifikátor LevelThree. Po dalším hledání v compat/iso9995 bychom nalezli, že tento modifikátor se zapíná právě po stisku modifikátoru ISO_Level3_Shift. Nakonec ještě pravý Alt svážeme s modifikátorem Mod3. Bohužel se mi nepodařilo zjistit důvod, proč tomu tak musí být – bez toho mi však tato klávesa nepracuje jako modifikátor a nemění úroveň kláves.
Načtení konfigurace
Po uložení výše uvedených souborů do adresáře /etc/X11/xkb/symbols pod jména např. US a CZ můžete danou konfiguraci načíst pomocí programu setxkbmap. Na tomto místě bych chtěl říci, že se mi nepodařilo provést toto nastavení jako obyčejný uživatel a dané konfigurační soubory jsem musel vytvářet jako root, v případě, že jsem něco opomněl, budu vděčný za vaše připomínky.
Pro načtení rozložení klávesnice použijte příkaz setxkbmap s volbou -symbols a za ní jméno vašeho výběru. Poněvadž obě rozložení jsou pouze částečná, kombinuji je s úplným rozložením en_US a jeho variantou pc104, což zapíšeme jako en_US(pc104). X serveru to sdělíme pomocí příkazu:
setxkbmap -symbols en_US\(pc104\)+US
kde jsme závorky uvodili tak, abychom zabránili jejich interpretaci shellem.
V druhé části článku se podíváme na několik dalších ukázek (práce se skupinami, integrační vrstvy apod) a nakonec si ještě povíme, jak přemluvit program kxkb aby vzal v úvahu naše rozložení kláves.