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