Nachträgliche Einrückung in Synedit
-
MacWomble
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Nachträgliche Einrückung in Synedit
Hallo,
wie kann ich einen Sourcecode in Synedit automatisch formatieren lassen? Benötige ich hierzu die Codetools?
Gibt es eventuell ein Beispiel hierfür?
wie kann ich einen Sourcecode in Synedit automatisch formatieren lassen? Benötige ich hierzu die Codetools?
Gibt es eventuell ein Beispiel hierfür?
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
-
Warf
- Beiträge: 2281
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Nachträgliche Einrückung in Synedit
Das ist gar nicht mal so einfach und dafür gibt es keine vorgefertigte Funktion. SynEdit kennt die syntax der zielsprache nicht und daher ist es natürlich auch schwer da irgendwas zu machen.
Wenn man es richtig machen wöllte würde das so gehen:
1. Source code lexen
2. AST (Abstract Syntax Tree) aufbauen
3. AST traversen und pretty printen (also praktisch tiefensuche über den AST machen und jede node korrekt formatiert ausgeben)
du musst also praktisch n drittel Compiler schreiben (Lexer + Parser), was natürlich nicht sonderlich einfach/wenig ist. Wenn du nur einrücken willst, brauchst du keinen komplexen pritty printer, ich hatte das damals für meine kleine IDE einfach so gemacht, das ich immer wenn man enter gedrückt hat, geschaut hab ob in der zeile vorher eins der Keywords vorkam bei denen man einrücken muss, wenn ja wurde nach dem enter drücken einfach automatisch der curser um zwei felder nach rechts bewegt. Link zum Source. Nicht die schönste lösung, hat aber ein vollkommen akzeptables ergebnis geliefert.
Darf man fragen für welche Sprache das ist? Vielleicht gibt es ja schon ne Lösung (für C und C++ kann man z.B. einfach clang-format im hintergrund aufrufen, und das die sache übernehmen lassen)
Wenn man es richtig machen wöllte würde das so gehen:
1. Source code lexen
2. AST (Abstract Syntax Tree) aufbauen
3. AST traversen und pretty printen (also praktisch tiefensuche über den AST machen und jede node korrekt formatiert ausgeben)
du musst also praktisch n drittel Compiler schreiben (Lexer + Parser), was natürlich nicht sonderlich einfach/wenig ist. Wenn du nur einrücken willst, brauchst du keinen komplexen pritty printer, ich hatte das damals für meine kleine IDE einfach so gemacht, das ich immer wenn man enter gedrückt hat, geschaut hab ob in der zeile vorher eins der Keywords vorkam bei denen man einrücken muss, wenn ja wurde nach dem enter drücken einfach automatisch der curser um zwei felder nach rechts bewegt. Link zum Source. Nicht die schönste lösung, hat aber ein vollkommen akzeptables ergebnis geliefert.
Darf man fragen für welche Sprache das ist? Vielleicht gibt es ja schon ne Lösung (für C und C++ kann man z.B. einfach clang-format im hintergrund aufrufen, und das die sache übernehmen lassen)
-
MacWomble
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Nachträgliche Einrückung in Synedit
Ich bin gerade dabei einen Quellcodegenerator für FPC zu bauen. Das funktioniert bisher bis auf die Einrückung wunderbar.
Nur kommt es unter Umständen zu unschöner Formatierung, wenn ich bestehenden Quelltext dazu einfüge, welche anders oder nicht eingerückt ist. Deswegen wollte ich einen Formatter nachträglich (nachdem der Quellcode eingefügt ist) über das Synedit laufen lassen.
Nur kommt es unter Umständen zu unschöner Formatierung, wenn ich bestehenden Quelltext dazu einfüge, welche anders oder nicht eingerückt ist. Deswegen wollte ich einen Formatter nachträglich (nachdem der Quellcode eingefügt ist) über das Synedit laufen lassen.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
-
Warf
- Beiträge: 2281
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Nachträgliche Einrückung in Synedit
Also natürlich kannst du da den Jedi Code Formatter den Lazarus auch benutzt verwenden, der kann aber nur ganze dateien formattieren. Das ist natürlich doof wenn schon was in der Datei steht, und man die Im git hat, möchte man wegen dem hinzufügen von deinem Code nicht eventuell die ganze datei formatieren.MacWomble hat geschrieben:Ich bin gerade dabei einen Quellcodegenerator für FPC zu bauen. Das funktioniert bisher bis auf die Einrückung wunderbar.
Nur kommt es unter Umständen zu unschöner Formatierung, wenn ich bestehenden Quelltext dazu einfüge, welche anders oder nicht eingerückt ist. Deswegen wollte ich einen Formatter nachträglich (nachdem der Quellcode eingefügt ist) über das Synedit laufen lassen.
Was du tun könntest ist die einrückungen selbst zählen, und dann durch deinen Code gehen und den einrücken.
Etwa so:
Code: Alles auswählen
VorrigeCodeZeile := Code[ZeileZumEinsetzen -1]; // erste code zeile vor dem ziel
for i:=0 to VorrigeCodeZeile .Count -1 do
if not (VorrigeCodeZeile.Chars[i] in [#9, ' ']) then // erstes symbol das kein tab oder space ist
Prefix := VorrigeCodeZeile.SubString(i); // Einrückung dieser zeile kopieren
for i:=0 to GenCode.Count-1 do
GenCode[i] := Prefix + GenCode[i]-
MacWomble
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Nachträgliche Einrückung in Synedit
Danke für die Info.
Ich habe das Einrückungsproblem zwar nicht gelöst, aber das Ergebnis sieht dennoch gut aus.
Ich schreibe nicht in bestehende Dateien sondern erzeuge komplette Sourcedateien. Zumindest nach derzeitigem Stand.
Die Dateien sollten dann manuell auch nicht mehr verändert, sondern ggf. mit meinem Programm bearbeitet bzw. neu erzeugt werden.
Sorry, mehr verrate ich erst beim Februar-Treffen in Stuttgart ...
Ich habe das Einrückungsproblem zwar nicht gelöst, aber das Ergebnis sieht dennoch gut aus.
Ich schreibe nicht in bestehende Dateien sondern erzeuge komplette Sourcedateien. Zumindest nach derzeitigem Stand.
Die Dateien sollten dann manuell auch nicht mehr verändert, sondern ggf. mit meinem Programm bearbeitet bzw. neu erzeugt werden.
Sorry, mehr verrate ich erst beim Februar-Treffen in Stuttgart ...
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
-
MacWomble
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Nachträgliche Einrückung in Synedit
Solche Konstrukte würden dann aber nicht erkannt und falsch eingerückt (oder es wird richtig kompliziert):Warf hat geschrieben:Somit hat es das selbe einrücklevel wie der target code. Wenn mans schlauer machen will, würde ich nach dem ersten begin suchen davor und von der Zeile dann die einrückung + 2 benutzen
Code: Alles auswählen
begin
for i := 1 to Ziel do
writeln('Irgendwas');
writeln('Fertisch !');
end;
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
- af0815
- Lazarusforum e. V.
- Beiträge: 7182
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Nachträgliche Einrückung in Synedit
Merk dir doch die Einrückungen im Quellcodegenerator und mach die Einrückungen nicht nachträglich.
Ich würde mal vermuten bzw. raten, du machst den Quellcodegenerator für den fpReport
Ich würde mal vermuten bzw. raten, du machst den Quellcodegenerator für den fpReport
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
MacWomble
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Nachträgliche Einrückung in Synedit
Nein, falsch geraten.af0815 hat geschrieben:Merk dir doch die Einrückungen im Quellcodegenerator und mach die Einrückungen nicht nachträglich.
Ich würde mal vermuten bzw. raten, du machst den Quellcodegenerator für den fpReport
Mit fpReport komme ich inzwischen besser klar, nachdem jetzt bekannt ist, wie man Zahlen formatiert.
Da warte ich auch noch ab, was Pascal da noch aus meiner Wunschliste abarbeiten kann.
Da ich keinerlei Reports in der Unit programmieren möchte (dafür gibts den Designer), besteht da für mich (noch) kein Bedarf.
Eigentlich wollte ich hier ja noch nicht zu viel verraten, aber was solls:
Wie du eventuell ja mitbekommen hast, habe ich mir ein System zur Erstellung von Datenbankanwendungen erarbeitet. Hierfür sind viele Klassen (z.B. für die DB-Tabellen) notwendig, welche alle nach dem gleichen Muster aufgebaut sind. Solche Klassen zu erstellen ist reine Fleißarbeit und wird idealerweise von der Maschine erledigt.
Danach gilt es, DrawGrids für die Datenlisten sowie passende Editoren einzurichten. Auch dies ist letztendlich Fleißarbeit ...
Neben einer drastischen Zeitersparnis und einer sauberen Sortierung der Methoden minimiert man durch ein solches System die Syntax- und Tippfehler, vereinheitlicht die Bezeichnungen und, und, und ...
Ich bin noch ganz am Anfang und kann momentan nur Klassen erstellen.
Das angehängte Beispiel cuakte erstellte ich in 6 Minuten (da fehlen noch einige sehr umfangreiche Methoden!) - und das wird noch besser !
Den Steuerrechner cuvat (Gibt es als VATCalculator) habe ich testweise mit meinem Generator nachgebaut, um ein einfacheres Beispiel zu haben.
- Dateianhänge
-
- cuvat.pas
- (1.44 KiB) 126-mal heruntergeladen
-
- cuakte.pas
- (8.46 KiB) 137-mal heruntergeladen
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
- af0815
- Lazarusforum e. V.
- Beiträge: 7182
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Nachträgliche Einrückung in Synedit
Wenn du dich an tiOPF erinnerst ist dort ein solcher Generator eingebaut.
tiOPF_apps dort tiOPFMapper/mapper und dort in der unit mapper_project_writer.pas ist ein Beispiel, wie das in tiOPF gelöst wurde. Falls du die unit nicht mehr findest, ich habe sie hier in meinem GIT Repro.
Ich habe mich schon mit dem Gedanken gespielt einen Reportwriter zu erstellen, der aus dem Reportformat wieder eine Pascal Unit bauen kann. Damit könnte ich den Report mit der Hand designen und dann als Unit fix einbinden. Hat für OneFileDeploy einiges an Vorteile.
tiOPF_apps dort tiOPFMapper/mapper und dort in der unit mapper_project_writer.pas ist ein Beispiel, wie das in tiOPF gelöst wurde. Falls du die unit nicht mehr findest, ich habe sie hier in meinem GIT Repro.
Ich habe mich schon mit dem Gedanken gespielt einen Reportwriter zu erstellen, der aus dem Reportformat wieder eine Pascal Unit bauen kann. Damit könnte ich den Report mit der Hand designen und dann als Unit fix einbinden. Hat für OneFileDeploy einiges an Vorteile.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
MacWomble
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Nachträgliche Einrückung in Synedit
Danke, aber das mit tiOPF habe ich aufgegeben und stricke mir selbst was. Ich habe die ganzen tiOPF-Sachen noch, aber bekam nicht die notwendige Unterstützung bei meinen - seinerzeit - einfachen Problemen.
Die fpReports in eine Unit umzuwandeln sollte recht einfach funktionieren, soweit ich das gesehen habe. Es ist ja fast alles im Report hinterlegt.
Die fpReports in eine Unit umzuwandeln sollte recht einfach funktionieren, soweit ich das gesehen habe. Es ist ja fast alles im Report hinterlegt.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
- af0815
- Lazarusforum e. V.
- Beiträge: 7182
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Nachträgliche Einrückung in Synedit
Das habe ich nicht gemeint, mit tiOPF was zu machen. Nur die Struktur dahinter wie der Generator funktioniert das habe ich gemeint. Das ist relativ einfach und wirkungsvoll.MacWomble hat geschrieben:Danke, aber das mit tiOPF habe ich aufgegeben und stricke mir selbst was.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
MacWomble
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Nachträgliche Einrückung in Synedit
den Mapper gabs nur als Windows-exe. Die Definitionen sind dort in einer XML-Datei zu coden. Das ist mir viel zu umständlich. 
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.