Preprocessor-opdrachten

KDiff3 ondersteunt twee preprocessor-opties.

Preprocessorcommando:

Als een bestand gelezen is, wordt het door deze externe opdracht gesluisd. De uitvoer van deze opdracht is dan zichtbaar in plaats van het originele bestand. U kunt uw eigen preprocessor schrijven om uw specifieke wensen te vervullen. Gebruik dit om storende delen van het bestand weg te halen, of automatisch de insprong te verbeteren, etc.

Preprocessor-commando alleen voor regelcontroles:

Als een bestand gelezen is, wordt het door deze externe opdracht gesluisd. Als een preprocessor-opdracht (zie boven) ook opgegeven wordt, wordt de uitvoer van de preprocessor de invoer van de preprocessor voor regelovereenkomsten. De uitvoer wordt dan alleen gebruikt bij de regelvergelijkingsfase van de analyse. U kunt uw eigen preprocessor schrijven om uw specifieke wensen te vervullen. Elke invoerregel moet een overeenkomende uitvoerregel hebben.

Het idee is om de gebruiker grotere flexibiliteit te geven bij het instellen van het resultaat. Maar dit vereist een extern programma, en veel gebruikers willen dat niet zelf schrijven. Het goede nieuws is dat sed of perl vaak voldoende is.

Voorbeeld: eenvoudig testgeval: bekijk bestand a.txt (6 regels):

aa
      ba
      ca
      da
      ea
      fa

En bestand b.txt (3 lines):

cg
      dg
      eg

Zonder een preprocessor zouden de volgende regels naast elkaar geplaatstworden:

aa - cg
      ba - dg
      ca - eg
      da
      ea
      fa

Dit is waarschijnlijk niet gewenst omdat de eerste letter de werkelijk interessante informatie bevat. Om te helpen bij het algoritme voor overeenkomst om de tweede letter te negeren kunnen we een preprocessorcommando gebruiken voor overeenkomst in regels, die 'g' vervangt door 'a':

sed 's/g/a/'

Met dit commando zal het resultaat van de vergelijking zijn:

aa
      ba
      ca - cg
      da - dg
      ea - eg
      fa

Intern ziet het algoritme voor overeenkomst de bestanden na uitvoeren van de preprocessor voor regelovereenkomst, maar op het scherm is het bestand ongewijzigd. (De normale preprocessor zou de gegevens ook op het scherm wijzigen).

De basis van sed

Deze sectie geeft alleen een inleiding op een paar basismogelijkheden van sed. Zie voor meer informatie info:/sed of https://www.gnu.org/software/sed/manual/html_mono/sed.html. Een voorgecompileerde versie voor Windows® kunt u vinden op http://unxutils.sourceforge.net. Merk op dat de volgende voorbeelden ervan uitgaan dat de opdracht sed in een map in uw omgevingsvariabele PATH staat. Als dit niet het geval is, dient u het volledige absolute pad voor de opdracht te gebruiken.

In deze context is alleen het substitutiecommando sed gebruikt:

sed 's/REGEXP/VERVANGING/VLAGGEN'

Voordat u een nieuw commando in KDiff3 gebruikt, zou u het eerst moeten testen in een console. Hierbij is het commando echo nuttig. Bijvoorbeeld:

echo abrakadabra | sed 's/a/o/'
   -> obrakadabra

Dit voorbeeld toont een erg eenvoudig sed-commando dat het eerste voorkomen van "a" vervangt door "o". Als u alle voorkomen wilt vervangen dan heeft u de vlag "g" nodig:

echo abrakadabra | sed 's/a/o/g'
   -> obrokodobro

Het symbool "|" is het pipe-commando die de uitvoer van het vorige commando naar de invoer van het volgende commando stuurt. Als u met een langer bestand wilt testen dan kunt u cat op UNIX®-achtige systemen gebruiken of type op Windows®-achtige systemen. sed zal de substitutie doen voor elke regel.

cat bestandsnaam | sed opties

Voorbeelden van het gebruik van sed in KDiff3

Andere soorten commentaar negeren

KDiff3 verstaat op dit moment alleen C/C++ commentaar. Met gebruik van de optie Commando voor preprocessing regels: kunt u ook andere soorten commentaar negeren, door ze te converteren in C/C++-commentaar.

Voorbeeld: om commentaar die begint met "#" te negeren, zou u ze willen converteren in "//". Merk op dat u ook de optie C/C++ commentaar negeren (behandelen als witruimte) moet inschakelen om een effect te krijgen. Een van toepassing zijnd Commando voor preprocessing regels: zou zijn:

sed 's/#/\/\//'

Omdat in sed het teken "/" een aparte betekenis heeft, is het nodig om het teken "\" voor elke "/" in de vervangende tekenreeks te plaatsen. Soms is de "\" ook nodig om een teken een speciale betekenis te geven of deze juist weg te halen. De accenten (') zijn alleen belangrijk bij testen op de commandoshell omdat het anders sommige tekens probeert te verwerken. KDiff3 doet dat niet behalve voor de escape-sequences '\"' en '\\'.

Niet-hoofdlettergevoelige verschillen

Gebruik het volgende Commando voor Preprocessor voor regelovereenkomsten: om alle invoer naar hoofdletters te converteren:

sed 's/\(.*\)/\U\1/'

Hier is de ".*" een reguliere expressie die met elke tekenreeks overeenkomt en in deze context met alle lettertekens op de regel overeenkomt. De "\1" in de vervangende tekenreeks verwijst naar de overeenkomende tekst binnen het eerste paar "\(" en "\)". De "\U" zet de ingevoegde tekst om in hoofdletters.

Versiebeheer-trefwoorden negeren

CVS en andere versiebeheersystemen gebruiken diverse trefwoorden om automatisch gegenereerde tekenreeksen in te voegen (info:/cvs/Trefwoordvervanging. Deze volgen allemaal het patroon "$TREFWOORD gegenereerde tekst$". We hebben nu een preprocessoropdracht voor regelovereenkomsten nodig die alleen de gegenereerde tekst verwijdert:

sed 's/\$\(Revision\|Author\|Log\|Header\|Date\).*\$/\$\1\$/'

Het teken "\|" scheidt de mogelijke sleutelwoorden. U zou deze lijst willen wijzigen naar wat u nodig hebt. De tekens "\" voor het teken "$" is nodig omdat anders het teken "$" overeenkomst met het eind van de regel.

Terwijl u experimenteert met sed gaat u wellicht deze reguliere expressies begrijpen en op prijs stellen. Ze zijn nuttig omdat er veel andere programma's zijn die soortgelijke dingen ondersteunen.

Getallen negeren

Getallen negeren is in feite een ingebouwde optie. Maar als een ander voorbeeld is dit het commando voor Preprocessor voor regelovereenkomsten:

sed 's/[0123456789.-]//g'

Elk teken binnen de tekens '[' en ']' is een overeenkomst en zal door niets vervangen worden.

Bepaalde kolommen negeren

Soms is een tekst erg strict opgebouwd, en bevat deze kolommen die u altijd wilt negeren, terwijl er andere kolommen zijn die u voor analyse wilt bewaren. In het volgende voorbeeld worden de eerste vijf kolommen (lettertekens) genegeerd, de volgende tien worden bewaard, dan worden er weer vijf genegeerd en de rest van de regel wordt bewaard.

sed 's/.....\(..........\).....\(.*\)/\1\2/'

Elke punt '.' komt overeen met een enkel teken. De "\1" en "\2" in de vervangstekenreeks verwijst naar de overeenkomende tekst binnen het eerste en tweede paar haakjes "\(" en "\)" die aangeeft welke tekst bewaard moet worden.

Diverse vervangingen combineren

Soms wilt u diverse vervangingen tegelijk uitvoeren. U kunt dan de puntkomma ';' gebruiken om deze van elkaar te scheiden. Voorbeeld:

echo abrakadabra | sed 's/a/o/g;s/\(.*\)/\U\1/'
   -> OBROKODOBRO

perl in plaats van sed gebruiken

In plaats van sed zou u perl kunnen gebruiken

perl -p -e 's/REGEXP/VERVANGING/VLAGGEN'

Maar sommige details zijn anders in perl. Merk op waar sed "\(" en "\)" vereist, perl de eenvoudigere "(" en ")" zonder voorafgaande '\' vereist. Voorbeeld:

sed 's/\(.*\)/\U\1/'
   perl -p -e 's/(.*)/\U\1/'

Uitvoervolgorde van preprocessors

De data wordt doorgesluisd door alle interne en externe preprocessors, in deze volgorde:

  • Normale preprocessor.

  • Preprocessor voor regelovereenkomsten.

  • Hoofdletterongevoelig (behandelen als witruimte) (conversie naar hoofdletters).

  • Opsporen van C/C++ commentaar.

  • Getallen negeren (als witruimte behandelen),

  • Witruimte negeren.

De gegevens zoals die na de normale preprocessor zijn worden bewaard voor weergave en samenvoeging. De andere handelingen wijzigen alleen de gegevens die het verschillenalgoritme voor regelovereenkomsten ziet.

Merk op dat, in de zeldzame gevallen waar u een normale preprocessor gebruikt, de preprocessor voor regelovereenkomsten de uitvoer van de normale preprocessor als invoer ziet.

Waarschuwing

De preprocessor-opdrachten zijn vaak erg nuttig, maar net zoals elke andere optie die automatisch uw teksten wijzigt of bepaalde verschillen verbergt, kunt u per ongeluk bepaalde verschillen over het hoofd zien en in het ergste geval belangrijke gegevens vernietigen.

Om deze reden vertelt KDiff3 u het als er een normale preprocessor-opdracht wordt gebruikt bij het samenvoegen, en wordt u gevraagd of deze uitgeschakeld moet worden of niet. Maar u wordt niet gewaarschuwd als er een Commando voor Preprocessor voor regelovereenkomsten: actief is. Het samenvoegen is niet voltooid totdat alle conflicten opgelost zijn. Als u menu-item DiffweergaveWitruimte tonen uitgeschakeld hebt, zijn de verschillen die met de optie Preprocessoropdracht voor regelovereenkomsten verwijderd zijn, ook onzichtbaar. Als de knop Opslaan inactief blijft tijdens het samenvoegen (door overblijvende conflicten), schakel dan menu-item DiffweergaveWitruimte tonen in. Als u deze minder belangrijke verschillen niet handmatig wilt samenvoegen kunt u menu-item Samenvoegen[A|B|C] voor alle onopgeloste witruimteconflicten gebruiken kiezen.