2010-07-09 15 views
9

Mam plik tekstowy sformatowany w YAML i chciałbym zdefiniować składanie niestandardowe dla VIM, ale nie jestem pewien, jak do tego przejść (mimo przeczytania dokumentacji VIM do składania). Plik składa się z YAML „dokumenty”, tak:Jak złożyć elementy YAML w VIM?

--- 
title: My Title 
attr1: value1 
attr2: value2 
--- 
title: Next Item 
attr1: value3 
--- 
title: One More Item 
... 

Chciałbym wynikowy tekst złożony wyglądać mniej więcej tak:

+---- 2 lines: My Title ---- 
+---- ? lines: Next Item --- 

Wszelkie sugestie są mile widziane! Dzięki!

Odpowiedz

4

Czy

%s/---\(.*\)\(\_.\{-}title: \)\(.*\)/---\1 #{{{1 \3\2\3/g 
set foldmethod=marker 

lub

%s/\(---\_.\{-}title: \)\(.*\)/#{{{1 \2\r\1\2/g 
set foldmethod=marker 

To doda komentarz z tytułem do początku każdego dokumentu YAML i pozostawić dokument nadal ważny. opcja foldmarker musi pozostać nietknięta.

Wynik:

1.

--- #{{{1 My Title 
title: My Title 
attr1: value1 
attr2: value2 
--- #{{{1 Next Item 
title: Next Item 
attr1: value3 
--- #{{{1 One More Item 
title: One More Item 
... 

Składane:

+-- 4 строк: --- My Title----------------------------- 
+-- 3 строк: --- Next Item---------------------------- 
+-- 3 строк: --- One More Item------------------------ 

2.

#{{{1 My Title 
--- 
title: My Title 
attr1: value1 
attr2: value2 
#{{{1 Next Item 
--- 
title: Next Item 
attr1: value3 
#{{{1 One More Item 
--- 
title: One More Item 
... 

Składane:

+-- 5 строк: My Title-------------------------------- 
+-- 4 строк: Next Item------------------------------- 
+-- 4 строк: One More Item--------------------------- 
+0

Dzięki za odpowiedź!Nie wiedziałem, jak używać znaczników, co zdecydowanie rozwiązało problem. Jednak w celu uniknięcia powielania danych, czy istnieje sposób, aby VIM użył wyrażenia regularnego, które podałeś, aby automatycznie określić poziomy zagięć, z tytułem? – wkranec

+0

@wkranec Myślę, że można to zrobić za pomocą 'foldmethod = expr' z właściwym zbiorem' foldexpr' i 'foldtext', ale nigdy go nie użyłem. – ZyX

2

Jeśli chcesz użyć foldmethod innego niż "Manual" cały czas, dodać tę linię do ~/.vimrc:
zestawu foldmethod = foldoption

polecam korzystania foldmethod = akapit. Spowoduje to złożenie na podstawie dowolnego wcięcia. Następnie, jeśli zmienisz dane wejściowe, wprowadzisz wcięcia, w które mają się składać fałdy. Na przykład, jeśli zmienisz wejście do

--- 
title: My Title 
    other attrs: other values 
--- 
title: Next Item 
--- 
title: One More Item 
... 

będzie spasować jak opisano

+0

Przepraszamy za ostatni komentarz. Jestem nowy w SO i nie wiedziałem, że wbudowany kod nie będzie działał (z jakiegoś powodu nie mogę już edytować). – wkranec

+0

Tak, to była moja wina, źle odczytałem twój pierwotny wkład. Myślałem, że ma już zagnieżdżony związek. Zamiast tego możesz użyć zestawu foldmethod = marker. W połączeniu z tym możesz użyć zestawu foldmarker = mmm, nnn gdzie mmm jest znacznikiem początkowym, a nnn jest znacznikiem końcowym. Więc spróbowałbym ustawić foldmarker = ---, --- (zakładając, że --- w YAML jest OK marker/delimeter dla fałd). Mam nadzieję że to pomoże. –

+0

Jeszcze raz dziękuję, Eric. Próbowałem wcześniej metody markera, jak opisałeś, ale potem VIM składa cały dokument (lub wszystkie elementy do końca pliku, jeśli spróbujesz zrobić zgięcie w środku dokumentu (ponieważ naprawdę nie ma zamknięcia) "---"). – wkranec