Úprava klávesovej mapy v X11

05.11.2023 | 18:09 | Mirecove dristy | Miroslav Bendík

Pri programovaní používam paradoxne slovenskú klávesnicu. Pozícia väčšiny špeciálnych kláves mi vyhovuje viac na Slovenskej klávesnici, ale nájdu sa tu výnimky. Preto som sa rozhodol o malú úpravu klávesovej mapy.

Nedávno sa podobný článok k úprave klávesovej mapy objavil na abclinuxu. Nepáči sa mi však spôsob aplikácie klávesovej mapy, ako aj veľká náročnosť postupu. Preto by som sa chcel podeliť o trocha jednoduchší spôsob, ktorý dovoľuje nastaviť klávesovú mapu aj globálne.

Ako fungujú klávesové mapy v X11

Na začiatok pripomeniem, že nastavenie klávesovej mapy sa robí príkazom setxkbmap mapa. Nasledujúcim príkazom sa nastaví slovenská klávesnica s rozložením qwerty: setxkbmap sk -variant qwerty.

Pre pochopenie, čo sa stalo sa pozrime na výpis setxkbmap -print:

xkb_keymap {
	xkb_keycodes  { include "evdev+aliases(qwertz)"	};
	xkb_types     { include "complete"	};
	xkb_compat    { include "complete"	};
	xkb_symbols   { include "pc+sk(qwerty)+inet(evdev)"	};
	xkb_geometry  { include "pc(pc105)"	};
};

Jednotlivé časti výpisu odkazujú na súbory v adresári /usr/share/X11/xkb. Napríklad položka evdev v xkb_keycodes znamená, že mapovanie z hardvérových kódov na X11 kódy definuje súbor keycodes/evdev v adresári /usr/share/X11/xkb.

Najzaujímavejšia položka je xkb_symbols, ktorá definuje, ako bude X11 reagovať na klávesy. Ide o zoznam súborov z adresára symbols oddelený znakom +. Súbory môžu mať modifikátory, napríklad qwerty.

Zoznam symbolov obsahuje niektoré súbory, ktoré neboli nikde špecifikované. Ako teda funguje mapovanie príkazu setxkbmap do konkrétneho zoznamu v xkb_symbols? Odpoveď nájdeme v adresári rules.

Ako najčistejšie riešenie sa mi zdalo vytvoriť si vlastný variant klávesnice, niečo ako sk(qwerty,supermap), ale tu som narazil na problém, že neexistuje spôsob, ako rozšíriť pravidlá v adresári rules. Jednoducho zoznam súborov je napevno zakompilovaný do setxkbmap, preto by bola nutná editácia už existujúcich súborov, čo by znamenalo, že pri aktualizácii sa to zase vráti do pôvodného stavu.

Vytvorenie vlastného súboru symbolov

Chcel som vytvoriť vlastný súbor symbolov, ktorý mal jedinú modifikáciu oproti pôvodnej klávesovej mape - symbol bodkočiarky na skratke AltGr + K. Tým by som sa zbavil nepríjemného stláčania bodkočiarky na SK klávesnici.

Želaná klávesová mapa
Obrázok 1: Želaná klávesová mapa

Vytvorenie vlastnej klávesovej mapy, ktorá je založená na existujúcej mape je veľmi jednoduché. Stačí vytvoriť nový súbor v adresári symbols s názvom napríklad supermap s nasledujúcim obsahom:

partial alphanumeric_keys modifier_keys
xkb_symbols "qwerty" {
	include "sk(qwerty)"
};

Súbor je možné jednoducho načítať príkazom setxkbmap supermap -variant qwerty. Úspešné načítanie môžeme prekontrolovať príkazom setxkbmap -print:

xkb_keymap {
	xkb_keycodes  { include "evdev+aliases(qwerty)"	};
	xkb_types     { include "complete"	};
	xkb_compat    { include "complete"	};
	xkb_symbols   { include "pc+supermap(qwerty)+inet(evdev)"	};
	xkb_geometry  { include "pc(pc105)"	};
};

Nakoniec zostáva doplniť úpravu mapy. Pre inšpiráciu sa pozrime do súboru sk z adresára symbols. Chcem upraviť klávesu K, ktorý sa nachádza v slovenskej mape na tomto riadku:

    key <ac08>  { [         k,          K,      lstroke,     NoSymbol ] };
</ac08>

Zostáva len upraviť lstroke symbolom semicolon. Takto vyzerá kompletný supermap súbor s náhradou klávesy:

partial alphanumeric_keys modifier_keys
xkb_symbols "qwerty" {
	include "sk(qwerty)"

	key <ac08>  { [         k,          K,      semicolon,     NoSymbol ] };
};
</ac08>

Po načítaní mapy setxkbmap supermap -variant qwerty začne AltGr + K fungovať ako bodkočiarka.

Globálne nastavenia

Zostáva už len nastaviť správnu klávesovú mapu automaticky po štarte X11. Ja používam priamo nastavenie v /etc/X11/xorg.conf.d a nemám žiaden applet na prepínanie. Takto vyzerá najjednoduchšie nastavenie:

Section "InputClass"
	Identifier "Keyboard"
	MatchIsKeyboard "on"
	Option "XkbLayout" "supermap"
	Option "XkbVariant" "qwerty"
EndSection

Moje (dosť šialené nastavenie)

Ok, ja používam trochu zložitejšie nastavenie a preto tu dávam konkrétne moje nastavenie. Je šialené, ale možno niekoho inšpiruje:

Section "InputClass"
	Identifier "Keyboard"
	MatchIsKeyboard "on"
	Option "XkbLayout" "supermap,us"
	Option "XkbOptions" "grp:ctrls_toggle,grp_led:scroll,terminate:ctrl_alt_bksp,keypad:pointerkeys,caps:escape,shift:both_capslock"
	Option "XkbVariant" "qwerty,"
	Option "XkbModel" "microsoftprooem"
	Option "AutoRepeat" "175 13"
EndSection

Na začiatku mám 2 definície layoutu. Prvou je moja klávesnica s variantom qwerty a druhou je štandardná anglická klávesnica.

Prepínanie klávesnice je mapované na oba klávesy Ctrl (grp:ctrls_toggle). Alternatívnu klávesovú mapu indikujem LED scroll lock (grp_led:scroll). Ďalej povoľujem zabitie X11 pomocou starej známej skratky Ctrl+Alt+Backspace (terminate:ctrl_alt_bksp). Niekedy nemám žiadne polohovacie zariadenie, takže mám mapované Shift-Numlock na ovládanie myši (keypad:pointerkeys). Ako používateľ vimu často potrebujem stláčať Esc, preto som ho namapoval na CapsLock (caps:escape). Niekedy sa však hodí, napríklad pre písanie konštánt, preto som namapoval CapsLock na obe klávesy Shift súčasne (shift:both_capslock).

    • RE: Úprava klávesovej mapy v X11 06.11.2023 | 17:35
      Avatar Richard Antix  Používateľ

      Ja osobne používam rozloženie, 

      • kde horný rad je klasika SK (+ľščťžýáíé=´), a pôvodné EN znaky !@#$%^&*´˝ zadávam cez AltGr
      • rozloženie Qwerty, ale
      • ale napravo od "P" mám ()\, so shiftom {}|, s AltGr úäň, so shiftom+AltGr: [])
      • ale napravo od "L" mám ;', so shiftom :", s AltGr ô!, so shiftom+AltGr:
      • ale napravo od "M" mám ,./, so shiftom <>?, s AltGr ?:-, so shiftom+AltGr: ×÷_

       

      Podstatou je, aby som pri programovaní i bežnom SK písaní mal všetky znaky, bez prepínania layoutu.

      A znaky ako úäňô radšej zadám s AltGr. Hlavne, aby som pre zadávanie ();'\,./ nemusel používať shift.

       

      A namiesto obskurného CapsLock mám namapovaný Hyper. Ten používam v Emacse ako ďalší modifikátor, poneváč tých nikdy nie je dostatok (vo funkcii "leader key", takže sa nejedná o stlačenie klávesov naraz, ale postupne, napr. <hyper>, potom <a> , potom <c> , a potom <l>  spustí príkaz na kopírovanie viditeľného riadku (výber sa volí zadaním jeho poradového znaku) na pozíciu kurzora. Takto to znie neuveriteľne komplikovane, ale v praxi je to intuitívne a rýchle.)