22. Éditer du texte en ligne de commande : vi

Ne tournons pas autour du pot, nous allons parler de vim et pas de emacs, même si les idées de RMS sont dans mon cœur.

Pendant longtemps, j’ai utilisé vi comme éditeur de texte en étant persuadé je j’utilisais vim. Puis un jour, après avoir configuré mutt (maileur en ligne de commande) pour utiliser vi, j’ai eu besoin de la correction orthographique. Or, tout ce que j’ai tenté de faire pour y parvenir n’a pas fonctionné jusqu’au moment où j’ai regardé si vim était bien installé. Il ne l’était pas. J’utilisais vi dans sa nudité la plus pure sous Debian. J’ai donc installé vim et beaucoup de choses sont apparues qui m’ont donné envie d’écrire cet article.

Configuration

La configuration de vim se fait dans le fichier ~/.vimrc. Voici une configuration très simple qui permet de voir comment cela fonctionne :

ab moi Machin Truc <machin.truc@chose.org>
" Un commentaire
set mouse=a
set number
set spell
set t_Co=256
map <F2> :set spell!<CR>
set spelllang=fr,en
hi SpellBad ctermfg=Red ctermbg=NONE

La première ligne crée un alias. En tapant « moi » dans vim suivi d’un espace, le texte « moi » sera remplacé par « Machin Truc <machin.truc@chose.org> ».
Ensuite se trouve un commentaire, annoncé par des guillemets « .
mouse=a précise que la souris peut être utilisée pour placer le curseur. C’est très utile, car dans vim, on se déplace dans la ligne et non de haut en bas à travers les lignes.
number spécifie qu’on veut des numéros de lignes.
spell spécifie qu’on peut utiliser un correcteur orthographique.
t_Co=256 fait passer la console en mode 256 couleurs.
map … lie la touche F2 à une bascule qui permet de passer au ou de revenir du mode de correction orthographique.
spelllang précise évidemment la ou les langues utilisées.
hi configure la couleur du texte (rouge) d’un mot mal orthographié et de son fond (ici aucun).

Correction orthographique

Un bon article sur la correction orthographique sous vim : http://www.jdhp.org/docs/tutoriel_vim_spellfr/tutoriel_vim_spellfr.html

La correction d’un mot se fait en tapant «z=». Des propositions sont faites alors et il faut choisir l’une d’entre elle dans la liste par son numéro.

On peut corriger toutes les occurrences d’un mot avec la commande «:spellr».
On passe de faute en faute vers le bas avec «]s» et vers le haut avec «[s ».
On peut désactiver et réactiver la correction orthographique, avec «:set spell» et «:set nospell».

Éditeur de texte

Déplacements

Ici, vi et vim se confondent. Ce sont des éditeur dédié au clavier et clairement orienté vers la logique de la structure. Celle-ci fait clairement la différence entre la structure logique du texte qui fait le sens d’un paragraphe et ce que l’on voit à l’écran. Un paragraphe logique peut s’étaler sur plusieurs lignes à l’écran. À la fin de celui-ci se trouve un saut de paragraphe. Pour l’écran, il y a plusieurs saut de lignes dans ce paragraphe. Si l’éditeur de texte ne fait pas la différence entre ces sauts et un saut de paragraphe, quand vous le copierez dans un éditeur ou le texte brut est nécessaire, en HTML par exemple, le paragraphe formera plusieurs lignes et la justification sera mauvaise. De plus la numérotation ne sera pas celle des lignes logiques, c’est-à-dire celle des paragraphes, mais celle arbitraire due à la largeur de l’écran.

Cela a une grande importance pour le déplacement à l’aide des touches clavier. Pour se déplacer dans une ligne, les flèches gauche et droite ou les touches H et L respectivement permettent de se déplacer d’un caractère vers la gauche ou la droite respectivement. Entre les lignes les flèches bas et haut ou les touches J et K respectivement permettent de se déplacer d’une ligne vers le bas ou le haut respectivement.

← ou H : un caractère vers la gauche
↓ ou J : une ligne vers le bas
↑ ou K : une ligne vers le haut
→ ou L : un caractère vers la droite

Pour les déplacement dans la ligne, il faut avoir recours aux touches suivantes :

0 : curseur sur le premier caractère de la ligne
17→ ou 17L : curseur 17 caractères plus loin vers la droite
5← ou 5H : curseur 5 caractères plus loin vers la gauche
^^ : curseur sur le premier caractère de la ligne
$ : curseur sur le dernier caractère de la ligne
w : saut d’un mot vers la fin de la ligne (séparateurs de mots non alphanumériques)
b : saut d’un mot vers le début de la ligne (séparateurs de mots non alphanumériques)
W : saut d’un mot vers la fin de la ligne (séparateur de mots : espaces)
B : saut d’un mot vers le début de la ligne (séparateur de mots : espace)
( : saut vers le début de la phrase ou le début de la phrase précédente
) : saut vers le début de la phrase suivante

gg : curseur au début de la première ligne
G : curseur au début de la dernière ligne
7G : curseur au début de la 7e ligne
{ : saut vers le paragraphe précédent
} : saut vers le paragraphe suivant

H : curseur en haut de l’écran
M : curseur au milieu de l’écran
L : curseur en bas de l’écran

Viewport

Il existe beaucoup de versions de vim. Certaines sont liées à des interfaces graphiques, comme GTK par exemple. Or, la gestion d’un press-papier permettant d’échanger des éléments entre les logiciels est prise en charge par l’interface graphique. Cela signifie qu’avec une version de vim qui n’est liée à aucune interface graphique, il n’existe pas de possibilités de réaliser un simple copier-coller à l’extérieur de vim. Cela peut poser des problèmes.

Pour les contourner, il faut utiliser la notion de wiewport.

Dans vim, on peut utiliser différents wiewports. Il s’agit de scinder vim en différentes parties. Ainsi, pour scinder vim horizontalement, il suffit de lancer la commande :

:sp nom_de_fichier

Si on omet le nom de fichier, on split la fenêtre de vim en deux parties, ouvertes sur le même document. On peut ainsi travailler sur deux parties différentes du document.

Si on met un nom de fichier, on peut ouvrir deux fichier différents dans la même instance de vim. Ainsi, on peut copier coller des éléments entre ces fichiers.

On peut aussi scinder verticalement le viewport avec la commande :

:vsp nom_de_fichier

Diverses commandes existent alors pour gérer les viewports :

Ctrl w successifs : change de viewport
Ctrl w puis + : agrandit le viewport
Ctrl w puis - : réduit le viewport
Ctrl w puis = : égalise les viewport
Ctrl w puis r ou R : échange les viewports
Ctrl w puis q : ferme le wiewport

Mouvements internes

Pour copier-coller à l’intérieur du traitement de texte vim, il suffit de sélectionner une portion de texte, de placer le curseur en mode commande sur l’endroit où on veut coller et de presser le bouton du milieu de la souris.

Annuler et refaire

Vi ou vim possèdent des mécanismes d’annulation très efficace. Cependant, le fait de pouvoir annuler plusieurs opérations dans l’ordre inverse de la chronologie de leur réalisation peut introduire une complexité assez importante pour devenir déroutante.

Commençons par dire que l’annulation et la reproduction d’une commande se fait en mode normal. Comme pour l’annulation se fait en pressant la touche :

u

cela ne peut se faire en mode insertion, mode dans lequel apparaîtrait le caractère u.

Ainsi, en mode normal, presser u permet d’annuler la dernière opération. Attention, est considéré comme opération tout ce qui a été fait lors du dernier passage en mode insertion. Si vous tapez « Oh, le beau vélo. », puis sortez du mode insertion en pressant « esc », puis y revenez par la touche « A » et tapez ensuite « Il est tout bleu. » pour quitter le mode insertion, taper u n’annulera que, mais entièrement, la dernière phrase « Il est tout bleu ».

On pourrait ensuite penser que taper une nouvelle fois u annule l’annulation. Ce n’est pas le cas, car presser une seconde fois u supprime « Oh, il est beau le vélo ». La touche u annule donc les opérations qui ont successivement été réalisées à l’exception de l’opération d’annulation elle-même.

Comment alors annuler la dernière annulation ? Il y a deux possibilités : la touche « . » (oui, oui, la touche point) ou « CTRL- R », R pour Redo. Mais attention, la touche point ne refait que la dernière opération. Si donc vous pressez deux fois sur « . » après avoir écrit « Il est tout bleu. », vous verrez réapparaître deux fois la phrase « Il est tout bleu. ». La touche point ne refait donc pas les dernières opérations annulées successivement. Pour cela, il faut utiliser « CTRL-R ».

Finalement, autant pour « u » que pour « CTRL-R », mais pas pour « . », il est possible de les faire précéder par un nombre n permettant de refaire les n opérations.

Laisser un commentaire