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.

Bemerkung 1. Im Prinzip sollte der Eingabe-Ergänzungs-Mechanismus auch im Mathematik-Modus arbeiten. Aber input-string entspricht dann der Linearisierung der TeXmacs Eingabe.

Bemerkung 2. Die Art und Weise wie TeXmacs Befehle an die Anwendung schickt, kann ganz ähnlich wie die Eingabe angepasst werden. Dafür gibt es die Konfigurations-Option :commander, die ganz ähnlich wie die :serializer Option arbeitet.

Das plugin complete

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.

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