Tekstbestanden vergelijken
- October 9, 2017
- 0
Wie geregeld met tekstbestanden werkt, kent het probleem allicht: je hebt verschillende versies van één bestand en vraagt je af wat er nou precies verschilt. Gelukkig bestaan er voor Linux heel wat tools om tekstbestanden te vergelijken. We hebben er twee getest: Meld en Diffuse.
Op UNIX- en Linux-systemen spelen tekstbestanden sinds jaar en dag een erg belangrijke rol. Je configureert het systeem en de meeste applicaties via duidelijk leesbare tekstbestanden. Loopt er onverwacht iets mis, dan heb je geen speciale applicatie nodig om te achterhalen wat er gebeurd is. Ook logfiles zijn gewoon platte tekstbestanden die je kan doorzoeken met verschillende tools. En misschien schrijf je af en toe een script om bepaalde taken te automatiseren? Dan ben je alweer aan de slag met tekstbestanden. Het zal je dan ook niet verbazen dat er voor Linux talloze tools bestaan om het werken met tekstbestanden te vereenvoudigen. Een courante taak is het vergelijken van verschillende tekstbestanden. Denk maar aan verschillende versies van één configuratiebestand om uit te zoeken waarom twee systemen zich anders gedragen. Of misschien werk je wel met een versiebeheersysteem voor jouw scripts? Ook dan heb je goede tools nodig om de precieze verschillen tussen meerdere versies van een bestand snel te vinden. Echte power users gebruiken daarvoor commandline tools zoals diff, diff3 of vimdiff. Maar gelukkig bestaan er ook grafische tools voor die taak, zoals Meld en Diffuse. Die hoeven qua functionaliteit zelfs niet onder te doen voor de commandline tools. Tijd voor een korte test dus!
Meld
Na het opstarten toont Meld (http://meldmerge.org) je drie opties: bestanden vergelijken, mappen vergelijken of bestanden in een versiebeheersysteem vergelijken. (Op de tweede optie gaan we hier niet dieper in.) Bestanden vergelijken is erg eenvoudig: selecteer de twee (of drie) gewenste bestanden en klik daarna op “Compare”. Meld toont dan netjes beide bestanden naast elkaar, met de verschillen in het rood. In de schuifbalk rechts worden de verschillen met gekleurde blokjes aangeduid en met Alt-Down spring je snel naar de volgende regel met een verschil. Allicht wil je nu één van de twee bestanden aanpassen. Ook dat is erg eenvoudig in Meld. Daarvoor hoef je zelden tekst in te voeren, want Meld bevat meerdere sneltoetsen om de verschillen tussen beide bestanden weg te werken.
In de kolom tussen de twee bestanden zie je twee pijltjes staan op de huidige regel. Klik op het pijltje naar rechts om de versie uit het linkerbestand te kopiëren naar het rechterbestand en vice versa. Met shift ingedrukt verandert het pijltje in een kruisje en verwijder je de regel uit het gekozen bestand. Met control ingedrukt krijg je twee pijltjes te zien en kopieer je de huidige regel een regel hoger of een regel lager in het andere bestand. Probeer het vooral zelf uit: je zal merken dat dit erg intuïtief werkt! In het Changes-menu vind je de sneltoetsen terug voor elke denkbare actie. Zodra je die geleerd hebt, heb je zelfs je muis niet meer nodig!
Om de optie “Version Control View” te gebruiken, selecteer je de root directory van je repository. Voor git bijvoorbeeld is dat de directory die de .git-map bevat. Standaard toont Meld je nu enkel de bestanden die nog niet gecommit zijn in je repository. Verschillende versies van één specifiek bestand vergelijken is helaas niet mogelijk vanuit Meld. Zo’n vergelijking moet je starten vanuit git (met git difftool), nadat je git geconfigureerd hebt om Meld als GUI voor diff te gebruiken. Raadpleeg de manpage van git-difftool voor meer informatie.
Het precieze gedrag van Meld kan je nog uitgebreid aanpassen via Edit > Preferences. Denk bijvoorbeeld aan syntax highlighting, regelnummers tonen, bestanden uitsluiten van mapvergelijkingen of tekstfilters om bijvoorbeeld witruime en commentaren (beginnend met #) te negeren in tekstbestanden.
## afb1.png: Meld is een eenvoudige en gebruiksvriendelijk editor om tekstbestanden te vergelijken
Diffuse
De tweede tool in deze test is Diffuse (http://diffuse.sourceforge.net). De basismogelijkheden zijn erg gelijkaardig aan die van Meld, al kan je met Diffuse geen directories vergelijken. In het View-menu vind je de sneltoetsen terug om te navigeren tussen de verschillen. Het Merge-menu bevat dan weer alle opties om de verschillen tussen de bestanden af te handelen. Hier ontbreken echter Meld’s handige opties om een regel te verwijderen of in te voegen voor of na de huidige regel. Maar Diffuse kan dan weer méér dan 3 bestanden met elkaar vergelijken, mocht je dat nodig hebben. Ook handig is dat je de verschillende bestanden, indien nodig, manueel kan uitlijnen met elkaar. In afbeelding 2 zie je bijvoorbeeld twee verschillende versies van een shell-script. Diffuse had niet meteen door dat regel 4 van het oude bestand terugkomt op regel 12 van het nieuwe bestand. Daardoor lijkt het alsof beide scripts erg veel verschillen, terwijl dat niet het geval is. Dat los je op door eerst links op regel 4 te klikken en de spatiebalk in te drukken en vervolgens rechts op regel 12 te klikken en alweer de spatiebalk in te drukken. Het resultaat is veel overzichtelijker, zoals je ziet in afbeelding 3. Omgekeerd gebruik je de Isolatie-functie uit het View-menu om aan te geven dat een bepaalde regel uniek is in één van de twee bestanden. Zo zal Diffuse niet meer proberen om die regel uit te lijnen met een regel uit het andere bestand.
Daarenboven beschikt Diffuse ook nog over een aantal handige tools om tekstbestanden te herformatteren. Je vindt ze terug in het Format-menu. Zo zijn er onder andere sneltoetsen om witruime aan het einde van de regels te verwijderen, tabs naar spaties om te zetten en codeblokken meer of minder te laten inspringen. Een standalone teksteditor biedt uiteraard meer mogelijkheden op dat vlak, maar handig is het wel. Verschillende versies van een script bevatten immers geregeld dergelijke subtiele verschillen die de aandacht afleiden van de échte wijzigingen. Dan is het best praktisch dat je in Diffuse al een aantal van die problemen kan oplossen. Een alternatief is om in het Preferences-menu aan te vinken dat verschillen in witruimte steeds genegeerd mogen worden.
Tot slot bevat Diffuse ook andere mogelijkheden voor het werken met versiebeheersystemen. Zo is het in de GUI niet mogelijk om een overzicht te tonen van bestanden die nog niet gecommit zijn. Anderzijds laat Diffuse je wél toe om een bepaalde revisie te specificeren wanneer je een bestand opent van een directory onder versiebeheer. De precieze revisie vind je voor Git bijvoorbeeld terug met het commando “git rev-list” (tenminste als je steeds duidelijke changelog entries hebt ingevuld!). Vervolgens vul je dat revisienummer rechtsonder in wanneer je een bestand opent. Erg handig om bijvoorbeeld een bug in de laatste versie van een script op te lossen door een deel van de code uit een oudere versie terug te halen!
## afb2.png: Diffuse raakt soms in de war bij het uitlijnen van twee tekstbestanden…
## afb3.png: …maar dat los je zelf snel op!
Zowel Meld als Diffuse zijn prima tools om tekstbestanden met elkaar te vergelijken en eventueel te bewerken. Meld is iets gebruiksvriendelijker om eenvoudige configuratiebestanden te bewerken, terwijl Diffuse dan weer erg geschikt is om meerdere revisies van een script onder versiebeheer te vergelijken. Niet zeker welke van de twee jou het beste ligt? Probeer ze dan gewoon alle twee eens uit!