IFDEF entfernen

Für Fragen rund um die Ide und zum Debugger
Antworten
Jo@Win
Beiträge: 18
Registriert: Do 3. Jan 2013, 14:57

IFDEF entfernen

Beitrag von Jo@Win »

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

Socke
Lazarusforum e. V.
Beiträge: 3158
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

Beitrag von Socke »

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.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Jo@Win
Beiträge: 18
Registriert: Do 3. Jan 2013, 14:57

Re: IFDEF entfernen

Beitrag von Jo@Win »

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

Warf
Beiträge: 1907
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: IFDEF entfernen

Beitrag von Warf »

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.

Jo@Win
Beiträge: 18
Registriert: Do 3. Jan 2013, 14:57

Re: IFDEF entfernen

Beitrag von Jo@Win »

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?

Warf
Beiträge: 1907
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: IFDEF entfernen

Beitrag von Warf »

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:

Code: Alles auswählen

{$IF Foo}
...
{$ENDIF Foo}
In dem fall ist ein einfaches string replace völlig ausreichend, beispiel via sed:

Code: Alles auswählen

sed -i.bak -E 's/\{\$(IFDEF|ENDIF) Foo\}//g' **/*.pas
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

Jo@Win
Beiträge: 18
Registriert: Do 3. Jan 2013, 14:57

Re: IFDEF entfernen

Beitrag von Jo@Win »

Wenn es einfach wäre, dann hätte ich nicht gefragt :D
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.

Warf
Beiträge: 1907
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: IFDEF entfernen

Beitrag von Warf »

Jo@Win hat geschrieben:
Di 19. Jan 2021, 13:53
Wenn es einfach wäre, dann hätte ich nicht gefragt :D
Die IDE kennt ja die Blöcke, die zu einem $IFDEF gehören.
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.

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.

Jo@Win
Beiträge: 18
Registriert: Do 3. Jan 2013, 14:57

Re: IFDEF entfernen

Beitrag von Jo@Win »

Die Automatik fügt keine Annotierung hinzu. Das wäre auch schon mal etwas hilfreich. 8)

Antworten