|
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