Comment puis-je plier automatiquement un long code C dans Vim?

Je rencontre régulièrement des codes C sans se plier. Il est irritant de les lire s’il n’ya pas de pliage, en particulier avec les fichiers longs. Comment puis-je les plier?

Plier selon la syntaxe

:set foldmethod=syntax 

Si vous voulez le faire manuellement sur les bits que vous voulez replier

 :set foldmethod=manual 

puis créez de nouveaux plis en sélectionnant / déplaçant et en appuyant sur zf par exemple

 shift-v jj zf 

(en ignorant les espaces)

Edit: Voir aussi les commentaires de cette réponse pour les méthodes de pliage de retrait et de marqueur.

Je pense que vous avez peut-être mélangé la terminologie. Avez-vous besoin “d’emballage” ou “pliage”. Le retour à la ligne est celui où les lignes qui ne tiennent généralement pas à l’écran en raison de leur longueur sont coupées, c’est-à-dire affichées sur plusieurs lignes consécutives à l’écran (en fait, il s’agit d’une ligne, sur plusieurs lignes – difficile à expliquer, mieux à voir dans entraine toi).

En vim, l’emballage est défini par

 :set wrap 

pour l’allumer, et

 :set textwidth=80 

pour déterminer où vim doit envelopper le texte (80 caractères est généralement une bonne mesure).

Plier en revanche est une question complètement différente. C’est celui où vim plie plusieurs lignes de code (par exemple une fonction) en une seule ligne de code. C’est utile pour augmenter la lisibilité du code. Vim a plusieurs méthodes de pliage, vous pouvez toutes les voir si vous

 :help folding 

Je pense que ce que vous recherchez, ce serait le pliage de syntaxe, mais je peux me tromper. Je recommande de lire la page d’aide, ce n’est pas long et très utile.

J’ai rassemblé un plugin fold pour C et C ++ . Cela va au-delà de ce qui est fait avec le pliage syntaxique (peut-être pourrait-il être amélioré, je ne sais pas), et laisse les choses moins bruyantes et pas vraiment utiles dépliées, par rapport au pliage par indentation et marqueur.

La mise en garde: afin d’avoir des temps de réaction décents, j’ai dû faire quelques simplifications, et parfois le résultat est assez foiré (nous devons taper zx pour résoudre ce problème).

Voici un petit screencast pour voir comment le plugin plie un code source C ++ correctement équilibré, qui n’est pas en cours de modification 🙁

entrez la description de l'image ici

Dans vi (par opposition à vim), la réponse était:

 :set wm=1 

Cela définit la marge de retour à un caractère avant la fin de la ligne. Ce n’est pas la meilleure spécification au monde avec des fenêtres de tailles variables (cela s’avérait bien avec les écrans verts quand il était difficile de changer la taille).

Cela signifie qu’il existe également une autre façon de le faire dans vim:

 :set textwidth=30 

Voir: Manuel de l’utilisateur VimDoc Section 25.1

Le vous voulez probablement le réglage

 :set foldmethod=syntax 

Mais ne mettez pas cela manuellement! Il manque l’une des principales fonctionnalités de Vims, qui propose des parameters personnalisés pour des centaines de types de fichiers déjà intégrés. Pour obtenir cela, ajoutez ceci à votre ~ / .vimrc

 filetype plugin on filetype indent on 

La détection de type de fichier est principalement basée sur l’extension, dans ce cas, les fichiers * .c. Voir: help: filetype pour plus d’informations. Vous pouvez également personnaliser ces parameters basés sur le type de fichier.

En fait, il existe un autre moyen très simple et efficace, qui consiste à utiliser foldmethod = marker et à positionner foldmarker sur {,} . Le résultat du pli ressemblerait alors à:

  1. toutes les fonctions pliées. Fondamentalement, cela ressemble au contour dans IDE. (et vous pouvez également set foldlevel=1 ou plus, si vous ne voulez pas tout replier au début)

entrez la description de l'image ici

  1. Voici à quoi ressemble une fonction normale lorsque vous l’ouvrez avec le niveau 1 via zo .

entrez la description de l'image ici

De plus, faire le pliage par syntaxe nécessite un peu de travail supplémentaire, et voici un bon tutoriel à ce sujet. Mais je pense que fold by marker={,} est assez, et surtout, c’est simple et soigné.