Ein- und Ausgabe über Pipelines, Grundlagen

Konfiguration und Kompilierung eines sehr einfachen Plugins, minimal, findet sich in Beispiel eines Plugin in C++ im Kapitel über Plugins. Wir beginnen mit der Analyse des Quellcodes minimal/src/minimal.cpp. Das Hauptprogramm, main, besteht im wesentlichen aus:

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_ESCAPEDATA_BEGIN DATA_BEGIN
DATA_ESCAPEDATA_END DATA_END
DATA_ESCAPEDATA_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);

Bemerkung 1. TeXmacs geht davon aus, dass keine Ausgabe mehr kommt, wenn ein DATA_END ein DATA_BEGIN abschließt. Deshalb muss jegliche Ausgabe in einen einzigen äußeren DATA_BEGIN-DATA_END-Block eingeschlossen werden. Es ist möglich, solche abgeschlossenen DATA_BEGIN-DATA_END Blöcke in einander zu verschachteln. Sie dürfen aber keinesfalls mehr als einen in sich geschlossenen Block senden, da TeXmacs sofort die Kontrolle übernimmt, wenn der äußere Block abgeschlossen ist.

Bemerkung 2. In unserem Beispiel wurde der C++ Code der Anwendung in die Schnittstelle übernommen. Der übliche Weg, wenn Sie eine TeXmacs-Schnittstelle für eine bereits existierende Anwendung myapp schreiben, besteht darin, in der Anwendung eine Start-Option –texmacs zu implementieren. Dann braucht man die Verzeichnisse myapp/src und myapp/bin nicht mehr. Es reicht das Plugin zu konfigurieren, indem man z.B. so etwas wie die folgenden Zeilen in eine Initialisierungs-Datei myapp/progs/init-myapp.scm einfügt:

(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.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".