Pro lokalizaci textové konzole je třeba nastavit ovladač klávesnice, aby generoval kódy znaků podle požadovaného rozložení kláves, a ovladač displeje, aby umožňoval zobrazování národních znaků včetně písmen s diakritikou (s akcenty).
Ačkoli jádro Linuxu podporuje od verze 1.3.? Unicode umožňující současné používání nejen všech možných písmen s akcenty, ale i téměř všech světových abeced, v současnosti stále převažuje využívání osmibitových kódování.
Pro češtinu, slovenštinu, polštinu, maďarštinu, rumunštinu, slovinštinu, chorvatštinu, albánštinu a další východoevropské jazyky psané latinkou je určena znaková sada ISO-8859-2, známá také pod názvem ISO LATIN-2. Západoevropské jazyky naproti tomu používají kódování ISO-8859-1. Obě tato kódování jsou rozšířením kódu ASCII a shodují se i v některých dalších znacích, takže ISO-8859-2 lze používat například i pro němčinu.
Přestože kódování ISO-8859-2 je pro zmíněné jazyky mezinárodním standardem a preferovaným kódováním, v mnoha neunixových systémech se používají jiná kódování; v MS-Windows sada Windows-1250, která se bohužel v několika znacích odlišuje od ISO-8859-2, v systému MS-DOS, jeho klonech i v DOSových oknech MS-Windows kódová stránka 852 nazývaná též PC LATIN-2, která má ne-ASCII znaky kódovány zcela odlišně. Další kódování se používají v jednotlivých zemích (v České republice a na Slovensku je stále populární sada Kamenických), na jiných operačních systémech (Macintosh), pro některá zařízení (tiskárny) i programy (kódování Cork v TeXu).
Zatímco znaková sada ISO-8859-2 je určena pro několik jazyků,
rozložení klávesnice je pro každý jazyk jiné. Standardní česká nebo
slovenská klávesnice pro PC vycházející z českého psacího stroje je pro
psaní textů, v nichž se vyskytují speciální "počítačové" znaky, dosti
nepohodlná. Proto mnoho lidí používá různé "programátorské klávesnice",
které bohužel nejsou standardizovány a jak ukázaly diskuse v konferenci
linux
, širší dohoda o jejich rozložení je téměř vyloučena.
Při zkoušení klávesnice nezapomeňte, že mnoha programům je třeba pomoci, aby pracovaly s osmibitovými znaky --- kapitola Lokalizace různých aplikací. Problémy by neměly být s editorem vi, proto nově nainstalovanou klávesnici testujte nejdříve v tomto editoru v režimu vkládání znaků.
Distribuce, kterou používáte, může mít podporu pro české prostředí už zabudovanou. Proto je vhodné nahlédnout nejprve do kapitoly Jak počeštit různé distribuce a postupy popsané v následujících odstavcích zkoušet teprve pokud nenaleznete jednodušší řešení tam.
ISO-8859-2 fonty pro konzolu a program setfont, kterým se zavádí, jsou součástí balíku kbd už od dávných verzí Linuxu. Pokud v některé distribuci balík kbd není, je možné jej získat například na ftp://ftp.muni.cz/pub/linux/system/keyboards/kbd-0.96.tar.gz.
Pro adaptéry VGA a lepší stačí zavést font příkazem
setfont lat2-16.psf
(nikoli lat2-08.psf
výšky 8, jak je doporučováno v dokumentaci
k cs-tools), pro adaptéry EGA je vhodný font lat2-14.psf
(může
někdo potvrdit, že na adaptéru EGA program setfont funguje?). V novějších
verzích kbd jsou pro ISO-8859-2 k dispozici ještě fonty iso02*
.
Pokud není použit program vtfontd, zavedení fontu se projeví na všech
virtuálních terminálech (konzolách).
Pokud na vašem systému není mapa české klávesnice, lze použít část balíku
cs-tools
ftp://ftp.muni.cz/pub/localization/linux/obsolete/cs-tools/cs-tools-0.19.tar.gz.
Soubory *.map
z adresáře console
z tohoto balíku je
třeba zkopírovat do adresáře /usr/lib/kbd/keytables
. Zvolená
mapa klávesnice se pak zavede příkazem
loadkeys cz-lat2
v některém ze startovacích skriptů. V distribuci Red Hat stačí uvést
řádek KEYTABLE v souboru /etc/sysconfig/keyboard
:
KEYTABLE="cz-prog"
Klávesnice fungují jako americké, do českého režimu se přepnou stisknutím klávesy Pause nebo držením klávesy AltGr (pravý Alt). Pro zpětné přepnutí lze použít opět Pause nebo držení AltGr.
Klávesnice z kbd údajně nefungují s jádry vývojové řady 2.1.x. Na počítačích s vývojovými jádry je nutné používat balík ucw popsaný dále.
Při stisku klávesy, při držení v rytmu autorepeatu a při uvolnění
klávesy generuje klávesnice na počítačích PC přerušení IRQ 1. Jádro
načítá z portu 0x60 tak zvané scankódy kláves, což je jeden nebo celá
posloupnost bytů. Například při stisku klávesy 'q' bude načteno 0x10
(16 desítkově), při uvolnění kód o 0x80 větší, tedy 0x90. Některé
klávesy, jako např. Delete posílají dvoubajtové escape-scankódy 0xe0,
0xNN, klávesa Pause posloupnost 0xe1, 0x1d, 0x45. Jádro nejdříve
scankódy převádí na tak zvané keykódy (funkce getkeycode
v drivers/char/keyboard.c
--- docela zajímavé čtení). Toto
mapování lze měnit i na uživatelské úrovni, ale to má význam
snad jenom při používání exotického hardware. Pro národní klávesnice je
zajímavé další mapování, při němž se keykódy převádějí na kódy znaků.
Od jádra verze 0.99pl10 lze implicitní mapu
drivers/char/defkeymap.map
měnit.
Tento balík využívá schopnosti jádra Linuxu pracovat se znaky v kódování Unicode. Pro zobrazování se používá zvláštní textový režim adaptérů EGA/VGA, který umožňuje současně zobrazit 512 různých znaků. Jako devátý bit kódu znaku se používá bit 3 barevných atributů. Tak je možné zobrazovat všechny znaky podle kódování ISO-8859-1 i ISO-8859-2 současně s rámečky, které mohou být na pozicích 0xB0 až 0xDF, pro něž adaptér VGA zdvojuje levý sloupec, aby byla šířka znaku 9 bodů. V budoucnosti by měl být použit grafický režim. Díky tomu se tento balík elegantně vyrovnává s problémy popsanými v kapitole Rámečky v~programech MC & spol. se zobrazují špatně.
Balík se nachází na
ftp://atrey.karlin.mff.cuni.cz/pub/local/mj/linux/ucw-cs-1.1.tar.gz,
jeho popis je na
http://atrey.karlin.mff.cuni.cz/~mj/linuxcs/.
Po rozbalení balíku se přepněte do adresáře ucw-cs-1.1
a zadejte
install -c -o root -g root -m 644 fonts/* /usr/lib/kbd/consolefonts
install -c -o root -g root -m 644 keymaps/* /usr/lib/kbd/keytables
install -c -o root -g root -m 755 mapscrnuni/mapscrnuni /usr/local/bin
install -c -o root -g root -m 644 mapscrnuni/latin2.table /usr/lib/kbd/consoletrans
do startovacích skriptů /etc/rc*
je nutné přidat příkazy
setfont ucw16.psf
mapscrnuni < /usr/lib/kbd/consoletrans/latin2.table
loadkeys cs-head cz-type cs-compose
a do souborů /etc/profile
a /etc/csh.cshrc
nebo
$HOME/.bashrc
a $HOME/.cshrc
, případně do
/etc/issue
je nutné přidat příkaz, který zajistí přepnutí na
uživatelské mapování obrazovky:
/bin/echo -en "\033(K"
Pokud se při spuštění programu loadkeys objeví chybové hlášení jako
Keymap 12: Permission denied
je nutné zadat tento příkaz jako root. Zdá se, že loadkeys spuštěný obyčejným uživatelem neumí zvětšit konverzní tabulku pro klávesnici v jádře, a výsledkem je zmíněné hlášení.
Balík je zajímavý tím, že mapa klávesnice je rozdělena do několika
souborů, které příkaz loadkeys
spojí a zavede jako jednu mapu.
Na místě cz-type.map
(český psací stroj) lze použít
cs-ucw.map
(písmena s akcenty se píšou se stisknutým Caps Lock),
cz-prog.map
(česká programátorská), sk-type.map
(slovenský psací stroj) nebo sk-prog.map
(slovenská
programátorská), podle toho, komu co vyhovuje.
U některých X-serverů dojde při přepnutí z virtuálního terminálu do X a zpět k vypadnutí konzolového fontu. Situaci lze řešit opětovným ručním zavedením fontu, nebo je možné použít program vtfontd - ftp://ftp.excom.spb.su/pub/linux/Utils/Console/vtfontd-1.0.1.tar.gz, který také umožňuje používat na jednotlivých konzolách různé fonty.
Inu tento problém vlastně ani není problémem, je to samozřejmost,
protože v mc nejsme na virtuální konzole, ale na normálním terminálu
ttypx, tudíž nemáme právo použít ioctl PIO_FONT, protože nejsme ani
vlastníkem tty, ani superuživatelem (drivers/char/vt.c
řádek
212 --- opět velmi zajímavé čtení).
Při používání některých programů (jako například Midnight Commanderu)
bývají problémy se zobrazováním rámečků. U Midnight Commanderu je možné
použít parametr -a
, který způsobí, že mc bude pro zobrazování
rámečků používat ASCII znaky +
, -
a |
, což sice
nepůsobí příliš esteticky, ale je to rozhodně lepší, než když se místo
rámečků zobrazují písmena.
Vzhledem k tomu, že programy používající čárovou grafiku jako MC nebo MenuConfig jádra, jsou po nainstalování českých fontů na textovou konzolu Linuxu nečitelné, je nutné použít font, který tyto rámečky obsahuje, a upravit nastavení databází termcap a terminfo. Již upravené databáze jsou ke stažení na URL http://linux-cz.inecnet.cz/ftp/mc/.
Tyto databáze je nutno zkopírovat termcap
do /etc/termcap
a terminfo
do /usr/lib/terminfo/l/linux
a znovu se
přihlásit. Ke konverzi mezi zdrojovou a binární podobou
terminfo slouží příkazy infocmp a tic. I potom mohou být problémy
způsobené tím, že u videoadaptéru VGA jsou znaky s kódy 0xB0 až 0xDF
vyhrazeny pro rámečky a VGA při zobrazování zdvojuje pravý sloupec každého
z těchto znaků, aby se dosáhlo šířky znaku 9 pixelů, ale u znakových sad
ISO-8859-2 jsou na těchto pozicích běžné znaky. Elegantním řešením je
použití unikódových fontů Martina Mareše popsaných v kapitole
ucw
.
Pokud nepoužíváte klávesnici, která umožňuje přepínání mezi dvěma režimy (čeština nebo slovenština a angličtina), můžete pro přepínání používat následující dva skripty, které zajistí i přepnutí fontů.
loadkeys cz-lat2
setfont lat2-16.psf
loadkeys us
setfont
Skripty budou samozřejmě fungovat pouze tehdy, budete-li mít nainstalovánu podporu národní klávesnice a ISO-8859-2 znaky pro konzolu. Přitom je nutné pamatovat, že zatímco klávesnice se přepíná pouze pro jednu virtuální konzolu, fonty (není-li použito vtfontd) se přepínají pro všechny.
Příčinou může být, že text je v jiném kódování. Text je třeba překódovat pomocí utility cstocs popsané v kapitole cstocs do kódování ISO-8859-2 a poté jej prohlížet a editovat standardním způsobem. Nebo případně, vznikl-li tento font na jednom z Billových produktů, můžete použít k prohlížení font upravený tak, aby zobrazoval správně české znaky, jak v kódování CP1250 (Windoze), tak i ISO-8859-2 (unixové OS). Tento font opět najdete někde na ftp://ftp.inet.cz/.
Vzhled fontů z balíku kbd je dost špatný, velká písmena s akcenty jsou nižší než bez akcentů, pokud si chce někdo vytvořit vlastní font, může mu pomoci tento popis:
Soubory s fontem jsou umístěny v /usr/lib/kbd/consolefonts
.
Používají se dva formáty těchto souborů, formát psf, který je popsán
v souboru
file:/usr/lib/kbd/consolefonts/psffiles.doc, a ještě
jednodušší formát, který nepoužívá žádnou hlavičku, a soubory obsahují
prostě obrazy všech 256 znaků uložených v pořadí podle kódů znaků.
Pro každý znak z fontu je v souboru tolik bytů, kolik bodů je výška
fontu (včetně volných řádků nahoře a dole; nejčastěji 8 až 16 bodů),
první byte odpovídá hornímu řádku znaku. Každý znak má šířku 8 bodů,
nejvyšší bit se zobrazuje vlevo.
Je také možné použít editor fontů chedit, který se nachází na ftp://ftp.fi.muni.cz/pub/linux/apps/misc/chedit.tar.gz. Je poněkud zastaralý a umí editovat pouze fonty ve formátu psf.
Obě české klávesové mapy, tedy cz-lat2.map
i
cz-lat2-prog.map
, mají standardní rozložení qwerty, jste-li
zvyklí na rozložení qwertz, není nic jednoduššího než zaměnit písmenka
'y' a 'z' v klávesové mapě, tedy v souboru cz-lat2.map
, případně
cz-lat2-prog.map
:
...
keycode 21 = z
...
keycode 44 = y
...
Ano, tento dvojhmat je mým prvním stisknutím klávesnice, jestliže jsem nucen
sedět u počítače s Billovým OS. (Doufám, že se autoři skutečných operačních
systému neurazí.) Slouží k přepnutí se mezi primární a sekundární
klávesnicí. Pro některé skalní příznivce firmy SoftMicro jsem přichystal
úpravu cz-lat2.map
:
upravíme řádek s keycode 42 (klávesa Shift)
keycode 42 = Shift Shift Shift Shift Shift Shift Shift Shift AltGr_Lock\
Shift AltGr_Lock Shift Shift Shift Shift Shift Shift
...vše samozřejmě na jednom řádku. Potom již bude kombinace LeftShift+LeftAlt fungovat stejně jako klávesa Pause, tedy pro přepínání klávesnic.