Looking for Computer Science  & Information Technology online courses ?
Check my new web site: https://www.yesik.it !

Wrapping lines.png

Dans un éditeur de texte comme vim, une même ligne logique terminée par un retour à la ligne peut s'enrouler sur plusieurs lignes écran.

Quand on utilise l'éditeur de texte vim pour taper du texte au kilomètre, une chose pénible est de devoir insérer manuellement les retours à la ligne ... au bout de chaque ligne. En effet, en l'absence de retour à la ligne explicite, le texte est inséré dans une très longue ligne logique qui s'enroule sur plusieurs lignes écran.

Heureusement, vim possède (au moins) deux manières de formater automatiquement les lignes à la bonne longueur. Soit lors de la saisie. Soit après coup.

Formatage lors de la saisie: l'option textwidth

Textwidth (vim).png

Une fois la largeur du texte définie avec :set textwidth, vim insère automatiquement un retour à la ligne quand le texte dépasse cette limite.

La solution pour vous simplifier la vie lors de la saisie est d'utiliser l'option textwidth. Avec elle, il est possible de définir explicitement une longueur de ligne maximale, et dans ce cas, tout texte non blanc tapé au delà de la limite déclenche l'insertion automatique d'un retour à la ligne. Bien entendu, la rupture se fait sur une frontière de mot (une espace).

La valeur de textwidth est définie à l'aide de la commande :set:

:set textwidth=14

À partir de maintenant, si vous tapez une ligne de plus de 14 caractères, un retour sera inséré devant le mot qui dépasse. Notez que si vous insérez plus de textwidth caractères sans espace, aucun retour n'est inséré.

Pour plus de détails sur textwidth, je vous renvoie sur l'aide en ligne de vim:

sh$ vim -c ":help textwidth"
                                                *'textwidth'* *'tw'*
'textwidth' 'tw'        number  (default 0)
                        local to buffer
                        {not in Vi}
        Maximum width of text that is being inserted.  A longer line will be
        broken after white space to get this width.  A zero value disables
        this.  'textwidth' is set to 0 when the 'paste' option is set.  When
        'textwidth' is zero, 'wrapmargin' may be used.  See also
        'formatoptions' and |ins-textwidth|.
        When 'formatexpr' is set it will be used to break the line.
        NOTE: This option is set to 0 when 'compatible' is set.

Reformatage après modification: la commande gq

gq-1 (vim).png

textwidth dans Vim — L'option textwidth permet de formater automatiquement le texte lors de la saisie.


gq-2 (vim).png

Le formatage n'est pas maintenu automatiquement lors de l'édition: une modification en début de ligne peut faire dépasser le texte à la fin. Et les lignes trop courtes ne sont pas jointes automatiquement.


gq-3 (vim).png

La commande gq permet de reformater le texte. Si vous voulez préserver un retour à la ligne explicite (en fin de paragraphe, par exemple) vous devrez insérer une ligne blanche.


Si insérer automatiquement les retours à la ligne est pratique lors de la saisie initiale du texte, c'est vite problématique lors des éditions: en effet, les retours à la ligne ne sont pas ajustés dynamiquement. Ce qui ruine rapidement la mise en forme dès que l'on change la longueur d'une ligne de texte.

La solution est dans la commande gq. Celle-ci reformate le texte en joignant les lignes trop courtes et en rajoutant des retours à la ligne pour honorer textwidth. Pour citer encore l'aide en ligne:

sh$ vim -c ':help gq"
                                                        *gq*
gq{motion}              Format the lines that {motion} moves over.
                        Formatting is done with one of three methods:
                        1. If 'formatexpr' is not empty the expression is
                           evaluated.  This can differ for each buffer.
                        2. If 'formatprg' is not empty an external program
                           is used.
                        3. Otherwise formatting is done internally. 

                        In the third case the 'textwidth' option controls the
                        length of each formatted line (see below).
                        If the 'textwidth' option is 0, the formatted line
                        length is the screen width (with a maximum width of
                        79).
                        The 'formatoptions' option controls the type of
                        formatting |fo-table|.
                        The cursor is left on the first non-blank of the last
                        formatted line.
                        NOTE: The "Q" command formerly performed this
                        function.  If you still want to use "Q" for
                        formatting, use this mapping: >

Comme vous pouvez le constater, gq attend un déplacement (motion) pour déterminer l'étendu du texte à reformater. Pour reformater le texte entre la position actuelle du curseur et la fin du document (G), vous utiliserez la commande:

gqG

Pour reformater l'intégralité d'un document vous devrez d'abord atteindre la première ligne (1G):

1GgqG

Pour reformater le paragraphe actuel, vous devrez d'abord vous positionner à son début ({), puis reformater jusqu'à la fin du paragraphe (}):

{gq}

Dans ce dernier cas, il est aussi possible d'utiliser l'opérateur de sélection de paragraphe (ap) ce qui produira sensiblement le même résultat que précédemment en formatant le paragraphe courant:

gqap

Ce ne sont là que quelques exemples. L'aide en ligne de vim contient un descriptif complet de toutes les commandes de déplacement:

sh$ vim -c ":help motion.txt"
*motion.txt*    For Vim version 7.1.  Last change: 2006 Dec 07


                  VIM REFERENCE MANUAL    by Bram Moolenaar


Cursor motions                                  *cursor-motions* *navigation*

These commands move the cursor position.  If the new position is off of the
screen, the screen is scrolled to show the cursor (see also 'scrolljump' and
'scrolloff' options).

1. Motions and operators        |operator|
2. Left-right motions           |left-right-motions|
3. Up-down motions              |up-down-motions|
4. Word motions                 |word-motions|
5. Text object motions          |object-motions|
6. Text object selection        |object-select|
7. Marks                        |mark-motions|
8. Jumps                        |jump-motions|
9. Various motions              |various-motions|
...