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!"
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.
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'.
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.
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.
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ť.
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.
(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"
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:
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ň
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í:
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.
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
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.
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