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.
Antwort1
Ihre Frage betrifft nicht wirklich eine Grafik-API, sondern nur Terminalsteuerzeichen.
Es steckt viel Geschichte dahinter, aber Terminals damals warenFernschreiberMaschinen. Im Grunde eine Schreibmaschine mit Papiertransport, die über eine serielle Verbindung mit dem Computer verbunden ist. Beim Eintippen eines Zeichens wird dieser Binärwert an den Computer gesendet (und auch auf der Seite eingegeben). Der Computer druckt die Zeichen als Ausgabe dessen aus, was Sie angefordert haben.
Sonderzeichen wurden zur Steuerung des Terminals verwendet (daher stammt auch die Strg-Taste, mit der diese Zeichen erzeugt wurden). Beispielsweise wäre ^H
oder eine Rücktaste, ist ein Wagenrücklauf (bewegt den Cursor an den Zeilenanfang) und ist ein Zeilenvorschub (bewegt die Seite eine Zeile nach oben). Einige Steuercodes haben in C (die von fast allen Programmiersprachen gemeinsam genutzt wird) eine Escape-Sequenz , um die Steuerzeichen zu erzeugen. Die zuvor aufgeführten Steuerzeichen wären , bzw. .^?
^M
^J
\b
\r
\n
DerTerminal-EmulatorSie verwenden heute genau das, wonach es klingt: Es ist Software, die vorgibt, ein alter Fernschreiber zu sein. In gewisser Weise ist es fast so, als ob Unix immer noch denkt, Sie würden eine Schreibmaschine verwenden, um mit ihm zu kommunizieren.
Im Fall von curl
schreibt es eine ganze Zeile, sendet dann \r
(Wagenrücklauf), wodurch der Cursor an den Zeilenanfang gebracht wird, und schreibt dann eine weitere Zeile. Da kein Zeilenvorschub gesendet wird, überschreibt es immer wieder dieselbe Zeile auf dem Bildschirm.
Um dies zu demonstrieren, können Sie Folgendes versuchen:
echo -n "First" ; sleep 5 ; echo -en "\rSecond\n"
Sie sehen das Wort „First“ 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 selbst, „Third“ hinzuzufügen, Sie werden etwas sehen, was Sie wahrscheinlich nicht erwartet haben ;-)
Weitere Informationen zu diesen und anderen Steuerzeichen finden Sie im ascii(7)
Handbuch.
Antwort2
Suchen Sie etwas wieAbonnieren?
Antwort3
Diese Frage besteht eigentlich aus mehreren Fragen, und"Steuerzeichen"behandelt nur einen kleinen Teil davon, z. B. den Fortschrittsbalken für curl
. Allgemeiner ausgedrückt handelt es sich hierbei um allgemeine Funktionen von Terminals (und Terminalemulatoren).
Die meisten dieser gemeinsamen Funktionen sind standardisiert inECMA-48: Kontrollfunktionen für codierte Zeichensätze. Andere Funktionen sind jedochnicht. Sie sind implementierungsdefiniert.
ECMA-48 bezieht sich aufSteuerungsfunktionenDazu gehörtSteuerzeichenUndSteuersequenzen(oft als Escape-Sequenzen, ANSI-Sequenzen usw. bezeichnet).
Einige Steuerzeichen werden verwendet füreinfachOperationen, zB
- Bewegen Sie den Cursor zur vorherigen Spalte in derselben Zeile
- Bewegen Sie den Cursor zur ersten Spalte in derselben Zeile
- Bewegen Sie den Cursor zum nächsten Tabulatorstopp in der gleichen Zeile.
- Bewegen Sie den Cursor zur nächsten Zeile (und scrollen Sie den BildschirmWennin der letzten Reihe schon)
Der Fortschrittsbalken für curl
wird mit diesen einfachen Operationen erstellt. Aber Steuerzeichen können nur so viel, nicht mehr. Steuersequenzen können mehr, z. B.
- Bewegen Sie den Cursor auf eine beliebige Zeile/Spalte auf dem Bildschirm
- Bewegen Sie den Cursor zu einer beliebigen Zeile in der gleichen Spalte auf dem Bildschirm
- Bewegen Sie den Cursor zu einer beliebigen Spalte in der gleichen Zeile auf dem Bildschirm
- Tabstopps in jeder beliebigen Spalte auf dem Bildschirm setzen
- den Cursor zur vorherigen Zeile bewegen
- den Bildschirm nach oben oder unten scrollen, ohne den Cursor zu bewegen
So viel zu den Parallelen zwischen einfach und komplex. Steuersequenzen werden auch verwendet, um die Farbe von Text und Hintergrund zu ändern, Text vom Bildschirm zu löschen und Text invertiert anzuzeigen (oder fett, unterstrichen, blinkend).
Programme, die einen invertierten (oder farbigen) Fortschrittsbalken zeichnen, verwendenSteuersequenzen.
Obwohl Steuersequenzen mehr können, können sie nur bestimmte Dinge. Sie zu Texteditoren, Installationsbildschirmen (und Programmen, die farbige Fortschrittsbalken zeichnen) zusammenzusetzen, ist kompliziert. Einiges davon wird durch die Verwendung von Bibliotheken, die diese Dinge kennen, vereinfacht. Anfangs hatten wir termcap (und eine Datenbank mit einigen hundert Terminaltypen), erweitert auf terminfo (und eine Datenbank mit rund tausend Terminaltypen).
Trotz Standardisierung gibt es Dutzende von Terminalbeschreibungen, die Sieverwenden. Daher verwenden wir weiterhin Bibliotheken für alle außer den trivialsten dieser Anwendungen. Eine davon ist ncurses („new-curses“), eine andere ist Slang (technisch „S-Lang“).
Weiterführende Literatur: