ansi(R) ansi(R) NAME ansi-Treiber-Funktionen bei Ausgaben auf den Bildschirm (Intern, nur bei bsh32.exe) SYNTAX Escape-Sequenzen: esc[Z, esc[nZ, esc[n;n...m, esc[=nZ, ... BESCHREIBUNG Mit Hilfe von Escape-Sequenzen können verschiedene Funktionen des Bildschirms -und auch andere- gesteuert werden. Eine Escape-Sequenz beginnt stets mit einem Escape-Zeichen (dezimal 27), fast immer gefolgt von dem Zeichen '['. Beendet wird solch eine spezielle Zeichenfolge fast ausnahmslos durch einen Buchstaben, meist ein Großbuchstabe. Escape-Sequenzen werden nur verarbeitet, wenn sie zu einem Bildschirm-Gerät geschrieben werden. Das sind beispielsweise: CON, CONOUT$, /dev/tty, /dev/tty01, /dev/console, ... Ein 'Leckerbissen' ist die MultiScreen-Sequenz esc[nz, s.u. Mit esc[c;sp können Tasten programmiert werden, wodurch man sich eine _sehr_ bequeme Bedienung zurechtbasteln kann. Sequenzen gemäß ANSI X3.64-1979: -------------------------------- Für ein fehlendes 'n' wird in der Regel '1' eingesetzt. esc[nA Cursor n Zeilen aufwärts esc[nB Cursor n Zeilen abwärts esc[nC Cursor n Zeichen vorwärts esc[nD Cursor n Zeichen zurück esc[nE Cursor auf Anfang, n Zeilen abwärts esc[nF Cursor auf Anfang, n Zeilen aufwärts esc[H Cursor auf Position 1;1 esc[v;hH Cursor auf Position vertikal;horizontal esc[v;hf dito esc[n` Cursor auf Spalte n (`==Backquote!) esc[nG Cursor auf Spalte n-1 (nicht ANSI) esc[nd Cursor auf Zeile n esc[nP Löscht n Zeichen esc[nM Löscht n Zeilen esc[nX Überschreibt n Zeichen leer esc[0J Löscht Bildschirm, von Position bis Ende 1J Löscht Bildschirm, von Anfang bis Position 2J Löscht Bildschirm, Cursor auf 1;1 3J Löscht Bildschirmpuffer, Cursor 1;1 (n.ANSI) esc[K Löscht Zeile, von Position bis Ende esc[0K Löscht Zeile, von Position bis Ende 1K Löscht Zeile, von Anfang bis Position 2K Löscht Zeile esc[n@ Einfügt n Leerstellen esc[nL Einfügt n Leerzeilen esc[nS Scrollt Bild n Zeilen aufwärts esc[nT Scrollt Bild n Zeilen abwärts esc[nZ -- Cursor n TABs zurück esc[s Sichert aktuelle Cursor-Position (Wert=0) esc[u Holt Cursor-Position (Wert=0) esc[ns Sichert aktuelle Cursor-Pos. (16 Werte, n=0-15) esc[nu Holt Cursor-Position (16 Werte, n=0-15) esc[a;ns Sichert aktuelle Zeichenattribute (n=0-15) a=0: normal+reverse a=1: normal a=2: reverse esc[a;nu Holt aktuelle Zeichenattribute (n=0-15) a=0: aktuelle Mode (7m,0m) entscheidet. a=1: normal a=2: reverse esc[nm Setzt Zeichenattribute: (mehrere: esc[n1;n2;n3;n4...m sind angebbar) esc[0m Löscht Zeichenattribute: 1m,7m,8m 1m Helligkeit ein 4m -- Unterstreichen ein 5m -- Blinken ein 7m Umkehrung (reverse video) ein 8m Sichtbarkeit (Input-Echo) aus. Wirkt nicht innerhalb der Kommandozeile des Kommandozeilen-Editors; ist dennoch aktiviert. 10m - Primärer Font 11m - Erster alternativer Font 12m - Zweiter alternativer Font 30m Vordergrund schwarz 31m Vordergrund rot 32m Vordergrund grün 33m Vordergrund braun 34m Vordergrund blau 35m Vordergrund magenta 36m Vordergrund cyan 37m Vordergrund weiß 38m -- Unterstreichen-Modus ein 39m -- Unterstreichen-Modus aus 40m Hintergrund schwarz 41m Hintergrund rot 42m Hintergrund grün 43m Hintergrund braun 44m Hintergrund blau 45m Hintergrund magenta 46m Hintergrund cyan 47m Hintergrund weiß esc[6n Schreibt die aktuelle Cursor-Position in die Eingabe: "VP HP\n" esc[2i Konvertiert den Bildschirmpuffer und schreibt diese Daten (OEMTEXT) in die Zwischenablage. esc[2h -- Locks keyboard esc[2l -- Unlocks keyboard esc[=7h Autowrap ein esc[=7l Autowrap aus esc[c;sp Programmiert Tasten: code;string[;...;...]p string;code code;code string;string Siehe unten: HINWEISE. Sequenzen nicht ANSI-konform: ----------------------------- esc[=cA -- Overscan-Farbe auf c esc[=f;dB Signalton freq;dauer 37-32kHz;millisek (f;d werden nur unter NT berücksichtigt) esc[=s;eC Cursor-Größe start;ende (0;15,...,16;0) Bei s>e oder s>15 wird Cursor unsichtbar. (0;13 hat gleiche Wirkung wie 2;15 , da Windows nur *einen* Wert (1-100) verarbeitet.) esc[=0C Schreibt aktuelle start;ende-Werte in die Eingabe. Siehe unten: esc[=nM escQFn"str"-- Programmiert die Funktionstaste Fn mit "str" Abgrenzungen ": irgendwelche Zeichen nicht in str F1:Fn=='0', F2:Fn=='1', ..., F16:Fn=='?', ..., bis F96: esc[0k Tastendruck-Klick ein (Wirkt nur unter NT richtig.) esc[1k Tastendruck-Klick aus esc[nz MultiScreen: Wechselt zu Bildschirm n esc[=cF Normale Vordergrundfarbe auf c esc[=cG Normale Hintergrundfarbe auf c esc[=cH Reverse Vordergrundfarbe auf c esc[=cI Reverse Hintergrundfarbe auf c esc[=cJ -- Grafik Vordergrundfarbe auf c esc[=cK -- Grafik Hintergrundfarbe auf c esc[=0L Füllung neuer Bereiche mit aktuellen Farben (STD) 1L Füllung neuer Bereiche mit Normal-Farben esc[=0M Schreibt aktuelle Normal-Farben in die Eingabe 1M Schreibt aktuelle Reverse-Farben in die Eingabe 2M -- Schreibt aktuelle Grafik-Farben in die Eingabe: Rückgabe: "VG HG\n", als dezimale Digit-Strings. Siehe BEISPIELE. Farbwerte: 0 Schwarz 8 Grau 1 Blau 9 Hell Blau 2 Grün 10 Hell Grün 3 Cyan 11 Hell Cyan 4 Rot 12 Hell Rot 5 Magenta 13 Hell Magenta 6 Braun 14 Gelb 7 Weiß 15 Hell Weiß HINWEISE bsh: set +S / set -S schalten ansi aus/ein. readc.com funktioniert auch unter NT. Normal- und Reverse-Farben sind voneinander getrennt. Ebenso die nm- von den =cX-Farb-Einstellungen. 7m / 0m schalten Reverse ein/aus. =cF =cG =cH =cI gestatten eine getrennte Einstellung, zudem mit Werten von 0-15, also einschließlich bold-Bit. Man beachte, daß eine Reverse-Farbwahl im Normal-Modus keine sofortige Wirkung zeigt, sondern erst bei esc[7m ! Die Zeichenfolgen - und -- (siehe oben) bedeuten, daß diese Escape-Sequenzen nicht (--) oder eventuell (-) realisiert wurden/werden. Der interne Kommandozeilen-Editor der bsh32 hat (ebenfalls) ein Tasten-Mapping eingebaut: <Alt>+<Taste> Mit Escape-Sequenzen programmierte Tasten wirken nur bei eingeschaltetem Kommandozeilen-Editor (set -E). Die Sequenz 8m ist zur Eingabe von Geheimworten nützlich. Wirkt nicht sichtbar innerhalb der Kommandozeile des Kommandozeilen-Editors, ist aber dennoch aktiv. Wirkt aber beim read-Kommando, usw. Tasten-Mapping mit esc[...p: ============================= echo '%e["sf9";"echo 999 "p%c' programmiert 'echo 999 ' auf die Tasten <Shift>+<F9>. Nach Tastendruck sieht die Kommandozeile so aus: # echo 999 _ und man kann <Enter> drücken zur Ausführung. echo '%e["sf9";"echo 999%r"p%c' programmiert die <Enter>-Taste gleich mit (%r==CR). echo '%e["scaf12";"echo aaa%r"p%c' echo '%e["sca;f12";"echo aaa%r"p%c' echo '%e["sca:f12";"echo aaa%r"p%c' <Shift>+<Ctrl>+<Alt>+<F12>, die 96-ste Fu-Taste. Wie oben in der Liste gezeigt, können Strings und Dezimalzahlen beliebig kombiniert werden. Mit Zahlen ist immer nur _ein_ Zeichen darstellbar: echo '%e[65;66;"B";67;"C";68p' echo '%e["aA";"B";"a:B";"a:C";"C";"D"p' <Alt>+<A>==B, <Alt>+<B>==C, <Alt>+<C>==D Man beachte das <Alt>: Bei der Programmierung von normalen Einzelzeichen ist nur <Alt>+<Zeichen> oder <Alt>+<Shift>+<Zeichen> möglich, auch wenn man es bei Zahlenangabe anstelle von Strings nicht angeben konnte. Es sind maximal 8 Paare innerhalb einer einzigen Sequenz esc[...p angebbar. Anstelle von "aa'a'aa" kann auch 'aa"a"aa' verwendet werden, damit man die Abgrenzungszeichen ('") auch jeweils programmieren kann: Die Ergebnisse: aa'a'aa und aa"a"aa Noch universeller ist es, zwei Delimiter innerhalb direkt hintereinander zu stellen: "aa""bb" programmiert: aa"bb 'aa''bb' programmiert: aa'bb 'aa''""' programmiert: aa'"" 'aa''"' programmiert: aa'" '''' programmiert: ' ''' programmiert: FEHLER! "" programmiert: LEER '' programmiert: LEER echo '%e["sca:f12";"echo ""aaa b""%r"p%c' programmiert: echo "aaa b"CR MultiScreen: echo '%e["sf4";"echo ''%%e[4z%%c''%r"p%c' programmiert: echo '%e[4z%c'CR womit man durch <Shift>+<F4> zum Screen4 wechselt. Maskierungen: echo '%e["sf4";"echo ''%%e[4z%%c''%r"p%c' ' ' '' '' für die Shell: '' --> ' %% %% für das äußere echo-Kommando: %% --> % %c unterdrückt Zeilenvorschub. %e ist Kurzform von %033. Solche Maskierebenen sind leider notwendig, wenn man alles machen können will. Besser so als gar nicht. Hier sind immerhin drei Syntax-Formen verschachtelt beteiligt: Shell (bsh), echo-Kommando und ansi-Treiber! Aber in der Praxis braucht man nur _ein_ erfolgreiches Muster, das man ja kopieren kann. Weiterhin können Shell-Variablen benutzt werden: E="xyz"; echo "...$E..."; ... Das macht's dann doch wieder einfach, weil hübsch nacheinander und weil $E vieles verbirgt. BEISPIELE Umgang mit den Input-Schreib-Sequenzen 6n =0C =0M =1M: echo '%033[=0M%c'; read vordgr hintgr echo '%e[=0M%c'; read vordgr hintgr echo '%e[=0M%e[8m%c'; read vordgr hintgr; echo '%e[0m%c' Auf diese Weise verhindert man, daß die Informationen direkt als Eingabe von Kommandos verarbeitet werden; Ohne Zeilenvorschub müßte man bei 'read' <Enter> drücken. Das will man ja nicht haben: # echo '%e[=0C%c' # 13 15 bsh: Kommando nicht gefunden: '13' # _ Die Sequenzen 8m/0m schalten das Echo der Systemfunktion innerhalb von read aus/ein. Die beiden Zahlen werden auf diese Weise nicht sichtbar. EXIT-CODE Gibt es nicht. Bei falschen oder unbekannten Sequenzen werden diese teilweise ausgeschrieben, also nicht ganz 'geschluckt'. DIAGNOSE Es gibt Fehlermeldungen, falls dieser interne ansi-Treiber gar nicht genutzt werden kann. SIEHE AUCH bsh(K), readc(K), bsh32.exe, DOS-help:ansi.sys . AUTOR Diese Funktionen ansi wurden entwickelt von: Helmut Schellong, Bad Salzuflen