Was ist die Grafik-API des Terminals?

8

Wie können bestimmte Programme Hintergrund- und Schriftfarben festlegen und Zeichen mehr als einmal an dieselbe Stelle auf dem Bildschirm schreiben (z. B. in die dritte Zeile, fünfte Spalte)?

Einige Beispiele sind der von angezeigte Fortschrittsbalken curl google.com > a, einige Installationsbildschirme und fast jeder Texteditor.

vemv
quelle

Antworten:

5

Was Sie fragen, ist nicht wirklich eine Grafik-API, sondern nur Terminal-Steuerzeichen.

Dahinter steckt viel Geschichte, aber Terminals waren früher Fernschreiber . Grundsätzlich eine Schreibmaschine mit Track-Papier, die über eine serielle Verbindung an den Computer angeschlossen ist. Wenn Sie ein Zeichen eingeben, wird dieser Binärwert an den Computer gesendet (und auf der Seite eingegeben). Der Computer druckte Zeichen als Ausgabe der von Ihnen angeforderten Daten zurück.

Für die Steuerung des Terminals wurden Sonderzeichen verwendet (daher stammt der Steuerschlüssel, um diese Zeichen zu erzeugen). Beispiel: ^Hoder ^?wäre eine Rücktaste, ^Mist ein Wagenrücklauf (bewegt den Cursor an den Anfang der Zeile) und ^Jist ein Zeilenvorschub (bewegen Sie die Seite um eine Zeile nach oben). Einige Steuercodes haben eine Escape-Sequenz in C (die von fast allen Programmiersprachen gemeinsam genutzt wird), um die Steuerzeichen zu generieren. Die Kontrollen aufgelistet zuvor wäre \b, \r, \njeweils.

Der Terminal-Emulator, den Sie heute verwenden, ist genau das, wonach das klingt. Es ist eine Software, die vorgibt, ein alter Fernschreiber zu sein. In gewisser Weise ist es fast so, als ob Unix immer noch denkt, dass Sie eine Schreibmaschine verwenden, um mit ihr zu kommunizieren.

Im Fall von curlschreibt es eine ganze Zeile und sendet dann \r(Wagenrücklauf), wobei der Cursor an den Anfang der Zeile gesetzt wird, und schreibt dann eine weitere Zeile. Da kein Zeilenvorschub gesendet wird, wird immer wieder über dieselbe Zeile auf dem Bildschirm geschrieben.

Hier ist etwas, das Sie versuchen können, um dies zu demonstrieren:

echo -n  "First" ; sleep 5 ; echo -en "\rSecond\n"

Sie sehen das Wort "Zuerst" gedruckt (aber es wird keine neue Zeile gesendet). 5 Sekunden später wird es durch das Wort "Second" ersetzt und eine neue Zeile gesendet. Sie können dieses Muster unbegrenzt wiederholen. Versuchen Sie, "Third" selbst hinzuzufügen, Sie werden etwas sehen, das Sie wahrscheinlich nicht erwartet haben ;-)

Weitere Informationen zu diesen und anderen Steuerzeichen finden Sie im ascii(7)Handbuch.

Bahamat
quelle
7

Suchen Sie so etwas wie Flüche ?

Boris Ivanov
quelle
3
In diesen Tagen wollen Sie die neuen Flüche, oder ncurses.
Steven Montag,
Genau. Danke für Korrekturen. Ich habe vergessen, dass sie anders sind.
Boris Ivanov
1

Diese Frage besteht eigentlich aus mehreren Fragen, und "Steuerzeichen" adressieren nur einen kleinen Teil davon, z. B. den Fortschrittsbalken für curl. Im Allgemeinen sind dies gemeinsame Merkmale von Terminals (und Terminalemulatoren).

Die meisten dieser allgemeinen Funktionen sind in ECMA-48: Steuerfunktionen für codierte Zeichensätze standardisiert . Jedoch sind auch andere Funktionen nicht . Sie sind implementierungsdefiniert.

ECMA-48 bezieht sich auf Steuerfunktionen . Dies umfasst Steuerzeichen und Steuersequenzen (häufig als Escape-Sequenzen, ANSI-Sequenzen usw. bezeichnet).

Einige Steuerzeichen werden für einfache Operationen verwendet, z.

  • Bewegen Sie den Cursor auf die vorherige Spalte in derselben Zeile
  • Bewegen Sie den Cursor in die erste Spalte derselben Zeile
  • Bewegen Sie den Cursor zum nächsten Tabulator in derselben Zeile
  • Bewegen Sie den Cursor in die nächste Zeile (und scrollen Sie auf dem Bildschirm, wenn Sie sich bereits in der letzten Zeile befinden).

Der Fortschrittsbalken für curlwird mit diesen einfachen Operationen erstellt. Aber Steuerzeichen können nur so viel, nicht mehr. Kontrollsequenzen bewirken mehr, z.

  • Bewegen Sie den Cursor auf eine beliebige Zeile / Spalte auf dem Bildschirm
  • Bewegen Sie den Cursor auf eine beliebige Zeile in derselben Spalte auf dem Bildschirm
  • Bewegen Sie den Cursor auf eine beliebige Spalte in derselben Zeile auf dem Bildschirm
  • Setzen Sie Tabulatoren an einer beliebigen Spalte auf dem Bildschirm
  • Bewegen Sie den Cursor in die vorherige Zeile
  • Lassen Sie den Bildschirm nach oben oder unten scrollen, ohne den Cursor zu bewegen

Soviel zu Parallelen zwischen einfach / komplex. Steuersequenzen werden auch verwendet, um die Farbe von Text und Hintergrund zu ändern, Text vom Bildschirm zu löschen und Text in umgekehrter Darstellung anzuzeigen (oder fett, unterstrichen, blinkend).

Programme, die einen Reverse-Video-Fortschrittsbalken (oder einen farbigen Fortschrittsbalken) zeichnen, verwenden Steuersequenzen .

Obwohl Steuersequenzen mehr können, können sie nur bestimmte Dinge tun. Das Zusammenfügen zu Texteditoren, Installationsbildschirmen (und Programmen, die farbige Fortschrittsbalken zeichnen) wird kompliziert. Einiges davon wird durch die Verwendung von Bibliotheken, die über diese Dinge Bescheid wissen, vereinfacht. Anfangs hatten wir termcap (und eine Datenbank mit einigen hundert Terminaltypen), die auf terminfo erweitert wurde (und eine Datenbank mit rund tausend Terminaltypen).

Selbst bei Standardisierung gibt es Dutzende von Terminalbeschreibungen, die Sie verwenden können . Daher verwenden wir weiterhin Bibliotheken für alle außer den trivialsten dieser Anwendungen. Einer ist ncurses ("new-curses"), ein anderer ist slang (technisch "S-Lang").

Weiterführende Literatur:

Thomas Dickey
quelle