Faites set foldmethod=expret utilisez 'foldexpr'pour définir une expression de script vim qui définira les points de départ du pli.
set foldmethod=expr
set foldexpr=get(split(getline(v:lnum-1)),0,'')!=get(split(getline(v:lnum)),0,'')?'>1':'='
Cela semble plus compliqué qu'il ne l'est, car nous ne pouvons pas facilement utiliser des espaces dans :set, mais avec des espaces, et une nouvelle ligne ou 2, cela ressemble à:
get(split(getline(v:lnum - 1)), 0, '') != get(split(getline(v:lnum)), 0, '')
\ ? '>1'
\ : '='
Aperçu
Fondamentalement, cela compare le premier mot de chaque ligne avec la ligne précédente. Si les mots sont différents, la ligne est début du repli, >1. Sinon , il garde le même niveau de repli, =.
Gloire des détails
set foldmethod=expr pour dire à Vim d'utiliser une expression de script vim pour déterminer les plis
'foldexpr' L'option contient l'expression de script vim
- Évaluation de la condition avec un ternaire qui revient
>1quand un pli doit commencer et =quand le niveau de pli doit continuer
v:lnumest la ligne actuelle qui 'foldexpr'est en cours d'exécution pour mettre à jour les plis
- Récupère le contenu de la ligne actuelle (
v:lnum) et de la ligne précédente ( v:lnum - 1) viagetline()
- Divisez chaque ligne en mots via
split()
- Utilisez
get()pour obtenir le premier index des mots fraîchement divisés
- Utilisez une valeur par défaut de
''dans le cas d'une ligne vide. par exempleget(words, 0, '')
- Comparer le premier mot de la ligne actuelle avec le premier mot de la ligne précédente dans la partie condition du ternaire
Remarque: cette méthode peut avoir des problèmes de performances avec des documents très volumineux
Pour plus d'aide, voir:
:h 'foldmethod'
:h 'foldexpr'
:h getline(
:h v:lnum
:h split(
:h get(