Faites set foldmethod=expr
et 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
>1
quand un pli doit commencer et =
quand le niveau de pli doit continuer
v:lnum
est 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(