Ein- und Ausgabe über Pipelines, Grundlagen |
Konfiguration und Kompilierung eines sehr einfachen Plugins, minimal, findet sich in Beispiel eines Plugin in
int
main () {
display-startup-banner
while (true) {
read-input
display-output
}
return 0;
}
Gemäß Vorgabe sendet TeXmacs eine Zeichenkette, die mit '\n' endet an die Anwendung. Dem entsprechend besteht der Code für read-input aus folgenden Zeilen
char buffer[100];
cin.getline (buffer, 100, '\n');
Die Ausgabe ist etwas komplizierter, denn TeXmacs muss eindeutig feststellen können, dass die Ausgabe beendet ist. Das wird erreicht, in dem jedwede Ausgabe, in Blockform eingekapselt wird. Das ist im vorliegenden Fall ein Begrüßungstext, banner, und die interaktive Reaktion der Anwendung. Die Kapselung sieht folgendermaßen aus:
DATA_BEGINformat:messageDATA_END
Hier stehen DATA_BEGIN und DATA_END für spezielle Steuer-Buchstaben:
#define DATA_BEGIN ((char) 2)
#define DATA_END ((char) 5)
#define DATA_ESCAPE ((char) 27)
Der Steuer-Buchstabe DATA_ESCAPE dient zur Maskierung DATA_BEGIN und DATA_END innerhalb des kommunizierten Textes
DATA_ESCAPE
⟶
DATA_BEGIN
DATA_ESCAPE
⟶
DATA_END
DATA_ESCAPE
⟶
DATA_ESCAPE
format spezifiziert das Format für den zu übertragenden Text, message. In unserem Beispiel ist der Code, display-startup-banner, Übertragung und Darstellung der Begrüßungs-Botschaft in TeXmacs folgender
cout << DATA_BEGIN << "verbatim:";
cout << "Hi there!";
cout << DATA_END;
fflush (stdout);
Entsprechend wurde display-output so programmiert
cout << DATA_BEGIN << "verbatim:";
cout << "You typed " << buffer;
cout << DATA_END;
fflush (stdout);
(plugin-configure myapp
(:require (url-exists-in-path?
"myapp"))
(:launch "myapp
–texmacs")
(:session "Myapp"))
Wenn der Quellcode der Anwendung myapp nicht verändert werden kann oder darf, dann bleibt immer noch die Möglichkeit, ein Ein-/Ausgabe-Filter tm_myapp zu schreiben, der die Umsetzung vornimmt. Unter den Standard-Plugins im Verzeichnis
plugins
finden Sie mehrere Beispiele.