Guide de contrôle total de vim
From All4Dev
Contents |
Bases de Vim
Modes
Mode normal
Mode insertion
Modes de sélection
- passer en mode de sélection sequentielle : v
- passer en mode de sélection linéaire : <S-v> (traduire Shift + v )
- passer en mode de sélection par bloc : <C-v> (traduire Control + v)
Note : la touche o permet de changer le côté de la sélection où les flèches agissent, pendant qu'elle est active, de sorte qu'il est possible de l'étendre ou de la restreindre d'un côté ou de l'autre.
Déplacements
Pour se passer des flèches du clavier et de la souris, c'est facile avec Vim.
Position du curseur
Ces commandes s'utilisent en mode normal :
- w, b : avance ou recule d'un mot, en positionnant le curseur sur le début du mot
- e, ge : avance ou recule d'un mot, en positionnant le curseur sur la fin du mot
- z<Enter> : fait défiler l'écran de sorte que la ligne en cours soit en haut de l'écran
- zz : fait défiler l'écran de sorte que la ligne en cours soit au centre de l'écran
- <C-e>, <C-y> : respectivement, fait défiler le texte vers le haut et vers le bas.
- H, M, L : respectivement, place le curseur sur la première ligne, la ligne centrale et la dernière ligne de l'écran (pas du fichier).
Les sauts permettent également d'atteindre des endroits-clé dans le fichier.
- gg : sauter au début du fichier
- G : sauter à la fin du fichier
- : (quote deux fois de suite) saute à l'endroit où le curseur se trouvait avant le dernier saut
- '. : saute à l'endroit où la dernière modification de texte a été faite. Ceci est très pratique quand on édite une ligne et qu'on se déplace de plusieurs pages pour vérifier quelque chose dans le code : on peut revenir à la ligne en cours d'édition avec «'.».
- <C-o> et <C-i> : respectivement, saute vers toutes les positions passées du curseur, et futures.
Effacer ou corriger
Dans tous les exemples suivants, la touche 'd' sert à supprimer, et 'c' sert à corriger (supprimer puis passer en insertion).
Exemples simples :
- dw/cw : «delete/correct word» efface/corrige depuis la position du curseur jusqu'à la fin du mot
Étant donnée la ligne suivante (le curseur est sur le 'O' de NOT NULL) :
DB_DataObject_Cast::sql('N[O]T NULL');
- ci' : «correct in quotes», supprime "NOT NULL" (quotes exclus), et passe en insertion
- ca' : «correct a quote», supprime "NOT NULL" (quotes inclus), et passe en insertion
- ci( : «correct in parenthesis», à vous de déduire...
Pour tous ces exemples, il est possible de remplacer le 'c' par 'd' comme delete, pour couper à la place de corriger.
Par exemple, il est possible de supprimer un mot, mettons qu'on veuille supprimer le "NOT" de "NOT NULL" :
- daw : «correct a word», le curseur doit se trouver sur le mot à corriger (alors qu'avec dw il faudrait que le curseur se trouve sur la première lettre du mot)
Maintenant, nous voulons remplacer la partie gauche de l'égalité. Plaçons-nous en début de ligne avec '_' puis :
- ct= : «correct to '='», supprime depuis la position courante du curseur jusqu'au signe '=' non inclus, et passe en insertion
- cf= : «correct find '='», supprime depuis la position courante du curseur jusqu'au signe '=' inclus, et passe en insertion
Le plugin Surround permet de travailler sur les caractères délimiteurs tels que guillemets, parenthèses, tags XML, etc. Il permet par exemple de remplacer des quotes par des guillemets, de supprimer ou ajouter des parenthèses, etc.
Marques
- m<c> : pour placer une marque (remplacer <c> par un caractère)
- '<c> : pour revenir à l'endroit où la marque <c> a été posée
Si on travaille à plusieurs endroits du même fichier, il peut être utile de placer plusieurs marques pour retrouver ces endroits rapidement.
Tags
Vim permet d'interfacer les exuberant ctags.
Tout d'abord, exécuter ctags à la racine du code source.
Script phptags.sh :
#!/bin/sh ctags -f .ctags -h ".php" -R \ --exclude="\.svn" \ --exclude="\.git" \ --totals=yes \ --tag-relative=yes \ --PHP-kinds=+cf \ --regex-PHP='/abstract class ([^ ]*)/\1/c/' \ --regex-PHP='/interface ([^ ]*)/\1/c/' \ --regex-PHP='/(public |static |abstract |protected |private )+function ([^ (]*)/\2/f/'
Exécuter phptags à la racine du projet.
Ajouter ce fichier de tags au ~/.vimrc :
set tags+=/path/to/ctags_file
Ensuite, dans Vim, il est possible d'atteindre un tag avec la commande ':tag tagname' (<TAB> pour la complétion).
Il est possible d'ouvrir directement Vim en sautant à un tag :
vim -t tagname
Mais le plus pratique, ce sont les sauts pour explorer le code à travers les appels de fonction.
Il faut placer le curseur sur un identifiant, puis :
- <C-]> pour sauter à la définition de cet identifiant (méthode, classe, etc). Cette action empile l'ancienne position dans la pile des sauts de tags. Dans gvim il est possible d'utiliser control-clic gauche.
- <C-t> pour dépiler une position dans la pile des sauts de tags (équivalent à <C-o> mais restreint aux sauts concernant les tags)
Il est possible de réaffecter le raccourci <C-_> pour qu'il ouvre un tag dans un nouvel onglet (tab) de Vim. Rajouter cette ligne dans le fichier ~/.vimrc :
map <C-_> :tab tag <C-R>=expand("<cword>")<CR><CR>
Recherche et substitution
- :set incsearch pour la recherche incrémentale
- :set hlsearch pour mettre en surbrillance les résultats de la recherche
- / recherche en avant
- ? recherche en arrière
- * recherche en avant du mot entier sous le curseur
- # recherche en avant du mot entier sous le curseur
- g* (et g#) recherche en avant (en arrière) du mot sous le curseur en tant que string
g* permet de chercher un nom de variable quelle que soit son préfixe (->, . ou $), en PHP par exemple.
- :%s#original#remplacement#flags : remplace automatiquement le motif «original» par «replacement». '%' signifie qu'on travaille sur tout le fichier. Les flags sont :
- g : remplacer toutes les occurences du motif s'il apparaît plusieurs fois par ligne
- i : ne pas être sensible à la casse
- c : demande confirmation à chaque remplacement (mode interactif)
- On peut remplacer le motif seulement sur une sélection de plusieurs lignes données (avec <S-v>). L'appui sur ':' fait apparaître :'<,'> sur la ligne de commande, cela désigne l'intervalle sélectionné. Cela donne :
:'<,'>s#original#remplacement#flags
- Le plugin Keepcase permet d'effectuer une substitution de texte en reproduisant la casse originale. Utiliser cette forme (utiliser <tab> pour compléter le nom de la fonction) :
:%SubstituteCase#original#remplacement#flags
Recherche ungreedy
Exemple. Voici ce texte :
Salut les amis ! Bonjour. Salut à vous !
Je veux chercher les phrases commençant par «Salut» et terminant par «!».
Avec ce pattern de recherche :
Salut.*!
Vim matche la totalité de la ligne (utiliser :set hlsearch). L'étoile de l'expression régulière aura été gourmande et aura «aspiré» les phrases intermédiaires.
C'est le problème classique de la regex gloutonne (greedy). Avec les regex PCRE, on utilise le flag '?', mais avec Vim, il faut utiliser :
Salut.\{-}!
Là il matche les deux phrases : «Salut les amis !» et «Salut à vous !».
Voir l'aide :
:help greedy
Conventions de codage
Indentation
Utiliser la touche '=' pour indenter.
- == : indente la ligne en cours
- gg=G : indente tout le fichier
- sélection de lignes avec <S-v> puis = : indente plusieurs lignes sélectionnées
Règles de tabulations
On préfère des tabulations de quatre espaces. Cela s'obtient de la façon suivante:
set expandtab set shiftwidth=4 set softtabstop=4 set tabstop=4
Ou en abrégé inclus à la fin du fichier en commentaire (modeline) :
// vim: ts=4 sts=4 sw=4 et
Longueur maximum d'une ligne
On fixe en général la longueur maximale d'une ligne de code à 80 caractères (ou 120 depuis la démocratisation des écrans 16/9).
Ces deux lignes permettent d'afficher sur fond rouge les caractères qui dépassent.
highlight OverLength ctermbg=red ctermfg=white guibg=#592929 match OverLength /\%81v.*/
La première ligne déclare un nouveau style de surbrillance de texte, appelé OverLength. La deuxième ligne applique ce style à tout texte correspondant à la regex /\%81v.*/.
Propreté du code
On peut mettre en surbrillance les caractères non-imprimables qui ne devraient pas figurer dans le code source.
Espaces en fin de ligne :
highlight NoSpacesEOL ctermbg=red ctermfg=white guibg=#592929 match NoSpacesEOL / \+$/
Tabulations (en général elles sont interdites, on oblige d'utiliser des espaces) :
highlight NoTabs ctermbg=red ctermfg=white guibg=#592929 match NoTabs /\t/
Interface
Coloration syntaxique
- ":syntax on" : active la coloration syntaxique en fonction du FileType
Pour les fichiers que Vim ne saurait pas reconnaître, il est possible de forcer le FileType en plaçant en commentaire à la fin du fichier la commande "filetype=".
Par exemple, pour les fichiers dans /etc/apache2/sites-available, Vim ne les reconnaît pas comme des fichiers de configuration Apache. Pour cela, il faut indiquer :
# vim: filetype=apache
Onglets (tabs)
- :tabedit <file> : ouvre un fichier dans un nouvel onglet
- gt (ou CTRL-PGDOWN), gT (ou CTRL-PGUP) : respectivement passer à l'onglet suivant/précédent
- :tabmode <entier> : déplace l'onglet courant à la position indiquée (0 signifie premier onglet)
- CTRL-W T : si la fenêtre est splitée, détache le buffer en cours dans un nouvel onglet
Modelines
Dans le fichier, il faut placer en commentaires une ligne commençant par «vim:» et énumérant les attributs, comme ceci par exemple :
// vim: ts=4 sts=4 sw=4 et
Vim comme IDE
Il existe plusieurs extensions qui permettent de transformer Vim en IDE.
- TagList : source-code browser
Dernière ligne en cours d'édition
Vim peut sauter à la dernière ligne sur laquelle se trouvait le curseur à chaque ouverture d'un fichier.
Les infos sont stockées dans $HOME/.viminfo : ce fichier doit appartenir à l'utilisateur et avoir les droits suivants : -rw-------
Enfin, placer les lignes suivants dans $HOME/.vimrc pour que cela fonctionne :
if has("autocmd")
au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$")
\| exe "normal! g'\"" | endif
endif
Sous Debian GNU/Linux, on trouve ces lignes prêtes à décommenter dans /etc/vim/vimrc.
Sessions
Lorsqu'on ouvre plusieurs fichiers dans plusieurs onglets/fenêtres splittées, on aimerait pouvoir quitter Vim et retrouver cette configuration à la prochaine ouverture.
- :mksession : écrit le fichier Session.vim qui enregistre l'état de la session en cours
- :mksession! : pareil, mais écrase le fichier Session.vim s'il existe déjà (même mécanisme que :w et :w!)
- vim -S : ouvre Vim en tenant compte du fichier Session.vim, retrouvant ainsi la session enregistrée
Organisation du code
Utilisation des replis (folds)
Permet de mieux organiser le code source pour les fichiers très long :
set foldmethod=marker
Ou en abrégé en fin de fichier :
// vim: fdm=marker
Les marqueurs standards respectivement de début et de fin de replis :
// {{{ title
// source-code ...
// }}}
zc pour fermer les replis (c comme close), et zo (ou flèche directionelle) pour les ouvrir (o comme open).
Regexp et plus
Pour conditionner n'importe quelle commande sur une regexp, en mode commande:
:g/regexp/commande
Pour remplacer partout avec confirmation:
:%s/regexp/subs/gc
\_ toutes \\__ confirmation
les lignes \__ toutes les occurences au sein d'une même ligne
Complétion
En mode insertion taper <C-x><C-n> (Control-x Control-n). Pour avoir plus d'aide dessus :help completion.
Utiliser également <C-p> et <C-n> pour comlpéter les mots (comme tab dans le shell).
Alignement
Installer le script align : http://www.vim.org/scripts/script.php?script_id=294
array( 'a' => 'A', 'salut' => 'SALUT', 'très long' => 'TRÈS LONG', )
Sélectionner les lignes avec avec <S-v> puis taper :
:'<,'>Align=>
array( 'a' => 'A', 'salut' => 'SALUT', 'très long' => 'TRÈS LONG', )
Jeux de caractères et encodage
TODO (fileencoding, encoding)
- Afficher le code du caractère sous le curseur : ga
Outils
GNU Screen
Pour faire marcher la souris dans vim avec screen :
:set mouse=n (ou =a, comme on veut) :set ttymouse=xterm2

