TL;DR1 vim c'est bien

La première impression lorsque l'on commence avec vim c'est qu'il est difficile à prendre en main. Ce n'est pas faux !

— Comment générer une chaine aléatoire ?
— Demander à un étudiant qui débute avec vim de quitter !

Si j'ai bien vite saisi le « coup des 3 modes », il m'a fallu du temps pour découvrir l'usage des onglets (tabs) par exemple. Cet éditeur est tellement riche qu'il demande un certain temps d'apprentissage. Une fois que l'on a pris le temps de l'appréhender, ça va mieux !

Même si un programmeur va utiliser un IDE pour développer du code, il devra cependant bien connaitre son éditeur de texte.
IDE et éditeur de texte sont deux outils incontournables de l'informaticien.
Juste Leblanc

Commençons donc par énoncer sa philosophie afin de l'appréhender beaucoup plus facilement. Je ne reviens sur ses 3 modes; mode normal, mode édition et mode commande que pour dire que le mode normal est, par définition, le mode dans lequel l'on se trouve le plus souvent possible. Le passage en mode insertion se fait uniquement lorsque l'on veut insérer du texte !

Les commandes vim peuvent être vues comme des appels de fonction ou simplement comme pouvant être combinées un peu comme un nom suivi d'un verbe (les compléments viendront ensuite).

d signifie delete
e signifie aller jusqu'à la fin du mot

de signifie effacer jusqu'à la fin du mot

c signifie change
i signifie inside (un peu comme un adjectif)
( signifie parenthesis

ci( signifie remplacer le contenu des parenthèses

De plus . permet de répéter la dernière commande d'édition (complète, pas un mouvement).

Si j'entre la commande Afoo<ESC>, j'insère en fin de ligne les trois caractères foo (le <ESC> me permettant de repasser en mode normal). Si ensuite j'entre la commande ., n'importe où sur une autre ligne, ça aura le même effet. Un chouette exemple chez viEmu de la merveilleuse commande . qu'il faut prendre la peine de lire.

Quelques options de base

Sans être exhaustif (ce n'est pas le but), je partage quelques options qui ne sont pas self-compréhensible.

set ignorecase
set smartcase 

Cette combinaison rend la recherche plus efficace. Pour faire une recherche, il suffit d'entrer un pattern (le mot que l'on cherche) après le caractère /. Si ce pattern est écrit en minuscules, la recherche ne sera pas sensible à la casse. Si, par contre, le pattern contient des minuscules et des majuscules alors la recherche sera sensible à la casse.

vim autorise l'utilisation des regex (expressions régulières) dans ses recherches. Les deux options suivantes permettent une meilleure prise en charge des expressions régulières (d'après Losh).

nnoremap / /\v
vnoremap / /\v

Par défaut, lorsque l'on fait un substitute (:s/un/deux/), c'est la première occurrence qui est changée … alors que en général, on veut les changer toutes → gdefault


— Il faut couper les lignes à 80 caractères !
— Ça c'est encore un truc de vieux peys !

Je n'argumenterai pas sur l'usage en informatique (du moins une certaine informatique) de couper les lignes à 80 caractères. Que l'on veuille le faire ou pas, je conseille de jeter un œil sur l'aide de vim au sujet du wrapping ou

L'art de découper son texte !  

L'aide de vim s'obtient par la commande help,

:help fo-table

Dès que vous avez lu, vous pouvez choisir les options qui vous plaisent pour les paramètres suivant. Pour ma part, je choisis (aujourd'hui):

set wrap 
set textwidth=80
set colorcolumn=82
set formatoptions=qrn1j

leader key

Le deuxième usage non basique que propose vim est de donner un clavier complet à l'utilisateur afin qu'il puisse le paramétrer comme il l'entend ! C'est l'utilisation de la « leader key ». Par défaut toute combinaison de touches après la touche \ aura l'effet défini par l'utilisateur.

Par exemple si l'on a l'habitude de souligner une ligne d'autant de caractères = que de lettres dans la ligne (certains utilisateurs de la syntaxe markdown font comme ça), on peut;

  • faire une copie de la ligne (yy) et la coller (p);
  • sélectionner toute la ligne (V);
  • remplacer tous les caractères sélectionnés par = (r=)

La touche leader me permet d'y associer le raccourci 1 par exemple: (nnoremap permet de redéfinir une (combinaison) de touches en mode normal, inoremap pour le mode insert et vnoremap pour le mode visuel)

 nnoremap <leader>1 yypVr=

Comme je lis et conçois assez bien que la touche \ n'est pas le meilleur choix, je tente d'utiliser la touche , pour ce faire.

let mapleader=","

L'avantage de cette fonctionnalité c'est de pouvoir ajouter un maximum de raccourcis … l'inconvénient, c'est qu'il faudra les retenir …

Dictionnaire et correcteur orthographique

Si vous êtes comme moi, vous aimez bien écrire sans fautes mais vous n'avez pas la meilleure orthographe qu'il soit. Un coup de

 spell spelllang=fr

et vous signalez à vim de rendre le dictionnaire français disponible. Si vous ne l'avez pas, il le téléchargera pour vous.

Pour demander la liste des mots corrects, c'est z= sur le mot en question et pour parcourir le fichier en s'arrêtant sur les mots fautifs, c'est ]s. Pour ajouter un mot au dictionnaire local, c'est zg.

Personnellement, il m'arrive d'écrire un anglais … j'ajoute alors à mon .vimrc la possibilité de passer d'un dictionnaire à l'autre … et éventuellement de désactiver cette correction orthographique lorsqu'elle me parrait inutile.

" switch / toggle dictionary 
nnoremap <leader>ts :set spell!<cr>
nnoremap <leader>sfr :set spelllang=fr<cr>
nnoremap <leader>sen :set spelllang=en<cr>

TODO Chercher un dictionnaire en nouvelle orthographe.

Mouvements

Pour se déplacer, les flèches (semblent) fonctionnent très bien. Alors, pourquoi s'embarrasser des touches hjkl si ce n'est parce qu'elles m'évitent de déplacer ma main2.

Simplement pour se rappeler que d'autres mouvements sont possibles:

  • f suivi d'un caractère pour m'emmener à la prochaine occurrence de celui-ci;
  • % permet de trouver la parenthèse (ou accolade ou crochet ou …) fermante correspondant à la première parenthèse (ou accolade ou … ) ouvrante trouvée … même si elles sont imbriquées;
  • H, M et L nous emmène directement en Haut de l'écran, au Milieu ou en bas (Lowest);
  • zt, zz et zb ne changent pas la position du curseur mais scrollent la vue pour que le curseur se retrouve en haut, au milieu ou en bas de l'écran;
  • * se place sur la prochaine occurrence du mot se trouvant sous le curseur;

Scinder sa fenêtre en plusieurs fenêtres (split)

vim permet de scinder (split) la fenêtre en deux fenêtres ce qui permet de parcourir deux fichiers en parallèle … fonctionnalité très pratique. Je ne parle que des split verticaux, car je ne vois pas l'utilité d'un split horizontal.

Attention de bien distinguer les notions de fenêtre (window) et d'onglet (tab).

L'aide de vim me dit que je peux ouvrir une nouvelle fenêtre à l'aide de :vne[w]. J'ajoute donc un raccourci vers cette fonctionnalité.

nnoremap <leader>sn :vne<cr>

Parfois, il est utile d'ouvrir une nouvelle fenêtre contenant le même fichier. C'est la commande :vsp[lit]. Dans ce cas, il faudra parfois passer d'une fenêtre à l'autre … et là , ça devient ch#+@t car il faut passer par les commandes vim à coups de [Ctrl]. C'est également à ce moment que l'on repense aux commandes de mouvements jklm.

nnoremap <leader>s :vsp<cr>
nnoremap <leader>sl <C-w>l
nnoremap <leader>sr <C-w>m

Plugins

vim peut se munir d'une série de plugins.

Jusqu'à présent, j'utilisais peu cette fonctionnalité mais j'ai vu, au hasard du web, un screenshot présentant un petit split à gauche listant les répertoires du répertoire courant … j'aime bien ça3 !

Pour ça, il faut rendre l'utilisation des plugins simples avec le plugin pathogen. Une fois installé, tous les autres plugins s'installeront facilement dans le répertoire ~/.vim/bundle.

plugin NerdTree

Le plugin NERDTree permet d'afficher l'arborescence des fichiers dans un petit split à gauche.

La doc m'explique comment permettre de l'afficher au lancement de vim et ma leader key me permet de le faire apparaitre / disparaitre à loisir.

autocmd vimenter * NERDTree
nnoremap <leader>tree :NERDTreeToggle<cr>

NERDTree permet de bookmarquer des fichiers dans le split, de partager le même split dans plusieurs onglets, …

screenshot-vim-1.png



À ce stade, il reste à lire mon fichier .vimrc … et plein d'autres pour se donner une idée des « options qui vont bien ».

Mon fichier .vimrc (ainsi que d'autres fichiers de configuration) se trouve → github.com/Pinkilla/dotfiles.



Liens

À lire aussi


  1. Too long; don't read signale que le billet n'est pas lu parce que trop long. J'en fait ici un résumé … très très résumé ;-) 

  2. On parle bien d'un clavier azerty (ou qwerty) car sur un clavier bépo ça ne le fait pas trop. 

  3. C'est un peu ça qui m'a donné l'envie d'essayer un peu SublimeText … mais ça faisait à nouveau des (autres) raccourcis à apprendre !