Guide de contrôle total de vim

From All4Dev

Contents

Bases de Vim

Modes

Mode normal

Mode insertion

Modes de sélection

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 :

Les sauts permettent également d'atteindre des endroits-clé dans le fichier.

Effacer ou corriger

Dans tous les exemples suivants, la touche 'd' sert à supprimer, et 'c' sert à corriger (supprimer puis passer en insertion).

Exemples simples :

Étant donnée la ligne suivante (le curseur est sur le 'O' de NOT NULL) :

DB_DataObject_Cast::sql('N[O]T NULL');

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" :

Maintenant, nous voulons remplacer la partie gauche de l'égalité. Plaçons-nous en début de ligne avec '_' puis :

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

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 :

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

g* permet de chercher un nom de variable quelle que soit son préfixe (->, . ou $), en PHP par exemple.

:'<,'>s#original#remplacement#flags
:%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.

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

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)

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.

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.

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)

Outils

GNU Screen

Pour faire marcher la souris dans vim avec screen :

:set mouse=n (ou =a, comme on veut)
:set ttymouse=xterm2