Vim : le meilleur éditeur du monde

Anne éditeur vim développement utf-8

Dans la série : on en découvre tous les jours…

Entrer des caractères spéciaux

Pour entrer des caractères comme ^X, il faut taper ^V^X. Commencer par ^V permet aussi d’entrer des caractères à partir de leur code. Un extrait du wiki de vim à ce sujet :

  • By decimal value: ^Vnnn (with 000 <= nnn <= 255)
  • By octal value: ^VOnnn or ^Vonnn (with 000 <= nnn <= 377)
  • By hex value: ^VXnn or ^Vxnn (with 00 <= nn <= FF)
  • By hex value for BMP Unicode codepoints: ^Vunnnn (with 0000 <= nnnn <= FFFF) .
  • By hex value for any Unicode codepoint: ^VUnnnnnnnn (with 00000000 <= nnnnnnnn <= 7FFFFFFF)

Pour entrer des caractères spéciaux comme les symboles mathématiques, on peut utiliser les digraph : ça consiste à taper ^K, suivi de deux caractères.

Par exemple :

  • ^K=> donne ⇒
  • ^K=< donne ≤
  • ^K(- donne ∈
  • ^K?= donne ≃
  • ^KFA donne ∀
  • ^KSE donne §
  • ^KNS donne un espace insécable

On peut voir la table avec :

:help digraph-table

Les digraphes des caractères grecs et des symboles mathématiques les plus courant sont résumés ici.

Pour rechercher des caractères UTF-8, voir unicode-table ou fileformat.info. Ou encore mieux, on peut les dessiner sur mausr pour essayer de lui faire deviner ce qu’on cherche !

Mode visuel

Nombre de ligne

Si on met l’option showcmd (sc) un nombre correspondant à la taille de la zone sélectionnée est affiché à la fin de la ligne de commande. Très pratique pour connaître le nombre de lignes sélectionnées par exemple.

Plus ponctuellement, ou pour avoir plus d’information, on peut aussi utiliser g CTRL-g. On obtient avoir une information du genre :

Selected 4 of 1116 Lines; 36 of 10718 Words; 244 of 77026 Bytes

ou avec une autre configuration :

5 sur 283 Lignes ; 28 sur 1155 Mots ; 189 sur 7975 Caractères ; 189 sur 8048 octets sélectionnés

Re-sélectionner

Quand on applique une commande (une substitution par exemple) sur une sélection, celle-ci se désélectionne. Pour la sélectionner à nouveau, il suffit de faire gv.

Mettre des options pour vim dans un fichier

J’utilise principalement ça dans mes fichiers txt2tags pour indiquer à vim la langue pour la correction orthographique. A la fin du fichier, j’ajoute :

%============================================
%<!-- vim: spell spelllang=fr
-->
%============================================

Pour plus d’information :

:help modeline

(ou chercher modeline dans la page d’aide sur les options).

Recherche

* et

  • * pour chercher le mot sous le curseur et # pour chercher à l’envers ;
  • g* similaire à * mais même si la chaîne n’apparaît pas comme un mot (g#) ;

A la suite d’une telle recherche, si on veut l’étendre à une recherche case-insensitive, on peut juste :

  • se mettre en mode recherche avec /,
  • puis, rappeler la dernière recherche avec la flèche vers le haut,
  • ajouter \c (voir ci-dessous),
  • et enfin <CR>.

Casse (majuscules/minuscules)

La propriété booléenne ignorecase permet d’ignorer la casse dans les recherches.

Mais si on veut juste l’ignorer dans une recherche particulière, il n’est pas utile de modifier la propriété, il suffit d’utiliser \c n’importe où dans la chaîne à chercher.

Inversement, si ignorecase est positionnée, on peut utiliser \C dans une recherche pour tenir compte de la casse.

Passer du .ml au .mli et inversement

Il est très pratique d’avoir une touche (ici ,s) qui permet de passer du fichier .ml au fichier .mli en inversement quand on édite du ocaml. J’ai adapté ce truc en partant de la version de Stefano Zacchiroli paru dans Caml Weekly News, for the week of 11 to 18 November, 2003, mais j’ai ôté la partie Python qui ne semble pas indispensable :

    if !exists("g:did_ocaml_switch")
      let g:did_ocaml_switch = 1

      fun OCaml_switch()
        if (match(bufname(""), "\\.mli$") >= 0)
          let fname = substitute(bufname(""), "\\.mli$", ".ml", "")
          exec "arge " . fname
        elseif (match(bufname(""), "\\.ml$") >= 0)
          let fname = bufname("") . "i"
          exec "arge " . fname
        endif
      endfun

      map ,s :call OCaml_switch()

    endif

Plugins

  • Pathogen est un gestionnaire de plugins ;
  • lightline permet de configurer une jolie ligne d'état ;
  • syntastic détecte les erreurs de compilation lors de la sauvegarde d’un fichier ;
  • le plugin AnsiEsc permet de voir un fichier texte contenant du formatage (couleurs…).

Autres astuces

  • q: pour voir l’historique des commandes. Permet de les modifier, de les rejouer, etc.
  • k, K, t, T : déplacement vers une lettre, et ; pour répéter la même recherche.
  • le caractère @ permet de refaire la dernière commande : (peut être précédé d’un nombre pour spécifier le nombre de fois).
  • en mode insertion, on peut utiliser ^R pour insérer ce qui est dans le registre courant (dernière chose coupée par exemple).
  • le registre courant s’appelle 0 (ou "), mais il y a une pile LIFO de 1 à 9, si bien que quand on fait cw, on place le mot coupé dans le registre 0, –mais ce qui y était devient le registre 1– (<- non pas tout de suite) et donc si on fait cw^R0 on remplace le mot courant par ce qu’il y avait dans le registre courant avant.
  • /toto/e recherche toto et se place à la fin,
  • c//e : si on fait ça pendant une recherche sur /toto, c’est comme un cw sauf que ça ne remplace que toto, et non pas jusqu'à la fin du mot.
  • quand on a une longue ligne qui est repliée sur plusieurs lignes, les déplacements peuvent être fastidieux, mais gj et gk (ou g + flèche) permettent de se déplacer verticalement dans la ligne.
  • ~ permet d’inverser la casse d’une lettre, cela permet donc de passer de minuscule à majuscule et inversement. Pour mettre en majuscules, c’est U, et u pour mettre en minuscules. On put aussi utiliser :
    • g~//{déplacement}// comme par exemple g~w inverse la casse jusqu'à la fin du mot ;
    • gU//{déplacement}// comme par exemple gU$ met en majuscule jusqu'à la fin de la ligne ;
    • gu//{déplacement}// comme par exemple gut. met en minuscules jusqu’au caractère ‘.’ suivant.

Voir aussi :