web-dev-qa-db-fra.com

Commande vim pour restructurer / forcer le texte à 80 colonnes

Je sais qu'il existe des moyens de définir automatiquement la largeur du texte dans vim en utilisant set textwidth (comme la disposition de la colonne Vim 80 concerne ). Ce que je recherche, c’est quelque chose de similaire à = (commande de retrait de ligne) mais retournez à 80. Dans certains cas, vous modifiez du texte avec largeur de texte et, après avoir joint des lignes ou supprimé/ajouté du texte, le texte est mal enveloppé.

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

long line is long!  
short

Après avoir exécuté la commande (en supposant que l’enveloppe était de 13 colonnes):

long line is  
long! short

Si ce n'est pas possible avec une vraie commande vim, il existe peut-être un programme en ligne de commande dans lequel je peux diriger l'entrée?

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

222
wickedchicken

Définissez textwidth sur 80 (:set textwidth=80), aller au début du fichier (peut être fait avec Ctrl-Home ou gg) et tapez gqG.

gqG formate le texte à partir de la position actuelle jusqu'à la fin du fichier. Il joindra automatiquement les lignes consécutives lorsque cela sera possible. Vous pouvez placer une ligne vide entre deux lignes si vous ne souhaitez pas que ces deux lignes soient jointes.

352
Michael Madsen

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

89
Alex Hirzel

Vous pouvez utiliser gq avec n’importe quel opérateur de mouvement. Par exemple, si vous voulez seulement reformater à la fin de la ligne courante (c’est-à-dire pour envelopper la ligne sur laquelle se trouve votre curseur), vous pouvez utiliser gq$

Vous pouvez également reformater en sélectionnant du texte en mode visuel (avec `v et déplacement), puis en tapant gq.

Il existe d'autres options pour forcer les lignes à se terminer.

Si vous voulez que vim encapsule vos lignes pendant que vous y insérez du texte au lieu d'attendre la fin de la restructuration du texte, ces options vous seront utiles:

:set textwidth=80
:set wrapmargin=2

(Ne vous laissez pas distraire par wrap et linebreak, qui reformate uniquement le texte affiché à l'écran et ne modifie pas le texte dans le tampon.)

34
JohnGH

Grâce à un commentaire de DonaldSmith, j'ai trouvé ceci car l'option textwidth ne reformate pas ma longue ligne de texte (je convertis en jouant avec des conversions d'hex en octets):

:%!fold -w 60

Cela a reformulé le fichier entier (ce qui était une ligne pour moi) en lignes de longueur 60.

18
shearn89

Si vous recherchez un moyen non-Vim , il y a toujours les commandes UNIX fmt et par .

Remarques:

  • Je ne peux pas commenter sur Unicode, il peut ou non se comporter différemment.
  • @nelstrom a déjà mentionné l'utilisation de par dans sa diffusion Web.

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 depuis Vim:

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

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

13
Ehtesh Choudhury

J'utilise presque toujours gq en mode visuel. Je dis à mes étudiants que cela correspond à "Gentlemens 'Quarterly", un magazine destiné aux personnes exigeantes.

6
ncmathsadist