Nachträgliche Einrückung in Synedit

Rund um die LCL und andere Komponenten
Antworten
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

Beitrag von MacWomble »

Hallo,

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

Beitrag von Warf »

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)

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

Beitrag von MacWomble »

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.
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

Beitrag von Warf »

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.
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.

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]
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

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

Beitrag von MacWomble »

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 ...
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

Beitrag von MacWomble »

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
Solche Konstrukte würden dann aber nicht erkannt und falsch eingerückt (oder es wird richtig kompliziert):

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.

Benutzeravatar
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

Beitrag von af0815 »

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 :-)
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

Beitrag von MacWomble »

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 :-)
Nein, falsch geraten. :D
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.

Benutzeravatar
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

Beitrag von af0815 »

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.
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

Beitrag von MacWomble »

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.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
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

Beitrag von af0815 »

MacWomble hat geschrieben:Danke, aber das mit tiOPF habe ich aufgegeben und stricke mir selbst was.
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.
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

Beitrag von MacWomble »

den Mapper gabs nur als Windows-exe. Die Definitionen sind dort in einer XML-Datei zu coden. Das ist mir viel zu umständlich. :shock:
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Antworten