3. Nastavenia konzoly

Táto kapitola by mala čítavou, poučnou a zároveň zábavnou formou pojednávať o veciach medzi prstom a okom. Základnou otázkou nech nám je „Zmysel života, vesmíru a vôbec.“

3.1. Slovenčina na výstupe textovej konzoly

3.1.2. Ako fonty fungujú

Existuje niekoľko súborových formátov na ukladanie fontov, princíp je však rovnaký -- súbor obsahuje 256 obrázkov (glyphs), z ktorých všetky majú rovnaký rozmer (napr. 8x16 bodov -- veľkosť fontu) a každý zobrazuje jeden znak.

Aby nám tých 256 obrázkov bolo na niečo dobrých, je treba font zo súboru zaviesť do znakového generátora videokarty. Na to slúži jeden z príkazov

meno-fontu môže byť absolútna alebo relatívna cesta k súboru s fontom, alebo meno súboru, pokiaľ sa nachádza v adresári /usr/lib/kbd/consolefonts/, či už s príponou, alebo bez.

Pre ľahšie pochopenie tých obrázkov, skúste nahradiť meno-fontu reťazcom t850 a sledujte výsledok na všetkých virtuálnych konzolách.

Naspäť k štandardnému fontu sa vždy dostanete jedným z príkazov

Čo sa presne deje? Program setfont/consolechars zavedie všetkých 256 obrázkov do znakového generátora EGA/VGA karty. Od tohto momentu sa na všetkých konzolách bude znak s ASCII kódom napr. 65 vykreslovať ako šesdesiaty piaty obrázok z našeho súboru s fontom. Ešte raz pripomínam a dvakrát podčiarkujem, že font je vždy rovnaký pre všetky virtuálne konzoly, na ktorých zobrazuje znaky ten istý znakový generátor EGA/VGA karty.

Dôležité je uvedomiť si, že interne ide naozaj len o obrázky a tvar niektorého znaku vo fonte nemá nič spoločného s jeho ASCII kódom. Ak by ste si sami vytvorili nejaký font (v dokumentácii ku kbd/console-tools máte informácie o všetkých formátoch), v ktorom by mal ten šesdesiaty piaty obrázok tvar písmena z, po jeho natiahnutí sa vám bude pri zadaní Alt-6-5, čo je ASCII kód písmena A, zobrazovať znak z. Ale ak tento znak uložíte do súboru, v tomto sa bude nachádzať bajt s hodnotou 65, teda písmeno A.

3.1.3. Fonty ISO-8859-2

Toto využíva štandard ISO-8859-2 (a iné) - spoločné znaky s ASCII vykreslí rovnako a znaky špecifické pre tú ktorú abecedu „namapuje“ na menej používané znaky ASCII tabuľky. Kam presne ktorá norma umiestňuje znaky s diakritikou, nás zaujímať nemusí (pokiaľ nevytvárame vlastné fonty), hlavné je, že napr. anglický text je nezmenený (angličtina má všetky znaky spoločné so slovenčinou) a slovenský text už viac neobsahuje hlúpe znaky, ktoré so slovenčinou nemajú nič spoločné.

Slovenské (ISO-8859-2) fonty, ktoré sú súčasťou balíkov kbd a console-tools:

Na zavedenie fontu použite príkaz

Odporúčam používať lat2a-16, resp. lat2u-16. Ostatné fonty majú bezchybné zobrazovanie slovenských znakov, problém však nastáva pri aplikáciách, ktoré využívajú znaky na kreslenie rámčekov (napr. mc).

Čo sa týka fontov iso02.* z balíka kbd, treba pri nich použiť argument príkazu setfont -m latin2u.trans. Takže celý príkaz na zavedenie niektorého z týchto fontov je:

V súbore latin2u.trans (iso02.acm) sa nachádza tzv. Aplication-Charset Map (ACM), akási prevodná tabuľka, ktorá obsahuje riadok pre každý znak fontu a jeho podobu v kódovaní UTF-8.

3.1.4. Automatické zavádzanie fontov

Ak ste si našli svoj font, ktorý chcete používať a mať ho automaticky zavedený vždy pri štarte, nie je nič ľahšie. Inicializačný skript rc.sysinit robí asi toto: skontroluje, či existuje súbor /etc/sysconfig/i18n a program (skript) /sbin/setsysfont. Ak áno, spustí setsysfont. Ten načíta /etc/sysinfo/i18n a podľa premenných definovaných v tomto súbore príkazom consolechars alebo setfont zavedie font.

Takže stačí nastaviť správne premenné v súbore /etc/sysconfig/i18n a skript /sbin/setsysfont urobí všetko za nás. Tento skript možno spustiť kedykoľvek chcete zaviesť font nastavený ako štandardný pre systém.

Premenné v súbore /etc/sysinit/i18n sú (používajte len mená súborov bez cesty a bez prípony!):

Skriptík setsysfont obsahujú oba balíky a kedykoľvek môžete zaviesť font nastavený ako systémový v súbore /etc/sysinit/i18n jednoduchým zadaním
sh$ /sbin/setsysfont
	

Podľa toho, čo sme si hovorili o tom, že pre všetky virtuálne konzoly môže byť nastavený len jeden spoločný font, nemá veľký zmysel zavádzať nastavovanie fontu zvlášť pre každého užívateľa. S tým súvisí aj fakt, že nastavenie fontu sa vzťahuje k danému počítaču, pri ktorom práve sedíte a nie k tomu, ku ktorému ste pripojení napr. cez ssh.

Predsa len si viem predstaviť prípad, keď niektorý z viacerých používateľov jedného počítača potrebuje odlišný font. V tom prípade môže vložiť príkaz na zavádzanie fontov do svojich skriptov, ktoré vykonáva shell pri prihlásení a odhlásení. Pre bash by to mohlo vyzerať takto:

Vonkoncom to nie je ideálne riešenie, ale svoj účel splní (minimálne po moment prvého odhlásenia). Trochu sa s tým pozabávajte, aby sa font (a rozloženie kláves) menilo len pri prvom prihlásení a poslednom odhlásení, tiež setfont pod iXami nemá veľmi zmysel a tak... V Tips-HOWTO je uvedený spôsob, ako zistiť, na koľkých virtuálnych konzolách je ešte užívateľ prihlásený.

Ináč, aby bolo jasné, toto vám bude fungovať len na lokálnom stroji - zamyslite sa, prečo asi setfont (aj loadkeys) nefunguje cez vzdialený terminál a či by ste z toho niečo mali, keby to tak nebolo.

Ak to s takýmto riešením myslíte vážne, tak skôr uvažujte nad modifikáciou skriptu /etc/profile.d/lang.sh, kde by sa kontroloval aj obsah užívateľského súboru ~/.i18n a podľa toho by sa zaviedol skript, popis rozloženia kláves, prípadne nejaké premenné...

3.2. Slovenská klávesnica na textovej konzole

Keď je slovenský font na konzole rozbehaný a naše národné znaky sa zobrazujú správne, máme so slovenčinou problém číslo dva - ako tam tie znaky dostať? Keby ste si chceli tento súbor len prečítať bez potreby následnej navštevy psychiatra, stačilo by zaviesť nejaký font so slovenskou podporou. Ale keďže ste uvedomelý linuxák / uvedomelá linuxáčka, hneď chcete do Slovak-HOWTO prispieť a pomocou klávesnice písať slovenský text. Na to potrebujete s tou klávesnicou niečo urobiť.

3.2.1. Popis rozloženia kláves (keymap)

Adresáre /usr/lib/kbd/keymaps/i386/qwertz/ a qwerty/ obsahujú po nainštalovaní balíka kbd/console-tools aj popisy slovenského rozloženia kláves. Pre nás sú zaujímavé súbory

sk-prog-qwerty.map.gz
sk-qwerty.map.gz
sk-prog-qwertz.map.gz
sk-qwertz.map.gz

Tieto súbory obsahujú definície rozloženia kláves pre slovenský jazyk, pričom rozdiely medzi nimi sú v umiestnení kláves Y a Z a počte slovenských znakov, ktoré pomocou nich možno napísať priamo (bez mŕtvych kláves). Najviac sa na slovenský písací stroj podobá sk-qwertz, najmenšie zmeny oproti americkej klávesnici sú zase v sk-prog-qwerty.

Súbory v adresári /usr/lib/kbd/keymaps/i386/include/ obsahujú popis základných rozložení kláves (azerty , qwerty, qwertz ), prídavných kláves (keypad, windowkeys), prípadne problémových kláves ( delete, backspace, ctrl ). Súbory linux-*.inc.gz sú špecifické pre linux (teda nie pre jazyk). Sú to napr. kľúče (F1-F12, kombinovaním s Ctrl a Shift až po F48), Shift-PgUp a Shift -PgDown, atď.

Keymapy *.inc.gz nepopisujú kompletné rozloženie klávesnice, ale len niektorých jej častí. Využívajú sa pri pripájaní (include) zo súborov *.map.gz, čo je výhodné z dôvodu jednoduchšej konfigurácie klávesnice. Napríklad zmenou jedného riadku v súbore s rozložením sk-qwerty môžme dostať rozloženie qwertz, prípadne (to asi využijete) jednoducho odstaviť znaky euro a cent, ktoré (zatiaľ?) nepotrebujeme a zbytočne nám zaberajú znaky E a C.

Na zavedenie súboru s popisom rozloženia kláves slúži nasledovný príkaz:

loadkeys nazov

kde nazov môže byť absolútna alebo relatívna cesta ku keymap súboru, alebo meno súboru, pokiaľ sa nachádza v adresári /usr/lib/kbd/keymaps/, či už s príponou, alebo bez.

Štandardné slovenské popisy rozloženia kláves nájdeme vo vyššie spomínaných *.map.gz súboroch. Ak sa chcete vrátiť k štandardnému rozloženiu, príkaz
sh$ loadkeys -d
	
zavedie pôvodné, ktoré je uložené v súbore defkeymap.map.gz niekde medzi ostatnými keymap súbormi. Predtým ale nikdy nezabudnite zmeniť režim slovenskej klávesnice na US znaky, tzn. 1 dáva 1 a nie + atď. Ak by ste predsa zabudli, je možné, že klávesy, kde sa nachádzali slovenské znaky, nebudú fungovať správne (v skutočnosti budú fungovať správne, ale vám sa to nebude páčiť). Vtedy znovu zaveďte predchadzájúcu keymapu (na nefunkčné klávesy použite AltGr - pravý Alt) a klávesou Pause/Break všetko napravíte. Potom môžete znova zaviesť defkeymap.

Pokiaľ sa vám nepáči ani jeden zo štandardných keymap súborov pre slovenčinu, čo je pravdepodobné vďaka riadku
include "euro"
	
v include súboroch qwerty-layout.inc.gz aj qwertz-layout.inc.gz, môžete kľudne pozmeniť existujúci súbor s popisom rozloženia kláves, prípadne vytvoriť nový. Nebojte sa, je to zložité! Nebudem to tu rozpisovať všetko, prezrite si zopár kmap súborov, prečítajte manuálovú stránku keymaps(5) a mali by ste to ľahko pochopiť.

My si povieme len o základných veciach, ktoré nám pomôžu pozmeniť existujúce kmap súbory s popismi slovenských klávesníc, aby ste si poradili s (mne známymi) komplikáciami, alebo upravili rozloženie kláves podľa svojho gusta.

3.2.3. Keycode a definovanie kláves

Predchádzajúci problém s eurom možno vyriešiť aj definovaním znakov E a C v samotnom súbore sk-qwerty.kmap.gz (alebo inom, ktorý používate) pomocou slova keycode:
keycode 18 = e
keycode 46 = c
	

V keymap súboroch je pre každú klávesu (alebo aspoň pre každú, ktorú chceme predefinovať) jeden riadok približne tohto razenia:
keycode 3 = two at lcaron two nul nul nul nul Meta_two Meta_two...
	

Číslo za keycode označuje určitú klávesu a reťazce za = hovoria o tom, aký znak má ovládač klávesnice generovať pri stlačení tejto klávesy, a to buď samotnej, alebo v kombinácii so špeciálnymi klávesmi Shift, AltGr, Control, Alt, ShiftL, ShiftR, Ctrl a CtrlR. To nám dáva 256 možných znakov na každú klávesu.

Väčšinou sa pozmeňuje len prvých 16 kombinácií modifikátorov. To je význam riadku
keymaps 0-15
	
na začiatku kmap súborov.

V nasledujúcom zozname je týchto 16 kombinácií (po riadkoch):

žiadnyShiftAltGrShift-AltGr
ControlShift-ControlAltGr-ControlShift-AltGr-Control
AltShift-AltAltGr-AltShift-AltGr-Alt
Control-AltShift-Control-AltAltGr-Control-AltShift-AltGr-Control-Alt

Z hľadiska slovenskej klávesnice sú dôležité len prvé štyri - prvé dva sú zvyčajne nezmenené americké znaky, napr. two at, čo je 2 @, a druhé dva sú znaky slovenskej abecedy, ktoré bude ovládač klávesnice posielať aplikáciám ak pri stlačení tejto klávesy budeme súčasne držať klávesu AltGr (pravý Alt), napr. lcaron two, čo je naše ľ 2.

Aby ste mohli vkladať slovenské znaky, nemusíte celý čas pridržiavať AltGr nosom, ale môžete použiť Pause/Break, ktorý v kontexte s národnými klávesnicami funguje ako AltGr Lock. Chápte to tak, že keď sa prepnete do slovenského režimu stlačením Pause/Break, prvé a druhé dva reťazce v každom riadku keycode sa vymenia, napr.
two at lcaron two -> lcaron two two at
	

Vtedy môžete použiť AltGr na zadávanie znakov americkej klávesnice, alebo sa opätovným stlačením Pause/Break prepnúť spät do US režimu.

Riadok pre klávesu s kódom 41 (znaky ` a ~), má v súbore sk-qwerty.map.gz nasledovný tvar:
keycode 41 = grave asciitilde dead_diaeresis dead_circumflex ...
	

Mne osobne sa nepáči, že sú tu umiestnené mŕtve klávesy dead_diaeresis (dve bodky nad znakom) a dead_circumflex (mäkčeň), pretože ich nepotrebujem --- ä aj ô na slovenskej klávesnici predsa je. A keby aj nebolo, na ich písanie môžem kľudne použiť mŕtvy kláves mäkčeň. O tom si bližšie povieme v časti o compose sekvenciách. Teraz chcem mať na tomto mieste znaky ; (semicolon) a ° (degree) tak, ako je to na popiske mojej klávesnice. Zmením teda riadok takto:
keycode 41 = grave asciitilde semicolon degree ...
	

Ináč, ten stupeň asi nie je stupeň, ale mŕtvy znak krúžku nad písmenom, napr. v češtine nad u, ale taký kláves je nám fakt nanič. Radšej budeme písať stupne.

Názvy znakov, ktoré sa používajú pri definovaní jednotlivých kláves si môžete pre znaky ASCII zistiť v súbore us.map.gz. Číselné kódy všetkých kláves vám vypľuje program

showkey

Pravidlá pre názvy znakov špecifických pre slovenčinu v kmap súboroch:

  1. Prvé písmeno v názve určuje ASCII znak, pre ktorý chceme použiť diakritiku.

  2. K nemu pridáme identifikátor diakritického znamienka:

    caron --- mäkčeň
    acute --- dĺžeň
    diaeresis --- dve bodky nad
    circumflex --- vokáň

    Napríklad:

    scaron = š
    uacute = ú
    Ocircumflex = Ô

Názvy ďalších znakov špecifických pre slovenčinu:

0xa7 --- § (paragraf)
degree --- ° stupeň

Pre správnu interpretáciu identifikátorov znakov s diakritikou je nutné na začiatku kmap súboru určiť kódovú stránku, pre ktorú bude určený tento popis rozloženia kláves. Ide o to, že ten istý znak môže mať v rôznych kódových stránkach iný ASCII kód. Implicitná hodnota je iso-8859-1, teda pre slovenské keymapy je nutné vložiť riadok:
charset "iso-8859-2"
	

Ešte jeden príklad: ak chcete používať slovenské rozloženie qwertz a americké rozloženie qwerty, potrebujete vymeniť znaky Y a Z:
keycode 21 = y Y z Z
keycode 44 = z Z y Y
	

Na prvý pohľad to môže fungovať dobre, ale problém sa prejaví pri zapnutom Caps Lock - znaky Y a Z sa stále píšu malými písmenami. Pri písaní popisov rozložení znakov možno takýto problém ošetriť pridaním písmena + pred každé písmeno v keycode riadku danej klávesy. Písmeno + určuje nasledovnému písmenu atribút letter, teda sa bude pri stlačenom Caps Lock písať veľké písmeno. Všetky písmená a-z, A-Z majú tento atribút priradený automaticky, ale to len v prípade, že majú keycode riadok tvaru:
keycode 21 = y
	

V našom prípade teda musíme priradiť tento atribút všetkým znakom explicitne. Takže, konečná úprava keymapy bude:
keycode 21 = +y +Y +z +Z
keycode 44 = +z +Z +y +Y
	

Pre výmenu písmen toto riešenie funguje spoľahlivo, bohužiaľ, ešte stále neexistuje spôsob, ktorým by sa dalo dosiahnuť napríklad písanie veľkých písmen s diakritikou pri zapnutom Caps Lock jednoduchým stláčaním ich kláves, ako je to v slovenskom popise rozloženia kláves pre X Window System.

3.2.4. Mŕtve klávesy a sekvencie compose

S mŕtvymi klávesami súvisia v kmap súboroch riadky tvaru
compose 'c1' 'c2' to 'c3'
	

Predstavme si mŕtve znaky ako úplne obyčajné znaky s tým rozdielom, že ovládač klávesnice ich neposiela aplikáciám, ale zostanú niekde „visieť“, kým z klávesnice nepríde ďalší znak. Ovládač klávesnice nepošle ani tento, ale pokúsi sa spojiť ho s predchádzajúcim mŕtvym znakom a až výsledok spojenia pustí ďalej. No, a ako má to spojenie uskutočniť, to mu presne hovoria riadky compose v keymap súboroch.

V nasledujúcej tabuľke je zoznam mŕtvych znakov používaných v slovenčine, spolu s významom a znakom, ktorým sa označujú v compose sekvenciách.

Postup pri písani compose sekvencií

  1. Každá compose sekvencia sa začína kľúčovým slovom compose.

  2. Nasleduje compose znak mŕtvej klávesy (podľa tabuľky Mŕtve klávesy), napríklad \'.

    Druhý je znak, s ktorým chceme mŕtvu klávesu kombinovať, napríklad A.

    Za kľúčovým slovom to nasleduje výsledok spojenia mŕtvej klávesy a znaku bez diakritiky, teda Á.

Je praktické mať pri vytváraní compose sekvencií zavedený slovenský font, aby ste výsledok mohli hneď kontrolovať. Veľkou pomocou je tiež možnosť príkazu loadkeys čítať zo štandardného vstupu. Napríklad:
sh$ loadkeys
include "/usr/lib/kbd/keymaps/i386/include/windowkeys.map.gz"
keycode 41 = grave asciitilde semicolon dead_diaeresis
compose '"' 'a' to 'ä'
# ukončenie zadávania:  EOF  -  Ctrl-D
sh$
	

Popis aktuálneho rozloženia kláves môžete uložiť do súboru príkazom
sh$ dumpkeys > subor
	

Ak nemáte zavedený slovenský popis rozloženia kláves, musíte zadávať tieto znaky ako Alt sekvencie, poprípade vkladať ich hex kódy v tvare 0xed pre í. Výpis znakov aktuálneho fontu spolu s ich hex kódmi vám urobí program

kbd:

showfont

console-tools:

showcfont

Ešte raz naša compose sekvencia a nejaké navyše:
compose '\'' 'A' to 'Á'   # dlhé A cez dĺžeň
compose '^'  'O' to 'Ô'   # O s vokáňom cez mäkčeň
compose '^'  'a' to 'ä'   # široké a cez mäkčeň,
compose '^'  'A' to 0x84  # ...preto nepotrebujeme dead_diaeresis
	

Mimochodom, v súbore /usr/lib/kbd/keymaps/compose/compose.latin2 máte zoznam compose sekvencií pre normu ISO-8859-2.

3.2.5. Automatické zavádzanie keymap súboru

Na nastavenie rozloženia klávesnice, ktoré chceme zaviesť pri štarte systému, nám slúži súbor /etc/sysconfig/keyboard. Pre Slováka ako repa by mal vyzerať minimálne takto:
KEYTABLE=sk-qwerty     # zavedie rozloženie kláves sk-qwerty
KBCHARSET=iso-8859-2   # ...a spomínaný súbor compose.latin2
	

Nastavenie klávesnice pri štarte má na starosti skript keytable, ktorý je volaný priamo z rc.sysinit, takže netreba vytvárať linky v adresároch pre runlevel 3/multiuser, prípadne 5/X.

V dokumentácii k initscripts sa píše: „Ak uložíte popis rozloženia kláves (použitím dumpkeys) do súboru /etc/sysconfig/console/default.kmap, zavedie sa pri štarte systému ešte pred pripájaním/kontrolou súborových systémov. To môže byť užitočné, ak potrebujete zadať heslo roota v prípade problémov. Musí to byť ‚dumpnutý‘ popis rozloženia kláves a nie skopírovaný súbor z /usr/lib/kbd/keytables/, pretože tie často ešte vkladajú (include) iné popisy z tejto adresárovej štruktúry.“

Po pripojení súborových systémov, v prípade, že existuje spustiteľný súbor /etc/rc.d/init.d/keytable a adresár /usr/lib/kbd/keymaps/, vykoná sa príkaz
sh# /etc/rc.d/init.d/keytable start
	

Tento už zavedie popis rozloženia kláves tak, ako to máte určené premennými v súbore /etc/sysconfig/keyboard, preto nemusíte vytvárať odkazy v jednotlivých rc[1-5].d/ adresároch.

To, čo sme si hovorili o zmene fontu pri prihlásení nejakého užívateľa na virtuálnej konzole, sa dá aplikovať aj na rozloženie kláves. Úplne najjednoduchšie riešenie (ktoré sa pri prvom odhlásení pošle do kríkov) je asi takéto:

3.3. Zhrnutie nastavení konzoly

Pokiaľ som sa niekde nesekol, tak minimálne v distribúciách RedHat a Mandrake by po týchto zmenách mala do pohody zašlapať slovenská podpora (fonty + klávesnica).

Tiež, ak zadávate rootovské heslo s použitím iného rozloženia kláves ako je štandardné (us), vložte si jeho popis do súboru /etc/sysconfig/console/default.kmap. Pozor, nesmiete len tak skopírovať súbor, alebo vytvoriť link! Ak chcete použiť napríklad rozloženie sk-qwertz, urobte to takto:
sh$ loadkeys sk-qwertz
sh# dumpkeys >/etc/sysconfig/console/default.kmap
      

Ak chcete nastaviť slovenský font a klávesnicu len jednorazovo, tieto príkazy by to mali dokázať:

...a naspäť na štandardné nastavenia: