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?


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.


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

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

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

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.


2
Cela m'a sauvé la journée en ressuscitant un certificat OpenSSL. Merci
— Cengiz Can
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.