Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   Source Code Formater (https://www.delphipraxis.net/186248-source-code-formater.html)

Monday 17. Aug 2015 20:19

Source Code Formater
 
Hallo,

bei einigen meiner Dateien ist mein Code auf die schnelle geschrieben und deswegen unschön mit einrückungen usw.

Beim Googlen bin ich wenig erfolgreich gewesen. Diese Polystyle Demo funktioniert nur sehr eingeschränkt und kaufen soll man das zur Zeit. Bei anderen Formater die funktionieren nicht so richtig oder werden nicht mehr gepflegt, haben defekte Links usw.

Nun wollte ich schnell selbst einen Source Code Formater schreiben der den Code schön macht. Allerdings gibt es da doch mehr zu beachten, als ich zunächst dachte.

Kennte jemand ein Programm / Tool dass das kann?

Am liebsten wäre mir mit den Sprachen Delphi, HTML, CSS, PHP, JavaScript.

LG
Monday

frankyboy1974 17. Aug 2015 20:25

AW: Source Code Formater
 
Hallo monday,

ich würde auf friday warten.

mfg

frank

Dejan Vu 17. Aug 2015 20:25

AW: Source Code Formater
 
Greg's Formatter, Jedi Code Formatter. Bei GExerts ist einer dabei. Ich verwende DelForExp

Sherlock 19. Aug 2015 08:26

AW: Source Code Formater
 
DelForExp ist ja der, der in die GExperts eingebaut werden kann. Grundsätzlich hat ja Delphi selber auch einen, mindestens seit XE2.

Sherlock

Mavarik 19. Aug 2015 08:42

AW: Source Code Formater
 
Zitat:

Zitat von Monday (Beitrag 1312480)
Nun wollte ich schnell selbst einen Source Code Formater schreiben

Melde Dich, wenn Du Ihn fertig hast...:cyclops:

Ich nutze den in der IDE... Wenn überhaupt...

Leider funktioniert KEINER so wie ich es gerne hätte...
Daher formatiere ich NUR Blöcke und NIE eine ganze Unit...

Monday 11. Jul 2020 20:35

AW: Source Code Formater
 
Hallo,

ist schon eine Weile her. Aber mein Wunsch einen eigenen Source Code Formatter (Pascal) zu schreiben steht noch immer im Raum :-D

Deshalb habe ich noch ein bisschen gegrübelt und mich mal wieder daran versucht.

Einer meiner ersten Versuche möchte ich hier vorstellen. Es ist eine reine Spiel-und-Test Version. Es funktioniert noch nicht perfekt. Aber mir gefällt die Tendenz im Augenblick schon ganz gut. Später wenn ausgereifter will ich alles auch benutzerfreundlicher machen. Aktuell muss ich den Zustand reifen lassen :)

Wer Lust und Spaß daran hat, kann gerne mit dem Code auch etwas herumknobbeln, weiterverarbeiten, usw.
Anregungen zum Code und Ideen sind Willkommen.

Der Code ist einfach gehalten. Einfach ein neues Projekt erstellen, ein großes Memo (nur für die Anzeige), ein Button und ein Label (eigentlich auch nicht notwendig, wieder nur um schnell mal etwas zu prüfen...) darauf ziehen. (Ich komme von Lazarus, daher sind evtl. geringfügig änderungen nötig).

"input.txt" => Quellcode der formatiert werden soll
"output.pas" => der Formatierter Code

Viel Spaß und viel Glück :-)

Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,RegExpr, strutils;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }


function string_zaehlen(substr: string; str: string): integer;
var
  a: integer;
  z,posi: integer;
begin
  // ===== Ein paar sachen nicht zählen:
  // === einzeiliges...
  // kommentare ignorieren
  Delete(str,pos('//',str),length(str));
  // texte innerhalb von ' ignorieren
  Delete(str,posEx('''',str,1),
    (posEx('''',str, posEx('''',str,1)+1   ) -  posEx('''',str,1)+1    )       );



  // ab hier zählen
  z := 0; posi := 0;
  For a := 0 to str.Length-1 do begin
    posi := posEx(substr, str, posi+1);
    if posi > 0 then begin
      z := z+1;
    end;
    if posi = 0 then begin break; end;
  end;
  Result := z;
end;

//https://www.delphi-treff.de/tipps-tricks/object-pascal/strings/zeichen-wiederholen/
function Replicate(ch: char; anzahl: integer): string;
begin
  SetLength(Result,Anzahl);
  if Length(Result)>0 then
    FillChar(Result[1],Length(Result),ch);
end;

procedure Split(Delimiter: Char; Str: string; ListOfStrings: TStrings) ;
begin
   ListOfStrings.Clear;
   ListOfStrings.Delimiter      := Delimiter;
   ListOfStrings.StrictDelimiter := True; // Requires D2006 or newer.
   ListOfStrings.DelimitedText  := Str;
end;


function Implode(const Strings: TStrings; const separator: string): String;
var
  i: Integer;
begin
  Result := Strings[0];
  for i := 1 to Strings.Count - 1 do
    Result := Result + separator + Strings[i];
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  input: TSTringList;  // Datei einlesen
  output: TStringList; // verarbeitete daeti ausgeben

  trenner: TSTringList;

  a: integer;
  temp,txt,txt2: string;

  leerzeichen: integer;
  d: textfile;
begin


  // ===== Datei einlesen - begin
  input := TStringList.Create;
  input.LoadFromFile('input.txt');
  // ===== Datei einlesen - end







  // ===== Datei verarbeiten - begin
  trenner := TStringList.Create;
  trenner.Add(' ');
  trenner.Add('//');
  trenner.Add(';');
  trenner.Add('var');
  trenner.Add(#13#10);
  trenner.Add('begin');
  trenner.Add('end');
  trenner.Add('{');
  trenner.Add('}');
  trenner.Add('[');
  trenner.Add(']');
  trenner.Add('(');
  trenner.Add(')');
  trenner.Add('"');
  trenner.Add('''');


  txt := input.Text;
     For a := 0 to trenner.Count-1 do begin
  txt := StringReplace(txt,trenner[a],#13#10+trenner[a]+#13#10,[rfReplaceAll, rfIgnoreCase]);
  end;

     input.text := txt;
     input.Text.Split(#13#10);



  // === Elemente prüfen und bearbeiten
  For a := 0 to input.Count-1 do begin




     // allgemeines
    if pos('interface',input.Strings[a]) >0 then begin input.Strings[a] := #13#10#13#10+'interface'+#13#10; end;
    if pos('uses',input.Strings[a]) >0 then begin input.Strings[a] := #13#10+'uses'+#13#10; end;
    if pos('type',input.Strings[a]) >0 then begin input.Strings[a] := #13#10+'type'+#13#10; end;
    if pos('private',input.Strings[a]) >0 then begin input.Strings[a] := #13#10+'private'+#13#10; end;
    if pos('public',input.Strings[a]) >0 then begin input.Strings[a] := #13#10+'public'+#13#10; end;
    if pos('implementation',input.Strings[a]) >0 then begin input.Strings[a] := #13#10+'implementation'+#13#10; end;
    //if pos('type',input.Strings[a]) >0 then begin input.Strings[a] := #13#10+'type'+#13#10; end;



    // ===== Zeilenumbrüche
    // Zeilenumbruch aber nicht weniger Text als X zeichen ist.
    if posEx('var',input.Strings[a],1) >0 then begin input.Strings[a] := StringReplace(input.Strings[a],'var',#13#10+'var'+#13#10,[rfReplaceAll, rfIgnoreCase]); end;
    //if posEx('begin',input.Strings[a],1) >0 then begin input.Strings[a] := StringReplace(input.Strings[a],'begin','begin '+#13#10,[rfReplaceAll, rfIgnoreCase]); end;
    if posEx('begin',input.Strings[a],1) >0 then begin input.Strings[a] := StringReplace(input.Strings[a],'begin','begin'+#13#10,[rfReplaceAll, rfIgnoreCase]); end;
    if posEx('end;',input.Strings[a],90) >0 then begin input.Strings[a] := StringReplace(input.Strings[a],'end;',' end;'+#13#10#13#10,[rfReplaceAll, rfIgnoreCase]); end;
    if (posEx('procedure',input.Strings[a],1) >0) then begin   input.Strings[a] := StringReplace(input.Strings[a],'procedure',#13#10#13#10#13#10+'procedure',[rfReplaceAll, rfIgnoreCase]);   end;
  if posEx('function',input.Strings[a],1) >0 then begin input.Strings[a] := StringReplace(input.Strings[a],'function',#13#10#13#10#13#10+'function',[rfReplaceAll, rfIgnoreCase]); end;

  if posEx('if',input.Strings[a],1) >0 then begin input.Strings[a] := StringReplace(input.Strings[a],'if',#13#10+'if',[rfReplaceAll, rfIgnoreCase]); end;
  if posEx('while',input.Strings[a],1) >0 then begin input.Strings[a] := StringReplace(input.Strings[a],'while',#13#10+'while',[rfReplaceAll, rfIgnoreCase]); end;
  if posEx('for',input.Strings[a],1) >0 then begin input.Strings[a] := StringReplace(input.Strings[a],'for',#13#10+'for',[rfReplaceAll, rfIgnoreCase]); end;


  temp := input.Strings[a];
  //Delete(temp,pos('//',temp),length(temp)); // kein zeilenumbruch im kommentar
  if (posEx(';',temp,1) >0) then begin  input.Strings[a] := StringReplace(input.Strings[a],';',';'+#13#10,[rfReplaceAll, rfIgnoreCase]); end;
  end;
  // ===== Datei verarbeiten - end




  // ===== leerzeichen - begin
  // leerzeichen muss am schluss gemacht werden

  // === Vorformatieren - begin
   output := TStringList.Create;
   txt2 := '';
    For a := 0 to input.Count-1 do begin
      txt2 := (txt2+input.Strings[a]);
    end;
    output.text := txt2;
    output.text.Split(#13#10); //jetzt zeilenweiße bearbeitne
  // === Vorformatieren - end



  leerzeichen := 1; // linker rand
  For a := 0 to output.Count-1 do begin
    output.strings[a] := trimleft(output.strings[a]);



    temp := StringReplace(output.strings[a],'end;','endXXX',[rfReplaceAll, rfIgnoreCase]);
    temp := StringReplace(temp,'end ','endXXX',[rfReplaceAll, rfIgnoreCase]);
    leerzeichen := leerzeichen - string_zaehlen('endXXX',temp);
    //leerzeichen := leerzeichen - string_zaehlen('end;',temp);


    //output.strings[a] := IntTostr(leerzeichen)+Replicate(' ',leerzeichen) + output.strings[a]; //zum testen
    output.strings[a] := Replicate(' ',leerzeichen) + output.strings[a];


    leerzeichen := leerzeichen + string_zaehlen('begin',output.strings[a]);
    leerzeichen := leerzeichen + string_zaehlen('class(',output.strings[a]);
    leerzeichen := leerzeichen + string_zaehlen('finally',output.strings[a]);



    label1.caption := IntToStr(leerzeichen);   //zum testen ob leerzeichen noch stimmen...

    output.strings[a] := output.strings[a]+#13#10;


  end;



  // ===== Schönheitskorrekturen
  // leerzeilen korrigieren
  For a := output.Count-1 downto 0 do begin

     // procedure zusätzliche leerzeilen wieder entfernen /  korrigieren
    if (pos('procedure',output.strings[a]) > 0) and ((trim(output.strings[a-1]) = '')) and (pos('procedure',output.strings[a-4]) > 0) then begin
      output.Delete(a-1);
      output.Delete(a-2);
      output.Delete(a-3);
    end;

    // var zusätzliche leerzeilen wieder entfernen /  korrigieren
   if (pos('var',output.strings[a]) > 0) and (trim(output.strings[a-1]) = '') then begin
     output.Delete(a-1);
   end;

  end;

input := output;

  // ===== leerzeichen - end






  // ===== Temporär anzeigen - begin
  Memo2.text := ''; txt2 := '';
  For a := 0 to input.Count-1 do begin
    //txt2 := (txt2+input.Strings[a])+#13#10; // anzeige um die einzelnen objekte zu erkennen.
    txt2 := (txt2+input.Strings[a]);
  end;
  Memo2.text := txt2;
  // ===== Temporär anzeigen - end





  // ===== Datei schreiben - begin
  assignfile(d, 'output.pas');
  rewrite(d);
  writeln(d, txt2);
  closefile(d);
  // ===== Datei schreiben - bend
end;

Mavarik 12. Jul 2020 11:22

AW: Source Code Formater
 
Zitat:

Zitat von Monday (Beitrag 1469391)
Hallo,

ist schon eine Weile her. Aber mein Wunsch einen eigenen Source Code Formatter (Pascal) zu schreiben steht noch immer im Raum :-D

Ja ich bin auch immer noch dabei - wenn Zeit ist.

Gut mein Formatter ist deutlich aufwendiger als Deiner...

Die Delphi Frühstücksgruppe ist mittlerweile auch dabei.

Mavarik

himitsu 12. Jul 2020 13:26

AW: Source Code Formater
 
Habt ihr euch mal versucht ans LSP zu hängen?
Das ware doch eine gute Ausgangslage auch für einen Formatter.

freimatz 13. Jul 2020 07:56

AW: Source Code Formater
 
Zitat:

Zitat von Monday (Beitrag 1469391)
Hallo,

ist schon eine Weile her. Aber mein Wunsch einen eigenen Source Code Formatter (Pascal) zu schreiben steht noch immer im Raum :-D

Dann beschäftige Dich mal mit Grammatiken und Parser. Sonst wird das immer ein unbrauchbares Gebastel bleiben.

Und warum nicht den Delphi eigenen Formatter verwenden?

Mavarik 13. Jul 2020 09:35

AW: Source Code Formater
 
Zitat:

Zitat von freimatz (Beitrag 1469439)
Und warum nicht den Delphi eigenen Formatter verwenden?

Weil der nicht genug kann, bzw. nicht das was ich brauche.

bernhard_LA 8. Jul 2021 15:54

AW: Source Code Formater
 
was ist denn aktuell (2021) der bester code Formater für Delphi ?
  1. ich hätte gerne einheitliche Schreibweise für alle var's , Befehle etc. , also immer so was wie FMeineVar : String; . das F bei Lokalen Vars ist zwingend
  2. typen müssen immer als TMyObject benannt werden
  3. .....
  4. das ganze Formatierungs Thema kann via XML konfiguiert werden


Hab so was bei IntelliJ & Java , wäre auch cool wenn der Delphi Code so ordentlich dann wäre.

jaenicke 8. Jul 2021 20:39

AW: Source Code Formater
 
Der beste ist finde ich der in Delphi integrierte mit neu eingestellter Breite (z.B. 130 Zeichen, was ich auch im Editor selbst einstelle). Der funktioniert meistens gut und hält sich ohne weitere Einstellungen an die Standardformatierung.

Uwe Raabe 8. Jul 2021 20:57

AW: Source Code Formater
 
Ein Teil deiner Forderungen hat aber nichts mit der Formatierung zu tun, sondern mit Namenskonventionen. Das wird ein reiner Formatter nicht leisten können.

Mavarik 9. Jul 2021 10:43

AW: Source Code Formater
 
Der Formatter der von Delphi mitgeliefert wird, wird von EMBT "gepflegt" und sollte eigentlich immer auf dem aktuellen Stand sein...
Ich einer perfekten Welt.

Mir geht es aber um mehr bei der Sourcecode-Formatierung.

Ich habe schon vor langer Zeit "rumgefragt", wer mir bei der Programmierung des ultimativen Formatters helfen möchte...
Die, die sich gemeldet haben, haben bisher keine einzige Zeile dazu beigetragen.

Da ich meinen Focus momentan auf #DMVVM gelegt habe, komme ich leider selber auch nicht dazu...
Ohne Erklärungen wird man den Source nicht verstehen, daher ist das Repo nicht public.

Ich will Ende des Jahres nochmal einen Blog-post dazu machen und den Fortschritt zeigen.

Zitat:

Zitat von bernhard_LA (Beitrag 1492052)
was ist denn aktuell (2021) der bester code Formater für Delphi ?

Vielleicht kann ich die Frage dann 2022 beantworten.

bernhard_LA 9. Jul 2021 16:52

AW: Source Code Formater
 
vielleicht wäre so was wie genormte Coding Styles eine Lösung.

In Java sind doch getter und setter nicht an genormte Namen gebunden, d.h.
durch beliebig unglückliche Funktionsnamen wird dann der Code auch schwer verständlich.
In Delphi gibt dafür die Properties :-D, aber das set.... und get.... ist halt nicht zwingend, dann kann der Code halt auch wieder "Übel" aussehen

Ein Code Review Tool wäre hier perfekt.

stahli 9. Jul 2021 18:16

AW: Source Code Formater
 
Ich arbeite immer noch an meinem Optimizer.

Der wird auch Codevervollständigung und -Änderung vereinfachen - insbesondere was Interfaces und deren Klassenimplementation betrifft.

Hier mal ein kleines Beispiel: https://www.delphipraxis.net/1402961-post3.html

Aus "prop Firstname: String;" in einer Klassendeklaration wird auf Knopfdruck ein komplettes Property mit Getter (_get_Firstname), Setter (_set_Firstname) und privatem Feld (fFirstname).
Die Präfixe und die Codebausteine lassen sich variabel definieren.

Wird das Property in der Form nachträglich in einem Interface aufgenommen, wird die Vervollständigung in allen Klassen durchgeführt, die das Interface verwenden (auch später in anderen Projekten, die das Interface nutzen).

Dazu gibt es gewisse Vorgaben, die man schon in dem Interface einrichten kann. So kann man z.B. schon im Interface festlegen, dass die Klassenmethoden virtuell sein sollen oder der Parameter im Setter als "const". Die Einstellungen werden dann bei der Klassenvervollständigung gleich berücksichtigt (wenn die Methoden neu angelegt werden).

Die Voreinstellungen kommen i.d.R. nur bei Neuerzeugungen von Eigenschaften, Methoden und Feldern zum Tragen. Man kann aber auch Änderungen nachträglich erzwingen.
Hat man Methoden in Klassen z.B. nicht virtuell angelegt, kann man dies durch einen Schalter in der Interface- oder Klassenstruktur korrigieren.
Das könnte dann so aussehen: "prop Firstname: String; !vi"
So würden alle Getter und Setter der Property in allen verwendenden Klassen in "virtuell" geändert werden.

Auch Umbenennungen kann man erzwingen: "prop Firstname: String; !rn First_Name" !rt String[100]
Damit würde der Propertyname und Typ entsprechend durchgehend umbenannt (allerdings nur bezüglich der Getter und Setter und des privaten Feldes "fFirst_Name" (incl. im Codeblock der Getter und Setter)).
Ob man mal irgendwann ein echtes Refactoring innerhalb der IDE anstoßen kann, kann ich derzeit nicht einschätzen. Da muss man ggf. mal noch den besten Weg finden.)

Wenn "First_Name" im aktuellen Projekt nochmal umbenannt wird in "FirstName" und dieses Interface auch in einem anderen ProjektOld verwendet wird, in dem der Stand noch "Firstnamwe" lautete, wird der Optimizer "Firstname" in "FirstName" ändern und den Zwischenschritt überspringen.


Ob das jetzt Deinem Wunsch nahe kommt, kann ich nicht wirklich einschätzen.

Mavarik 10. Jul 2021 09:03

AW: Source Code Formater
 
Zitat:

Zitat von bernhard_LA (Beitrag 1492110)
vielleicht wäre so was wie genormte Coding Styles eine Lösung.

In Java sind doch getter und setter nicht an genormte Namen gebunden, d.h.
durch beliebig unglückliche Funktionsnamen wird dann der Code auch schwer verständlich.
In Delphi gibt dafür die Properties :-D, aber das set.... und get.... ist halt nicht zwingend, dann kann der Code halt auch wieder "Übel" aussehen

Ein Code Review Tool wäre hier perfekt.

FixInside macht genau das und wird Dir auch eine Warnung aus, wenn der Getter oder Setter nicht dem Namepattern entspricht.

Delphi-Quellcode:
Property Foo : Integer read GetMyFoo; // Warning.

Mavarik 10. Jul 2021 09:11

AW: Source Code Formater
 
Zitat:

Zitat von stahli (Beitrag 1492118)
Hier mal ein kleines Beispiel: https://www.delphipraxis.net/1402961-post3.html

Aus "prop Firstname: String;" in einer Klassendeklaration wird auf Knopfdruck ein komplettes Property mit Getter (_get_Firstname), Setter (_set_Firstname) und privatem Feld (fFirstname).
Die Präfixe und die Codebausteine lassen sich variabel definieren.

Ich habe ja sicherlich auch meine Eigenheiten wie ich etwas formatiere, aber Getter mit _ und dann nochmal _ for dem Name, ist ja voll gruselig.

Da wo ich vom aktuellen Style Guide abweiche hat es wirklich gute Gründe, aber in den Grundlegenden Dingen - (bis auch Kleinigkeiten) - kann ich mich an den Style Guide halten.!

jaenicke 10. Jul 2021 09:38

AW: Source Code Formater
 
Zitat:

Zitat von Mavarik (Beitrag 1492134)
Ich habe ja sicherlich auch meine Eigenheiten wie ich etwas formatiere, aber Getter mit _ und dann nochmal _ for dem Name, ist ja voll gruselig.

Unterstriche per se sind ja laut Styleguide nur bei Importen aus anderen Sprachen erlaubt (Windows Messages, ...).

Aufgrund der vergangenen Diskussionen im Forum glaube ich, dass er durchaus weiß, dass er das anders macht als 99% der Delphi-Entwickler, aber jedem das Seine. Solange man Quelltexte nicht im Team bearbeitet oder veröffentlicht, ist das ja ziemlich egal.

Ich möchte solche Quelltexte nur nicht lesen müssen. Deshalb kaufe ich auch grundsätzlich keine Komponenten, bei denen die Beispiele schon deutlich anders als im Styleguide beschrieben aussehen. ;-)
Meistens gibt es ja Alternativen.

stahli 10. Jul 2021 09:42

AW: Source Code Formater
 
Zitat:

Zitat von Mavarik (Beitrag 1492134)
Ich habe ja sicherlich auch meine Eigenheiten wie ich etwas formatiere, aber Getter mit _ und dann nochmal _ for dem Name, ist ja voll gruselig.

So sieht man immer sofort, dass man einen Getter oder Setter vor sich hat, der normalerweise nicht aufzurufen ist.
Aber wie gesagt, das ist ja nicht zwingend.

DeddyH 10. Jul 2021 10:41

AW: Source Code Formater
 
Der Style-guide ist ja kein heiliger Gral. Was nützt mir Code, der sich sklavisch an Formatierungsvorgaben hält, aber inhaltlich suboptimal ist? Wenn jemand mit den Konventionen bricht, dies aber konsequent und nachvollziehbar tut, ist das für mich persönlich überhaupt kein Problem, der Code bleibt ja trotzdem lesbar.

Rollo62 10. Jul 2021 11:04

AW: Source Code Formater
 
Ich nutze gerne eine Art 'umgekehrt polnische Notation',
Also

Ding_Get
Ding_Set

Was den Vorteil der guten visuellen Strukturierung hat,
Und zusätzlich auch schön alphanumerisch sortiert bleibt.

Als Sahnehäubchen geht dann auch noch
Ding_Execute
Ding_Clear
Ding_Start
Ding_Stop
...

Oh je, damit bin ich bei den Puristen wohl zum Satan gekührt.
Bitte steinigt mich nicht so heftig, ich bin doch nur individuell :-)

stahli 10. Jul 2021 12:01

AW: Source Code Formater
 
... könnte ich problemlos als Option mit aufnehmen.

dummzeuch 10. Jul 2021 12:10

AW: Source Code Formater
 
Ich bin natürlich ein bisschen voreingenommen und finde deshalb den von GExperts am besten, vor allem, weil er meine bevorzugte Formatierung unterstützt (aber nicht nur, man kann sehr viel konfigurieren). Er unterstützt leider einige (vor allem neuere) Sprachkonstrukte von Delphi nicht, aber man kann mittels {(*} und {*)} Bereiche markieren, die nicht neu formatiert werden sollen. Das entschärft das Problem etwas.

Die Hoffnung, dass der eingebaute Formatter der Delphi IDE alles unterstützt, was auch der Compiler unterstützt, hatte ich auch mal. Aber leider ist das bis heute eine Illusion. Und leider gibt es da soweit ich weiß, keine Möglichkeit, die Formatierung für einen Bereich auszusschalten.

Konfiguration via XML bieten beide nicht, soweit ich weiß. Der von GExperts bietet Konfiguration via INI_Datei.

Es gab auch mal einen JEDI Code Formatter, keine Ahnung, wie da der Stand ist. Ich glaube, er wird in Lazarus verwendet.

Uwe Raabe 10. Jul 2021 14:04

AW: Source Code Formater
 
Zitat:

Zitat von dummzeuch (Beitrag 1492146)
Und leider gibt es da soweit ich weiß, keine Möglichkeit, die Formatierung für einen Bereich auszusschalten.

Man kann aber auch bei Bedarf nur die aktuelle Selektion formatieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz