2014-05-04 3 views
1

J'ai (quelque chose d'équivalent) ce qui suit dans un fichier de syntaxe:Vim se déplie de synchronisation avec la syntaxe/mal insérée

syn sync clear 
syn sync fromstart 
syn region fooBlock start="\<interface\>" end="\ze\<implementation\>" fold 
syn region fooBlock start="\<implementation\>" end="\%$" fold 

La coloration syntaxique fonctionne très bien (comme on peut le voir en ajoutant par exemple matchgroup=Keyword). Folding travaille aussi au fond, mais quand j'insérer une nouvelle fois (en tapant par exemple implementation, vim commence le pli d'une ligne plus tard que prévu. Exemple:

- interface 
| l1 
| l2 
    implementation 
- l3 
| l4 
| l5 

Lorsque vous tapez ceci, évidemment je me attends la deuxième fois à commencer une ligne plus tôt. en tapant zx corrige que, tout comme la sauvegarde et la réouverture du fichier ou en tapant :syn sync fromstart.

que puis-je faire pour avoir vim insérer correctement les plis que je tape?

Je l'ai déjà regardé dans :help fold-syntax, mais comme indiqué, :syn sync fromstart dans le fichier de syntaxe ne fonctionne pas.

Il est peut-être préférable d'utiliser \ze (ou le suffixe me=s-1, qui donne également le même résultat) pour mettre en surbrillance/plier des régions multi-parties.

Répondre

1

Vous essayez d'exprimer le fait que la section interface se termine une ligne avant une implementation ligne. Les régions de syntaxe (et en particulier le repliement) fonctionnent mieux lorsqu'il existe un début de région défini et un marqueur de fin de région (comme begin et end).

J'ai essayé de faire fonctionner votre exemple en ajoutant \n au modèle, mais cela ne fonctionnait pas non plus. Je suppose pour obtenir un pliage fiable, vous devez passer de la syntaxe-pliage à un 'foldexpr', comme ceci:

:setlocal foldmethod=expr foldexpr=getline(v:lnum)=='interface'\|\|getline(v:lnum)=='implementation'?'>1':'=' 
Questions connexes