Hlavní navigace

Použití Emacsu pro porovnávání a slučování souborů

Pavel Tišnovský

Na předchozí článek s popisem možností nabízených textovým editorem Vim při porovnávání a slučování souborů dnes navážeme, protože si ukážeme, jakými způsoby se dají podobné úkoly vyřešit v Emacsu.

Doba čtení: 17 minut

11. Modul diffview-mode

12. Instalace modulu diffview-mode

13. Použití balíčku diffview-mode

14. Aplikace patche v režimu ediff

15. Odkazy na Internetu

1. Použití Emacsu pro porovnávání a slučování souborů

Vzhledem k tomu, že celý předchozí článek o nástrojích určených pro porovnávání a slučování obsahu textových souborů byl věnován možnostem textového editoru Vim a taktéž pluginům vytvořeným pro Vim, budeme se dnes kvůli zachování harmonie vesmíru věnovat textovému editoru Emacs a jeho režimům a přídavným modulům. S Emacsem jsme se ostatně na Rootu setkali, a to dokonce několikrát. Především vyšly dva seriály [1] [2] věnované použití Emacsu, poměrně podrobně jsme si popsali i historii vzniku tohoto editoru a taktéž jsme si ukázali schopnosti Emacsu při ladění nativních aplikací (samotné ladění je prováděno GNU Debuggerem, Emacs zde slouží jako inteligentní front end).

Obrázek 1: GNU Emacs spuštěný v režimu s grafickým uživatelským rozhraním.

Důležité upozornění: v současnosti se používá několik typů textových editorů, v jejichž názvu objevíme slovo Emacs. Jedná se například o MicroEMACS a jeho varianty, z nichž jedna je používána a udržována Linusem Torvaldsem. Dnes se ovšem zaměříme na popis možností GNU Emacsu, i když popisované režimy by měly být funkční i v XEmacsu (pokud ho ještě někdo používá namísto GNU Emacsu). Všechny popisované režimy lze samozřejmě použít jak tehdy, když je GNU Emacs spuštěn s plnohodnotným grafickým uživatelským rozhraním, tak i v případě, že používáte GNU Emacs spuštěný v terminálu, například s využitím balíčku emacs-nox (nox = no X).

Obrázek 2: Pokud vám grafické uživatelské rozhraní u textových editorů nevyhovuje a dáváte přednost použití terminálu, je možné Emacs startovat s volbou -nw nebo –no-window-system.

Poznámka: věnovat se budeme zejména případům, kdy se porovnávají jednotlivé soubory popř. kdy se aplikuje patch na jediný soubor. Dále popsané moduly totiž umožňují i složitější operace, například porovnání celých adresářů, aplikace patche obsahujícího změny pro více souborů atd. Těmto operacím se v případě zájmu budeme věnovat příště.

2. Režimy pro porovnávání souborů

V GNU Emacsu nalezneme několik režimů určených pro porovnávání souborů (ať již se jedná o dva či o tři souboru), pro jejich slučování a taktéž pro práci se soubory obsahujícími záplaty (patch) vytvářené například utilitou diff popř. systémy pro správu verzí. Navíc je možné si doinstalovat i další podpůrné moduly, které porovnávání ještě více zjednodušují. Všechny užitečné režimy si popíšeme v navazujícím textu, ovšem již teď si řekneme, že pro porovnání souborů se používá režim nazvaný ediff (s „e“ na začátku), ovšem zapomenout nesmíme ani na klasický režim diff (resp. diff-mode).

Nejprve se podívejme na způsob porovnání dvou souborů, což jsou většinou dvě varianty toho samého souboru. Pokud spustíte Emacs příkazem:

emacs verze1 verze2

měly by se po spuštění Emacsu vytvořit a zobrazit dva buffery, každý s jednou variantou souboru:

Obrázek 3: Zobrazení dvou bufferů obsahujících dvě varianty souboru, které budeme chtít porovnat.

Obrázek 4: Stejné soubory, ovšem tentokrát je Emacs puštěný v terminálu.

3. Zákaz zobrazení bufferu s úvodními informacemi

V závislosti na aktuálně používané konfiguraci Emacsu se může stát, že se vám namísto obou bufferů (viz screenshoty 3 a 4 z předchozí kapitoly) zobrazí pouze jeden ze souborů a v druhém bufferu bude otevřena „vítací“ obrazovka Emacsu. Situace může vypadat zhruba takto:

Obrázek 5: Namísto druhého souboru se zobrazil buffer s úvodními informacemi o Emacsu.

V tomto případě můžete pomocí myši nebo klávesy Enter vybrat odkaz „Dismiss startup screen“ popř. navíc zvolit „Never show it again“. Tuto volbu je samozřejmě možné později odvolat, a to smazáním následujícího textu z konfiguračního souboru ~/.emacs

 '(inhibit-startup-screen t)

Poznámka: nesmažte celý řádek, protože poslední uzavírací pravou závorku je nutné zachovat. Je totiž součástí funkce custom-set-variables. Alternativně lze poslední znak t nahradit za nil.

4. Porovnání dvou souborů

Ve chvíli, kdy máme zobrazeny oba buffery obsahující původní i novou verzi nějakého souboru, můžeme zavolat příkaz ediff-buffer, a to následujícím způsobem:

M-x ediff-buffers

Poznámka: budeme se držet konvencí pojmenování klávesových zkratek Emacsu, takže předchozí řádek znamená stisk klávesové kombinace Alt+X následované zápisem ediff-buffers a klávesou Enter. Samozřejmě není nutné psát celé jméno příkazu, protože funguje doplňování pomocí klávesy Tab (zde konkrétně se zobrazí cca dvacet příkazů začínajících na „ediff“).

Po spuštění výše uvedeného příkazu se Emacs zeptá na jména bufferů, jejichž obsah se má porovnat. Zde můžeme jen potvrdit nabízená jména klávesou Enter (povšimněte si ovšem, že první buffer bude pojmenován A a druhý B, toho využijeme později). Ihned poté se Emacs přepne do nového režimu ediff, v němž se používá odlišný způsob zobrazení souborů a taktéž nové klávesové zkratky (tento režim je modální). V případě, že je Emacs spuštěný s GUI, je ediff režim rozpoznatelný tak, že se zobrazí nové okno s jeho příkazy a klávesovými zkratkami (pravý horní roh):

Obrázek 6: GNU Emacs přepnutý do takzvaného ediff režimu.

Nové okno s příkazy platnými pro ediff režim je samozřejmě možné si zvětšit klávesovou zkratkou ? a prozkoumat dostupné příkazy:

Obrázek 7: Okno s příkazy platnými v ediff režimu.

V případě, že je Emacs spuštěn v terminálu, jsou příkazy režimu ediff zobrazeny ve speciálním bufferu, což je ostatně patrné i z následujícího screenshotu:

Obrázek 8: Okno s příkazy platnými v ediff režimu zobrazené po stisku klávesy ?.

5. Základní klávesové zkratky v režimu ediff

V režimu ediff je možné použít několik nových klávesových zkratek. Především se jedná o zkratky p (previous) a n (next) používané pro přechod (skok) na předchozí či následující nalezenou změnu. K těmto zkratkám existují i alternativy Del a Space (ovšem v závislosti na nastavení může Del odpovídat klávese Backspace). Další používanou zkratkou je klávesa h, kterou je možné přepnout režim zobrazení změn – buď se změny pouze barevně zvýrazní nebo se řádky, na nichž byla detekována změna, označí na začátku znaky ->> a <<. Velmi užitečné je také přepnutí způsobu uspořádání bufferů klávesovou zkratkou | – namísto zobrazení obou porovnávaných bufferů pod sebou je možné buffery zobrazit vedle sebe, což je v dobách širokoúhlých monitorů praktičtější. Ostatně se můžeme podívat na screenshot:

Obrázek 9: Vertikální uspořádání bufferů v režimu ediff.

Jednotlivé změny je možné slučovat (popř. sloučení odstranit) těmito zkratkami:

Zkratka Význam
a změna z prvního bufferu se přenese do druhého bufferu
b změna z druhého bufferu se přenese do prvního bufferu
ra návrat poslední úpravy prvního bufferu
rb návrat poslední úpravy druhého bufferu

Mnemotechnická pomůcka: v režimu ediff je první buffer pojmenován A a druhý buffer B, což je ostatně patrné i ze screenshotů.

Zkratky a a b jsou tedy obdobou zkratek dp a do z Vimu, ovšem s tím rozdílem, že ve Vimu je funkce zkratky (z kterého bufferu se bude změna získávat a který buffer bude měněn) závislá na tom, ve kterém bufferu se nachází kurzor.

Samozřejmě nesmíme zapomenout ani na zkratku q, kterou se režim ediff ukončuje a přejde se do výchozího režimu (v našem konkrétním případě do režimu editace zdrojových souborů napsaných v Pythonu).

Poznámka: pokud preferujete, aby se ve výchozím nastavení zobrazily buffery vertikálně a nikoli horizontálně (což dnes nebude příliš praktické), je možné řídit výchozí chování následovně:

(setq ediff-split-window-function 'split-window-horizontally)

popř.:

(setq ediff-split-window-function 'split-window-vertically)

6. Zvýraznění změn na úrovni jednotlivých slov nebo dokonce znaků

Na způsob zobrazení změn na velký vliv volba nazvaná refinement, jejíž nastavení je možné přepínat klávesovou zkratkou @. Stav této volby určuje, jakým způsobem se zobrazí změny detekované na jednotlivých řádcích. Vše si pro větší přehlednost ukážeme na porovnání dvou textových souborů. V případě, že je volba refinement nastavena do stavu OFF, jsou změny představovány změnou pozadí celých řádků, ale již nebudeme vidět, kde přesně na řádku ke změnám došlo:

Obrázek 10: Vybraná změna (první řádky v obou bufferech), kde ovšem nevidíme, kde přesně ke změně došlo.

Pokud volbu refinement přepneme klávesou @ do stavu ON, budou již změny provedené v rámci jednotlivých řádků viditelné. Podobného efektu dosáhneme i klávesovou zkratkou *, která ovšem refinement zobrazí pro právě vybranou změnu, ovšem stav volby se nezmění:

Obrázek 11: Zde již můžeme na zvýrazněných řádcích vidět, že ke změně došlo ve slovu „software“.

Implicitně je zvýraznění změn na jednom řádku provedeno pro celá slova, což může být někdy nevýhodné, především při opravování různých překlepů atd. Aby se Emacs choval podobně jako například již zmíněný Meld nebo Vim s pluginem DiffChar, tj. aby zobrazoval změny jednotlivých znaků, musíme provést přenastavení proměnné ediff-forward-word-function tak, aby obsahovala referenci na funkci forward-char. Přenastavení je nutné provést globálně (přesněji řečeno pro oba porovnávané buffery), takže se namísto speciální formy setq použije speciální forma setq-default.

Poznámka: setq a setq-default sice na první pohled vypadají jako obyčejné funkce, ovšem skutečně se jedná o speciální formy. O nutnosti použití speciálních forem jsme se zmínili v článku o LISPu.

Existuje několik způsobů, jak celý úkon provést. První způsob spočívá v přepnutí do režimu IELM neboli „Interactive Emacs-Lisp Mode“, v němž je možné používat smyčku REPL jazyka ELISP a přímo tak ovlivňovat chování Emacsu. Přepnutí do režimu IELM se provede následujícím způsobem:

M-x ielm

Následně lze do interaktivní smyčky REPL zapsat volání speciální formy setq-default a režim ihned poté ukončit:

(setq-default ediff-forward-word-function 'forward-char)

Alternativní (a nutno říci, že pro tyto případy mnohem rychlejší) způsob využívá jednoho speciálního mini bufferu (někdy psáno dohromady minibuffer), který se zobrazí klávesovou zkratkou M-: (tedy Alt+dvojtečka). Do tohoto jednořádkového mini bufferu stačí zadat stejný příkaz (viz též obrázek číslo 14).

Obrázek 12: Nastavení zobrazení změn na úrovni jednotlivých znaků v interpretru jazyka ELISP.

Obrázek 13: Zobrazení změn na úrovni jednotlivých znaků (zde konkrétně změna velikosti písmena „a“).

Obrázek 14: Nastavení zobrazení změn na úrovni jednotlivých znaků z takzvaného mini bufferu.

Obrázek 15: Takto se zobrazí změny na úrovni jednotlivých znaků v terminálu.

7. Vytvoření souboru s rozdíly

V režimu ediff je možné použít klávesovou zkratku D (difference). Po jejím stisku se oba soubory porovnají a vytvoří se běžný patch. Ten je možné uložit příkazem wd (write diff).

Dokonce je možné zobrazit i formát patche, a to konkrétně klávesovými zkratkami C-c C-d (klasický kontextový formát) a C-c C-u (unifikovaný formát). Mimochodem, zápis klávesových zkratek opět odpovídá konvencím Emacsu a znamená Ctrl+C Ctrl+D a Ctrl+C Ctrl+U. Způsob zobrazení ovlivňuje i to, jak se patch zapíše na disk výše zmíněným příkazem wd.

8. Porovnání tří souborů

V Emacsu je samozřejmě možné porovnávat i tři varianty souborů a popř. je slučovat, tj. provádět třícestný merge. Postup je prakticky shodný s postupem, který jsme použili při porovnávání/slučování dvou verzí. V nejjednodušším případě otevřeme v Emacsu všechny tři soubory, které budeme chtít porovnat:

emacs new_mine.txt old.txt new_someone_else.txt

Následně spustíme režim ediff, ovšem příkaz, kterým se režim ediff inicializuje, bude odlišný (na konci bude trojka):

M-x ediff-buffers3

Emacs se opět zeptá, které buffery se budou porovnávat a přiřadí jim jména A, B a C. Výsledek bude vypadat takto:

Obrázek 16: Porovnání tří variant textového souboru.

Obrázek 17: Porovnání tří variant textového souboru po přechodu (a vysvícení) první nalezené změny.

Samozřejmě můžeme porovnávat libovolné soubory, včetně zdrojových kódů. Rozdílem bude fakt, že se současně bude inicializovat i režim práce s konkrétním programovacím jazykem, v našem případě s Pythonem – viz menu:

emacs new.py old.py other.py

Obrázek 18: Porovnání tří variant zdrojového kódu.

9. Příkazy používané při porovnávání tří souborů

Některé příkazy jsou v tomto režimu shodné s již známými příkazy, tj. je možné používat klávesové zkratky n a p pro procházení změnami, klávesu | pro výběr zobrazení (horizontální nebo vertikální umístění bufferů v okně), @ pro přepínání režimu zobrazení změn na jednom řádku atd. Podobně je tomu i u příkazu q atd. Nepatrně se změnil význam příkazu ~, který postupně prohazuje pořadí všech tří bufferů.

Obrázek 19: Slučování změn pomocí příkazů ab, ac atd.

Ovšem příkazy a a b, s nimiž jsme se seznámili v předchozích kapitolách, budou odlišné, resp. přesněji řečeno přestanou v původní zjednodušené variantě existovat. Je to vlastně logické, protože při práci se dvěma buffery je jasné, že změny se budou přenášet z vybraného bufferu (A či B) do druhého bufferu (B nebo A). U porovnávání obsahu tří bufferů je však nutné určit jak zdrojový buffer (ze kterého se změna získá), tak i buffer cílový (kam se zapíše). Takže namísto pouhých tří příkazů máme k dispozici příkazů šest:

Příkaz Význam
ab přenos změny z bufferu A do bufferu B
ac přenos změny z bufferu A do bufferu C
ba přenos změny z bufferu B do bufferu A
bc přenos změny z bufferu B do bufferu B
ca přenos změny z bufferu C do bufferu A
cb přenos změny z bufferu C do bufferu B

Obrázek 20: Okno s nápovědou zobrazené při porovnávání a slučování tří souborů.

Použití těchto příkazů je většinou mnohem rychlejší, než do a dp ve Vimu (ostatně i proto je lepší si tyto příkazy, resp. jejich dvanáct variant) namapovat na nové klávesové zkratky.

Obrázek 21: Pomocí klávesy * jsou zvýrazněny změny jednotlivých znaků nebo slov, nikoli pouze změněné řádky.

Použít lze také příkaz D (diff) pro zobrazení rozdílů mezi prvními dvěma buffery. Pokud budete chtít porovnat jiné buffery, je možné před D několikrát použít již výše zmíněný příkaz ~ pro jejich prohození. Výstup vygenerovaný příkazem D je možné uložit do nového souboru s využitím příkazu wd (write diff).

Obrázek 22: S využitím klávesové zkratky | je možné původně horizontálně umístěné buffery rozložit vertikálně.

Obrázek 23: Režim zvýraznění jednoznakových popř. jednoslovních změn provedených v rámci jednoho řádku.

10. Spuštění Emacsu přímo v režimu porovnání dvou souborů

Minule jsme se zmínili o tom, že jedním ze způsobů porovnání souborů ve Vimu je spuštění tohoto editoru příkazem vim -d nebo vimdiff s tím, že se editoru předají i jména porovnávaných souborů. Podobnou funkci je možné využít i v Emacsu, ovšem spuštění bude nepatrně složitější (což nemusí vadit, když si vytvoříte funkci nazvanou například emacsdiff~/.bashrc). Spuštění Emacsu bude vypadat následovně:

emacs --eval "(ediff-files \"old.py\" \"new.py\")"

11. Modul diffview-mode

Užitečným modulem pro Emacs je modul nazvaný diffview-mode, který dokáže vertikálně rozdělit okno a zobrazit jak obsah vybraného souboru, tak i novou verzi souboru po aplikaci patche. Tento modul je možné získat z adresy https://github.com/mgalgs/diffview-mode, ovšem jeho instalaci je možné provést přímo z Emacsu (což je samozřejmě nejjednodušší řešení).

12. Instalace modulu diffview-mode

Ukažme si nejdříve postup instalace tohoto balíčku.

Přímo z běžícího Emacsu spusťte příkaz:

M-x package-install

Dále na výzvu zadejte název balíčku a potvrďte klávesou Enter:

diffview

Po chvilce (na rychlé síti za několik sekund) by se měl balíček stáhnout a nainstalovat. O tom, v jakém je stavu, se lze kdykoli později přesvědčit příkazem:

M-x package-list

V zobrazeném seznamu by se u balíčku diffview měl objevit řetězec „installed“ a nikoli „available“.

Obrázek 24: Seznam balíčků ještě před instalací modulu diffview.

Obrázek 25: Seznam balíčků po instalaci modulu diffview. Nainstalovaný balíček je zvýrazněn červeně

13. Použití balíčku diffview-mode

Použití tohoto balíčku je poměrně jednoduché. Nejdříve otevřeme dva buffery, z nichž jeden bude obsahovat původní verzi souboru a druhý patch, který by se měl na tuto verzi aplikovat:

emacs old.py old2new.patch

Obrázek 26: Zobrazení patche i původního souboru. Povšimněte si, že k dispozici jsou nové příkazy dostupné v menu Diff.

Následně se spustí příkaz:

M-x diffview-current

Po zadání tohoto příkazu by se měl změnit pohled na obsah souborů, protože se ve dvou vertikálně orientovaných bufferech zobrazí původní a nová verze souboru:

Současně jsou oba buffery provázány, takže se při pohybu kurzoru mění pozice kurzoru (v řeči Emacsu „point“) v obou bufferech synchronizovaně.

Obrázek 27: Namísto patche se zobrazí dvě varianty souboru – původní varianta a varianta s aplikovaným patchem.

14. Odkazy na Internetu

Ve skutečnosti je možné aplikovat patche i v režimu ediff. Nejjednodušší je situace, kdy se v bufferu již nachází soubor s patchem. V takovém případě zadáme příkaz:

MIF18 tip v článku témata

M-x epatch

a na zobrazený dotaz odpovíme, že se patch již nachází v bufferu. Následně zadáme jméno souboru, na který se má patch aplikovat. Po aplikaci patche se zobrazí původní soubor i soubor změněný popř. se vypíšou informace o kolizích a dalších chybách, které aplikaci patche znemožnily. Současně se provede přepnutí do režimu ediff, ve kterém můžeme vidět rozdíly mezi původním souborem a souborem upraveným (opatchovaným).

Podobně je možné postupovat ve chvíli, kdy jsou otevřeny dva buffery – jeden s patchem, druhý s originální verzí souboru. V takovém případě použijeme příkaz:

M-x epatch-buffer

15. Odkazy na Internetu

  1. GNU Emacs (home page)
    https://www.gnu.org/software/emacs/
  2. GNU Emacs (Wikipedia)
    https://en.wikipedia.org/wi­ki/GNU_Emacs
  3. Emacs (Wikipedia)
    https://en.wikipedia.org/wiki/Emacs
  4. XEmacs (home page)
    http://www.xemacs.org/
  5. Evil mode pro Emacs
    https://github.com/emacs-evil/evil
  6. Emacs timeline
    http://www.jwz.org/doc/emacs-timeline.html
  7. Emacs Cheat Sheet
    http://www.rgrjr.com/emac­s/emacs_cheat.html
  8. Emacs Diff-Mode
    https://www.gnu.org/softwa­re/emacs/manual/html_node/e­macs/Diff-Mode.html
  9. DiffMode (Emacs Wiki)
    https://www.emacswiki.org/e­macs/DiffMode
  10. EdiffMode (Emacs Wiki)
    https://www.emacswiki.org/e­macs/EdiffMode
  11. diffview-mode
    https://github.com/mgalgs/diffview-mode
  12. Using Multiple Buffers
    https://www.gnu.org/softwa­re/emacs/manual/html_node/e­macs/Buffers.html
  13. MiniBuffer
    https://www.emacswiki.org/e­macs/MiniBuffer
  14. Evaluating Expressions
    https://www.emacswiki.org/e­macs/EvaluatingExpressions
  15. EINE (Emacs Wiki)
    http://www.emacswiki.org/emacs/EINE
  16. EINE (Texteditors.org)
    http://texteditors.org/cgi-bin/wiki.pl?EINE
  17. ZWEI (Emacs Wiki)
    http://www.emacswiki.org/emacs/ZWEI
  18. ZWEI (Texteditors.org)
    http://texteditors.org/cgi-bin/wiki.pl?ZWEI
  19. Zmacs (Wikipedia)
    https://en.wikipedia.org/wiki/Zmacs
  20. Zmacs (Texteditors.org)
    http://texteditors.org/cgi-bin/wiki.pl?Zmacs
  21. TecoEmacs (Emacs Wiki)
    http://www.emacswiki.org/e­macs/TecoEmacs
  22. Micro Emacs
    http://www.emacswiki.org/e­macs/MicroEmacs
  23. Micro Emacs (Wikipedia)
    https://en.wikipedia.org/wi­ki/MicroEMACS
  24. EmacsHistory
    http://www.emacswiki.org/e­macs/EmacsHistory
  25. Seznam editorů s ovládáním podobným Emacsu či kompatibilních s příkazy Emacsu
    http://www.finseth.com/emacs.html
  26. Programovací jazyk LISP (druhá část)
    https://www.root.cz/clanky/pro­gramovaci-jazyk-lisp-druha-cast/
  27. Ediff
    https://www.gnu.org/softwa­re/emacs/manual/html_node/e­diff/index.html
  28. Plugin Diffchar
    https://github.com/vim-scripts/diffchar.vim
  29. DirDiff.vim : A plugin to diff and merge two directories recursively.
    http://www.vim.org/scripts/scrip­t.php?script_id=102
  30. vim-dirdiff na GitHubu
    https://github.com/will133/vim-dirdiff
  31. Vim-fugitive na GitHubu
    https://github.com/tpope/vim-fugitive
  32. Vim-fugitive na www.vim.org
    http://www.vim.org/scripts/scrip­t.php?script_id=2975
  33. vimdiff, nástroj drsňáků
    http://www.sw-samuraj.cz/2017/11/vimdiff-nastroj-drsnaku.html
  34. Comparing and Merging Files
    https://www.gnu.org/softwa­re/diffutils/manual/diffu­tils.html
  35. Three-way merge
    https://en.wikipedia.org/wi­ki/Merge_(version_control)#Three-way_merge
  36. diff (1) – Linux Man Pages
    https://www.systutorials.com/doc­s/linux/man/1-diff/
  37. diff utility (Wikipedia)
    https://en.wikipedia.org/wi­ki/Diff_utility
  38. GNU Wdiff
    https://www.gnu.org/software/wdiff/
  39. GNU wdiff Manual
    https://www.gnu.org/softwa­re/wdiff/manual/
  40. wdiff (1) – Linux Man Pages
    https://www.systutorials.com/doc­s/linux/man/1-wdiff/
  41. diff3 (1) – Linux Man Pages
    https://www.systutorials.com/doc­s/linux/man/1-diff3/
  42. sdiff (1) – Linux Man Pages
    https://www.systutorials.com/doc­s/linux/man/1-sdiff/
  43. Stránky nástroje Meld
    http://meldmerge.org/
  44. Meld na stránkách GNOME
    https://wiki.gnome.org/Apps/Meld
  45. Stránky nástroje TkDiff
    https://sourceforge.net/pro­jects/tkdiff/
  46. Zdrojové kódy TkDiffu
    https://sourceforge.net/pro­jects/tkdiff/files/tkdiff/4­.2/
  47. Poslední verze nástroje TkDiff
    https://sourceforge.net/pro­jects/tkdiff/files/latest/dow­nload
  48. Manuálová stránka k nástroji TkDiff
    http://linux.math.tifr.res­.in/manuals/man/tkdiff.html
  49. diffh: Make your diff easier to see
    https://inconsolation.wor­dpress.com/2013/10/07/dif­fh-make-your-diff-easier-to-see/
  50. Stránky projektu diffh
    https://sourceforge.net/pro­jects/diffh/
  51. Pretty Diff (implementovaný v JavaScriptu)
    http://prettydiff.com/
  52. Nástroje pro diff textů
    https://en.wikipedia.org/wiki/Diff-Text
  53. Pretty Diff (implementovaný v JavaScriptu)
    https://en.wikipedia.org/wi­ki/Pretty_Diff
  54. Stránky projektu colordiff
    https://www.colordiff.org/
  55. Skript idiff
    http://www.pixelbeat.org/scrip­ts/idiff
  56. Three way git merging with Meld
    https://lukas.zapletalovi­.com/2012/09/three-way-git-merging-with-meld.html
  57. xxdiff na serveru SourceForge
    https://sourceforge.net/pro­jects/xxdiff/
  58. Stránka nástroje KDiff3
    http://kdiff3.sourceforge.net/
  59. Seriál o programovacím jazyku TCL a GUI knihovně Tk
    https://www.root.cz/seria­ly/programovaci-jazyk-tcl/
  60. ActiveTcl
    https://www.activestate.com/activetcl
  61. Tiobe: žebříček popularity programovacích jazyků
    https://www.tiobe.com/tiobe-index/
Našli jste v článku chybu?