Dompter VIM en trois temps

Yakhya Dabo

- Titre : Dompter VIM en trois temps

- Auteur : Yakhya Dabo

- Parution : 30 janvier 2015

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2016 Yakhya Dabo. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Découverte de VIM

- II. Les Ressources

- III. Pour Commencer

- IV. L'aide

- V. Temps 1 : Les principaux modes de VIM

- VI. Le Mode Normal

- VI-A. Navigation

- VI-B. Notion de ligne

- VI-C. Notion de word

- VI-D. Précision pour copier/couper et coller

- VI-D-1. Copier avec y (yank)

- VI-D-2. Couper avec d (delete)

- VI-E. Les actions opposées

- VII. Le Mode Insert

- VII-A. La commande <Ctrl-O>

- VIII. Le Mode Command-Line

- VIII-A. Les numéros de lignes

- VIII-B. Play with range

- VIII-C. Find and replace avec s

- VIII-D. Les filtres

- VIII-E. La recherche

- IX. Le Mode Visual

- IX-A. Exemple avec <Ctrl-V>

- X. What's next … ?

- X-A. Temps 2 : Grok your VIM

- XI. Configuration de base

- XII. Du Mapping pour aller plus vite !

- XII-A. j et k pour une Navigation entre lignes virtuelles

- XII-B. Arrow keys désactivé

- XII-C. Edition de .vimrc avec<leader>ev et<leader>sv

- XII-D. Basculer de relative à absolute

- XII-E. Bonus abbréviation

- XIII. Conclusion

- XIV. Remerciement

I - Découverte de VIM

Dans le livre
The Pragmatic Programmer
, l'un des must read du craftsman, les auteurs (Andy Hunt et Daves Thomas) insistent sans cesse sur le principe D.R.Y (Don't Repeat Yourself). Il revient sous forme de leitmotiv dans tous les chapitres. Le bon développeur, en vrai artiste, ne se répète pas. En plus de son langage de programmation fétiche (Java, Scala, Ruby…) il doit disposer d'un IDE configurable dans sa boîte à outils, être à l'aise avec la programmation shell pour automatiser les tâches courantes, et maîtriser du bout des doigts un éditeur de texte, “
I
t is better to know one editor very well, and use it for all editing tasks.” Puis, dans un style messianique, ils décrivent l'éditeur du développeur : “The editor will be an extension of your hand; … Make sure that the editor you choose is available on all platforms you use.” L'éditeur doit être configurable, extensible et programmable. Et voilà pourquoi je veux vous présenter VIM comme étant l'éditeur du Développeur.

VIM (Vi IMproved) est un éditeur de texte libre, un parmi la vingtaine de clones de Vi. Pour rappel Vi existe depuis 1976; une antiquité dans le temps informatique. Il a survécu à toutes les tempêtes qui ont secoué le monde informatique. A l'origine Vi a été créé pour le système Unix dont il deviendra plus tard l'éditeur standard. C'est aussi un éditeur modal; les touches du clavier sont interprétées différemment d'un mode à un autre. En mode Insert pour taper du texte ou en mode Normalpour exécuter des commandes.

La première release de Vim voit le jour le 2 Novembre 1991. Il sera publié sous licence GNU et disponible sur plusieurs plateformes, Linux, Windows et Mac étant les plus populaires. Le projet a été initié par Bram Moolenaar pour pallier les imitations de Vi en ajoutant de nouvelles fonctionnalités :

- Le support de plugins

- L'édition de fichier, via le réseau, avec les protocoles SSH et Http

- L'interaction avec la souris

- La coloration syntaxique, notamment pour les langages de programmation

- L'intégration d'un langage de script

L'esprit de Vim est de réaliser toutes les actions possibles sans avoir besoin de lever les mains du clavier, en se passant de la souris et des touches éloignées. Sa courbe d'apprentissage en forme de mur (Learning wall) peut être interprétée de la manière suivante : On ne s'investit qu'une seule fois, pour toujours.

Je vous propose dans cette série de trois articles trois étapes pour dompter VIM. L'objectif est de vous convaincre qu'au delà de manipuler des fichiers de logs sur des serveurs distants, Vim peut être notre éditeur de texte au quotidien. La première partie présentera les commandes de base de Vim à travers ses principaux modes. La deuxième partie portera sur la configuration, comment adapter l'outil à nos habitudes et nos besoins spécifiques sans violer le principe DRY. Et dans la dernière partie on présentera quelques plugins pour l'extension de Vim. Il est déconseillé de vouloir commencer par connaître toutes les commandes de VIM. C'est pour ça que vous ne les verrez pas toutes. 10% d'entre elles pourront couvrir vos besoins les plus courants.

II - Les Ressources

Parmi les nombreuses ressources disponibles dans les librairies et sur Internet quelques auteurs se distinguent par la qualité très solide de leurs références :

Blogs

- Steve Losh : http://stevelosh.com/blog/

- Tim Pope : https://github.com/tpope

Livres

- Pragmatical Vim (Drew Neil)

- Learning the vi and Vim Editors (Arnold Robbins, Linda Lamb)

Vidéo

- Bill Odon sur infoQ

- Drew Neil : http://vimcasts.org

III - Pour Commencer

- Installer vim (apt-get install vim sur Ubuntu)

- Pour lancer vim depuis le terminal

vim ouvre un éditeur vierge

vim fileName ouvre ou crée un fichier

vim fileName+lineNumber ouvre un fichier et met le curseur à la position lineNumber

Une fois l'éditeur lancé on peut effectuer les actions suivantes :

- Enregistrer : :w

- Enregistrer sous fileName: :w/fileName

- Quitter définitivement : :q

- Quitter Vim provisoirement : <Ctrl-Z> (et fg pour revenir sur vim)

- Afficher les numéros absolus : :set nu

- Afficher les numéros relatifs : :set relativenumber

IV - L'aide

Le dernier détail important, qui reste incontournable pour démarrer, c'est l'utilisation de l'Aide. Pour y accéder il suffit de taper :help (ou :h)avec le mot clé en paramètre :

:help pattern ou :h pattern

Si vous vous sentez prêts la prochaine étape c'est par là, les principaux modes de VIM.

V - Temps 1 : Les principaux modes de VIM

Comme énoncé dans l'introduction VIM est un éditeur modal. Chaque mode expose une manière différente d'interpréter les touches du clavier et d'interagir avec l'éditeur pour effectuer des actions sur le texte. On en distingue principalement quatre :

- Mode Normal pour exécuter des commandes sur le texte

- Mode Insert pour insérer du texte

- Mode Command-line pour exécuter des commandes à travers le shell de VIM

- Mode Visuel pour travailler sur une sélection

On verra pour chacun de ces modes quelques cas d'utilisation.

Nota : Dans la documentation on peut trouver Command Mode à la place de Normal Mode. Ne pas faire la confusion avec Command-Line Mode.

VI - Le Mode Normal

C'est le mode par défaut, le mode naturel de VIM, là où l'on passera le plus de temps. La majeure partie des commandes de manipulation de texte (recherche, navigation, modification, suppression) s'effectue en mode Normal. Pour passer d'un mode à un autre on passe par le mode Normal. Il suffit d'appuyer sur <ESC> pour y arriver.

VI-A - Navigation

On peut utiliser les touches fléchées du clavier pour se déplacer dans le texte. Mais pour rester fidèle à l'epsrit VIM il est recommandé d'utiliser les touches h(left), j(down), k(up) et l(right)

n place le curseur sur la ligne n

H place le curseur en haut de l'écran.

M: place le curseur au milieu de l'écran.

L place le curseur en bas de l'écran.

VI-B - Notion de ligne

VIM fait la différence entre une ligne virtuelle et une ligne réelle. La ligne virtuelle est celle affichée à l'écran. La ligne réelle correspond à une ligne du fichier, elle se termine par le caractère <EOL>. Une ligne réelle peut correspondre à plusieurs lignes virtuelles.

j/k : Pour se déplacer à travers les lignes réelles.

gj/gk : Pour se déplacer à travers les lignes virtuelles.

Déplacement avec j et k.

Déplacement avec gj et gk

On peut compter 8 lignes réelles et 11 lignes virtuelles

VI-C - Notion de word

Une autre subtilité dans VIM est la différence entre word (avec w en minuscule) et WORD (avec W en majuscule). Voici ce qu'on peut lire dans le manuel (:help word) :

A word consists of a sequence of letters, digits and underscores, or a sequence of other non-blank characters, separated with white space (spaces, tabs, ). This can be changed with the ‘iskeyword' option. An empty line is also considered to be a word.

A WORD consists of a sequence of non-blank characters, separated with white space. An empty line is also considered to be a WORD.

Word avec W n'est délimité que par des espaces (tab, space ou <CR>). Il correspond à la définition grammaticlale d'un mot tandis que word avec w englobe les ponctuations « . », « ; », « ; », « _ », « -« …

w : Pour passer d'un word à un autre

W : Pour passer d'un WORD à un autre

En mode normal les commandes de manipulation de texte sont de la forme :command<motion>. Sur son blog, Steve Losh parle d' « action + complément d'objet ». L'action c'est le command et le complément d'objet correspond au motion qui peut être une suite de caractères, de mots ou de lignes.

Exemple :

d2d
command = d (delete)
motion = 2d (2 lines from cursor position)

y2y
command = y (yank)
motion = 2y (2 lines from cursor position)

caw
command = c (change)
motion = aw (arround word)

Chaque motion peut avoir un multiplicateur, 2d, 2y, 3w… Pour les lignes on peut préciser la direction, vers le bas (par défaut) ou vers le haut. La position du curseur est toujours le point de départ, le point 0.

d2d : supprimer la ligne courante et la ligne en dessous (0 et 1 vers le bas)

d2j : supprimer les lignes 0, 1 et 2 vers le bas

d2k : supprimer les lignes 0, 1 et 2 vers le haut

VI-D - Précision pour copier/couper et coller

Pour faire une action de copier, couper ou coller on écrit ou lit dans le presse-papier. Avec VIM c'est dans le registre qu'on agit. Il existe plusieurs registres, et le presse-papier en est un. Quand on fait un yank, un delete ou un past on écrit dans un registre spécifique appelé registre par défaut. Un article spécifique pourra être consacré à la manipulation des registres.

VI-D-1 - Copier avec y (yank)

y2y : copier la ligne courante et la ligne en dessous.

y2j : copier la ligne courante et les deux lignes en dessous.

y2k : copier la ligne courante et les deux ligne au dessus.

yaw : copier le mot courant

y2w ou 2yw : copier le mot courant et le mot qui vient juste après

VI-D-2 - Couper avec d (delete)

Il présente les mêmes motions que yy, avec daw, d2w, 2dw, d2d, d3k (4 line above)

D : Couper, à partir de la position du curseur, jusqu'à la fin de la ligne

p/P (past): passe le contenu du registre après/avant le curseur

Exemple avec yyp pour copier la ligne courante juste en dessous (effectue une duplication)

Exemple avec ddp pour inverser la ligne courante avec celle en dessous

o/O : insérer une ligne vide en dessous/au dessus de la ligne courante

s (substitute): Supprimer le caractère courant et passe en mode Insert (pour remplacer)

S : supprime la ligne courante et passe en mode Insert

f{char} : positionne le curseur sur la première occurrence du caractère. On peut ensuite taper « ; » pour passer à l'occurrence suivante ou « , » pour revenir à l'occurrence précédente.

Exemple avec fl (find l)

f{char} peut être utilisé comme motion. Ex dfx,cfx

u : Annule la dernière action et <Ctrl-R> pour revenir sur l'annulation

A : positionne le curseur en fin de ligne et passe en mode insert

Le motion « t » (till) est utilisé pour spécifier l'endroit où s'arrête l'action.

Exemple avec dt. (delete till the dot )

VI-E - Les actions opposées

Certaines commandes ont des effets opposés.

w / b : Se déplacer d'un caractère vers l'avant/arrière

. / ; : repète/annuler la dernière répétition

u / <Ctrl-r> : Undo/Redo

VII - Le Mode Insert

On se retrouve dans ce mode très spécialement pour taper du texte. C'est l'ultime mode des éditeurs de textes classiques (notpad, sublime…). Il suffit de faire I, i, A ou la touche insert, depuis le mode Normal pour y arriver. D'autres commandes d'édition du mode Normal (c, s, A) nous basculent directement dans ce mode.

VII-A - La commande <Ctrl-O>

Comme dit plus haut la majeure partie des commandes est utilisée en mode normal. En pleine édition on peut avoir besoin de supprimer des lignes, remplacer des caractères, copier/coller, sauvegarder les dernières modifications… La première solution est de faire <ESC> pour passer en mode normal, taper la commande, et faire « i » pour revenir en mode insert. Un autre moyen, plus rapide, c'est d'utiliser <Ctrl-O>. Il nous permet de passer provisoirement du mode Insert au mode Normal juste le temps de taper une commande du mode Normal..

(Dans le prochain chapitre on montrera d'autres astuces plus pratiques pour taper des commandes depuis le mode insert sans avoir à le quitter.)

VIII - Le Mode Command-Line

C'est un peu l'équivalent du shell pour vim. On y arrive en tapant « : » depuis le mode normal. Le prompt s'affiche ensuite et nous laisse la main pour taper une commande. On peut aussi faire des recherches dans ce mode avec “/” ou faire des filtres avec “!”

VIII-A - Les numéros de lignes

Toutes les lignes d'un fichier possèdent un numéro et la numérotation commence à 1. Le numéro d'une ligne peut être “absolu” ou “relatif”, en référence à la position courante, le point 0. Pour la plupart des actions sur les lignes on aura besoin des numéros “relatifs”.

Pour afficher ou masquer les numéros absolus

:set nu:set nonu

Pour afficher ou masquer les numéros relatifs

:set relativenumber:set norelativenumber

VIII-B - Play with range

La force du mode Command-Line est la facilité de travailler sur des blocks de lignes, range.range..

Exemple de ranges :

1 : la première ligne

$ : la dernière ligne

. : la ligne courante

1,$ : de la ligne jusqu'à la dernière ligne

.,2 : de la ligne courante jusqu'à la deuxième ligne

% : l'ensemble des lignes (texte complet)

On peut aussi référencer les lignes de manières relatives, en ajoutant le signe “+” (vers le haut) ou “-“ (vers le bas) devant les bornes.

-1, -2 : De la première ligne (1) au dessus de la ligne courante jusqu'à la deuxième ligne au dessus de la ligne courante.

1,+3 : De la première ligne (1) jusqu'à la troisième en dessous de la ligne courante.

Exemples

:23d4 : Supprimer les lignes 23, 24, 25 et 26 .

:+1,$d : Supprimer de la ligne courante +1 jusqu'à la fin.

:2,5p : Afficher de la ligne 2 jusqu'à la ligne 5 ( p = print) .

:range move/copy x : Déplacer/Copier les lignes spécifiées dans
range
s à la ligne x

Exemple avec :1,2move5

On peut exécuter une commande du mode normal tout en étant en mode Command -Line

:range normal {command}

Exemple avec :% normal A ;

:% sélectionner toutes les lignes
normal passer en mode Normal
A aller à la fin de la ligne et passer en mode Insert
; écrire un point virgule
Quand on valide avec Entrée la commande s'applique sur toutes les lignes

VIII-C - Find and replace avec s

:s/oldWord/newWord: Remplacer, sur la ligne courante, la première occurrence de oldWord par newWord

:s/oldWord/newWord/g: Remplacer, sur la ligne courante, toutes les occurrences de oldWord par newWord

:s/oldWord/newWord/c: Demande confirmation avant d'effectuer le remplacement

Exemple avec :s/line4/LINE4/g

On peut appliquer le find and replace sur un
range.
Exemple la commande
:
%s/oldWorld/newWorld/g remplace toutes les occurrences de oldWorld par newWorld sur l'ensemble du texte. Sans l'option g le remplacement ne portera que sur les premières occurrences de oldWorld des différentes lignes du texte.

VIII-D - Les filtres

:r !{cmd} : Insérer le résultat d'une commande juste en dessous de la position du curseur

Exemple avec :r !ls ou :r !git status

VIII-E - La recherche

/{pattern}<CR> : depuis le mode normal nous permet de faire une recherche sur un mot
n : pour passer à l'occurrence suivante
N : pour passer à l'occurrence précédente

Exemple avec /line

IX - Le Mode Visual

En mode visual, comme son nom l'indique, on travaille sur une sélection de manière intuitive. La zone de sélection peut porter sur des mots (commande v), des lignes ( commande V), ou un block (ensemble de colonnes) avec la commande <Ctrl-V>. Une fois la sélection effectuée on peut exécuter une commande du mode normal, faire <ESC> et observer le résultat.

IX-A - Exemple avec <Ctrl-V>

<Ctrl-V> pour activer le mode visual
lll…pour sélectionner les colonnes
jjj… pour sélectionner les lignes
gU pour transformer en majuscule

La commnde gv : Revenir en mode visual, avec la dernière sélection.

<Ctrl-V>pour activer le mode visual
lll… pour sélection les colonnes
jjj… pour sélectionner les lignes
gU pour transformer en majuscule
gv pour revenir sur la sélection
d pour supprimer le block sélectionné

La commande  o : pour modifier la sélection

<Ctrl-V> pour activer le mode visuallll… pour sélection les colonnes
jjj… pour sélectionner les lignes
o pour modifier la sélection
lll… pour désélectionner les colonnes
jjj… pour désélectionner les lignes

X - What's next … ?

Pour ce qui est de la magie de VIM on aurait pu s'en tenir à ce qu'on vient de voir, les différents modes de VIM avec les commandes de base qui nous accompagnent au quotidien et les quelques cas d'utilisation. Des fonctionnalités qu'on ne trouve pas ailleurs… Mais pour le plus timide des développeurs il en faudra encore plus pour s'intéresser à un nouvel outil. Certaines commandes peuvent être fastidieuses à taper. La tâche sera d'autant plus difficile qu'on peut avoir à utiliser ces commandes tous les jours. Peut-on toujours se permettre de faire des aller-retours entre le mode
Insert
et le mode
Normal
juste pour enregistrer, supprimer des lignes, mettre en majuscule, … ? On verra, dans le prochain article, à travers le fichier de configuration .vimrc, comment on peut personnaliser notre éditeur pour simplifier les tâches courantes.

X-A - Temps 2 : Grok your VIM

Après avoir été convaincu de changer votre éditeur pour Vim et avoir pris connaissance de quelques commandes de bases, place à la phase suivante : la configuration.

On n'écrit pas que du code dans notre travail. On s'exprime aussi par écrit, dans un langage plus humain, pour échanger avec d'autres collaborateurs qui ne sont pas tout le temps du même métier; on n'est pas dispensé de la maîtrise de l'orthographe. Voyons ce que le correcteur d'orthographe de VIM propose pour le spell checking.

Pour l'activation/désactivation …

:set spell:set nopell

… et pour les commandes d'utilisation

z= voir les suggestions sur le mot mal orthographié
]s se mettre sur le prochain mot mal orthographié
[s se mettre sur le précédent mot mal orthographié
zg ajouter le mot au dictionnaire
zug annuler l'ajout du mot au dictionnaire

Le spell checking parait ici contre-intuitif. Pour chacune des commandes, on a au minimum deux caractères à taper, y compris parfois un caractère spécial (“]”,”[“ ou “=”). Utiliser Vim de cette manière peut être très vite déroutant. Les premiers signes de frustration font leur apparition, comme cet utilisateur qui se plaint sur Stackoverflow d'être plus productif avec ses précédents éditeurs qu'avec VIM qu'on lui a pourtant présenté comme étant l'éditeur du développeur…

I've heard a lot about Vim, both pros and cons. It really seems you should be (as a developer) faster with Vim than with any other editor. I'm using Vim to do some basic stuff and I'm at best 10 times less productive with Vim.

Et la réponse qui a suivi résume l'idée de cet article :

Your problem with Vim is that you don't grok vi.

http://stackoverflow.com/questions/1218390/what-is-your-most-productive-shortcut-with-vim

Sans une configuration minimale l'éditeur reste très peu pratique. Pour découvrir la vraie puissance de VIM il faut l'adapter à ses habitudes. Le travail commence dans le fichier de config ~/.vimrc qui joue le même rôle que ~/.gitconfig pour Git ou ~/.bashrc pour Linux. On peut trouver des fichiers .vimrc sur github mais il vaut mieux en prendre un qui soit basique et l'enrichir au fur et à mesure. Cela doit refléter une habitude qui n'est pas universelle. On trouvera principalement dans le fichier des configs de bases, des mappings et des macros (fonctions).

XI - Configuration de base

Dans la partie configuration on met les options par défaut, celles dont on a besoin le plus souvent. Les options rarement utilisées pourront être activées manuellement.

Exemple : Puis qu'il est plus pratique de se repérer à partir de la position courante que des numéros de lignes, on choisira par défaut l'affichage des numéros de lignes en mode relatif.

set relativeNumber

Si au cour d'une session on veut passer à l'affichage en mode absolu on exécute les deux commandes (en mode command-line):

:set norelativenumber:set nu

On va essayer de voir d'autres options que l'on peut avoir besoin de spécifier dans le fichier de config.

Faire une recherche intelligente
set ignorecaseset smartcase

Avec cette configuration si le mot recherché est en minuscule la casse n'est pas prise en compte. Par contre si une des lettres du mot est en majuscule on a la recherche en case-sensitive.

Ne pas rendre VIM compatible avec Vi. Si on active la compatibilité on perd les fonctionnalités de VIM qui n'existent pas dans VI.

set nocompatible

Mettre en évidence la position du curseur avec une ligne horizontale.

set cursorline

Afficher la commande sur la barre d'état.
set showcmd

Mettre en évidence les parenthèses qui correspondent.

set showmatch

Activer la recherche incrémentale. La recherche s'effectue au fur et à mesure qu'on fait la saisie.
set incsearch

Masquer les buffers quand ils ne sont plus utilisés.

set hidden

Définir la couleur de fond.
set background=dark

Choisir l'encoding pour l'affichage et l'encoding pour les fichiers.
set encoding=utf8

set fileencoding=utf-8

Prendre le dictionnaire français pour le spell checking.

set spell spelllang=fr_fr

Mettre 4 espaces pour l'indentation. On utilise soit la tabulation (tabstop) soit « >> » (shiftwidth).

set tabstop=4set shiftwidth=4

80, le nombre maximal de caractères par ligne.

set textwidth=80

Ne pas couper un mot pour aller à la ligne.

set linebreak

Par défaut leader est mappé en « \« . Il est remappé en « , » pour une utilisation plus simple.

let mapleader = “,”

XII - Du Mapping pour aller plus vite !

Pour faire un petit parallèle risqué avec le développement : quand on a un block de codes qui revient à différents endroits d'un projet on pense automatique à le simplifier par une structure plus compacte. C'est presque la même chose avec le mapping, on cherche à simplifier pour aller encore plus vite. On y a recours généralement quand on doit exécuter une combinaison de commandes fréquemment utilisée ou invoquer une fonction. On peut appliquer le mapping à un mode spécifique, modal mapping (imap, nmap et vmap), ou à tous les modes, generalmapping (map).

Une des contraintes quand on crée un mapping est d'avoir des collisions. Certains raccourcis peuvent être déjà définis par l'OS, l'éditeur même, un plugin de l'éditeur ou une macro. On n'en crée pas délibérément. Quelques astuces sont mises à notre disposition pour limiter les risques de collisions et aussi pour avoir des raccourcis plus intuitifs :

- Utiliser les touches dont on ne se sert presque jamais F2, F3, …

- Combiner les touches avec les keys modifier Ctrl, Alt, Shift,

- Préfixer avec leader : c'est une touche qu'on choisit pour préfixer les mappings. Par défaut c'est “\” mais dans la pratique on utilise très souvent “,” ou “-”. Il doit donc être remappé dans le .vimrc.

Le mode Insert est très pauvre. On doit le quitter à chaque fois qu'on doit faire une action un peu compliquée. Pour supprimer une ligne par exemple il faut en général faire :

<esc> pour aller au mode normal
dd suppression de la ligne
i pour revenir en mode insert

Pour mettre un mot en majuscule depuis le mode il faut au minium faire <esc>viwgUi
.

Ces actions sont très courantes quand on fait de l'édition. Comme le développeur a horreur de la répétition, VIM nous facilite la tâche avec le mapping qui nous permet de muscler notre éditeur.

En ajoutant ces lignes dans notre config on pourra réaliser des actions sans quitter le mode Insert. Ctrl-D pour supprimer une ligne, Ctrl-U pour mettre en majuscule un mot ou Ctrl-Y pour dupliquer une ligne.

imap <C-D> <esc> ddiimap <C-U> <esc> viwgUiimap <C-Y> <esc> yypi

XII-A - j et k pour une Navigation entre lignes virtuelles

nmap j gjnmap k gk

Recursive mappings

Par défaut le mapping sur VIM est récursif. Si on ajoute ce map
map j ggmap Q j
Q est mappé en j , j mappé en gg, donc Q mappé en gg. On parle de recursive mapping

noremap W j
Si on ne veut pas de mapping recursif on utilise le mot clé noremap. Ici W devient juste j et pas gg.

Pour se mettre à l'abri des mauvaises surprises il est préférable d'utiliser par défaut un mapping non récursif

Ctrl-S pour sauvegarder depuis les modes Normal ou Insert …

noremap <C-S> :w<CR>inoremap <C-S><C-O> :w<CR>

… on peut aussi passer <leader>w

noremap <leader>w :w<CR>inoremap <leader>w <C-O>:w<CR>

jj, Enter ou Shift-Enter pour un Echappe plus intuitif

inoremap jj <esc>inoremap <CR> <esc>inoremap <S-CR> <esc>

XII-B - Arrow keys désactivé

Certains proposent de désactiver les touches fléchées, avec la valeur Nop, pour se forcer à utiliser les touches hjkl pour la navigation. D'autres proposent d'en faire un autre usage.

noremap <Up> <Nop>noremap <Down> <Nop>noremap <Left> <Nop>noremap <Right> <Nop>

Alt-J et Alt-K pour déplacer la ligne courante en mode normal

nmap <M-J> mz:m+<CR>'znmap <M-K> mz:m-2<CR>'z

Alt-J et Alt-K pour déplacer un block de lignes en mode Visual

vmap <M-J> :m'>+<CR>'<my'>mzgv'yo'zvmap <M-K> :m'<-2′><CR>my'<mzgv'yo'z

Leader
The leader is a kind of “namespace” to keep those customizations separate
and prevent them from shadowing default commands. (Steve Losh)

<leader>i pour les aller retour entre les modes Normal et Insert

nnoremap <leader>i iinoremap <leader>i <es>

Spell checking (http://amix.dk/vim/vimrc.html)

<leader>ss pour activer/désactiver le spell checking …
nnoremap ss :setlocal spell!

… et les commandes ,sn ,sp ,sa ,sz pour l'utilisation
nnoremap <leader>sn ]snnoremap <leader>sp [snnoremap <leader>sa zgnnoremap <leader>sz z=

XII-C - Edition de .vimrc avec<leader>ev et<leader>sv

Il est très fréquent de vouloir faire des modifications sur .vimrc, et de voir les effets dans l'immédiat, alors qu'on est en pleine édition. Voici un mapping simple qui facilite l'écriture et le chargement des modifications.

nnoremap <leader>ev :vsplit $MYVIMRCnnoremap <leader>sv :source $MYVIMRC

$MYVIMRC une variable qui correspond au fichier .vimrc
:vsplit pour ouvrir .vimrc dans un nouvel onglet vertical
:source pour charger la dernière configuration

XII-D - Basculer de relative à absolute

On peut avoir besoin de basculer entre le relative et l'absolute dans l'affichage des numéros de lignes. Avec ce mapping la commande est<leader>n

1. function! NumberToggle()

2. if(&relativenumber == 1)

3. set norelativenumber

4. set number

5. highlight LineNr ctermfg=yellow

6. else

7. set nonumber

8. set relativenumber

9. highlight LineNr ctermfg=green

10. endif

11. endfunc

12. nnoremap<leader>n :call NumberToggle()<CR>

http://jeffkreeftmeijer.com/2012/relative-line-numbers-in-vim-for-super-fast-movement/

XII-E - Bonus abbréviation

iabbrev @@ yakhya.dabo@arolla.fr

iabbrev cc AROLLA - Mastering Software Development

On ferme la deuxième partie de la série sur l'abréviation. Elle nous permet d'insérer rapidement les champs qu'on utilise couramment dans le texte, prénom, nom, adresse e-mail, signature, site web, … Avec la config ci-dessus, on peut se limiter à taper @@ pour l'e-mail ou cc pour copyright.

XIII - Conclusion

C'est dans dans la partie configuration qu'on découvre la vraie puissance de VIM. Le mapping doit être le premier réflexe pour rendre plus simples des actions complexes et pour éviter des répétitions comme les aller-retour entre le mode normal et les autres modes. N'hésitez pas à vous inspirer d'exemples sur le net pour enrichir votre configuration.

On est bien tenté de dire qu'avec VIM on peut tout faire.

XIV - Remerciement

Nous remercions TO DO pour sa relecture et Laethy pour la mise au gabarit.