Puis-je justifier un texte dans Vim?

38

La seule raison pour laquelle j'ai jamais édité un fichier texte dans Pico ou Nano, et non dans Vim, était sa commande "Justifier" ^J. Il reformaterait un paragraphe de texte en créant des sauts de ligne lors des sauts de mot, de sorte que le texte flotterait bien sur un écran de largeur fixe - formaterait le texte de manière à l'adapter aux 80 colonnes prédéfinies, en créant des sauts de ligne uniquement entre les mots. Même si la fonction était limitée, elle était très utile, que ce soit pour formater de longs blocs de commentaires, des fichiers de documentation, ou simplement pour remplacer une ligne infinie de paramètres par quelque chose de plus lisible.

Puis-je faire quelque chose comme ça dans Vim?

SF.
la source

Réponses:

37

Vous pouvez utiliser les opérateurs gqou gwcombinés avec une commande de mouvement. Par défaut, il utilise le fmtprogramme (sous Linux) pour formater le texte donné. Cependant, à ma connaissance, cela ne justifie pas les lignes, vous obtiendrez donc des marges droites.

La façon dont je l'utilise est de gwip(mode normal) avec le curseur sur un paragraphe. Cela formatera le paragraphe actuel en gardant le curseur sur la même position. Je l'utilise de cette façon pour m'assurer que seul le paragraphe actuel est formaté. Lors de la modification d'un fichier texte, la publication gwG(mode normal) au début du fichier formate le texte entier. En tant que bonne pratique, veillez à laisser au moins une ligne vierge entre les paragraphes.

Il y a beaucoup de configuration qui peut être faite. Pour commencer, voici une aide pertinente: :h gq, :h gw, :h fo(options de format), :h fp(programme de format), :h fo-table(une explication des options possibles).

guillem
la source
1
GQ / GW est certainement la voie à suivre. pour ajouter à ce message, vous pouvez changer le programme de formatage afin d’avoir plus d’options. Commander vimcasts.org/episodes/formatting-text-with-par
Bambu
3
Par défaut, Vim n'utilise aucun programme externe, bien que vous puissiez en choisir un en définissant l' 'formatprg'option.
Jamessan
15

Il existe un excellent VimCast sur ce sujet.

http://vimcasts.org/episodes/formatting-text-with-par/

Fondamentalement, vous devez installer par:

$ brew install par
# or
$ sudo apt-get install par

Et puis, puisque vous voulez que les colonnes soient encapsulées dans 80 colonnes:

:set formatprg=par\ -w80

Maintenant, vous pouvez utiliser l' gqopérateur, comme dans d'autres réponses (par exemple gqip), et il utilisera Par au lieu du formateur intégré de Vim.

Par est assez avancé et formatera bien des commentaires comme celui-ci:

/* This is a long */
/* multiline comment */
janko-m
la source
11

De :help usr_25:

JUSTIFYING TEXT                                                                 

Vim has no built-in way of justifying text.  However, there is a neat macro     
package that does the job.  To use this package, execute the following          
command:                                                                        

        :runtime macros/justify.vim                                             

This Vim script file defines a new visual command "_j".  To justify a block of  
text, highlight the text in Visual mode and then execute "_j".

Donc, tout ce que vous avez à faire est de courir

:ru macros/justify.vim

puis tapez

_j

pour justifier le texte dans tout le fichier.

(Bien sûr, vous pouvez également ajouter ru macros/justify.vimà votre fichier .vimrc pour ne pas avoir à le taper à chaque fois.)

Remarque : ceci n’ajoute pas de sauts de ligne pour vous. Vous devez les ajouter manuellement avec gq. Pour cela, vous devez également définir le textwidth(la valeur par défaut est 0) sur la valeur souhaitée via

set textwidth=80

et, si vous le souhaitez, le tretour automatique à la ligne en définissant l' option -flag via

set formatoptions+=t

Si vous le souhaitez, vous pouvez définir un mappage dans votre fichier .vimrc pour qu'il effectue tout le travail à votre place:

nnoremap <C-j> gggqG_j

Ceci se place au début du fichier ( gg), enveloppe toutes les lignes ( gqjusqu'à G), puis _jrend le texte plus stable.

Poignée de porte
la source
Pour plus d'informations sur le formatage, voir: MANUEL DE L'UTILISATEUR VIM - Édition du texte formaté
Suuuehgi
Je viens de trouver l’ :set fo+=aoption très utile pour le reformatage automatique de tout le paragraphe. Regardez :help fo-tablepour d'autres options. Il y a aussi un bon tutoriel vidéo ici .
Suuuehgi
+1 pour une solution complètement intégrée. Le _jmappage ajouté par la macro semble justifier le fichier entier pour moi, ou il peut être limité par une sélection visuelle par lignes.
ches
5

Bien que l'aide de nano appelle la ^Jcommande "Justifier", elle ne justifie pas le texte mais reformate le texte en cassant les lignes avant la marge droite de l'écran (ou sur une colonne configurable, je suppose).

Vous pouvez faire la même chose dans VIM en définissant la variable textwidth, à partir de :help 'textwidth':

Largeur maximale du texte inséré. Une ligne plus longue sera coupée après un espace pour obtenir cette largeur. Une valeur zéro désactive ceci.

C'est-à-dire: pendant que vous tapez, si une ligne est plus longue que des textwidthcaractères, VIM va envelopper la ligne au premier espace pour que la longueur de la ligne soit inférieure ou égale à textwidth.

Pour que cela fonctionne, l'option formatoptionsdoit contenir la lettre t. Voir :help 'formatoptions'et :help fo-tablepour les options disponibles. Par exemple, l' coption de rendre la mise en forme avec des commentaires peut vous intéresser .

Modifier : vous pouvez effectuer la même opération, sans la nécessité de mettre ten formatoptionsutilisant la commande gw{motion}, il forme le texte entre la position actuelle du curseur et la position du curseur après {motion}. La gwcommande est également disponible en mode visuel, elle met en forme le texte sélectionné.

toro2k
la source
1
C'est bon pour taper. Puis-je appliquer cela pour du texte préexistant?
SF.
3

Voici deux options faciles:

  1. avec un bloc de texte sélectionné, tapez !fmt
  2. avec votre curseur au début d’un bloc, tapez !}fmt

Les deux envoient un bloc de texte à unix fmt, voir les man fmtoptions. Vous pouvez passer les arguments d'option de vim. Par exemple, pour formater un bloc de 50 caractères de large, tapez !}fmt -w 50.

Kaan
la source
désolé, corrigé maintenant
Kaan
Vous pouvez également formater tout votre fichier en tapant :%!fmtet en annulant avec un seul usi vous n'aimez pas le résultat.
Wildcard
-1

Marquez le texte à l'aide de la commande visuelle puis utilisez:

:!par 40j 

où 40 est la largeur de la colonne et les jmoyens justifiés.

utilisateur16937
la source
2
Bienvenue sur notre site! Votre question est actuellement de faible qualité car il manque des explications sur l'outil que vous utilisez ( par) et sur le fonctionnement de votre solution. Vous voudrez peut-être ajouter plus de détails pour améliorer la qualité de votre réponse et la rendre plus utile pour les futurs lecteurs.
statox