Wie würdet ihr einen Editor schreiben? Jede Zeile als ein Objekt?



  • Athar schrieb:

    Objekteditor schrieb:

    Und nun möchtest du die jeweiligen Felder wie TCP und UDP Port, Destination und Source IP Adresse usw. einzeln farbig hervorheben, wie machst du das, daß du es als binärer Blob einliest?

    Gar nicht, das war nur zum Vergleich gedacht.

    Dann ist der Vergleich aber Praxisfremd, wenn ich beim "als Binärblock einlesen"
    keine Einfärbungen durchführen kann.
    Ich will schon nen Editor bauen, bei dem ich einzelne Wörter einfärben kann.



  • Ja, das ist schon klar. Ich wollte zeigen, dass auch beim Einlesen und Speichern durch ein eigenes Objekt für jede Zeile nicht viel Performanz verloren geht.
    Aber gerade wenn du zeichengenaue/wortgenaue Formatierung brauchst, bleibt dir ohnehin nicht viel anderes übrig.

    Objekteditor schrieb:

    Ich würde bei meinem Texteditor übrigens nicht das gesamte Dokument auf einmal einlesen, sondern nur den Bereich, der auch dargestellt wird bzw. ein klein bischen mehr, sagen wir mal alle 300 Zeilen.

    Und für die 100 Zeilen vor und hinter den gerade sichtbaren Zeilen würde ich im Hintergrund in so einer Art Triplebuffer laden.

    Was machst du, wenn jemand einen ganzen Abschnitt löscht/verändert und dann an eine andere Stelle der Datei springt? Und beim Speichern? Das könnte schnell kompliziert werden.



  • Athar schrieb:

    Was machst du, wenn jemand einen ganzen Abschnitt löscht/verändert und dann an eine andere Stelle der Datei springt? Und beim Speichern? Das könnte schnell kompliziert werden.

    Guter Einwand.

    Falls der Text verändert wird, dann müßte ich diese Bereiche natürlich im Hintergrund merken, also im RAM vorhalten, bis gespeichert wird.

    Anderseits ist so etwas trotzdem sinnvoller, als die gesamte Textdatei im Speicher zu halten, denn was machst du, wenn du nur 4 GB RAM auf dem Rechner hast, deine Textdateie aber > 4 GB groß ist?

    Mir ist das zwar bei einer Textdatei noch nicht passiert, aber sehr wohl bei einem Hex-Editor.
    Und da trennt sich schnell die Spreu vom Weizen, welcher Hex-Editor überhaupt noch für große Dateien in Frage kommt.
    Manche Hex-Editoren konnten die große Datei zwar einlesen, aber beim "Search & Replace" scheiterten sie dann.
    Solche Sachen sollen bei meinem Editor nicht vorkommen.



  • Objekteditor schrieb:

    Deswegen habe ich mir gedacht, daß ich jede Zeile oder nach reifer Überlegung besser jedes Wort in ein eigenes Objekt packe, denn dann kann ich jedes Wort einzeln z.B. eine Vorder- oder Hintergrundfarbe zuweisen, oder unterstreichen, oder fett machen usw..

    Dazu müsstest du erstmal "Wort" definieren. Für Programmiersprachen ist das nicht praktikabel (Kommentare, Strings...).
    Besser sind Klassen wie Cursor und Range. Siehe auch den verlinkten Beitrag zum Kate-Editor.

    Eine Range wäre quasi ein Wort wo aber Anfang und Ende auf beliebige Stellen (Cursor) im Text zeigen. Dann kannst du auch sagen range->set_color().



  • DrGreenthumb schrieb:

    Objekteditor schrieb:

    Deswegen habe ich mir gedacht, daß ich jede Zeile oder nach reifer Überlegung besser jedes Wort in ein eigenes Objekt packe, denn dann kann ich jedes Wort einzeln z.B. eine Vorder- oder Hintergrundfarbe zuweisen, oder unterstreichen, oder fett machen usw..

    Dazu müsstest du erstmal "Wort" definieren.

    Hab ich doch eigentlich oben schon.

    Für Programmiersprachen ist das nicht praktikabel (Kommentare, Strings...).
    Besser sind Klassen wie Cursor und Range. Siehe auch den verlinkten Beitrag zum Kate-Editor.

    Eine Range wäre quasi ein Wort wo aber Anfang und Ende auf beliebige Stellen (Cursor) im Text zeigen. Dann kannst du auch sagen range->set_color().

    Warum wäre das für Quellcode nicht praktikabel?



  • Objekteditor schrieb:

    Einzelne oder mehrere Leerzeichen würde ich ebenfalls als eigene Wörter zählen.
    Für Sonderzeichen gilt das gleiche.
    Und normale Wörter würden aus Buchstaben oder Zahlen bestehen.

    /* Und wenn du jetzt einen String einfärben willst? */

    Da hast du den Anfang und ein Ende. Das ist besser als 1000 Wörter.



  • DrGreenthumb schrieb:

    Objekteditor schrieb:

    Einzelne oder mehrere Leerzeichen würde ich ebenfalls als eigene Wörter zählen.
    Für Sonderzeichen gilt das gleiche.
    Und normale Wörter würden aus Buchstaben oder Zahlen bestehen.

    /* Und wenn du jetzt einen String einfärben willst? */

    Da hast du den Anfang und ein Ende. Das ist besser als 1000 Wörter.

    Das mag für ein Comment so gelten, aber so etwas:

    #include <x.h>
    
    int func(const char *filename)
    {
      int len = 0;
      #ifdef _WIN32
      	file = fopen(filename, "r"); //if win32 - open the filename in current dir
      #else
        if (len==1)
        {
          if ((str[0]=='0') || (str[0]=='N'))
            ret=0;
          else
            ret=1; 
        }
      printf("Blabla = %i\n", i);
      return 0;    
    }
    

    Hat schon viele verschiedene Farben.
    Die den Variablentypen int, const char und den Schlüsselwörtern wie if, else, while use. kann man eine Farbe geben.
    Den Zahlen kann man eine andere Farbe geben, als einem Zeichen '0' oder String im Programm.
    Der Kommentarblock hat ne extra Farbe.
    include und #ifdef und #else hat ne eigene Farbe.
    Man könnte auch %i und \n in der Printfanweisung speziell hervorheben.
    Und wenn man auf die { klickt, dann sollte diese und die untere dazu passende }
    ebenfalls in einer anderen Farbe hervorgehoben werden.

    Macht 6 Farben und alle kommen sehr oft und abwechselnd vor.
    Du bräuchtest also sehr viele indirekten Anfang und Ende Zuweisungen.
    Der Code wird dadurch nicht einfacher, sondern komplexer.
    Denn wenn du z.b. einen String Zeilenweise einliest, dann brauchst du auch z.B. eine dynamische Liste für die vielen Anfänge und Enden einer Einfärbung, sowie der dazu passenden Farbe oder Farbindexnummer.

    Allein für diese Zeile:

    if ((str[0]=='0') || (str[0]=='N'))
    

    Hast du 5 Anfänge und Enden, wobei 4 davon nur für ein einzelnes Zeichen verwendet werden. Nämlich 0, '0', 0 und 'N'.
    Der 5. Bereich wäre für das if.

    PS: Nicht in die Irre führen lassen, das Forum hebt Zahlen hier farblich leider nicht hervor, wäre aber sinnvoll, gute Editoren tun das.



  • Objekteditor schrieb:

    PS: Nicht in die Irre führen lassen, das Forum hebt Zahlen hier farblich leider nicht hervor, wäre aber sinnvoll, gute Editoren tun das.

    #ifdef & Co wird übrigens hier auch nicht speziell hervorgehoben, obwohl es sinnvoll wäre.

    _WIN32 könnte man übrigens ebenfalls noch farblich hervorheben, damit es zusätzlich zur Großschreibung sich auch noch farblich von normalen Variablen abhebt.



  • Athar schrieb:

    Kurzer Test in C++ mit einer 484 MB-Logdatei (7.6 Millionen Zeilen):
    Einlesen als binärer Blob: 0.85s

    Von was für einem Speichermedium wurden die Daten gelesen? Eine normale Festplatte packt keine 500MB pro Sekunde.



  • Ich will schon nen Editor bauen, bei dem ich einzelne Wörter einfärben kann.

    Was, wenn du Zeichenketten suchen moechtest und gefundene Farbig hervorheben moechtest? Ueber mehrere Woerter, oder auch innerhalb. Jedes Wort ein Objekt halte ich fuer schlecht.



  • dann brauchst du auch z.B. eine dynamische Liste für die vielen Anfänge und Enden einer Einfärbung, sowie der dazu passenden Farbe oder Farbindexnummer.

    Das gilt für den wörterbasierten Ansatz aber genauso.

    Hast du 5 Anfänge und Enden, wobei 4 davon nur für ein einzelnes Zeichen verwendet werden. Nämlich 0, '0', 0 und 'N'.
    Der 5. Bereich wäre für das if.

    Aber immer noch besser als die 28 Wörter (wenn ich richtig gezählt habe), die bei dieser Zeile zusammenkommen.
    Denk dir eine Range einfach als Wort, in dem auch Leerzeichen vorkommen dürfen.

    Antoras schrieb:

    Von was für einem Speichermedium wurden die Daten gelesen? Eine normale Festplatte packt keine 500MB pro Sekunde.

    Ich habe vorher davor gesorgt, dass die Datei im Filecache ist, daher dürfte das Medium egal sein (es ist eine Durchschnitts-SSD).



  • knivil schrieb:

    Ich will schon nen Editor bauen, bei dem ich einzelne Wörter einfärben kann.

    Was, wenn du Zeichenketten suchen moechtest und gefundene Farbig hervorheben moechtest? Ueber mehrere Woerter, oder auch innerhalb. Jedes Wort ein Objekt halte ich fuer schlecht.

    Dann würden die Farbwerte der entsprechenden Wörter verändert werden.
    Das ist sogar einfacher als das Nachschauen bei solchen Ranges, ob nicht irgendein Range schon mit dem gefunden Suchmuster überlappt.



  • Athar schrieb:

    dann brauchst du auch z.B. eine dynamische Liste für die vielen Anfänge und Enden einer Einfärbung, sowie der dazu passenden Farbe oder Farbindexnummer.

    Das gilt für den wörterbasierten Ansatz aber genauso.

    Hast du 5 Anfänge und Enden, wobei 4 davon nur für ein einzelnes Zeichen verwendet werden. Nämlich 0, '0', 0 und 'N'.
    Der 5. Bereich wäre für das if.

    Aber immer noch besser als die 28 Wörter (wenn ich richtig gezählt habe), die bei dieser Zeile zusammenkommen.
    Denk dir eine Range einfach als Wort, in dem auch Leerzeichen vorkommen dürfen.

    Ich habe 31 gezählt.
    Bei 1 Byte für den Farbwert, daß erlaubt 256 verschiedene Farben, das reicht völlig, würden also 31 Byte zusätzlich belegt werden.

    In deinem Fall wären es auf einem 64 Bit Rechner, wenn du Pointer nimmst 5*2*8 Bytes = 80 Bytes, bzw. nur 4*2*4 = 40 Bytes wenn du ein 32 Bit großes Integer nimmst und das als Arrayindexnummer verwendest.
    Bei meinem Fall verliere ich dagegen den Speicherplatz bei den vielen Adresswerten für nextitem und previtem für die Wortliste.

    Beim erstmaligen Parsen dürfte sich das ein oder andere nicht viel tun.
    Bei Veränderungen des Codes, z.B. wenn du am Anfang ein neues Wort einfügst, müßtest du die Bereiche aller deiner nachfolgenden Ranges ändern.
    Ich dagegen müßte nur 2 Adresswerte von nextitem und previtem bei 2 Wortobjekten ändern und das neue Wort dazwischen einfügen.

    Performancemäßig haben beide Vor- und Nachteile.



  • Objekteditor schrieb:

    Dann würden die Farbwerte der entsprechenden Wörter verändert werden. Das ist sogar einfacher als das Nachschauen bei solchen Ranges, ob nicht irgendein Range schon mit dem gefunden Suchmuster überlappt.

    Nö, denn der zu hervorherbende Text kann mitten in einem Wort anfangen und dort auch wieder aufhören.
    Und wie schon gesagt - Wörter und Ranges sind das gleiche, nur dass du beim Wortansatz auch dann eine neue Range anfängst, wenn das gar nicht nötig wäre (eben an Wortgrenzen, an denen sich die Formatierung nicht ändert).



  • Objekteditor schrieb:

    Ich habe 31 gezählt.
    Bei 1 Byte für den Farbwert, daß erlaubt 256 verschiedene Farben, das reicht völlig, würden also 31 Byte zusätzlich belegt werden.

    In deinem Fall wären es auf einem 64 Bit Rechner, wenn du Pointer nimmst 5*2*8 Bytes = 80 Bytes, bzw. nur 4*2*4 = 40 Bytes wenn du ein 32 Bit großes Integer nimmst und das als Arrayindexnummer verwendest.
    Bei meinem Fall verliere ich dagegen den Speicherplatz bei den vielen Adresswerten für nextitem und previtem für die Wortliste.

    Ich vergaß völlig.
    Wenn du mehrere Ranges hast, dann verlierst du da natürlich auch Speicherplatz für die Adressen, falls du das in einer dynamischen Liste abspeicherst.



  • Athar schrieb:

    Objekteditor schrieb:

    Dann würden die Farbwerte der entsprechenden Wörter verändert werden. Das ist sogar einfacher als das Nachschauen bei solchen Ranges, ob nicht irgendein Range schon mit dem gefunden Suchmuster überlappt.

    Nö, denn der zu hervorherbende Text kann mitten in einem Wort anfangen und dort
    auch wieder aufhören.

    Ok, dann müßte ich dafür ein neues Wortobjekt dazwischen einfügen und das alte in zwei neue Wörter aufspalten, sowie den Textstring entsprechend umkopieren.

    Und wie schon gesagt - Wörter und Ranges sind das gleiche, nur dass du beim Wortansatz auch dann eine neue Range anfängst, wenn das gar nicht nötig wäre (eben an Wortgrenzen, an denen sich die Formatierung nicht ändert).

    Naja, deine Ranges sind alle indirekt, sie sind kein Teil des Textstrings, z.b. einer Zeile.
    Das ist bei mir anders, bei mir gehört die Farbe zu den Wörtern als Eigenschaft.
    Und die einzelnen Wörter bilden dann den Textstring bzw, die Zeile.



  • Ich werfe mal noch zwei Begriffe in den Raum:

    Fliegengewicht und Kompositum.

    Die beiden Muster scheinen mir für einen Editor nützlich zu sein.



  • Objekteditor schrieb:

    Ich vergaß völlig.
    Wenn du mehrere Ranges hast, dann verlierst du da natürlich auch Speicherplatz für die Adressen, falls du das in einer dynamischen Liste abspeicherst.

    das hast du auch bei deinem Konzept. Oder willst du die Wortgrenzen jedesmal neu ermitteln? Auch halte ich dann das löschen/einfügen von Textabschnitten für ziemlich kritisch. Die Anzahl der Objekte tut sein übriges. Im schlimmsten Fall hast du so viele Objekte wie Zeichen

    Ranges sind im Regelfall genau gleich zu deinem Konzept. Nur mit dem Vorteil, dass du beliebige Ranges auch über mehrere Wörter und Zeilen hinweg definieren kannst. Ganze Datei markieren: Eine Range anlegen. Bei deinem Konzept Millionen von Objekten durchlaufen und Status setzen



  • zwutz schrieb:

    Objekteditor schrieb:

    Ich vergaß völlig.
    Wenn du mehrere Ranges hast, dann verlierst du da natürlich auch Speicherplatz für die Adressen, falls du das in einer dynamischen Liste abspeicherst.

    das hast du auch bei deinem Konzept.

    Hab ich ja oben geschrieben.

    Ganze Datei markieren: Eine Range anlegen. Bei deinem Konzept Millionen von Objekten durchlaufen und Status setzen

    Ok, dieses Argument hat mich überzeugt, ich werde Ranges nutzen.



  • Objekteditor schrieb:

    Ganze Datei markieren: Eine Range anlegen. Bei deinem Konzept Millionen von Objekten durchlaufen und Status setzen

    Ok, dieses Argument hat mich überzeugt, ich werde Ranges nutzen.

    Noch etwas.

    Allerdings müssen die Ranges dann ja über Objektgrenzen hinweg funktionieren.
    Wenn bei euch jede Zeile ein Objekt ist, dann könnt ihr die Ranges nicht an die Objekte binden, wenn sie auch über die Objektgrenzen hinweg funktionieren sollen.

    Das sehe ich kritisch.

    Eventuell wäre es sinnvoll zwei Arten von Ranges einzuführen, eine die an Objekte gekoppelt sind, also an die Zeilen und die Zeilen statisch einfärbt.
    Statisch weil ein C++ Schlüsselwort wie z.B. while ja auch nach dem markieren mit der Maus und wieder los lassen ein Schlüsselwort bleibt.
    Und eine extra Range die nur zum Markieren da ist.

    Wobei die Range zum Markieren dann beim Zeichnen die höhere Priorität hat, als die statischen Objektgebundenen Ranges.


Anmelden zum Antworten