2010-07-09 29 views
9

J'ai un fichier texte au format YAML, et je voudrais définir un pliage personnalisé pour VIM, mais je ne suis pas sûr de la façon de le faire (malgré la lecture de la documentation VIM pour le pliage). Le fichier se compose de YAML « documents », comme ceci:Comment est-ce que je peux plier des articles de YAML dans VIM?

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

Je voudrais que le texte résultant plié à ressembler à quelque chose comme ceci:

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

Toutes les suggestions sont appréciés! Merci!

Répondre

4

Do

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

ou

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

Cela va ajouter un commentaire avec le titre au début de chaque document YAML et laisser le document toujours valide. L'option foldmarker doit être laissée intacte.

Résultat:

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 
... 

plié:

+-- 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 
... 

plié:

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

Merci pour la réponse!Je n'étais pas clair sur la façon d'utiliser les marqueurs, et cela a définitivement résolu le problème. Cependant, dans le but de ne pas dupliquer les données, VIM peut-il utiliser l'expression rationnelle que vous avez donnée pour déterminer automatiquement les niveaux de pli, avec un titre? – wkranec

+0

@wkranec Je pense que cela peut être fait en utilisant 'foldmethod = expr' avec l'ensemble correct' foldexpr' et 'foldtext', mais je ne l'ai jamais utilisé. – ZyX

2

Si vous souhaitez utiliser un foldmethod autre que "manuel" tout le temps, ajoutez cette ligne à votre ~/.vimrc:
set foldmethod = foldoption

Je recommanderais d'utiliser foldmethod = indent. Cela se repliera en fonction de tout retrait. Ensuite, si vous changez votre entrée pour inclure les retraits où vous voulez que les plis se produisent. Par exemple, si vous changez votre entrée à

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

Il se pliera comme vous l'avez

+0

Désolé pour le dernier commentaire. Je suis nouveau à SO et ne savais pas que le code en ligne ne fonctionnerait pas (je ne peux plus éditer pour une raison quelconque). – wkranec

+0

Ouais c'était ma faute, j'ai mal lu votre entrée d'origine. Je pensais qu'il avait déjà une relation imbriquée. Vous pouvez utiliser set foldmethod = marker à la place. En conjonction avec cela, vous pouvez utiliser set foldmarker = mmm, nnn où mmm est le marqueur de départ et nnn est le marqueur de fin. Donc, je voudrais essayer set foldmarker = ---, --- (en supposant --- dans YAML est OK marqueur/délimiteur pour les plis). J'espère que cela t'aides. –

+0

Merci encore, Eric. J'ai essayé la méthode marqueur avant comme vous l'avez décrit, mais ensuite VIM plie le document entier (ou tous les éléments jusqu'à la fin du fichier si vous essayez de faire un pli au milieu du document (car il n'y a vraiment pas de fermeture "---") – wkranec