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