Beste Antwort
Ich kann nicht glauben, dass noch niemand Vim gesagt hat. Vim!
Sobald Sie die anfängliche Lernkurve überwunden haben, Es ist ein erstaunliches Werkzeug zur Automatisierung alltäglicher Programmieraufgaben. Ich gebe Ihnen ein Beispiel, das ich heute früher verwendet habe.
Ich habe eine XML-Reader-Klasse (von einer XML-Basisklasse geerbt) für eine Komponente unserer Codebasis erstellt. Die XML sah ungefähr so aus.
...
Das Problem war (aufgrund der vorhandenen Architektur), dass diese Feldwerte alle private Datenelemente von Some\_XML\_Class im Code sein mussten. Was bedeutete, dass ich eine Menge bedeutungsloser Arbeit machen wollte, um Feld eins in std :: string m\_field\_one zu konvertieren für jedes dieser Felder.
Hier kommt Vim ins Spiel. Anstatt 20 Minuten auf die harte Tour zu bringen. Ich habe den obigen Codeabschnitt eingefügt und ein Makro aufgezeichnet.
^xistd::string m\_
Diese Reihe von vim-Befehlen führt die folgenden Schritte aus. Geht zum ersten Zeichen der Zeile und löscht es (“ wird gelöscht). Geht in den Einfügemodus und stellt std :: string m\_ Feld . Dann findet es das erste Vorkommen von „-“ und ersetzt es durch „\_“. Dann springt es zum Ende des Wortes field\_N , wechselt in den Append-Modus, fügt ein Semikolon hinzu und bewegt den Cursor nach rechts. Damit haben wir jetzt
std::string m\_field\_one;value="value1" />
Aber wir sind noch nicht fertig. Wir gehen dann in den Befehlsmodus, löschen den Rest der Zeile und springen zum nächsten. Damit haben wir:
std::string m\_field\_one;
Beachten Sie, dass Zeile eins perfekt formatiert ist und sich der Cursor derzeit in Zeile zwei befindet.
In diesem nächsten Teil, wenn die Magie hereinkommt. Bevor wir diesen Befehl ausgeführt haben, haben wir begonnen, ein Makro aufzuzeichnen, um a zu registrieren. . Verwenden Sie den Befehl q gefolgt von a . Führen Sie daher den vollständigen Befehl wie folgt aus (wobei das endgültige q verwendet wird, um die Beendigung des Makros anzuzeigen).
qa^xistd::string m\_
Rufen Sie dieses Makro nun mit dem Befehl Vim auf:
@a
Das Makro wird erneut ausgeführt und die nächste Zeile wird automatisch formatiert:
std::string m\_field\_one;
std::string m\_field\_two;
Aber warte, wir haben immer noch N-2 Linien mit ähnlicher Struktur! Nehmen wir an, in diesem Fall war N gleich 100. Kein Problem. Wir geben einfach den Befehl ein:
98@a
Dadurch wird das obige Makro 98 Mal ausgeführt und der Rest Ihres Codes wird automatisch formatiert !! Wir haben jetzt:
std::string m\_field\_one;
std::string m\_field\_two;
std::string m\_field\_three;
...
std::string m\_field\_ninetynine
std::string m\_field\_onehundered;
Erstaunlich .
* PS: Diese Befehle mögen Ihnen zunächst fremd und beängstigend erscheinen, aber wenn Sie einige Zeit mit Vim als primärem Editor verbracht haben, werden sie zur zweiten Natur. Das Schreiben des Beispielmakros dauerte 10 Sekunden und sparte viel Zeit.
* PPS: Ich weiß, dass der Beispielcode ziemlich dumm ist, aber ich habe ihn nur verwendet, um einen Punkt zu veranschaulichen. In der realen Welt werden Sie jedoch auf ähnliche Fälle stoßen.
Antwort
Vielen Dank für Ihre Anfrage.
Ich bin ursprünglich hierher gekommen, um vor einem solchen Ziel zu warnen, nur basierend zum Titel … Grundsätzlich würden Sie heute einen Texteditor schreiben, weil:
- Sie einen ganz bestimmten Bedarf haben (aber in diesem Fall sollten Sie immer noch besser von einer vorhandenen Basis ausgehen, als von einer vorhandenen von Grund auf neu gehen, es sei denn, Sie haben sehr neue Ideen);
- ODER Sie denken, dass dies eine interessante Übung in der Programmierung ist; Das ist in der Tat Ihr Ziel.
Denn ehrlich gesagt, wenn Sie Ihren Traumeditor nicht in den Hunderten, wenn nicht Tausenden von existierenden finden können, sind Sie sehr wählerisch !; -)
Ich war auch versucht zu sagen, dass das Schreiben eines Texteditors von Grund auf für einen Anfänger etwas entmutigend sein kann; sagen wir, es ist eine Aufgabe der Mittelstufe: ein bisschen schwer für einen absoluten Anfänger, einmal machbar Sie haben etwas Erfahrung.
Das heißt, ich habe meinen eigenen Texteditor geschrieben, als ich noch ein Anfänger war: frisch von der Universität, nur ein wenig in C codiert, ohne wirkliches Projekt. Aber ich war auf einem PC mit SCO Unix und hatte nur vi als Editor. Und ich mag es nicht wegen seiner zwei Modi (Navigation vs. Edition), die mich immer verwirren (anfangen zu tippen, meinen Text erst nach dem ersten i … zu sehen).
Also habe ich gerade angefangen, meinen Editor in C zu codieren, Curses als Schnittstelle zu verwenden, meine eigenen Datenstrukturen zu erstellen (wahrscheinlich ineffizient, aber wir haben uns damals mit kleinen Dateien befasst) usw.
Ich hatte viel Spaß, ich habe viel gelernt und als andere Benutzer anfingen, es ebenfalls zu verwenden, stellte ich fest, dass sie immer unerwartete Dinge tun, wie das Mischen von Tabulatoren und Leerzeichen … 🙂
Wenn Sie ein absoluter Anfänger sind, sollten Sie mit kleineren Projekten beginnen, um mehr über die Grundlagen der Sprache (Schleifen, Arrays usw.), über Datenstrukturen, das Lesen und Schreiben von Textdateien usw. Zu erfahren.
Es ist schwer, für eine Sprache zu raten … Für ein JVM-basiertes Projekt würde ich Ceylon verwenden, vielleicht mit JavaFX oder SWT. Für ein „nah am Metall“ -Projekt würde ich Rust verwenden (es gibt ein Startprojekt zum Schreiben eines Texteditors in Rust, das vielversprechend erscheint), während andere empfehlen würden, C ++ zu verwenden (was für Anfänger überwältigend sein könnte!). Für eine einfachere Sprache würde Lua vielleicht gut passen (andere würden empfehlen, Python zu verwenden, aber ich habe keine Erfahrung damit). Oder vielleicht JavaScript mit Node.js und der Electron-Plattform, eine Trendoption … (Atom, Visual Studio Code und Brackets wurden damit geschrieben. Aber das ist „kaum“ von Grund auf neu „, da sie vorhandene JS-Code-Editoren verwenden. )
Allgemeiner Rat: Entwerfen Sie zuerst Ihre Datenstruktur (die zweiteilige Strategie des Scintilla-Projekts ist gut; Seile, wie sie vom Rust-Projekt verwendet werden, sind etwas weiter fortgeschritten), wie Sie bearbeiten Daten: Hinzufügen oder Entfernen eines Zeichens, einer Zeile, einer Auswahl usw.
Denken Sie dann an die Benutzeroberfläche. Trennen Sie im Idealfall die beiden (Datenverarbeitung und Datenanzeige). Auf diese Weise eines Tages Sie können das UI-Ziel (von Swing zu JavaFX, von GTK + zu Qt usw.) ohne oder mit nur geringen Änderungen an Ihrer Basislogik ändern. Gut für die Portabilität.