3. Nastavenia konzoly

3.1 Slovenčina na výstupe textovej 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 "Ako, do šľaka, mám prinútiť svoju mašinu, aby mi žrala slovenské znaky z klávesnice a aby mi ich tiež aj vypľúvala na obrazovku?! To všetko v textovom režime!"

Fonty

Keď zobudíte o polnoci hocikoho, kto vo svojom živote videl počítač a opýtate sa ho, ako rozbehať slovenské znaky, určite spomenie niečo ako fonty. Totiž, aj malé decko vie, že na zobrazovanie znakov na obrazovku -- či už v textovom alebo grafickom režime -- slúžia fonty. Fonty pre konzolu a programy určené na manipuláciu s nimi sa nachádzajú v balíku kbd. Po jeho nainštalovaní sú súbory s fontami umiestnené v adresári /usr/lib/kbd/consolefonts. Pozor, tento balík sa volá kbd, ale obsahuje aj záležitosti spojené s fontami a preto sa v distribúciách označuje ako console-tools.

Pre nás sú dôležité najmä súbory, ktoré majú v mene iso02, lat2, latin2 alebo číslo 852. To naznačuje, že ide o fonty s podporou iso-8859-2 (latin2), alebo DOS codepage 852, čo sú štandardy aj pre slovenskú diakritiku.

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 príkaz

setfont meno-fontu
kde 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 príkazom setfont bez parametrov.

Čo sa presne deje? Program 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 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(65), čo je pri štandardnom fonte písmeno `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'.

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 console-tools:

lat2-08      lat2-10      lat2-12      lat2-14      lat2-16
lat2a-16
iso02.08    iso02.14    iso02.16

Na zavedenie fontu použite príkaz

setfont meno-zo-zonamu

Asi ``najlepší'' z týchto fontov je lat2a-16, fonty lat2-* vám zase umožnia pohrať sa s počtom riadkov a stĺpcov konzoly (aj keď na to sú aj lepšie spôsoby). Čo sa týka iso02.*, neviem o čo ide, pre slovenčinu sú prakticky nepoužiteľné.

...na prvý pohľad. Treba pri nich totiž použit argument príkazu setfont -m, ktorého hodnota udáva súbor s poradím znakov v danom fonte. Pre fonty iso02.f* je to súbor latin2u.trans. Takže celý príkaz na zavedenie niektorého z týchto fontov je:

setfont iso02.16 -m latin2u.trans

Ostatné spominané fonty už obsahujú svoje vlastné mapovacie tabuľky.

Automatické zavadzanie 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 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!):

SYSFONT=lat2a-16

(staršie console-tools)
SYSFONT=lat2u-16
SYSFONTACM=iso02

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í. 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:

~/.bash_profile:
        if ! [ -f ~/.font ]; then
                setfont -o ~/.font gr928a-8x16
        fi

~/.bash_logout:
        if [ -f ~/.font ]; then
                setfont ~/.font
                rm -f ~/.font
        fi

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... Ináč, aby bolo jasné, toto vám bude fungovať len na lokálnom stroji -- zamyslite sa, prečo je asi setfont (aj loadkeys) zakázaný cez vzdialený terminál a či by ste z toho niečo mali, keby nebol.

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 bol napríklad tento subor napísaný s diakritikou a vy by ste si ho chceli len prečítať bez potreby následnej navštevy psychiatra, stačilo by zaviesť nejaký font so slovenskou podporou. Ale ak chcete sami pomocou klávesnice písať slovenský text, potrebujete s tou klávesnicou niečo urobiť.

Popis rozloženia kláves (keymap)

Adresáre /usr/lib/kbd/keymaps/i386/qwertz/ a qwerty/ obsahujú po nainštalovaní balíka console-tools (kbd) 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/PgDn používané na scroll up/dn, 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é jednak z dôvodu šetrenia miestom na disku, ale hlavne 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íkazom

loadkeys -d
sa vždy môžete vrátiť k pôvodnému, ktoré je uložené v súbore defkeymap.map.gz niekde medzi ostatnými keymap súbormi. Predtým ale nikdy nezabudnite zmenit 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ájucú keymapu (na nefunkčné klávesy použite AltGr -- pravý Alt) a klávesou Pause/Break všetko napravíte. Potom môžete zaviesť defkeymap bez nebezpečenstva straty svojprávnosti.

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, ktore 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.

Include a nesprávna funkcia kláves `E' a `C'

(Tento problém je už minulosťou, ale čo mám robiť, keď sú teraz rozloženia takmer bezchybné?! Nejako vám to musím vysvetliť!)

Problém s `E' a `C' je spôsobený zavedením jednotnej meny v európskej únii. Na vine nie je ani tak EU, ale niekto, kto symboly pre Euro a Cent umiestnil na AltGr+E a AltGr+C, čo sú naše obyčajné `E' a `C'. Totiž, národné klávesnice sú väčšinou riešené tak, že po zavedení súboru naďalej funguje americké rozloženie a na prepínanie do národného režimu sa používa klávesa Pause, alebo môžme zadávať národné klávesy pri súčasnom držaní klávesy AltGr (pravý Alt). Súbor euro.inc, ktorý definuje tieto dva problemové symboly, je pripojený zo súboru qwerty-layout.inc, ktorý zase pripájajú samotné slovenské keymapy (sk-qwerty, sk-prog-qwertz, ...). A takto sa dostala definícia Euro a Cent na slovenskú klávesnicu.

Riešenie je brutálne jednoduché -- zeditujete qwerty-layout.inc (alebo qwertz-layout.inc) a odkomentujete znakom # riadok

include "euro"

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 ...
kde čí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, CtrlL a CtrlR. To nám dava 256 možných znakov na každú klávesu. Väčšinou sa pozmeňuje len prvých 16 kombinácii modifikátorov (to je význam riadku keymaps 0-15 na začiatku kmap súborov). V nasledujúcej tabuľke je týchto 16 kombinácii (po riadkoch!):
žiadny                   Shift                    AltGr
Shift+AltGr              Control                  Shift+Control
AltGr+Control            Shift+AltGr+Control      Alt
Shift+Alt                AltGr+Alt                Shift+AltGr+Alt
Control+Alt              Shift+Control+Alt        AltGr+Control+Alt
Shift+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
a vtedy mož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 nul...

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. Teraz chcem mať na tomto mieste znaky bodkočiarka (semicolon) a stupeň (degree) tak, ako je to na popiske mojej klávesnice. Zmením teda riadok takto:

keycode 41 = grave asciitilde semicolon degree nul ...

(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č.)

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.: scaron = š, uacute = ú, Ocircumflex = Ô

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

0xa7 = paragraf   degree = stupeň

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.

názov               význam            compose

dead_acute          dĺžeň             \'
dead_circumflex     mäkčeň            ^
dead_diaeresis      dve bodky nad     "

Postup pri písani compose sekvencií:

  1. Tvárte, že ste úplný mumák a neviete, že daný znak s diakritikou ešte nemáte definovaný a jednoducho chcete zadať tento znak použitím mŕtvej klávesy.
  2. Akože omylom (hi-hi) napíšte na začiatok riadku slovo compose.
  3. Prvý bude compose znak mŕtvej klávesy (podľa tabuľky), napríklad '\'', druhý je znak, s ktorým chcete mŕtvu klávesu kombinovať, napríklad 'A', a tretim bude vysledok, 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:

~$ 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
~$ 

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

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í (ak ho máte) program

showcfont

Ešte raz naša compose sekvencia a nejaké navyše:

compose '\'' 'A' to 'Á'     # dlhé A cez dĺžeň
compose '^'  'O' to 'Ô'     # definícia O s vokáňom cez mäkčeň
compose '^'  'a' to 'ä'     # definícia širokého 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.

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.

Je tu malý chyták, pretože inicializačný skript rc.sysinit najskôr skúsi zaviesť súbor /etc/sysconfig/console/default.kmap a keytable sa volá len v prípade, že sa tento súbor nepodarilo nájsť. Takže, buď zmažte/premenujte súbor default.kmap alebo doň vložte svoj popis rozloženia kláves.

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:

~/.bash_profile:
        if ! [ -f ~/.keymap ]; then
                dumpkeys > ~/.keymap
                loadkeys gr.map
        fi

~/.bash_logout:
        if [ -f ~/.keymap ]; then
                loadkeys ~/.keymap
                rm -f ~/.keymap
        fi

Kompilácia kernelu so slovenskou klávesnicou

Je veľmi jednoduché zmeniť rozloženie kláves, s ktorým bude jadro vášho operačného systému skompilované. Ak použijete program loadkeys s voľbou príkazoveho riadku --mktable <keymapfile>, tento vám vygeneruje `zdrojový kód' súboru <keymapfile>. Ten uložte do súboru drivers/char/defkeymap.c v adresárovej štruktúre zdrojového kódu Linuxu.

cd /usr/src/linux
loadkeys --mktable sk-qwerty > drivers/char/defkeymap.c

Po kompilácii kernelu a jeho nabootovaní vás čaká operačný systém s podporou slovečiny od head po tail.

3.3 Zhrnutie nastavení konzoly

Pokiaľ som sa niekde nesekol, tak minimálne na RedHate a Mandraku by po týchto zmenách mala do pohody zašlapať slovenská podpora (fonty + klávesnica).

/etc/sysconfig/i18n:
        SYSFONT=lat2a-16

/etc/sysconfig/keyboard:
        KEYTABLE=sk-qwertz
        KBCHARSET=iso-8859-2

Tiež by ste mali premenovať súbor /etc/sysconfig/console/default.kmap alebo doň vložiť slovenský popis klávesnice alebo z neho urobiť linku na takýto popis.

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

setfont lat2a-16
loadkeys sk-qwertz

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

setsysfont
loadkeys -d


Dopredu Dozadu Obsah