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 à l’aide de set textwidth (comme pour la disposition des colonnes Vim 80 ). Ce que je recherche est quelque chose de similaire à = (la commande de ligne de retrait) mais à 80. Le cas échéant, vous éditez parfois du texte avec textwidth et après avoir joint des lignes ou supprimé / ajouté du texte mal emballé.

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

 long line is long! short 

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

 long line is long! short 

Si ce n’est pas possible avec une commande true vim, peut-être existe-t-il un programme en ligne de commande sur lequel je peux canaliser l’entrée?

Après la recherche, j’ai trouvé cette référence qui contient quelques options supplémentaires: http://www.cs.swarthmore.edu/help/vim/reformatting.html

Définissez la textwidth de textwidth sur 80 ( :set textwidth=80 ), déplacez-vous au début du fichier (vous pouvez le faire avec CtrlHome ou gg ) et tapez gqG .

gqG forme le texte à partir de la position actuelle et à la fin du fichier. Il rejoindra automatiquement les lignes consécutives si possible. Vous pouvez placer une ligne vierge entre deux lignes si vous ne souhaitez pas que ces deux éléments soient joints.

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

Vous pouvez utiliser gq avec n’importe quel opérateur de mouvement. Par exemple, si vous souhaitez uniquement reformater à la fin de la ligne en cours (par exemple 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 (en utilisant `v et en se déplaçant), puis en tapant gq.

Il existe d’autres options pour forcer les lignes à envelopper également.

Si vous voulez que vim enveloppe vos lignes pendant que vous insérez du texte au lieu d’attendre la fin pour restructurer le texte, vous trouverez ces options utiles:

 :set textwidth=80 :set wrapmargin=2 

(Ne vous laissez pas linebreak par wrap et linebreak , qui ne reformateront que le texte affiché à l’écran et ne changeront pas le texte dans le tampon)

Grâce à un commentaire de DonaldSmith, j’ai trouvé ceci, car l’option textwidth ne reformatait pas ma longue ligne de texte (je convertissais le jeu avec des conversions hex / octet):

:%!fold -w 60

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

Si vous cherchez un moyen autre que Vim , il y a toujours les commandes UNIX fmt et par .

Remarques:

  • Je ne peux pas faire de commentaire sur Unicode, il peut ou non se comporter différemment.
  • @nelstrom a déjà mentionné l’utilisation de son numéro dans son webcast.

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 

À utiliser depuis l’intérieur de Vim:

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

Vous pouvez également définir :formatprg à par ou fmt et remplacer gq . Pour plus d’informations, appelez :help formatprg dans Vim.

Presque toujours j’utilise le gq en mode visuel. Je dis à mes étudiants que cela signifie “Gentlemens ‘Quarterly”, un magazine pour les gens exigeants.