Eingabe-Ergänzung |
Vorgabemäßig überprüft TeXmacs Ihr Dokument nach möglichen Ergänzungen Ihrer Eingabe, wenn Sie auf die tab-Taste drücken. Innerhalb einer Sitzung möchten Sie das Verhalten vielleicht anpassen, z.B. um vorhandene Befehle zu vervollständigen. dafür müssen Sie nur die Konfigurations-Option
(:tab-completion #t)
in der Initialisierungs-Datei init-myplugin.scm so setzen, dass TeXmacs geeignete Anforderungen an die Anwendung richtet, wenn die Tab-Taste innerhalb einer solchen Sitzung gedrückt wird. Diese Befehle haben die Form
DATA_COMMAND(complete input-string cursor-position)return
Hier steht DATA_COMMAND für das Zeichen '\20' (ASCII 16). Der input-string ist die komplette Zeichenkette, in der Tab auftrat und cursor-position eine Ganzzahl, die die Position des Cursors angibt, bei der Tab gedrückt wurde. TeXmacs erwartet von der Anwendung ein Tupel mit allen möglichen Ergänzungen der Form
DATA_BEGINscheme:(tuple
root completion-1 ⋯
completion-n)DATA_END
Hier ist root die Teil-Zeichenkette bis zur Cursorposition und completion-1 bis completion-n ist eine Liste von möglichen Ergänzungen, die an der aktuellen Cursorposition eingefügt werden könnten. Wenn keine gefunden werden können Sie eine leere Kette zurückgeben.
Ein sehr rudimentäres Beispiel dafür, wie der Ergänzungs-Mechanismus arbeitet, findet sich in dem complete Plugin, das die folgenden Dateien umfasst:
complete/Makefile complete/progs/init-complete.scm complete/src/complete.cpp
Die Begrüßungs-Botschaft in complete.cpp sorgt für einen Teil der Konfiguration:t
cout << DATA_BEGIN << "verbatim:";
format_plugin ();
cout << "We know how to complete 'h'";
cout << DATA_END;
fflush (stdout);
Hier lautet format_plugin so
void
format_plugin () {
// The configuration of a plugin can be completed at startup time.
// This may be interesting for adding tab-completion a posteriori.
cout << DATA_BEGIN << "command:";
cout << "(plugin-configure complete (:tab-completion #t))";
cout << DATA_END;
}
In der Hauptschleife kümmern wir uns zuerst um die normale Eingabe:
char buffer[100];
cin.getline (buffer, 100, '\n');
if (buffer[0] != DATA_COMMAND) {
cout << DATA_BEGIN << "verbatim:";
cout << "You typed " << buffer;
cout << DATA_END;
}
Dann behandeln wir den Fall, dass eine Aufforderung zur Ergänzung kommt:
else {
cout << DATA_BEGIN << "scheme:";
cout << "(tuple \"h\" \"ello\" \"i there\" \"ola\" \"opsakee\")";
cout << DATA_END;
}
fflush (stdout);
Wie Sie sehen, wird der eigentliche Befehl ignoriert. Unser Beispiel ist wirklich sehr rudimentär.