Logik einer Autovervollständigung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

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
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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. ;)
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

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
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.
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

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?
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.
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

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
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

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
Antworten