\"/
\"/ \"/    

Čeština v Unixu

Luděk Matyska, FI MU, ÚVT MU
Ročník IV - číslo 4, březen 1994
Citace: L. Matyska. Čeština v Unixu. Zpravodaj ÚVT MU. ISSN 1212-0901, 1994, roč. IV, č. 4, s. 4-8.
Tematické zařazení: Operační systémy, Různé
 předchozí článek | následující článek 

... aneb dlouhá cesta znaku od klávesnice k aplikaci a od aplikace na obrazovku

Klasickým způsobem komunikace s počítačem je vstup znaků prostřednictvím klávesnice. Přestože v poslední době prudce vzrůstá obliba grafických uživatelských prostředí ovládaných myší, bez klávesnice se stále neobejdeme, a to i přesto, že v principu lze veškerou komunikaci s počítačem provádět pomocí i jednotlačítkové myši1. Klávesnice stále zůstává nejefektivnějším prostředkem pro vkládání rozsáhlých textů.

Stiskneme-li klávesu klávesnice připojené k počítači, většinou neuvažujeme nad tím, co všechno se musí mezi klávesnicí a počítačem odehrát, než je příslušný znak aplikací přijat. Znalost této cesty se však stává velmi podstatnou, potřebujeme-li změnit rozložení znaků na klávesnici (např. vyměnit znaky zy), či jednoduchým způsobem vkládat znaky, které se na původní klávesnici nevyskytují (nejčastěji chceme psát v jazyce odlišném od jazyku, pro který byla klávesnice navržena: píšeme česky na americké klávesnici). Tento úkol budeme v dalším nazývat přemapování klávesnice.

Na úrovni operačního systému MS-DOS tento problém puvodne nebyl řešen, a proto se jednotlivé aplikace (editory, databáze, ...) podstatně liší ve způsobu, jakým je přemapování klávesnice řešeno (pokud vůbec). S postupujícím vývojem byl operační systém MS-DOS vybaven tzv. kódovými stránkami, ty ovšem problém v jeho celistvosti neřeší: řeší (neúplně a tedy i nedostatečně) pouze problém vstupu jazyka s rozšířenou sadou typografických znaků, avšak neřeší otázku osobního přizpůsobení klávesnice (ona zmíněná záměna některých kláves).

Přestože v původní verzi operačního systému Unix tento problém rovněž nebyl řešen2, umožnila průhlednost a (relativní) modularita tohoto systému navrhnout určité řešení v okamžiku rozšíření Unixu i za hranice Spojených států. Výhoda řešení na úrovni operačního systému je přitom okamžitě zřejmá: jednotlivé aplikace se nemusí o tuto záležitost starat (a mohou být tedy menší), uživatel si nastaví svou klávesnici jednou provždy a při přechodu mezi jednotlivými aplikacemi již nemusí uvažovat o tom, jak své nastavení znovu vyvolat (a ušetří rovněž čas, strávený jinak seznamováním se s různými systémy ovládání klávesnice).

V tomto příspěvku jsou uvedeny základy práce s prostředky pro přemapování klávesnice u operačního systému Unix. Jako příklad jsou použity příkazy dostupné v operačním systému SCO Unix, System V Release 3.2 a vyšší. Tento systém byl zvolen nikoliv proto, že by v něm použité řešení bylo nejtypičtější, jako spíše proto, že - alespoň podle mínění autora - se jedná o relativně nejlepší řešení (nepoužíváme-li grafické rozhraní). Některé další Unixy poskytují podobná rozhraní; tam, kde toto rozhraní chybí, může řešení firmy SCO sloužit jako inspirace a rovněž jako obrana proti dodavatelům, kteří tvrdí, že nic lepšího než jejich řešení neexistuje.

Scan kódy

Scan-kódy (snímané kódy) vysílané klávesnicí musí být transformovány ve znaky (případně posloupnosti znaků u funkčních kláves). Tuto činnost zajišťuje program mapkey, dílčí funkce jsou pak zajištěny i programy mapstrsetkey.

Program mapkey pracuje s přepisovací tabulkou, která je nastavitelná uživatelem. Tato tabulka má deset sloupců; první odpovídá přečtenému scan-kódu, druhý až devátý pak představuje znaky, na které má být tento scan-kód přepsán při současném držení řídících kláves (jedná se o samotný znak, znak při současném držení klávesy shift, control, control shift, alt, alt shift, control altcontrol alt shift), a desátý definuje chování při zapnuté klávese caps lock, num lockscroll lock3. Další podrobnosti je možno vyčíst z manuálových stránek věnovaných programu mapkey a popisu klávesnice keyboard.

Změnou tabulky mapkey může uživatel ovlivnit chování jednotlivých kláves na nejnižší úrovni, která je uživatelsky přístupná. Protože aplikace v Unixu nikdy nekomunikují s klávesnicí přímo (nemají na to dostatečná oprávnění), je takto jednoduše zajištěno promítnutí změny do všech používaných aplikací4.

SCO Unix dále poskytuje prostředky pro předefinování jednotlivých funkčních kláves (tj. všech kláves nereprezentujících přímo číslice nebo písmena na hlavní klávesnici). Jednak je možno hromadně předefinovat chování funkčních klíčů F1F10 (F12 u klávesnic typu AT) programem mapstr, pro běžného uživatele je však daleko zajímavější program setkey s následující syntaxí:

     setkey keynum string

Tento příkaz přiřadí funkční klávese keynum řetězec string, tj. zajistí, že při stisku klávesy se aplikaci pošle příslušný řetězec. Hodnoty keynum 1-12 odpovídají funkčním klíčům F1F12, hodnoty 13-48 pak týmž funkčním klíčům, ale při současném držení kláves shiftcontrol a jejich kombinací, od čísla 50 pak klávesám numerické (levé) části klávesnice (v jejich ne-numerické variantě, tj. při použití jako kláves pohybu kurzoru). Použitím příkazu setkey lze nejen využít funkční klíče (např. jako zkratku pro často používané příkazy), ale lze i předefinovat sekvence vysílané šipkami a dalšími znaky ovládání kurzoru (tato vlastnost může být velmi užitečná, používáme-li konzolu pro komunikaci se vzdáleným počítačem, který předpokládá nejen naprosto odlišné rozložení znaků na klávesnici, ale i zcela odlišné escape sekvence).

Překlad znaků

Přemapování scan-kódů programem mapkey je sice dostatečně univerzální, neřeší však všechny problémy, které se mohou vynořit při vstupu znaků národních abeced. Kromě toho je program mapkey použitelný pouze při komunikaci z konzoly (tj. z klávesnice přímo připojené k počítači), není však použitelný při komunikaci přes terminály, ať již připojené přímo k počítači (i když některé terminály jsou již schopné vysílat scan-kódy a tak emulovat chování konzoly), nebo připojené prostřednictvím počítačové sítě (běžně dostupné emulační programy scan-kódy nepřenášejí).

Pro tento účel byl v SCO Unixu implementován program mapchan, který je určen k přemapování znaků na znaky. Program mapchan tedy funguje analogicky jako program mapkey, ovšem pouze na úrovni jednotlivých znaků (tj. např. nerozezná držení klávesy shift, ovšem rozlišuje mezi malým a velkým a). Kromě této základní činnosti, tj. přepsání znaku x znakem y, však program mapchan plní ještě dvě podstatné funkce: zajišťuje existenci tzv. mrtvých kláves a mapuje znaky posílané aplikací na obrazovku5. Mrtvé klávesy jsou používány k realizaci akcentů (znaků čárka, háček apod.), kdy požadované písmeno skládáme postupným stiskem klávesy pro akcent (kdy se nezobrazuje nic - odtud pojem mrtvý znak) a vlastní klávesy znaku, k němuž chceme akcent připojit.

Jediným zjevným nedostatkem programu mapchan je jednak omezená velikost tabulky a rovněž nemožnost přepínat mezi různými přepisovacími tabulkami bez explicitního volání programu.

Zobrazení

Problematika mapování obrazovky je poněkud složitější - doposud zmíněné programy sice umožňují manipulaci se znaky vstupovanými klávesnicí, načtené znaky je však nutno rovněž zobrazit na obrazovce terminálu. Pouhé přeskládání znaků na klávesnici potíže nedělá, ovšem jakmile přidáme nový znak, musíme též zajistit, aby byl zobrazitelný. V praxi to většinou znamená použít nový font s novými znaky. Nebudeme se v této souvislosti zabývat otázkou tvorby nových znaků a budeme předpokládat, že příslušný font již máme k dispozici. Zavedení fontu do ovladače obrazovky zajišťuje v SCO Unixu program vidi, obdobné programy je možno nalézt ve všech Unixech pracujících s alfanumerickými terminály (a konzolou).

Pokud nové znaky leží ve fontu na stejných pozicích jako v používaném kódování (tj. použijeme-li např. tabulku ISO LATIN2 pro rozložení znaků s akcenty jak při vytváření tabulky mapchan, tak při vytváření fontu), pak je náš úkol u konce a můžeme začít používat i nové znaky. Komplikace se však objeví, jakmile při definici fontu používáme jiné rozložení znaků než při definici mapování do souboru (používáme např. kód ISO LATIN2, ale máme font s českými znaky pouze v kódu bratří Kamenických). V tomto případě je možno opět použít programu mapchan, tentokrát pro zpětné mapování, tj. pro překlad znaků, posílaných aplikací na obrazovku. Na rozdíl od předchozích možností překladu znaků je v tomto případě možno jeden znak nahradit celou posloupností znaků - to je vhodné zejména při práci se skutečnými terminály, kde znaky s akcenty vybíráme z jiného fontu než základního a pro zobrazení jednotlivých znaků musíme použít posloupnost typu: přepni do nového fontu, zobraz znak, přepni do původního fontu (takto může být situace řešena např. u terminálů Wyse 60).

Čeština

Uvedené prostředky mohou být snadno použity pro definici standardní české klávesnice. Jakmile je k dispozici font s českými znaky pro používanou obrazovku (většinou typu VGA), je možno použít fontů z MS-DOSu; jediným skutečným problémem je rozhodnutí, jak se přepínat zpět na původní znaky klávesnice. Jedním z možných řešení je použití klíče alt, který pak používáme obdobně jako klíč shift. Pro tento účel musíme modifikovat tabulku mapkey tak, aby klávesy, které mají být přemapovány, vysílaly při současném držení klávesy alt jiné znaky, než bez ní. Vhodným kandidátem jsou znaky s nastaveným osmým bitem, které se běžně nepoužívají. Tabulka mapchan pak tyto znaky přemapuje do původních znaků jednotlivých kláves.

Toto řešení, přes svou jednoduchost a jistou eleganci, však není univerzální - řada terminálů klávesu alt buď vůbec nezná, nebo je její použitelnost silně omezena (je funkční jen s určitou podmnožinou ostatních kláves). Toto řešení je rovněž nepoužitelné při přístupu přes počítačovou síť a obecně všude tam, kde není možno předefinovat reakci na scan-kódy. V tomto případě je pak vhodné použití mrtvých kláves, kdy "dvojitý" akcent vede k původnímu znaku (ý s další čárkou reprezentuje znak &).

Vytváříme-li font s českými znaky, měli bychom nejen zachovat spodní polovinu ASCII tabulky (tj. především znaky s čísly 32-126), ale i ty části rozšířené ASCII tabulky, které jsou používány většinou aplikací - znaky, z nichž jsou konstruovány rámečky. Použití programu mapchan však naštěstí umožňuje definovat a používat zcela speciální rozložení znaků v obrazovkovém fontu při zachování plné kompatibility s ostatními. To, co se předává mezi jednotlivými uživateli, jsou soubory, nikoliv mapování obrazovky. Lze proto jediný font s českými znaky používat i tam, kde běžně pracujeme se soubory v různém kódování národní abecedy (případně i pokud pracujeme s více národními abecedami, pokud je ovšem možno všechny znaky umístit do jediného fontu).

Závěr

Jak jsme mohli vidět, nabízí operační systém SCO Unix poměrně bohaté prostředky pro přemapovávání klávesnice a obrazovky, a tedy i pro implementaci jak vlastního rozložení znaků na klávesnici, tak i pro zavedení nových znaků a tím implementaci komunikace v národních abecedách. Neexistence obdobných prostředků v některých verzích Unixu je ve většině případů pouze důkazem toho, že se uvedená verze tohoto operačního systému ještě příliš nezabydlela v mnohojazyčném prostředí Evropy. Řešení realizované firmou SCO však může sloužit jako inspirace tam, kde jsou k dispozici zdrojové texty systému, a je tedy možno systém dále rozšiřovat.

Program a tabulky mapchan lze použít pro komunikaci českou abecedou i při přístupu k počítači s SCO Unixem přes síť - v podstatě stačí, aby byl zaručen oboustranný přenos znaků s nenulovým osmým bitem a aby byla lokálně k dispozici obrazovka s českými znaky (např. zavedením vhodného fontu). Veškeré přemapování lze pak svěřit programu mapchan na vzdáleném počítači.

Zcela samostatnou kapitolu v této souvislosti tvoří grafická uživatelská prostředí (X/Window systém, OpenWindow, Motif, ...), kde tvůrci těchto systémů předpokládají, že se komunikace s celým grafickým prostředím odehrává v jediném jazyce (tj. nepředpokládají, že by uživatel v různých oknech komunikoval různým jazykem a měl tedy i různě definovanou klávesnici). Přes toto zásadní omezení je možno i v těchto systémech použít obdobná řešení, jaká jsou prezentována v právě končícím příspěvku.

Na závěr jen malou poznámku: aby toto vše fungovalo, musí to vámi používané aplikace též používat. Přestože se jedná o implementaci standardů POSIX, existuje stále ještě řada aplikací (zejména ty, které jsou přebírány přímo ze Spojených států), které implementují vlastní manipulaci s klávesnicí a tak efektivně tyto standardy ignorují.

setting
1 Takovým extrémem může být např. komunikace lékařů zemí západní Evropy a Ameriky s počítačem: je pod důstojnost jejich stavu dotknout se klávesnice (to je totiž práce pro sekretářku - pravděpodobně by protestovaly i odbory).
... zpět do textu
2 Z obdobných důvodů jako při vzniku MS-DOSu: američtí tvůrci něco takového vůbec nepotřebovali a nepředpokládali, že by to potřeboval někdo jiný.
... zpět do textu
3 Na rozdíl od MS-DOSu není možno v SCO Unixu rozlišit stisk a uvolnění klávesy; uvolnění je vždy ignorováno.
... zpět do textu
4 Toto tvrzení není zcela pravdivé - aplikace má možnost předefinovat tabulku mapkey a tím efektivně anulovat změnu. Dobře napsaná aplikace to však nikdy nedělá.
... zpět do textu
5 Pro tento účel je na úrovni programu mapkey k dispozici program mapscrn, ten však neumí pracovat s víceznakovými sekvencemi.
... zpět do textu
Zpět na začátek
ÚVT MU, poslední změna 14.11.2011