Seite 1 von 1

Logik einer Autovervollständigung

Verfasst: Samstag 30. Juli 2011, 12:13
von maxi_king_333
Hallo Liebe Foren Gemeinde,

micht würde interessieren, wie Ihr eine Autovervollständigung implementieren würdet.
Dabei geht es nicht um ein einfaches Eingabefeld, sondern um Code-Vervollständigung.
Zum Beispiel, sollte man die Struktur des ganzen Codes vorhalten oder jedesmal neu erstellen?

Ich brauche das für einen Editor, der nicht nach WYSIWYG arbeitet, und ich hätte gerne eine Funktion, die gewisse Bereiche als Preview rendert...
Das hat zwar mit der Autovervollständigung direkt nichts zu tun, alledings muss man, wie bei dieser auch, wissen, wo sich der Cursor gerade in der Doumentenstruktur bedfindet.

Vielen Dank und Viele Grüße
Maxi

Re: Logik einer Autovervollständigung

Verfasst: Samstag 30. Juli 2011, 13:17
von snafu
Das hat nun wirklich nichts mit Vervollständigung zu tun. Naja, finde heraus, wieviele Zeilen in dein Preview passen, beachte dabei mögliche Umbrüche bei überlangen Zeilen und schnapp dir dann die benötigten Zeilen via Slicing auf dem Ergebnis von `str.splitlines()`. Je nachdem, in welcher Form die Quelle vorliegt, willst du vielleicht auch zeilenweise direkt über das Dateiobjekt iterieren und die Anzahl der Zeilen mitzählen. Es macht dann allerdings Sinn, die bereits eingelesenen Zeilen zu cachen für den Fall, dass sie nochmal benötigt werden.

Falls ich deine Frage missverstanden haben sollte und du etwas anderes haben möchtest, dann solltest du das nochmal etwas klarer beschreiben. ;)

Re: Logik einer Autovervollständigung

Verfasst: Samstag 30. Juli 2011, 14:49
von maxi_king_333
Hi,

danke für die Antwort...

Ich meinte keine Vorschau der Zeilen, sondern eher folgendes:

Code: Alles auswählen

text, text, text, :mathe,a^2+b^2=c^2:, text, text, text
Wenn ich nun in diesem mathe-inline-element bin, möchte ich, dass auf einen Tastendruck ein Calltipp mit der gerenderten Formel erscheint....
Ich würde sagen, dass hat in sofern etwas mit Autovervollständigung zu tun, dass ich wissen muss, wo und worin ich mich befinde...
Das ist da genau so, schreibe ich z.B. struct. zeigt mir mein Editor alle darauf folgenden Möglichkeiten an.
Bei meinem Editor soll er dann halt das Preview anzeigen, aber er muss auch wissen, wo und worin ich gerade bin...

Oder sehe ich da etwas falsch?

Viele Grüße
Maxi

Re: Logik einer Autovervollständigung

Verfasst: Samstag 30. Juli 2011, 17:43
von deets
Ich denke du wirst dir einen Parser bauen muessen, der dir - wenigstens grob, und mit viel Toleranz - den Quelltext in Bloecke zerlegt. Also zB an Zwischenueberschriften oder Absatzgrenzen zerlegt. Dann suchst du den Block des Interesses raus, anhand der Text-Position. Und denn musst du dann weiter im Detail parsieren, moeglichst robust. Kannst zB in Latex nach Formel-Markern suchen, und die dann extrahieren, um sie dann weiterzuverarbeiten.

Aber das ist alles sehr, sehr domaenenspezifisch, und da wirst du einfach loslegen muessen - kann sein, das QScintilla da zB schon Dinge vorbereitet, aber die konkrete Ausgestaltung haengt ja von der Semantik des Textes ab, das wirst du selbst machen muessen.

Re: Logik einer Autovervollständigung

Verfasst: Samstag 30. Juli 2011, 18:16
von maxi_king_333
Ja, ich weiß und ich habe auch schon einen Parser und ich weiß auch schon, wie ich das mit GtkSourceView löse...
Das Problem ist halt einfach, ich weiß nicht genau, wie die Dokumentenstruktur am besten für den Calltipp verarbeite...
Sollte ich beim Öffnen die Datei parsen und die Struktur inkrementell aktualisieren oder lieber jedesmal neu parsen?
Daher auch der Bezug zur Autovervollständigung.
Befinde ich mich z.B. bei Python hinter einem Modulnamen und schreibe einen Punkt, dann muss meine IDE das parsen um zu wissen, was kommen könnte.
Die Frage ist jetzt, wie macht die das?
Hält sie die Struktur vor und aktualisiert sie inkrementell.
Geht sie von meiner aktuellen Position ein Zeichen zurück, erkennt den Punkt, geht so lange zurück, bis irgendein abschließendes Zeichen kommt und weiß dann, wo ich bin.
Oder parst sie nur die Zeile oder die ganze Datei neu.
Also, wie würdet ihr das machen?

Re: Logik einer Autovervollständigung

Verfasst: Sonntag 31. Juli 2011, 15:22
von deets
Ich wuerde erstmal mit vollem parsen anfangen, um das Problem zu loesen. Wenn dann Probleme auftauchen mit der Performance, dann eben in einem mehrstufigen Schritt parsieren, wie schon von mir skizziert - also zB an Absatzgrenzen.

Bezogen auf Code zb wuerde ich dann nur noch einzelne Klassen, oder Methoden von Klassen oder Funktionsruempfe usw. parsieren. Ist nicht trivial, aber ich denke es geht auch nicht anders.

Re: Logik einer Autovervollständigung

Verfasst: Sonntag 31. Juli 2011, 16:25
von maxi_king_333
Ok, danke, dann werde ich das für erste mal so machen...
Aber fürs erste noch eine Frage:
Gibt es irgendeine Art Dictionary dem ich als Key z.B. den Bereich von 4 bis 20 zuweisen kann und dann mit z.B. 9 daraufzugreifen kann?

Viele Grüße und Vielen Dank
Maxi

Re: Logik einer Autovervollständigung

Verfasst: Sonntag 31. Juli 2011, 16:38
von snafu
Es gibt, wie ich schon sagte, Slicing. Damit kann in einem Rutsch auf mehrere Elemente (hier: Zeilen) zugegriffen werden. Ist die Angabe "9" auf Zeile 9 der gesamten Datei oder auf Zeile 9 des Ausschnitts bezogen? Letzteres geht von Haus aus, das andere müsste man selber schreiben.

Re: Logik einer Autovervollständigung

Verfasst: Sonntag 31. Juli 2011, 17:53
von maxi_king_333
Die 9 ist auf das 9. Zeichen der Datei bezogen, sodass ich die Position exakt angeben kann.
Mein Parser speichert den Start und den Endpunkt das Blocks ab.
Wenn jetzt der Startpunkt beim 4. Zeichen und der Endpunkt beim 20. liegt und ich als Cursor-Position die 9 bekomme, dann hätte ich gerne diesen Block als Rückgabe.
Ich habe das jetzt so gelöst:

Code: Alles auswählen

if child['start'] <= offset <= child['end']:
    return child
Und es funktioniert auch hervorragend, ich weiß nur nicht, ob es so performant ist, das jedesmal neu zu parsern und ob die Datenstruktur mit Listen und Dictionaries so gut ist :K .
Bild