Existe-t-il un moyen d'utiliser plusieurs méthodes de pliage vim à la fois?

14

J'ai foldmethod=indentinstallé mon ~/.vimrc, et en général cela fonctionne pour moi et j'aimerais le garder.

Cependant, il y a quelques fichiers que j'ai que je modifie régulièrement (et qui sont sous mon contrôle exclusif), où j'aimerais ajouter un système basé sur des marqueurs, en particulier pour que lorsque j'ouvre le fichier une grande section, je regarder rarement (qui est déjà «délimité» par le retrait) est pré-plié. On dirait que foldmethod=markerme permettrait de le faire (je ne me dérange pas le commentaire étrange dans le fichier pour indiquer ces « pré-plis » si nécessaire), mais je veux encore foldmethod=indentmis pour que je puisse utiliser zc, zoet ainsi de suite pour ensuite plier ou déplier des sections par retrait. Pour autant que je sache, je ne peux pas définir la méthode de pliage sur plusieurs valeurs.

Existe-t-il un autre moyen d'y parvenir (idéalement en utilisant quelque chose intégré au fichier lui-même)?

Andrew Ferrier
la source
J'essaie également de faire fonctionner les deux méthodes de pliage du marqueur et du retrait en même temps. Je crois également que l'utilisation de l'expression de pli est la meilleure option. Avez-vous trouvé une expression correspondant à la fois au retrait et au marqueur?
Jp_
1
@Jp_ nope, 'pas dégoûtant.
Andrew Ferrier

Réponses:

10

Chaque fenêtre peut avoir sa propre valeur locale de 'foldmethod'; ce que vous définissez ~/.vimrcn'est que la valeur par défaut globale. Il existe plusieurs façons de définir une valeur locale différente pour un tampon particulier :

  1. Manuellement avec :setlocal foldmethod=marker
  2. Pour un type de fichier particulier (par exemple des fichiers Java): :autocmd FileType java setlocal foldmethod=marker(ou dans ~/.vim/after/ftplugin/java.vim)
  3. Pour des fichiers particuliers: :autocmd BufRead /path/to/file setlocal foldmethod=marker
  4. À l'intérieur du fichier lui-même via une modeline (puisque vous devez ajouter les marqueurs de toute façon, je préférerais cela):

/* vim: set fdm=manual : */

Il ne peut toujours y avoir qu'une seule méthode de pliage dans une seule fenêtre. Si vous souhaitez utiliser différentes stratégies, vous devez choisir une méthode plus flexible (par exemple expr) et réimplémenter la ou les "autres" méthodes (par exemple en faisant en sorte que vous 'foldexpr'considériez le tiret). Ou vous utilisez deux divisions de fenêtre pour le même tampon et définissez des méthodes de pliage différentes pour chaque division.

Puisque ce n'est probablement pas ce que vous voulez entendre, vous pouvez pirater quelque chose avec un :autocmd CursorMovedqui change la méthode de pliage en fonction de la ligne actuelle:

" Use markers when in the first 100 lines, else use indent.
:autocmd CursorMoved,CursorMovedI <buffer> let &l:foldmethod = (line('.') <= 100 ? 'manual' : 'indent')
Ingo Karkat
la source
1
Merci. Donc, cela me dit que je peux définir foldmethod pour marquer à l'intérieur de ce tampon. Mais ce que je recherche, c'est quelque chose qui me permet toujours d'utiliser la méthode de pliage en retrait, tout en ayant des sections (qui sont délimitées par un retrait) pré-pliées. Si je fais (4) ci - dessus, zc, zoet ainsi de suite ne sera plus fonctionner comme prévu dans ce tampon. J'ai clarifié ma question.
Andrew Ferrier
Votre question n'était pas claire à cet égard, merci pour la clarification. J'ai modifié ma réponse.
Ingo Karkat
Oui, je m'excuse si je n'ai pas été clair. Le foldexpr semble être la meilleure approche mais aussi compliqué. Je vais essayer cependant. +1 pour le pointeur.
Andrew Ferrier
Merci encore. J'ai essayé d'écrire le foldexpr et j'ai ouvert un Q connexe ici qui peut être intéressant: superuser.com/questions/560167/…
Andrew Ferrier
@IngoKarkat: Dans le premier paragraphe sous la ligne, vous avez écrit qu'il ne peut y avoir qu'une seule méthode de pliage par tampon . Je crois que cela devrait être par fenêtre .
garyjohn