commande vim pour restructurer / forcer le texte sur 80 colonnes

240

Je sais qu'il existe des moyens de définir automatiquement la largeur du texte dans vim à l'aide set textwidth(comme les problèmes de disposition des colonnes Vim 80 ). Ce que je recherche, c'est quelque chose de similaire à =(la commande de mise en retrait), mais d'envelopper à 80. Le cas d'utilisation est parfois que vous modifiez du texte avec une largeur de texte et après avoir joint des lignes ou supprimé / ajouté du texte, il sort mal emballé.

Idéalement, cette commande réorganiserait complètement les lignes que je sélectionne et couperait les longues lignes tout en les ajoutant aux courtes. Un exemple:

long line is long!  
short

Après avoir exécuté la commande (en supposant que l'habillage était de 13 cols):

long line is  
long! short

Si ce n'est pas possible avec une vraie commande vim, peut-être y a-t-il un programme en ligne de commande qui fait cela que je peux diriger l'entrée?

Après avoir cherché, j'ai trouvé cette référence qui a plus d'options: http://www.cs.swarthmore.edu/help/vim/reformatting.html

poulet méchant
la source
9
Vous pourriez également être intéressé d'apprendre que Vim peut déléguer la mise en forme du texte à un programme externe, tel que le par . J'ai fait une capture d'écran qui montre comment formater le texte avec le par .
nelstrom
@nelstrom merci, TIL environ par. C'est fantastique!
Steven Lu
2
Lorsque vous voulez que le texte soit mince et fin (bien coupé?), Pensez toujours à gq- Gentleman's Quarterly . (Excuses pour l'homme anthropomorphisant, mais les œuvres mnémoniques.)
Ruffin

Réponses:

372

Réglez textwidthsur 80 ( :set textwidth=80), déplacez-vous au début du fichier (cela peut être fait avec Ctrl- Homeou gg) et tapez gqG.

gqGformate le texte à partir de la position actuelle et jusqu'à la fin du fichier. Il rejoindra automatiquement les lignes consécutives lorsque cela sera possible. Vous pouvez placer une ligne vierge entre deux lignes si vous ne souhaitez pas que ces deux soient réunies.

Michael Madsen
la source
14
Et cela fonctionne également avec des sélections visuelles. -À- dire quelque chose comme: V}gq. De cette façon, vous voyez ce que vous allez formater avant de le formater.
Plouff
6
Au fait, que fait-il exactement qen soi?
Richard-Degenne
1
Y a-t-il un moyen de le faire avec des lignes qui ne sont qu'une longue chaîne de caractères, sans espaces? EDIT: J'ai découvert l'utilitaire "fold". Vous vous demandez toujours comment faire cela en vi.
Donald Smith
7
utiliser set tw=80au lieu de set textwidth=80pour gagner du temps
Yibo Yang
4
@dmranck Après que set textwidth=76vos lignes seront auto-enroulées lors de la frappe. Ma plainte est que cela ne fait rien aux lignes existantes en cours d'édition. Mais V}gqest extrêmement utile à cet égard. Vpasse en mode de sélection visuelle, }sélectionne le saut de paragraphe suivant et gqexécute le formateur actuel dessus (ou utilisez gwpour appeler explicitement le formateur vi). En outre, {sélectionneront vers le haut. Vous pouvez sélectionner l'ensemble du document et le format avec ggVGgqbien qu'il existe peut-être un moyen plus simple. Enregistrez cela en tant que macro en utilisant @pour le rendre plus facile. Utilisez vipgqpour fmt paragraphe actuel.
ktbiz
94

La solution de Michael est la clé, mais je trouve le plus souvent que je veux reformater le reste du paragraphe actuel; pour ce comportement, utilisez gq}.

Alex Hirzel
la source
17
en développant cela - vous pouvez utiliser gq <motion> pour formater tout ce que vous souhaitez.
Dan Schnau
1
En outre, l'option «nojoinspaces» qui empêche deux espaces d'apparaître après les périodes où les lignes sont jointes à la limite d'une phrase. Bien lorsque votre style typographique est composé d'espaces simples entre les phrases en anglais.
Alex Hirzel
36

Vous pouvez utiliser gqavec n'importe quel opérateur de mouvement. Par exemple, si vous souhaitez uniquement reformater jusqu'à la fin de la ligne actuelle (c'est-à-dire pour envelopper la ligne sur laquelle se trouve votre curseur), vous pouvez utilisergq$

Vous pouvez également reformater en sélectionnant du texte en mode visuel (en utilisant `v et en vous déplaçant) puis en tapant gq.

Il existe également d'autres options pour forcer les lignes à boucler.

Si vous souhaitez que vim encapsule vos lignes pendant que vous y insérez du texte au lieu d'avoir à attendre la fin pour restructurer le texte, vous trouverez ces options utiles:

:set textwidth=80
:set wrapmargin=2

(Ne vous laissez pas distancer par wrapet linebreak, qui ne reformate que le texte affiché à l'écran, et ne modifie pas le texte dans le tampon)

JohnGH
la source
9
De l' wrapmarginaide: Lorsque 'textwidth' est différent de zéro, cette option n'est pas utilisée.
mmoya
21

Grâce à un commentaire de DonaldSmith, j'ai trouvé cela, car l' textwidthoption n'a pas reformaté ma longue ligne de texte (je convertissais le jeu avec des conversions hexadécimales):

:%!fold -w 60

Cela a reformulé tout le dossier (qui était une ligne pour moi) en lignes de longueur 60.

shearn89
la source
1
C'est très gentil. Toutes les réponses se concentrent sur la limitation de la largeur d'une ligne lorsqu'une ligne est divisée en espaces. Cette solution fonctionne pour les mots très longs (séquences d'ADN).
pedrosaurio
1
Pour les longues URL, c'est à peu près la seule chose que j'ai trouvée qui fonctionne. Je suis déjà nouveau sur la largeur de texte mais cela ne cassera pas les chaînes ininterrompues (ce qui est généralement une bonne chose)
SkyLeach
13

Si vous cherchez une méthode non-Vim , il y a toujours les commandes UNIX fmt et par .

Remarques:

  • Je ne peux pas commenter Unicode, il peut se comporter différemment.
  • @nelstrom a déjà mentionné l'utilisation pardans sa webémission.

Voici comment nous utiliserions les deux pour votre exemple.

$ echo -e 'long line is long!\nshort' > 3033423.txt
$ cat 3033423.txt
long line is long!
short
$ fmt -w 13 3033423.txt
long line is
long!  short
$ par 13gr 3033423.txt
long line is
long! short

Pour utiliser de l'intérieur de Vim:

:%! fmt -w 13
:%! par 13gr

Vous pouvez également définir :formatprgpar ou fmt et remplacer gq. Pour plus d'informations, appelez à l' :help formatprgintérieur de Vim.

Ehtesh Choudhury
la source
9

J'utilise presque toujours gqen mode visuel. Je dis à mes étudiants que cela signifie "Gentlemens 'Quarterly", un magazine pour les gens exigeants.

ncmathsadist
la source