Řídící znaky v shelluPetr 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
Pozn.: články boli naskenované ako text a preto obsahujú aj zopár chýb. Taktiež neručíme za zdrojové kódy (Asm, C, Arexx, AmigaGuide, Html) a odkazy na web. Dúfame, že napriek tomu vám táto databáza dobre poslúži.
Žiadna časť nesmie byť reprodukovaná alebo inak šírená bez písomného povolenia vydavatela © ATLANTIDA Publishing
none
|