2012-01-01 4 views
4

Je veux replier les définitions de fonction en code python en utilisant le repliement basé sur la syntaxe Vim. J'ai donc ajouté ce qui suit à mon .vim/syntax/python.vim:Vim: Comment lancer une syntaxe sur la ligne après une correspondance regexp? (fonctions python)

setlocal foldmethod=syntax 
syn sync fromstart 
syn region pythonFunctionFostart="^\z(\s*\)\%(def\|class\) " skip="^\s*$" end="^\ze\%(\z1\s\)\@!." fold transparent 

Cela fonctionne; il engloutit aussi les lignes vides entre les fonctions (contrairement à foldmethod = indent), ce que je veux. Cependant, je ne veux pas que la ligne "def function():" soit pliée. Pour autant que je compris les documents que je pouvais faire ce qui suit:

syn region pythonFunctionFold start="^\z(\s*\)\%(def\|class\) .*\n\zs." skip="^\s*$" end="^\ze\%(\z1\s\)\@!." fold transparent 

Mais cela provoque vim de ne pas créer de pli du tout. (J'ai essayé le regexp de début en utilisant la recherche simple bien sûr, et cela fonctionne). Ni fonctionne comme suit:

syn region pythonFunctionFold start="^\z(\s*\)\%(def\|class\) .*\n."ms=e skip="^\s*$" end="^\ze\%(\z1\s\)\@!." fold transparent 

ni ne hs = e, rs = e

Tout ce que j'essaie soit inclut la définition, ou ne fonctionne pas du tout. (Je suppose que vim n'aime pas les nouvelles lignes dans mes expressions rationnelles de syntaxe). Y at-il un moyen simple de faire un pli de syntaxe commencer la ligne après une correspondance regexp?

Edit: J'ai aussi essayé ce qui suit:

syn match pythonFunctionFold "^\(\s*\)\%(def\|class\) .*\n\zs\(\s*\n\|\1\s\+.*\n\)\+" fold transparent 

Quand je cherche le motif (en utilisant /) il correspond exactement les régions que je veux plier, et « :help syntax » demandes d'aliments pour les matchs multilignes . Mais je n'ai toujours pas de pli.

Répondre

1

Je crains que cela ne soit pas possible. De syntax.txt, sous :syn-multi-line:

Lorsque vous utilisez un modèle de démarrage avec un décalage, le début du match n'est pas autorisé à démarrer dans une ligne suivante. La surbrillance peut commencer dans une ligne suivante . L'utilisation de l'élément "\ zs" nécessite également que le début de ne se déplace pas vers une autre ligne.

+0

Merci. Bien que je ne comprenne pas pourquoi la limitation est là (ne devrait pas conduire à une performance majeure dans la mesure où je sous-vim regexps), je vais essayer de voir si je pourrais pirater le code de la syntaxe vim moi-même un jour. – erzxerzx

Questions connexes