Minule jsme si ukázali, že Emacs velmi dobře spolupracuje s externími programy při kompilaci a hledání textu v souborech. Dnes se podíváme, že ani spolupráce a komunikace s programy pro správu verzí mu není cizí. „Systémy pro správu verzí (Version control systems)“ jsou programy, které dovedou zaznamenávat více verzí zdrojového souboru. Dovedou také uchovávat informace o historii, například kdy byla která verze vytvořena, kdo ji vytvořil a jak změny popsal. Komplexní popis jednotlivých systémů by jistě vydal na samostatný seriál a nebudeme jej zde příliš podrobně rozebírat. Rozhraní Emacsu pro komunikaci s těmito systémy se jmenuje VC
(Version Control) a umožňuje práci se třemi systémy: RCS, CVS a SCCS.
Je-li soubor uložen v systému pro správu verzí, říkáme, že je „registrován“. Každý registrovaný soubor má odpovídající hlavní soubor (master file), který reprezentuje současný stav, historii, záznamy o změnách apod. a je obvykle uložen na nějakém serveru. Soubor, který je spravován v takovémto systému, se obvykle nazývá pracovní kopií (work file). Tento soubor lze běžným způsobem editovat a po provedení změn se tyto zaznamenají do systému (check in) spolu s popisem změn; nalézá se obvykle v pracovním adresáři uživatele. Systémy obsahují zpravidla mechanismus, jak reagovat v případě, že chce soubor měnit zároveň více uživatelů (zamykání souborů u SCCS a RCS, slučování změn ve chvíli vkládání do systému). Jak už jsem uvedl, podrobný popis mechanismu ukládání je skutečně nad rámec tohoto seriálu.
Podívejme se nyní na to, jak se soubory registrovanými v nějakém takovémto systému pracuje Emacs. Pokud otevřeme soubor, který je zaregistrovaný v některém z těchto systémů, Emacs nás o tom informuje na stavové řádce (mode line), například CVS-1.13
, tedy jméno použitého systému a pomlčkou oddělené číslo verze (znak mezi jménem a verzí může být také ‚ :
‘, což značí uzamčený nebo modifikovaný soubor). Příkazy módu VC
jsou v jistém smyslu univerzální, kokrétní akce (zamknutí souboru, přidání změn do systému, …) je tedy vybírána na základě aktuálního stavu souboru. Klávesové zkratky C-x C-q
a C-x v v
provádějí logicky následující operaci v systému na aktuálním souboru. Přesněji řečeno je funkce vc-next-action
namapována pouze na zkratku C-x v v
, přesný význam příkazu C-x C-q
je poněkud jiný a je více závislý na použitém systému.
Základní rozlišení při použití módu VC
souvisí úzce s použitým backendem, tedy systémem pro správu verzí, a to s použitím zamykání a bez zamykání. První možnost je standardní pro systémy RCS
a SCCS
, zatímco druhá pro CVS
. Logické kroky v případě použitého systému se zamykáním tedy jsou: zamknutí souboru, pokud již není uzamčený; je-li námi uzamčený a obsahuje změny, pak je to poslání změn do systému; pokud je námi uzamčený, ale neobsahuje žádné změny, je následujícím krokem znovuodemčení souboru; pokud je soubor zamknutý někým jiným, zeptá se Emacs, zda chcete toto uzamčení „ukrást“. Tyto kroky jsou platné i v případě, kdy je zamykání použito se systémem CVS
. V druhém případě, kdy není použito zamykání, nabídne C-x C-q
sloučení změn v případě, že jsou v systému obsaženy změny nezahrnuté v naší aktuální pracovní kopii; pošle změny do systému v případě, že žádné takové změny nenalezne. Existuje možnost, jak chování následujícího kroku rozšířit, přidáme-li prefix C-u
před příkaz, lze pomocí parametru například ovlivnit číslo další verze apod. Při posílání změn do systému je nejprve zobrazen tzv. *VC-Log*
buffer, který slouží pro zapsání změn. Změny jsou odeslány po stisku C-c C-c
, pokud změny odeslat nechceme, jednoduše tuto posloupnost nezadáme. V tomto bufferu lze také procházet pomocí příkazů M-n
, M-p
, M-s
a M-r
(podobně jako např. v bashi) historií zadaných logovacích zpráv.
Jednou z mnoha výhod systémů pro správu verzí je, že umožňují vracet se ke starším verzím, to je prohlížet, porovnávat apod. Zadáme-li v bufferu obsahující pracovní kopii souboru registrovaného v jednom ze systémů C-x v ~ VERZE
, kde VERZE je číslo námi požadované verze souboru, otevře se v Emacsu příslušná verze ze systému. Pomocí C-x v =
porovnáme aktuální obsah bufferu s poslední verzí odpovídajícího souboru v systému. Předřadíme-li navíc tomuto příkazu prefix C-u
, můžeme přímo zadat dvě konkrétní čísla verzí k porovnání. Příkaz C-x v g
je zkratka pro CVS annotate, který zobrazí aktuální stav souboru s popisem, kdy a kým byl který řádek editován. Dalšími užitečnými příkazy jsou registrování (ještě nezaregistrovaného souboru) do systému ( C-x v i
), zobrazení aktuální stavu a výpis zaznamenaných změn ( C-x v l
), a mnoho dalších, jejichž podrobný popis je uveden v manuálu. Významné je, že mód VC
lze použít ve spojení s tzv. Dired módem (o kterém bude podrobněji řeč v některém z následujících dílů). Stručně řečeno umožňuje tento mód práci s více soubory najednou. Posloupnost C-x v d
vytvoří právě takovýto VC Dired Mode
, kde lze nejen získat informaci o aktuálním stavu všech souborů zaregistrovaných v systému, ale zároveň s nimi pracovat. Čtenářům znalým práce s Dired módem prozradíme, že příkaz v v
( vc-next-action
) operuje s označenými soubory, ostatní si budou muset počkat na příslušný díl seriálu.
Práce se systémy pro správu verzí je u větších projektů často složitá a my jsme si zde nastínili pouze základní, ale zároveň nejužívanější příkazy. Popis práce s větvemi a další podrobnosti nebudeme dále rozebírat, ale zaměříme se ještě alespoň částečně na související problém, kterým je řešení konfliktů. Jedná se tedy o situaci, kdy jsme provedli změny na pracovní kopii souboru, který se mezitím v systému pro správu změnil. V Emacsu je možné pro řešení takovéto situace použít tzv. Emerge. Kompletní popis by byl bohužel zdlouhavý a příliš obsáhlý a vzhledem ke své obecnosti by si zasloužil samostatný článek. S ohledem na souvislost s použitím výše popisovaného módu pro správu verzí si jej zde alespoň stručně popíšeme. Emerge zobrazuje porovnávání změn ve třech bufferech, „A buffer“ a „B buffer“ a tzv. „merge buffer“. První dva obsahují původní soubory a třetí je výsledkem spojení.
V daném momentě je v prostředí Emerge pozornost soutředěna na jeden konkrétní tzv. „vybraný“ rozdíl. Tento rozdíl je v každém ze dvou původních bufferů označen pomocí v
a ^
, tedy například takto:
vvvvvvvvvvvvvvvvvvvv TEXT, KTERÝ SE LIŠÍ ^^^^^^^^^^^^^^^^^^^^
Emerge
umožňuje pohybovat se po jednotlivých rozdílech vpřed (klávesa n
) či vzad (klávesa p
); vybírat verzi obsaženou v prvním (A) (klávesa a
) či v druhém (B) souboru (klávesa b
); odskakovat na n-tý rozdíl ( C-u N j
) apod. Především ovšem rozlišuje práci ve dvou módech: rychlém (fast) a editovacím (edit). Rychlý mód slouží pouze pro slučování rozdílů výběrem jedné z variant (a pro tento mód slouží uvedené zkratky). Mód editační umožňuje navíc běžné upravování souboru (zmiňované akce zde mají potom předponu C-c C-c
). Přepínání mezi módy je namapováno na počáteční písmena jejich názvů, tedy f
pro rychlý a e
pro editační. Opuštění emerge je možné dvěma způsoby: příkazem emerge-quit
(klávesa q
), který uloží sloučené změny do souboru zadaného jména, nebo pomocí C-]
, který přeruší prováděné slučování. Příkazů pro práci s emerge je, jak bylo řečeno, celá řada, snad alespoň tento stručný přehled poslouží jako počáteční berlička při řešení problémů vzniklých během práce s módem pro správu verzí.
Příští díl bude věnovaný tzv. TAGům a jejich použití v prostředí editoru Emacs. Bude se jednat o poslední ryze programátorský díl, následující budou opět určeny širší Emacsovské komunitě.