AMIGA REVIEW online
  Uvodná stránka     Software     Hry     Obaly     Download     Kniha návštev     Amiga na PC     Amiga Forever  

Řídící znaky v shellu

Petr Mareš

Pokud si myslíte, že běžnému uživateli tento článek nic nepřinese, asi nemáte pravdu.

V dobách, kdy světem frčely BBS, se slovo ANSI ve významu řídících znaků skloňovalo ve všech pádech. ANSI se sice neskloňuje, ale z toho si nic nedělejte. O co se jedná? Řídícími znaky (neboli taky escape sekvencemi) jsou posloupnosti znaků, které se při vypisování na obrazovce neobjeví, místo toho však nějakým způsobem ovlivní další výstup. V našem případě se bude vše odehrávat v okně shellu, popřípadě v jiném okně zařízení CON:. Pokud ještě nevíte o co se jedná, otevřete si shell a zkuste napsat toto:

Echo „*E[4m“

Pokud jde vše v pořádku, vše, co se nyní napíše do tohoto shellu, bude podtrženo. Nedivil bych se, kdyby se vám to nelíbilo. Zrušte to příkazem

Echo „*E[24m“

a pokračujte ve čtení. Myslím si, že už máte zhruba představu o čem mluvím, a tak vám prozradím, k čemu všemu se to dá použít.

Co s tím?
Můžete si tím nastavit barvy písma a pozadí. Písmo tak můžete změnit na tučné, kurzívu, či podtržené.
Naučíte se měnit pozici textového kurzoru na obrazovce, umazávat z okna text a posouvat obsahem okna.
Můžete měnit parametry celého okna.
Pokud si s tím opravdu pohrajete, můžete do shellu kreslit i barevné obrázky.

Jak na to?
Změna stylu a barvy písma je v podstatě jednoduchá. Dokumentuje to následující přehled.
*E[3Xm změní barvu popředí na X, namísto X dosaďte číslo od 0 do 7.
*E[4Xm změní barvu pozadí na X, X je z rozsahu 0 až 7.
*E[0m zruší kurzívu, podtržení a tučnost písma a nastaví standardní barvy písma.
*E[1m nastaví tučné písmo.
*E[2m zapne světlou barvu písma.
*E[3m další znaky se budou vypisovat kurzívou.
*E[4m písmo bude podtržené.
*E[7m zapne inverzní vypisování písma. Barva písma se stane barvou pozadí a pozadí bude mít barvu písma. Pokud pak budete nastavovat barvy písma a podkladu jinými řídícími znaky, bude se nastavovat vždy opačná složka.
*E[8m tak tento kód je veliká magie. Písmo se stane neviditelným. Veškeré změny barev a stylů písma se projeví teprve po vypnutí tohoto módu.
Všechny tyto módy se ruší kódem *E[0m, nebo tím samým kódem, jen před číslici v kódu dejte dvojku. Například kurzívu vypnete pomocí *E[23m. Jediná výjimka je vypnutí tučného písma, které se spolu s vysvícením vypíná *E[22m.
*E[X@ na místo kurzoru vsune X mezer, přičemž znaky pod a vpravo od kurzoru posune o stejný počet znaků doprava.
*E[XA posune kurzor o X řádků nahoru. X může být i vícemístné číslo. Pokud X neuvedete, kurzor se posune jen o jednu pozici.
*E[XB posune kurzor o X řádků dolů. Obdoba *E[XA.
*E[XC posune kurzor doprava o X znaků.
*E[XD posouvá kurzor doleva.
*E[XE posune kurzor X znaků dolů a nastaví ho na první sloupec.
*E[XF posune kurzor X znaků nahoru a nastaví ho na první sloupec.
*E[X; YH nastaví kurzor na řádek X a sloupec Y
*E[J smaže znaky od aktuální pozice do konce obrazovky.
*E[K smaže znaky od aktuální pozice do konce řádku.
*E[XL vsune X řádků před aktuální řádek. Řádky pod ním se odsunou dolů.
*E[XM smaže X řádků pod kurzorem, opak předchozí sekvence.
*E[XP smaže X znaků pod kurzorem, opak *E[X@.
*E[XS posune celý obsah okna o X řádků nahoru.
*E[XT posune celý obsah okna o X řádků dolů.
*E[20l změní chování klávesy ENTER, po každém odřádkování se kurzor posune dolů, ale ne na začátek řádku.
*E[20h napraví chování způsobené sekvencí *E[201.
Následující znaky sice nejsou čistokrevné escape sekvence, ale určitě se mohou také hodit.
Stříška před písmenem znamená, že se znak píše s podrženou klávesou CTRL.
^J nám v shellu odřádkuje, s tím rozdílem, že příkaz, který jsme právě odklepli, se ještě neprovede a shell nám umožní zadat další příkazy. Tyto příkazy se pak provedou hromadně po normálním odřádkování klávesou RETURN. Toto má význam třeba tehdy, pokud nechceme, aby nám shell hned po prvním příkazu odscrolloval vypsaný text.
^M má v shellu stejný význam jako klávesa Enter
^I je obyčejný tabulátor
^G blikne obrazovkou popř. zahraje výstražný sampl - záleží na nastavení preferencí
^L je znak pro vypsání další stránky, v shellu se smaže okno
^N způsobí, že se k ASCII hodnotě následujících znaků bude přičítat 128.
^O vrátí stav způsobený ^N do pořádku
^W sice není řídící znak, ale při editaci v shellu smaže slovo vlevo od kurzoru, což se může hodit.
*N v argumentu příkazu zamění shell na znak konce řádku. Aby se nahrazení provedlo, musí být argument v uvozovkách.

Nastavování parametrů okna
Začneme od něčeho jednoduššího. Pokud jste si všimli, v původním shell-startupu od Commodoru jsou nadefinované aliasy pro zapnutí a vypnutí inverzních barev v okně. Toto bychom zařídit ještě neuměli, protože neumíme změnit barvu pozadí okna. Na to slouží jedna šikovná sekvence *E[>Xm, která nastaví barvu pozadí okna na barvu X.
Pokud jste zatím vše pochytili a baví vás to, mám pro vás opravdovou lahůdku. Existují řídící znaky, které umí posouvat začátek obsahu okna s přesností jednoho bodu! Slouží k tomu sekvence *E[Ax a *E[By. Za A dosaďte počet bodů od levého okraje a místo B napište, kolik bodů od samotného vrchu okna má začínat text uvnitř shellu. Pokud si tedy třeba myslíte, že vám je titulní lišta okna na nic, jde zařídit, aby tam prostě nebyla. To vám ukážu později v příkladech.
Pokud zjistíte, že byste chtěli mít obsah okna na stejném místě jako na začátku, vypište *E[x a *E[y a okno se vám posune tak, jak bylo původně. Posouvání obsahu okna má jednu zajímavou vlastnost. Pokud aktivní oblast v shellu zmenšíte, zůstanou na okraji okna nepřekreslené stopy po obsahu okna. Tímto způsobem by se dal nakreslit osmibarevný obrázek v rozlišení, které má aktuální obrazovka.
Teď už víte skoro všechno, ale než se dáte do experimentování, podívejte se na trochu teorie a na pár příkladů.

Jak to v shellu funguje.
Shell v příkazu echo „*E[1m“ změní *E na znak ESC, což je ASCII znak 27. Pokud však z nějakých příčin nemůžete použít klávesu ESC, zmáčkněte CTRL-[.
Pokud chcete mít zápis sekvencí co nejkratší, použijte shlukování. U řetězců, které mají na začátku *E[ a na konci stejný ukončovací znak (například m), můžete po těle příkazu napsat středník a tělo dalšího příkazu a tak dále. Ukončíte to všechno příslušným ukončovacím znakem.
Například tímto příkazem vypíšete text, který bude bílý a zároveň podtržený.

Echo „*E[32; 4mPodtržené bílé písmo. *E[0m“

Takto můžeme shlukovat sekvence se stejným ukončovacím znakem donekonečna.
Ted vám ukážu, jak dosáhnout největšího shellu, jaký se na obrazovku ještě vejde. Samozřejmě pomocí escape sekvencí. Okno shellu otevřeme příkazem

NewShell „CON:0/0/2000/-1//NOSIZE/NOCLOSE/NODEPTH/NODRAG/NOBORDER“ FROM s:bss

a do souboru s:bss dáme

Execute S: Shell-Startup
Echo „*E[0x *E[0y „ NOLINE
Echo „*E[0;0H*E[J“ NOLINE

Nejdříve se otevře okno bez okrajů, bez gadgetů a neposouvatelné a přes celou obrazovku, provedou se obvyklé inicializační akce, shellu povíme, kde má kreslit vnitřek a okno přemažeme. Tento shell má tu nevýhodu, že pokud ztratí a znovu získá fokus, systém se snaží nějak zvýraznit nově aktivované okno a trochu nám rozhodí barvy na prvních dvou řádcích.
Pokud chceme vytvořit aliasy s escape sekvencemi, stačí před každou uvozovkou napsat hvězdičku, aby nebyla interpretována shellem hned při zavádění aliasu. Tady vám nějaké užitečné aliasy napíšu.

alias cls „echo *“*E[0;0H*E[J*“ NOLINE“
alias rev „echo *“*E[>1m*E[30;47m *E[0;0H*E[J*“ NOLINE“
alias nor „echo *“*E[>0m*E[31;40m *E[0;0H*E[J*“ NOLINE“

Cls slouží pro obyčejné smazání obrazovky, což by se dalo udělat i jednodušeji, pokud bychom vypisovali znak CTRL-L. Rev zapne inverzní display a nor ho vrátí do pořádku.
Následující příklad vám trochu přiblíží použití řídících kódů ve skriptech. V tomto příkladě budeme dosazovat shellovskou proměnnou do sequence, bude to $ { x } a $ { y } .

set x 3
set y 11
lab loop
echo noline „*e[${x}x*e[${y}y“
echo „*E[>${x}m *E{30;41m*E[0; 0H*E[J“
set x eval $x+3
set y eval $y+2
echo noline „*e[${x}x*e[${y}y“
echo „*E[>0m*E[31;40m*E[0;0H*E[J“
set x eval $x+3
set y eval $y+2
IF 20 GT $x VAL
skip loop back
EndIF

Tento skriptík udělá v na okraji okna shellu pár tenkých barevných proužků, což se sice asi nedá použít na nic užitečného, ale je to hezké. Na podobném principu by se dal nakreslit jakýkoliv až osmibarevný obrázek v jemném rozlišení, délka tohoto ANSI souboru by však byla mnohem větší, než podoba obrázku v IFF. Princip, na jakém by kreslení tohoto obrázku fungovalo, si lépe uvědomíte po spuštění následujícího scriptu:

set x 20
lab loop
echo noline „*e[${x}x*e[${x}y“
set x eval $x + 1
skip loop back

Prográmek posunuje obsah okna po jednom bodě doprava a dolů, při čemž zanechává na levém a na horním okraji stopu po písmenech. Schválně si to zkuste napsat.
Jiné použití těchto kódů může být v promptu (text na začátku příkazového řádku). Pokud chceme mít prompt nějak barevně odlišen, můžeme ESCape sekvence použít i tam. Uvedu příklad, který vypisuje tučně návratový kód posledního spuštěného příkazu.

Prompt „*E[1m%R.*E[22m%S>“

Pokud nechcete mít barevný, nebo jinak odlišný prompt, může se vám hodit pokaždé zrušit styl písma pomoci *E[0m, pak máte jistotu, že ten prompt vždy přečtete.
Jako poslední příklad vám uvedu malou animaci ujíždějícího tanku. Program není vůbec složitý a stopne se stisknutím CTRL-D.

Lab loop
Echo „___*E[5D*E[B /__===*E[9D*E[B ooooo*E[2A*E[5D“ NOLINE
Skip loop BACK

Jak je vidět, s řídícími kódy se dá dělat mnoho. No řekněte sami, nebyla by to paráda mít demo, které se spouští v shellu pomocí příkazu Type Demo.txt?
Příjemnou zábavu.

Vytlačiť článok


© ATLANTIDA Publishing Všechna práva vyhrazena.
Žádna část nesmí být reprodukována nebo jinak šířena bez písemného svolení vydavatele.



Amiga na Vašem PC rychle, snadno a zdarma!


none

AMIGA REVIEW

57 ( 11-12 / 2000 )
56 ( 9-10 / 2000 )
55 ( 7-8 / 2000 )
54 ( 5-6 / 2000 )
53 ( 3-4 / 2000 )
52 ( 1-2 / 2000 )
 
51 ( 12 / 1999 )
50 ( 11 / 1999 )
49 ( 10 / 1999 )
48 ( 9 / 1999 )
46-47 ( 7-8 / 1999 )
45 ( 6 / 1999 )
44 ( 5 / 1999 )
43 ( 4 / 1999 )
42 ( 3 / 1999 )
41 ( 2 / 1999 )
40 ( 1 / 1999 )
 
39 ( 12 / 1998 )
38 ( 11 / 1998 )
37 ( 10 / 1998 )
36 ( 9 / 1998 )
35 ( x / 1998 )
34 ( x / 1998 )
33 ( 1-2 / 1998 )
 
32 ( 11-12 / 1997 )
31 ( 9-10 / 1997 )
30 ( 7-8 / 1997 )
29 ( 6 / 1997 )
28 ( 5 / 1997 )
27 ( 4 / 1997 )
26 ( 3 / 1997 )
25 ( 2 / 1997 )
24 ( 1 / 1997 )
 
23 ( 12 / 1996 )
22 ( 11 / 1996 )
21 ( 10 / 1996 )
20 ( 9 / 1996 )
18-19 ( 7-8 / 1996 )
17 ( 6 / 1996 )
16 ( 5 / 1996 )
15 ( 4 / 1996 )
14 ( 3 / 1996 )
13 ( 2 / 1996 )
12 ( 1 / 1996 )
 
11 ( 12 / 1995 )
10 ( 11 / 1995 )
9 ( 10 / 1995 )
8 ( 9 / 1995 )
7 ( 7 / 1995 )
6 ( 5 / 1995 )

ATLANTIDA NEWS

5 ( 3 / 1995 )
4 ( 1 / 1995 )
 
3 ( 11 / 1994 )
2 ( 9 / 1994 )
1 ( 7 / 1994 )
0 ( 5 / 1994 )