☰ menu
Pavel Satrapa

Skládání čili folding

Skládání se objevilo v šesté verzi programu. Jeho cílem je usnadnit editaci rozsáhlých souborů, kdy již jen samotné pohyby po textu mohou stát spoustu času. Skládání funguje podobně, jako když máte text vytištěný na papíře, který složíte tak, že část textu se skryje ve skladu. Viditelná část se tak zkrátí:

[složený text]

Podobně se chová vim: část textu zmizí a je nahrazena upozorněním „zde je složeno N řádků, z nichž první obsahuje XYZ“. Skryté řádky pochopitelně zůstávají v souboru, jen momentálně nejsou zobrazeny.

Ruční skládání a rozkládání

Příkazy pro zacházení se sklady začínají klávesou z (mnemotechnika: připomíná složený papír z profilu). Sklad vytvoříte kombinací zf (f jako fold). Za ním následuje pohybový příkaz – řádky od aktuálního až po cílový budou složeny. Místo nich se objeví jediný řádek ve tvaru

+--- 10 řádků:Text prvního z nich

Oznamuje, kolik řádků se za ním skrývá a jako vodítko k jejich obsahu zobrazuje text prvního z nich. Skládáte-li snadno definovatelný blok textu, poslouží vám výše zmíněná kombinace zf následovaná pohybovým příkazem či definicí objektu. Například zfap složí aktuální odstavec. Složitější část textu můžete nejprve vyznačit ve vizuálním režimu a následně stisknout zf, čímž se složí všechny vyznačené řádky.

Sklady lze vnořovat. Čili můžete složit část textu, která již obsahuje sklady. Zůstanou zachovány a po pozdějším rozložení nadřízeného skladu se objeví ve stavu, v němž byly před složením.

O rozložení skladu pod kurzorem se postará kombinace zo (o jako open). I po rozložení si ale vim pamatuje, že zde byl sklad a umožní vám jej znovu složit pomocí zc (c jako close). Čili zf definuje nový sklad (a složí jej), zatímco zc pouze vyhledá nejbližší existující rozložený sklad obsahující kurzor a složí jej. Definici skladu můžete odstranit kombinací zd (d jako delete).

Otevírat a zavírat sklady lze i skupinově. Kombinace zr (r jako reduce) rozevře jednu úroveň skladů v celém dokumentu, zatímco zm (m jako more) naopak jednu úroveň plošně zavře. O rozevření úplně všech skladů v celém dokumentu v libovolné hloubce zanoření se postará zR, zatímco o komplatní pozavírání zM.

Práce se sklady

Pokud sklad zkopírujete či vymažete, týká se operace všech jeho řádků. Takže například zkopírování jednoho řádku (příkaz yy) provedené na řádku se složeným skladem ve skutečnosti zkopíruje do vyrovnávací paměti všechny řádky daného skladu.

Při hledání řetězce se nemusíte obávat, že o něco přijdete. vim hledá i uvnitř skladů a pokud najde, automaticky dotyčný sklad rozevře a zobrazí nalezený výskyt.

Udržet přehled o existujících skladech nemusí být právě jednoduché. Vaši situaci usnadňuje proměnná foldcolumn. Pokud jí nastavíte nenulovou hodnotu – například :set foldcolumn=5 – zobrazí nalevo od textu příslušný počet sloupců, v nichž pseudograficky znázorňuje existující sklady. Sklad je vždy zahájen znakem „–“, pod nímž následují svislé čáry až po jeho konec. Vnořené sklady se zobrazují v dalších sloupcích.

[text se zobrazenými sklady]

Klepnutím myší na znaky „+“ a „–“ v levé části okna můžete otevírat a zavírat jednotlivé sklady.

Automatizace

Pokud vám to vyhovuje, můžete vim konfigurovat tak, aby sklady otevíral a zavíral automaticky. Slouží k tomu dvojice voleb

:set foldopen=all
:set foldclose=all

První z nich zajistí, že sklad se automaticky otevře, když na něj přemístíte kurzor. Druhá naopak sklady automaticky zavírá, jakmile je kurzor opustí. Přesněji řečeno jejich hodnotou určujete seznam příkazů, jež vyvolají otevření/zavření skladu, nicméně hodnota all je asi nejzajímavější.

Automatizovat lze i definici skladů. Slouží k tomu volba foldmethod. Její standardní hodnotou je manual, což znamená, že sklady si uživatel definuje ručně. Zajímavé automatické varianty představují :set foldmethod=indent (sklady jsou definovány podle úrovně odsazení textu, vhodné pro programovací jazyky) a :set foldmethod=syntax (sklady se definují podle syntaktických kategorií textu, které na to ale musí být připraveny).

Nejsilnější variantou automatické definice skladů je :set foldmethod=expr, kdy jsou sklady definovány obecnými výrazy :set foldexpr=výraz. Jejich problematika však přesahuje záběr tohoto textu. Dobrým začátkem pro jejich studium je :help fold-expr.