Frage

Ok, das ist ein bisschen eine freche Frage. Ich möchte einen einfachen Text-Editor (mit meinem eigenen Textmodus-Bildschirm Handling) bauen. Ich will nur ein gutes Beispiel für Datenstrukturen, die verwendet werden können, um den Text-Puffer und einige einfache Beispiele von Zeichen / Text Einfügen / Löschen zu repräsentieren. Ich kann den Rest des Codes selbst (Datei i / o, Konsole i / o usw.) behandeln. Ein Link zu einer netten einfachen Editor Quelle wäre toll (C oder C ++).

War es hilfreich?

Lösung

Das ist 2008. Sie einen Text-Editor nicht schreiben; Sie neu zu erfinden Feuer.

Immer noch hier? Ich bin mir nicht sicher, ob dies gilt oder welche Plattformen Sie planen, zu unterstützen, aber die Neatpad Reihe von Tutorials ist ein großartiger Ort, um sich Gedanken über einen Texteditor zu schreiben. Sie konzentrieren sich auf Win32 als Basis-Plattform, aber viele der gelernten Lektionen werden überall gelten.

Andere Tipps

habe ich für eine Firma Hauptprodukt war ein Texteditor, das zu arbeiten. Während ich in erster Linie auf der Skriptsprache für sie arbeitete, war der innere Aufbau des Editors selbst natürlich ein wichtiges Thema der Diskussion.

Es schien wie es brach in zwei allgemeine Gedankengänge. Einer war, dass Sie jede Zeile selbst gespeichert sind, und verknüpfen sie dann zusammen in einer verknüpften Liste oder andere allgemeine Datenstruktur, die Sie zufrieden waren. Der Vorteil war, dass alle leitungsorientierten Bearbeitungsaktionen (wie eine ganze Zeile löschen oder einen Zeilenblock in einer Datei zu bewegen) über trivial waren schnell zu implementieren und somit ein Blitz. Der Nachteil war, dass das Laden und Speichern Sie die Datei ein wenig mehr Arbeit nahm, weil Sie die gesamte Datei durchlaufen müssten und diese Datenstrukturen aufzubauen.

Der andere Gedankengang war zu dieser Zeit zu versuchen, große Stücke von Text zusammen zu halten, unabhängig von Zeilenumbrüchen, wenn sie nicht geändert worden waren, so dass sie nach oben zu brechen nur durch Bearbeitung erforderlich. Der Vorteil war, dass ein ungeschnittenes große Stück der Datei sehr leicht in eine Datei gesprengt werden könnte. So einfache Änderungen in dem Sie eine Datei laden, eine Zeile ändern, und speichern Sie die Datei, waren super schnell. Der Nachteil war, dass die leitungsorientierte oder Spaltenblockoperationen sehr zeitaufwendig waren auszuführen, da Sie durch diese großen Stücke von Text würden analysieren und um eine Menge von Daten zu bewegen.

Wir sind immer mit dem zeilenorientierten Design stecken, denn was es wert ist, und unser Produkt wurde einer der am schnellsten Redakteure zu der Zeit betrachtet.

Die "Gang of Four" Buch ( Design Patterns ) eine GUI-basierte Text Editor wie es ist Hauptquelle der Beispiele und ist ein lohnendes Buch zu besitzen.

Der allgemeine "reine Text" Editor verwendet wahrscheinlich Seil, die SGI STL hat eine Implementierung . Im Grunde sind sie eine verknüpfte Liste von Zeichenpuffer. Auf diese Weise, Einfügen / Löschen von Zeichen beinhaltet kleineren Puffer zu ändern und ein paar Hinweise, anstatt das gesamte Dokument in einem einzigen Puffer zu speichern und mit alles verschieben.

Meine Lieblings Lösung ist der Lücke Puffer , weil es ziemlich einfach zu implementieren und hat eine gute < em> abgeschrieben Effizienz. Verwenden nur eine einzige Reihe von Zeichen, mit einer Region, die als Spalt bezeichnet. Sobald Sie das Konzept zu verstehen, folgt der Code fast natürlich.

Sie müssen auch ein Hilfs array [vector ] den Index des Anfang jeder Zeile zu verfolgen - so dass Sie leicht eine bestimmte Textzeile extrahieren kann. Die Hilfs Array benötigt nur aktualisiert werden, wenn der Spalt sich bewegt, oder wenn ein Zeilenumbruch eingefügt / entfernt wird.

Diese beide Online-Dokumente stellen ein kleines, aber nützliches Füllhorn von „bekannten“ Datenstrukturen / Techniken für Texteditoren.

  1. Datenstrukturen für Textsequenzen wird beschrieben und experimentell analysiert ein einige Datenstrukturen, auf Stück lehnt Tabellen als die Datenstruktur der Wahl. Net.wisdom jedoch scheint auf Lücke Puffer zum Anlehnen als mehr als ausreichend für die Textbearbeitung zu sein und einfacher / debug zu implementieren.
  2. „Das Handwerk der Textbearbeitung“ (www.finseth.com/craft/) ist eine ältere Arbeit, und richtet sich mehr als nur Datenstrukturen und ist auf Emacs-Stil Editoren orientiert; aber die Konzepte sind in der Regel sinnvoll.

Ein einfacher Ansatz wäre Linie ausgerichtet werden, - stellen die Datei als Array / Vektor von char / Wchar_t Arrays / Vektoren, eine pro Zeile. Einfügungen und Löschungen so funktionieren, wie man erwarten würde, obwohl Ende der Leitung ein Sonderfall ist.

ich damit beginnen würde und möglicherweise die Liniendatenstruktur mit etwas ersetzen effizienten Einsätzen / löscht auf langen Leitungen unterstützt, nachdem Sie alles anderes haben zu arbeiten.

Sie können fast jede Datenstruktur verwenden, um einen Texteditor zu schreiben. Zwei Millionen Zeichen sind ziemlich dick Roman im Wert von Tipp- und Sie können sie leicht / ab bewegen (für ein Einfügen / Löschen in einem einfachen Array) in weniger als ein Zehntel einer Sekunde. Hören Sie nicht auf alle, die Sie nicht beim Aufbau einer sagt, Sie bekommen etwas, das genau richtig in allen kleinen Details funktioniert.

Ich schrieb mir, nachdem ich zu viel Surfen im Internet getan hatte, und ich habe eine Seite nach oben / unten verwendet würde die gleiche ist wie über / unter dem Scrollbar Daumen klicken. Der Sprung zurück, bevor Sie begann Scrollbar navigieren, wenn Sie ein Zeichen in einem normalen Editor eingegeben haben, bekam einfach zu ärgerlich für mich, also schrieb ich meine eigenen.

Wenn ich eine Rewrite tun würde (ich habe nur delphi Ansistrings für jeden Textpuffer in der aktuellen Version mit Zeilenumbrüche eingebettet), I ganze Zahlen oder int64s für jedes Zeichen und Codierblock Start verwenden würde / Stop, Cursorposition und Linie Markierungen in den High-Bits, auf diese Weise müssen Sie Zeiger nicht einstellen, wenn Sie Dinge einfügen oder löschen.

Ihre primäre Datenstruktur ist ein um den Text zu enthalten. Anstatt einen langen Puffer mit dem Text enthalten, werden Sie wahrscheinlich eine Reihe von Linien wollen, weil es schneller ist ein Zeichen in der Mitte einer Zeile einzufügen, dann ist es ein Zeichen in der Mitte eines großen Puffer einzufügen.

Sie müssen entscheiden, ob Ihr Texteditor eingebettete Formatierung unterstützen sollte. Wenn zum Beispiel, müssen Sie Schriftarten verwenden, bolding, Unterstreichungen, etc, dann wird Ihre Datenstruktur müssen Wege Einbettung Formatierungscodes in Ihrem Text enthalten. In den guten alten Zeiten der 8-Bit-Zeichen können wir den oberen 8 Bits einer ganze Zahl verwenden, um alle Formatierungs Flags zu speichern und den unteren 8-Bits, die die Zeichen selbst zu speichern.

Der eigentliche Code wird von der Sprache ab, die Sie verwenden. In C # oder C ++ werden Sie wahrscheinlich einen Array von Strings für die Linien verwenden. In C finden Sie eine Reihe von Heap-basierten haben Zeichen-Arrays.

Trennen Sie den Anzeigecode aus dem Textverarbeitungscode so weit wie möglich aus. Das Zentrum des Codes wird eine enge Schleife so etwas wie:

while (editing) {
    GetCharacter();
    ProcessCharacter();
    UpdateDisplay();
}

Eine anspruchsvollere Editor separate Threads für den Charakter bekommen / Verarbeitung und die Anzeige aufgefrischt werden.

Das hängt wirklich von Ihrem Design. Ein paar Jahre zurück, schrieb ich einen kleinen Editor Flüche verwenden. Früher habe ich doppelt verknüpften Liste, wobei jeder Knoten ein Zeichen war (ziemlich verschwenderisch Design .. aber es macht die Formatierung und Bildschirmaktualisierungs Routinen einfach).

Andere Datenstrukturen von meinen Freunden verwendet wurden, waren (das war ein Hausaufgaben-Projekt): 1) verketteten Liste von Arrays mit jedem Array repräsentiert eine Linie. 2) eine 2D-verkettete Liste (nur aus diesem Namen) .. es war eine verknüpfte Liste von Zeichen, aber jedes Zeichen wurde auf das Zeichen oben und unten verlinkt. 3) Array von verknüpften Liste

Allerdings würde ich Ihnen vorschlagen, durch den Quellcode einiger einfacher Editoren wie pico zu gehen, um zu sehen, was ds sie verwenden.

Haben Sie ausgecheckt Scintilla 's Quellcode?

Überprüfen Sie heraus vim, es ist Open-Source. Herumzuzustochern darin zu sehen, wie es behandelt, was Sie wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top