IFDEF entfernen
IFDEF entfernen
Hi,
es ist ja sehr schön und einfach Code mit ifdef zu umgeben, um z.B. mal etwas auszuprobieren.
Leider ist der umgekehrte Weg mit einigem an Handarbeit verbunden: Textmarker setzen beim IFDEF, ELSEIF ENDIF und dann entsprechend die Schalter entfernen.
Gibt es da eventuell eine Möglichkeit das zu vereinfachen, ähnlich wie beim Einfügen des Compilerschalters?
Jo
es ist ja sehr schön und einfach Code mit ifdef zu umgeben, um z.B. mal etwas auszuprobieren.
Leider ist der umgekehrte Weg mit einigem an Handarbeit verbunden: Textmarker setzen beim IFDEF, ELSEIF ENDIF und dann entsprechend die Schalter entfernen.
Gibt es da eventuell eine Möglichkeit das zu vereinfachen, ähnlich wie beim Einfügen des Compilerschalters?
Jo
-
- Lazarusforum e. V.
- Beiträge: 3177
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: IFDEF entfernen
Meinst du den Dialog aus dem Kontextmenü Quelle > In $IFDEF einschließen ...?
Hier ist mir nichts bekannt.
Du kannst über Suchen und Ersetzen und einem Regulären Ausdruck die Compilerschalter aber halbautomatisch entfernen:
Der Ausdruck um {$IFDEF IrgendeineBedingung} zu finden ist: \{\$IFDEF.*\}
Dann hängt es nur noch von deiner Quelltextauswahl ab, ob nur die gewünschten oder alle Schalter entfernt werden.
Hier ist mir nichts bekannt.
Du kannst über Suchen und Ersetzen und einem Regulären Ausdruck die Compilerschalter aber halbautomatisch entfernen:
Der Ausdruck um {$IFDEF IrgendeineBedingung} zu finden ist: \{\$IFDEF.*\}
Dann hängt es nur noch von deiner Quelltextauswahl ab, ob nur die gewünschten oder alle Schalter entfernt werden.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: IFDEF entfernen
Wenn es so einfach wäre...
Die IDE erkennt ja auch geschachtelte IFDEFS und das ist mit der RegExpr schon nicht mehr so einfach.
Dachte eher an so etwas wie with-Blöcke auspacken. Das funktioniert weitgehend gut
Die IDE erkennt ja auch geschachtelte IFDEFS und das ist mit der RegExpr schon nicht mehr so einfach.
Dachte eher an so etwas wie with-Blöcke auspacken. Das funktioniert weitgehend gut
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: IFDEF entfernen
Ifdefs kannst du einfach über die bedingung schalten:
Z.B. du hast debug code in einem {$IFDEF DEBUG}. Dann kannst du einfach am anfang der datei ein {$DEFINE DEBUG} schreiben um den code aktiv zu schalten und die zeile löschen um den code zu deaktivieren.
Projektweit kannst du über die projekteinstellungen defines aktivieren und deaktivieren, sodass diese defines dann in jeder Datei geschaltet sind. Z.B. kannst du eine Debug und Release Buildkonfiguration haben, in der Debug wird dann das define DEBUG gesetzt und in release nicht. So kannst du debug code hinzufügen der nicht in deiner finalen Executable die du weiter gibst drin ist.
Z.B. du hast debug code in einem {$IFDEF DEBUG}. Dann kannst du einfach am anfang der datei ein {$DEFINE DEBUG} schreiben um den code aktiv zu schalten und die zeile löschen um den code zu deaktivieren.
Projektweit kannst du über die projekteinstellungen defines aktivieren und deaktivieren, sodass diese defines dann in jeder Datei geschaltet sind. Z.B. kannst du eine Debug und Release Buildkonfiguration haben, in der Debug wird dann das define DEBUG gesetzt und in release nicht. So kannst du debug code hinzufügen der nicht in deiner finalen Executable die du weiter gibst drin ist.
Re: IFDEF entfernen
Ich glaube, ich habe mich nicht ganz klar ausgedrückt.
Ich möchte den jeweiligen Compilerschalter z.B.
{$IFDEF Hallo}
blablabla
{$ENDIF}
so entfernen, dass zuletzt nur der Code übrig bleibt:
blablable
Bei {$ELSE} ist dann zu fragen, wie mit diesem Code zu verfahren ist:$ifdef Sektion behalten, $else Sektion behalten, ungenutzter Code löschen oder auskommentieren.
Beispiel: Bei einer ausgedehnten Fehlersuche über x Units wird der jeweils verdächtige Code deaktiviert. Wenn dann der Fehler gefunden wurde, möchte ich den Compilerschalter wieder entfernen. Das ist dann mühsame Handarbeit. Zumal das schon mal paar Tage dauern kann.
Oder man hat bestimmte Funktionen nur bei einer Bedingung aktiviert, die aber jetzt immer aktiv sein soll.
Um den Code dann wieder lesbarer zu machen, bietet es sich an diese Schalter dann zu entfernen.
Verstanden?
Ich möchte den jeweiligen Compilerschalter z.B.
{$IFDEF Hallo}
blablabla
{$ENDIF}
so entfernen, dass zuletzt nur der Code übrig bleibt:
blablable
Bei {$ELSE} ist dann zu fragen, wie mit diesem Code zu verfahren ist:$ifdef Sektion behalten, $else Sektion behalten, ungenutzter Code löschen oder auskommentieren.
Beispiel: Bei einer ausgedehnten Fehlersuche über x Units wird der jeweils verdächtige Code deaktiviert. Wenn dann der Fehler gefunden wurde, möchte ich den Compilerschalter wieder entfernen. Das ist dann mühsame Handarbeit. Zumal das schon mal paar Tage dauern kann.
Oder man hat bestimmte Funktionen nur bei einer Bedingung aktiviert, die aber jetzt immer aktiv sein soll.
Um den Code dann wieder lesbarer zu machen, bietet es sich an diese Schalter dann zu entfernen.
Verstanden?
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: IFDEF entfernen
Das matchen von {$ELSE} und {$ENDIF} ist gar nicht mal so einfach, da das einen kellerautomaten benötigt reichen reguläre Ausdrücke allein nicht.
Was du aber machen kannst ist, du kannst einfach die else und endif annotieren:
In dem fall ist ein einfaches string replace völlig ausreichend, beispiel via sed:
Für else kannst du mit einem optionalen ausdruck 's/\{\$ELSE Foo\}.*{\$ENDIF Foo}//g' entfernen, andersrum geht es natürlich auch 's/\{\$IFDEF Foo\}.*{\$ELSE Foo}//g'
Gibt sogar möglichkeiten über groupmatches direkt den gesammten if-else-endif ausdruck zu canceln. Aber wie gesagt, das geht nur wenn die IF ELSE und ENDIF eindeutig über einen bezeichner zuordbar sind, sonst wirds mit regex nichts
Was du aber machen kannst ist, du kannst einfach die else und endif annotieren:
Code: Alles auswählen
{$IF Foo}
...
{$ENDIF Foo}
Code: Alles auswählen
sed -i.bak -E 's/\{\$(IFDEF|ENDIF) Foo\}//g' **/*.pas
Gibt sogar möglichkeiten über groupmatches direkt den gesammten if-else-endif ausdruck zu canceln. Aber wie gesagt, das geht nur wenn die IF ELSE und ENDIF eindeutig über einen bezeichner zuordbar sind, sonst wirds mit regex nichts
Re: IFDEF entfernen
Wenn es einfach wäre, dann hätte ich nicht gefragt
Die IDE kennt ja die Blöcke, die zu einem $IFDEF gehören.
Aber eventuell kann man wirklich mit einem Makro was machen. Pascalscript ist ja schon recht mächtig in der IDE.

Die IDE kennt ja die Blöcke, die zu einem $IFDEF gehören.
Aber eventuell kann man wirklich mit einem Makro was machen. Pascalscript ist ja schon recht mächtig in der IDE.
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: IFDEF entfernen
Die IDE kennt die blöcke weil sie einen parser für pascal implementiert. Wenn du also einen algorithmus schreiben willst musst du mindestens einen solchen parser haben. Du kannst den parser der IDE benutzen, der sollte im package codetools sein und sollte auch relativ einfach eingebunden werden können. Du könntest das ganze z.b. über ein Lazarus package implementieren, eine option die du z.b. über einen Hotkey aufrufen kannst, die dann alle ifdefs aus dem aktuellen editor rauswirft.Jo@Win hat geschrieben: Di 19. Jan 2021, 13:53 Wenn es einfach wäre, dann hätte ich nicht gefragt![]()
Die IDE kennt ja die Blöcke, die zu einem $IFDEF gehören.
Mit pascalscript makros kenne ich mich nicht so gut aus, aber wenn du da auch einfach die units des codetools packages benutzen kannst, kannst du es auch so machen.
Die regex Lösung mit annotierten else und endif ist halt die einfachste, solang du selbst die ifdefs hinzugefügt hast, da du ja garantieren musst das else und endif annotiert sind. Das gehört aber eh zum guten stil und sollte man sich sowiso angewöhnen. Hat halt vor allem den charme das es ein einzeiler mit sed ist, und keine spezielle lazarus installation mit einem eigenen package benötigt.
Re: IFDEF entfernen
Die Automatik fügt keine Annotierung hinzu. Das wäre auch schon mal etwas hilfreich. 
