---
categories: wip
title: Howto Vim
...

Un des éditeurs de texte de prédilection pour administrateur système. Vim est une couche de Vi apportant de nombreuses possibilités de personnalisation.
Ses début dans les années 90, il est encore très apprécié de par sa rapidité et que son code source soient encore (et restera) libre. Merci à [Bram Moolenaar](https://fr.wikipedia.org/wiki/Bram_Moolenaar) qui est l'initiateur de ce logiciel.

## Recommandations

Il est disponible dans tous les dépôts Debian :

~~~{.bash}
sudo apt install vim
~~~

Pour éviter de se tromper d'éditeur, nous pouvons le définir par défaut :

~~~{.bash}
sudo update-alternatives --config editor
~~~

Nous vous recommandons de suivre en quelques minutes le tutoriel pour apprendre les bases :

~~~{.bash}
vimtutor
~~~

Il faut savoir qu'il y a deux vues distinctes que l'on peut apercevoir en bas de l'interface ; le mode "-- VISUEL --" et le mode "-- INSERTION --". Avant de lancer les commandes que nous allons présenter plus bas, il faut d'abord savoir que le mode insertion s'active avec la touche `i` et pour revenir en mode visuel, il suffit d'appuyer sur la touche `Echap`.

En cas de besoin pour obtenir de l'aide :

~~~
:help user-manual
~~~

##  Premiers pas

Commençons par connaître une liste de raccourcis "vitales" :

~~~
a = "passer en mode «Insert» à droite du curseur"
:q! = "quitter sans sauvegarder"
:wq ou :x = "sauvegarder et quitter"

dd = "supprimer (et couper) la ligne actuelle"
v = "sélection du texte à partir du curseur"
V = "sélection du texte par ligne"
y ou Y = "copier la ligne actuelle"
p = "coller la ligne précédemment sélectionné"
u = "Annule la modification"
Ctrl+r = "Reviens sur annulation de la précédente modification"

zz = "recentre le texte à se trouve le curseur"
XG = "place le curseur à la ligne X"
gg = "Début du fichier"
G = "fin du fichier"

/mot = "Recherche le terme 'mot' vers le bas"
/mot\c = "Recherche le terme 'mot' vers le bas et sans prendre en compte la casse"
?mot = "Recherche le terme 'mot' vers le haut"
~~~


## Commandes avancées

La barbe commence à pousser ? C'est que vous êtes sur le bon chemin jeune padawan. Voici une seconde liste d'astuces pour éditer encore plus vite.

~~~

i = "passer en mode «Insert» - à gauche du curseur"
I = "passer en mode «Insert» - en début de phrase"
A = "passer en mode «Insert» - en fin de phrase"

x ou . = "effacer le caractère à droite"
X = "effacer le caractère à gauche"
rX = "remplace un caractère par X"
R = "Remplace les mots après le curseur"
U = Restaure la ligne à son état d’origine
cw = "change word - change le mot après l'emplacement du curseur"
:s/ancien/nouveau/g = "remplace le mot ancien par le mot nouveau"
:%s/aa/bb/g = "remplace toutes les récurrences dans un fichier"
ce = "édit le mot positionné à côté du curseur."
c$ = "édit tout le reste de ligne."
cG ="édit tout le reste du document après sur curseur"
~ = "inverser la casse d'un caractère"

e = "place le curseur à la fin d'un mot"
0 ou ^ = "place le curseur en début de ligne"
w = "fin du mot"
$ = "fin de ligne"
% = "Trouve le caractère fermant de '( [ ou {' 

:e <fichier> = "Après avoir sauvegardé son travail, on peut éditer directement un autre fichier"

ZZ = Équivalent à :wq
~~~

## Options

~~~
:set hlsearch = "active l'option de surbrillance lors de la recherche d'un mot"
:syntax on = "coloration syntaxique "
:color desert = "change la couleur pour *desert*"
~~~

Pour désactiver les options, il faudra ajouter le préfixe "no". Voici un exemple :

~~~
:set nolist = "Afficher les caractères invisibles"
~~~


### Afficher les caractères invisibles

Pour afficher les caractères invisibles :

~~~
:set list
~~~

Pour customiser les caractères utilisés (respectivement : tabulations, espaces insécables, espaces en fin de ligne retours à la ligne), par exemple :

~~~
:set listchars=tab:→\ ,nbsp:·,trail:␣,eol:↩
~~~

On notera le `\ ` pour `tab`, car vim attend deux caractères.

Pour les désactiver :

~~~
:set nolist
~~~




## Usages spécifiques 

  * Incrémenter / Décrémenter un nombre :

~~~
Ctrl+a = "Incrémenter"
Ctrl+x = "Décrémenter"
~~~

  * Commenter du code selon la procédure suivante :

~~~
Ctrl+v = "Mode «Visual» activé"
<fleches_directionneles> = "Choisir la zone concernée"
I = "Insérer en début de ligne - active le mode «Insert»"
<char> = "Caractère du commentaire en question - selon langage"
Echap = "Quitter le mode «Insert»"
~~~

   * Pour dé-commenter, suivre la liste des commandes suivantes :

~~~
Ctrl+v = "Mode «Visual» activé"
<flèches directionnelles> = "Choisir la zone concernée"
x = "Supprimer le caractère"
~~~

  * Ajouter/enlever de la tabulation :

~~~
Ctrl+v = "Mode «Visual» activé"
<flèches directionnelles> = "Choisir la zone concernée"
tab+> = "Déplace la sélection vers la droite et inversement avec la touche <"
~~~

  * Revenir 10 minutes plus tôt :

~~~
:earlier 10m
~~~

  * Taper des caractères UTF8

~~~
Ctrl+V u XXXX = "où `XXXX` est le code du caractère UTF8"
~~~

  * Taper des caractères ASCII

~~~
Ctrl+v NNN = "où `NNN` est le code du caractère UTF8"
~~~

  * Rechercher et remplacer dans portion d'un fichier (méthode sed)

Admettons que nous avons éditons un fichier d'une dizaine de ligne où les mots anciens doivent être remplacés par nouveaux. Ce changement doit uniquement s'opérer entre la ligne 2 et 6 :

~~~
:2,6s/anciens/nouveaux/g
~~~

  * Scripting

Exécuter automatiquement des commandes :

~~~{.bash}
$ vim ":retab" "+wq"
~~~

Enregistrer la sortie d'un script dans un fichier :

~~~{.bash}
$ vim -s mon-script.txt FICHIER.txt
~~~

  * Quitter Vim avec un code de sortie > 0

~~~
:cq
~~~

Cas d'usage : annuler un commit Git en cours de rédaction, cf. [/HowtoGit](/HowtoGit#quitter-l%C3%A9diteur-de-texte-sans-que-git-nex%C3%A9cute-laction-li%C3%A9e)

## Webografie

* [Documentation sur le site officiel](http://www.vim.org/docs.php)
* [Vim casts](http://vimcasts.org/)
* [VimAwesome - liste de nombreux plugins](http://vimawesome.com/)
* [Wallpaper movement commands](https://bitbucket.org/tednaleid/vim-shortcut-wallpaper/src)
* [Mémento des touches de racourcis](http://vimsheet.com)

## FAQ

Fonction "undo" même après fermeture, reboot… : <https://vi.stackexchange.com/questions/6/how-can-i-use-the-undofile#53>

