Comment puis-je envelopper du texte sur une longueur dans Vim?

102

Parlons de mesures relatives. Mon Vim ressemble à:

aaaaaaaaaaaaa 
bbbbbbbbbbbbb 
ccccccccccccc 
etc

Je voudrais qu'il soit plus petit:

aaaaa
aaaaa
bbbbb
bbbbb
ccccc
ccccc
etc

Comment puis-je l'avoir? Et comment puis-je gérer la définition de la longueur d'un tel bloc?

Léo Léopold Hertz 준영
la source
Voulez-vous dire envelopper le texte et non mettre en retrait le texte?
lc.
lc: Je ne connais pas la différence. J'allais écrire wrap comme il m'avait été recommandé, mais je ne l'ai jamais fait fonctionner.
Léo Léopold Hertz 준영

Réponses:

177

Vous pouvez en fait faire deux choses:

  1. Laissez vim formater (iechange) votre texte pour avoir des lignes plus courtes, en insérant des sauts de ligne
  2. Laissez les lignes telles quelles, mais affichez- les enveloppées

Lequel veux-tu?

L'option 1 serait réalisée en définissant textwidth(par exemple :set textwidth=30(d'après la réponse de Swaarop)). Ensuite, vous pouvez reformater votre texte en le mettant en surbrillance (en mode visuel) et en le tapant gq. ( textwidthpeut être abrégé comme tw, donc :set tw=30.)

L'option 2 peut être basculée en exécutant :set wrap/ :set nowrap. Cela encapsulera des lignes trop longues pour la fenêtre.

Les deux sont indépendants.

sleske
la source
33
+1 pour le raccourci clavier gq du mode visuel, c'est extrêmement utile
Fire Crow
3
Pour info, cela casse les espaces et gqgq ne fait rien sur une ligne comme indiqué dans la question même si tw = 5.
dlamblin
2
@Dlamblin: c'est exact. Si vous voulez plier exactement à la largeur donnée, sans respecter les espaces, utilisez la foldcommande comme dans la réponse de fgm.
sleske
Votre option ne fonctionne pas aussi loin que je vois. wrapse terminera à la limite de la fenêtre, pas textwidth.
DerWeh
@DerWeh: Oui, l'enroulement s'enroulera à la limite de la fenêtre. J'ai édité pour clarifier.
sleske
60

Une fois que vous avez défini 'textwidth', vous pouvez sélectionner du texte avec le mode visuel et appuyez sur gq pour l'envelopper correctement (vous pouvez également utiliser Q sur certaines configurations plus anciennes / héritées).

Quelques conseils utiles:

gqq (wrap the current line)
gq} (wrap this 'paragraph', i.e. until the next blank line)
:h gq
Vlad Dogaru
la source
3
+1, j'ai accidentellement frappé gq en vim, j'ai passé la dernière demi-heure à essayer de voir ce que j'avais frappé. C'est tellement utile.
user176121
gqqenveloppe également la ligne courante (au lieu de gqgqou gq$).
Ash
21

L'utilisation de fold (1) est une possibilité:

:%!fold -w5 

Résultat:

aaaaa
aaaaa
aaa 
bbbbb
bbbbb
bbb 
ccccc
ccccc
ccc
Fritz G. Mehner
la source
1
Cela ne respecte pas non plus les espaces pour le pliage
Lionel
7
@Lionel: Oui. Pour respecter les espaces, ajoutez l'option "-s" à la commande de repli.
sleske
14
:set textwidth=30
Swaroop CH
la source
Comment textwidth le gère-t-il lorsqu'il n'y a pas d'espaces, comme dans l'exemple de l'affiche originale? J'ai eu un jeu et il ne semble formater en fonction de la largeur de texte que s'il y a des espaces (ou supposément, si la variable breakat est définie sur autre chose).
Andy
3
@Andy textwidthne gérera pas une situation sans espace. Vous pouvez écrire votre propre formatexprfonction pour ce faire.
Swaroop CH
8

Si vous avez du texte sans espaces que vous souhaitez couper à une certaine longueur, il n'est ni nécessaire d'utiliser external foldni d'écrire le vôtre formatexpr.

:%s/\(.\{80\}\)/\1\r/g

cassera toutes les lignes à 80 caractères.

kthy
la source
2
Cela m'a sauvé la journée en ressuscitant un certificat OpenSSL. Merci
Cengiz Can