Vous utilisez un IDE complexe ?
Saviez vous qu'on ré-indenter son code d'une commande ? Enregistrer des macros dans VIM ? Lancer un grep ?
Venez découvrir la puissance d'un outil simple et évolutif à travers une présentation en direct du fonctionnement et des fon
1. ~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
Forum PHP 2009
Paris - La Villette
VIM = VI IMproved !
Frédéric Hardy
Matthieu Valleton
Questions
Utilisateurs d'Eclipse ou assimilé ?
Utilisateurs d'emacs ?
Utilisateurs de VIM ?
Historique
70's
ed
vi
1988
Bram Moolenaar développe VIM pour l'Amiga
1991
VIM devient un logiciel libre compatible GPL
1992
Portage sous UNIX
Portage sous MSDOS
1996
Naissance de gvim
2001
Support des greffons
Pliage de code
Gestion des types de fichiers
Ajout du partage vertical des fenêtres
Aujourd'hui
Version 7
Vérification orthographique
Complétion du code
Support des onglets
Disponible sur l'ensemble des plates-formes
Disponible en huit langues
Supporte un grand nombre de langages
Demain ?
Version 8
Nouvelles fonctionnalités décidées par la communauté
http://www.vim.org/sponsor/vote_results.php
Principes de fonctionnement
Éditeur de texte modal
Modes
1 of 14 11/13/2009 03:28 PM
2. ~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
Normal
Mode par défaut au démarrage de VIM
<Esc> à partir de n'importe quel mode
Permet d'appliquer des commandes sur le texte
/* Démonstration */
<?php
echo $microsoft; # suppression de texte
echo $apple; #chercher/remplacer
echo 'php'; #mise en majuscules
?>
Insertion
Permet l'insertion de texte
<Esc> ou <Ctrl>-C pour revenir au mode normal
Visuel
Permet d'effectuer des sélections
v pour démarrer une sélection par caractère
V pour démarrer une sélection par ligne
<Ctrl>-V pour une sélection en bloc
<Esc> ou <Ctrl>-C pour revenir au mode normal
v = Visuel
/* Démonstration */
<?php
# Selection par caractères
$GLOBALS['truc'] = 'abcde';
# Selection par ligne
$line = 'line';
class truc
{
# Selection par bloc
private $truc;
private $machin;
private $bidule;
}
?>
Remplacement
Permet de remplacer du texte
r pour remplacer un caractère
R pour remplacer plusieurs caractères
r = Replace
/* Démonstration */
<?php
echo $_SERVER['REQUEST_uRI'];
echo $_SERVER['QUERYSTRING'];
?>
Comment ça marche, ce truc ?
Insertion
i ou a à partir du mode normal
i = Insert
a = After
Nouvelle ligne en-dessous/au-dessus du curseur
o
2 of 14 11/13/2009 03:28 PM
3. ~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
O
/* Démonstration */
<?php
class inutile
{
# O
public $neSertRien = null;
# o
}
?>
Insérer <path>/<commande> en-dessous du curseur
:read <path>
:read !<commande>
/* Démonstration */
:read fichier.php
Insérer à la fin de la dernière insertion
gi
gi = Go Insert
/* Démonstration */
<?php
class
{
}
?>
En mode insertion :
Répéter la dernière insertion
<Ctrl>-A
A = Append
/* Démonstration */
<?php
class pleineDePublic
{
# Insérer après la tabulation
}
?>
Supprimer le mot avant le curseur
<Ctrl>-W
W = Word
/* Démonstration */
<?php
class salleDeConference
{
# Effacer number
public $number = null;
}
?>
Supprime tous les caractères insérés
<Ctrl>-U
U = Undo
3 of 14 11/13/2009 03:28 PM
4. ~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
/* Démonstration */
<?php
class encorePlusInutile extends inutile
{
# On insère une propriété de inutile
}
?>
Diminuer/augmenter le niveau d'indentation de 1
<Ctrl>-T
<Ctrl>-D
/* Démonstration */
<?php
function malIndente()
{
# C'est mal indenté
}
?>
Modification
Modifier un mot
cw pour modifier du curseur à la fin du mot
ciw pour modifier la totalité du mot
cw = Change Word
ciw = Change Inner Word
Il est possible de remplacer c par d
/* Démonstration */
<?php
# Modification
functruc machin() {}
noitcnuf reverse() {}
# Suppression des arguments
function bidule(__FILE__) {}
function truc(__LINE__) {}
?>
Modifier tout ce qui est entre ', ", (, { et [
ci' en mode normal
ci" en mode normal
ci( en mode normal
ci{ en mode normal
ci[ en mode normal
Il est possible de remplacer c par d
/* Démonstration */
<?php
echo 'simple quote';
echo "double quote";
echo toto(PHP_INT_MAX);
echo $array[time()];
function bete() { echo date(); }
?>
Modifier jusqu'à un caractère
ct{caractère} pour modifier jusqu'à {caractère}
4 of 14 11/13/2009 03:28 PM
5. ~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
cf{caractère} jusqu'à {caractère} inclus
Il est possible de remplacer c par d
/* Démonstration */
<?php
class debile
{
function trucQuiFaitUnTruc() {}
function machinQuiFaitUnTruc() {}
function QuiFaitUnTruc() {}
}
$debile = new debile();
# On veut machinQuiFaitUnTruc
$debile->trucQuiFaitUnTruc();
# On veut QuiFaitUnTruc
$debile->debileQuiFaitUnTruc();
?>
Modifier la ligne courante
cc
Il est possible de remplacer c par d
/* Démonstration */
<?php
/*
Ligne de commentaire à supprimer
Ligne de commentaire à modifier
*/
?>
Remonter la ligne suivante sur la ligne courante
J
{nombre}J remonte les {nombre} lignes
/* Démonstration */
<?php
$array = array(
1,
2,
3
);
?>
Déplacements
hjkl vs Left/Down/Up/Right
Se déplacer à droite et à gauche sur une ligne
Dernier caractère de la la ligne
$ en mode normal
<End> en mode normal
Premier caractère non vide de la ligne
^ en mode normal
<Home> en mode normal
{caractère} vers la droite/gauche
f{caractère} en mode normal
5 of 14 11/13/2009 03:28 PM
6. ~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
F{caractère} en mode normal
Avant {caractère} vers la droite/gauche
t{caractère} en mode normal
T{caractère} en mode normal
t = To
Répéter la dernière commande f, F, t ou T
; dans le même sens, en mode normal
, dans le sens opposé, en mode normal
Se déplacer dans les objets du texte
Avancer/reculer d'un mot
w, W
w = Word
Aller au début/à la fin d'un mot
b, B
e, E
b = Begin
e = End
Reculer à la fin du mot précédent
ge
ge = Goto End
Avancer/reculer d'une phrase
(, )
Copier/coller
yy pour copier une ligne
p pour coller
y = Yank
p = Paste
Plusieurs presse-papier
"{caractère}yy pour copier
"{CARACTÈRE}yy pour concaténer au presse-papier
"{caractère}p pour coller
/* Démonstration */
<?php
echo "Forum PHP 2009";
echo "Paris La Villette";
echo "Conférence VIM = VI IMproved";
?>
Rechercher
Vers l'avant/l'arrière le mot sous le curseur
*
#
Refaire la dernière recherche
n continue la recherche dans le même sens
N fait la même recherche dans le sens inverse
Expressions rationnelles
6 of 14 11/13/2009 03:28 PM
7. ~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
Très puissantes
Trop pour pouvoir être détaillées ici
/{regex} cherche vers l'avant
?{regex} cherche vers l'arrière
Recherche incrémentale
:set incsearch active la recherche incrémentale
/* Démonstration */
:set incsearch
<?php
class truc
{
public $public;
protected $protected;
private $private;
}
?>
Remplacer
:s/chaine/autreChaine
& répète le dernier remplacement
g& le répète pour tout le fichier
g = Global
/* Démonstration */
<?php
class machin
{
# On passe tout en public
public $chose;
protected $truc;
protected $bidule;
}
?>
Annuler/Refaire
Nombre limité uniquement par la RAM disponible
Définir le nombre maximum d'annulations
:set undolevels=1
:set undolevels=100
:set undolevels=1000
Annuler la ou les dernières modifications
:undo en mode commande
u en mode normal
Annuler les annulations
<Ctrl>-R en mode normal
/* Démonstration */
<?php
# On n'en veut pas... et puis on en veut
echo fonctionQuiNeSertARien();
?>
Arbre d'annulation
1
|
7 of 14 11/13/2009 03:28 PM
8. ~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
changement 1
|
1 2
/
changement 2 changement 3
| |
1 deux 1 two
g- recule dans l'arbre d'annulation
g+ avance dans l'arbre d'annulation
:undolist
:earlier
:later
Macros
Séquence de commandes ré-exécutable à volonté
q{caractère} démarre l'enregistrement
q termine l'enregistrement
@{caractère} déclenche l'exécution
@@ relance la dernière macro
Utilisable avec la quantification
/* Démonstration */
<?php
...
# $this->assert->string($truc)->isEqual('truc');
$this->equal($truc, 'truc');
...
$this->equal($truc, 'truc');
...
?>
Sauvegarder et charger des macros
"{caractère}p insère la macro dans le buffer
:let @{caractère} = getline('.') met la ligne courante dans la macro {caractère}
:registers permet de lister les macros
Quantification
Indique le nombre d'exécutions d'une commande
{nombre}{commande}
Utilisable avec toutes les commandes précédentes
/* Démonstration */
<?php
# On copie/colle 9 fois
# yy
# 9p
$array[] = 'truc';
?>
Intervalle
Groupe de une ou plusieurs lignes
{ligneDeDebut},{ligneDeFin}{commande}
Groupes pré-définis :
. : La ligne courante
$ : La dernière ligne
% : Toutes les lignes = 1,$
8 of 14 11/13/2009 03:28 PM
9. ~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
Utilisable avec toutes les commandes précédentes
/* Démonstration */
<?php
# :set nu
# On veut remplacer toto par titi dans ce qui suit
$toto = 'toto';
$truc = 'truc';
$toto = $toto . $truc;
# ligne non prise en compte
echo $toto;
# :set nonu
?>
Abbréviations
Insertion de code automatique
Disponibles dans tous les modes
/* Démonstration */
:cab PHP !php -l %<CR>
:iab <buffer> PHP <?php ?><Esc>3hi
Complétion
En ligne de commande
<Tab> déclenche la complétion
<Ctrl>-P : Proposition précédente
<Ctrl>-N : Proposition suivante
:set wildmenu
La complétion est possible à partir :
Du contenu du buffer courant
D'un dictionnaire
De mot-clefs
Des noms de fichiers
Du contexte (Omnicomplétion)
:h completion
Indentation et formatage automatique
indenter/formater le texte au cours de la frappe
Plusieurs modes possibles
:set autoindent
:set cindent
:set indentexpr
/* Démonstration */
<?php
function truc()
?>
Make
Définir le programme à appeler
:set makeprg=php -l %
Définir le format des erreurs
:set errorformat=%m in %f on line %l
Exécuter le programme
:make
9 of 14 11/13/2009 03:28 PM
10. ~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
Mapping
Possible de redéfinir toutes les commandes
Disponible dans tous les modes
/* Démonstration */
:nmap <F11> :make<CR>
Pliages
Concatène plusieurs lignes
Différentes méthodes de pliages
Suivant une expression
Suivant la syntaxe
Suivant l'indentation
Suivant des repères
Manuellement
Activation du pliage
:set foldenable
:set foldmethod
zi en mode normal
Replier le texte
zc en mode normal
zm en mode normal permet de tout replier
Déplier le texte
zo ou <Right> en mode normal
za en mode normal alterne entre plié/déplié
Coloration syntaxique
:syntax on active la coloration syntaxique
:set filetype défini le type du fichier
/* Démonstration */
<?php
asort($array);
function machin($array)
{
return array_keys($array)
}
?>
Buffers, fenêtres et onglets
Un buffer = un fichier
/* Démonstration */
:edit ceciEstUnBuffer.txt
:edit ceciEstUnautreBuffer.txt
Liste des buffers
:buffers
:ls
Buffer précédent et suivant
:bnext
:bprev
10 of 14 11/13/2009 03:28 PM
11. ~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
Editer un buffer
:buffer {nomDuBuffer}
:buffer {numeroDuBuffer}
Buffer != fenêtre
Une fenêtre pour un buffer
Un buffer pour plusieurs fenêtres
Un onglet = un ensemble de fenêtre
:tabedit
Manipuler les fenêtres
Séparer la fenêtre courante
:split
:vsplit
Ouvrir une nouvelle fenêtre
:new
:vnew
Se déplacer dans les fenêtres
Ctrl-W <Up>
Ctrl-W <Down>
Ctrl-W <Left>
Ctrl-W <Right>
/* Démonstration */
:new|new|new|vnew
Passer la fenêtre courante en plein écran
Ctrl-W _ en mode normal
/* Démonstration */
:new
:wincmd _
Fermer la fenêtre courante
:hide
/* Démonstration */
:new
:wincmd k
:hide
Fermer toutes les fenêtres sauf la fenêtre courante
Ctrl-W o en mode normal
/* Démonstration */
:new|new|new|3 wincmd k
:wincmd o
*/
Sessions
Possible de sauvegarder et restaurer à tout instant :
Les buffers en cours d'édition
La position et la taille des fenêtres
La configuration courante
:h mksession pour plus d'informations
11 of 14 11/13/2009 03:28 PM
12. ~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
Configuration
$HOME/.vimrc
$HOME/.gvimrc
$HOME/.vim
Plugins
Possibilité d'ajouter des fonctionnalités
taglist
http://www.vim.org/scripts/script.php?script_id=273
phpErrorMarker
http://www.vim.org/scripts/script.php?script_id=2794
myprojects
http://www.vim.org/scripts/script.php?script_id=2556
sherlock
http://www.vim.org/scripts/script.php?script_id=2731
upAndDown
http://www.vim.org/scripts/script.php?script_id=2586
Astuces pratiques
Changer la casse
~
/* Démonstration */
<?php
echo $_SERVER['request_method'];
?><FORM ACTION="" METHOD="POST"><?php
?>
Permuter le caractère sous le curseur et le suivant
xp
/* Démonstration */
<?php
ehco "toto";
?>
Permute la ligne suivante avec la ligne courante
ddp
/* Démonstration */
<?php
functionAAppelerEnSecond();
functionAAppelerEnPremier();
?>
Ouvrir le fichier correspondant au chemin d'accès sous le curseur
gf
/* Démonstration */
<?php
require('test.php');
?>
Incrémenter/décrémenter le nombre sous le curseur
<Ctrl>-A
<Ctrl>-X
/* Démonstration */
<?php
...
12 of 14 11/13/2009 03:28 PM
13. ~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
$this->assert->integer($integer)->isEqualTo(666);
$this->assert->hexa($hexa)->isEqualTo(0x9);
...
?>
Indenter
== indente la ligne courante
2== indente les 2 lignes suivantes
/* Démonstration */
<?php
function truc()
{
echo 'Ceci est mal indenté';
echo 'Et ca aussi';
echo 'Et ca aussi';
}
?>
Sélectionner en mode visuel le texte entre délimiteurs
va( sélectionne entre ( et ), délimiteur inclus
vi( sélectionne entre ( et ), délimiteur non inclus
va[ sélectionne entre [ et ], délimiteur inclus
vi[ sélectionne entre [ et ], délimiteur non inclus
va{ sélectionne entre { et }, délimiteur inclus
vi{ sélectionne entre { et }, délimiteur non inclus
/* Démonstration */
<?php
echo 'Bienvenue au forum PHP 2009 !';
echo $array['Ceci va être sélectionné'];
function machin()
{
echo 'Sélection !';
echo 'Sélection !';
echo 'Sélection !';
}
?>
Modification par bloc
Utilisation de la sélection visuelle par bloc <Ctrl>-V
/* Démonstration */
<?php
class truc
{
# On veut du public !
private $machin = null;
private $bidule = '';
}
?>
Édition à distance via ssh
:e scp://user@host/.vimrc
Intégration
Eclim (http://eclim.org/)
Vimplugin (http://vimplugin.org/)
13 of 14 11/13/2009 03:28 PM
14. ~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
Vimperator (http://vimperator.org/)
Ressources
:h est votre meilleur ami
:h <Tab> est un meilleur ami que :h
:h help
Site officiel (http://www.vim.org)
Wiki officiel (http://vim.wikia.com/wiki/Main_Page)
IRC (freenode.net, #vim)
A byte of VIM (http://www.swaroopch.com/notes/Vim)
Mailing-list
http://svn.mageekbox.net/repositories/vim/trunk
Google
Conclusion
VIM est
Un truc qui donne mal au crâne
Un éditeur de texte
Différent
Rapide et léger
Puissant
Multi-plates-formes
Modulaire
Qui évolue
Qui s'adapte à ses utilisateurs
Documenté avec une communauté importante
Long à apprendre
VIM n'est pas
Un remède contre le mal de crâne
Un IDE
Mais il peut s'en approcher via les greffons
Et il peut s'y intégrer
Citation
L'utilisation de vi n'est pas un péché,
mais une pénitence. (Richard Stallman)
Les auteurs
Matthieu Valleton
mvalleton@noparking.net
Frédéric Hardy
frederic.hardy@mageekbox.net
http://blog.mageekbox.net
Les fichiers de la conférence
http://svn.mageekbox.net/repositories/conferences/trunk/forumPHP2009
Remerciements
Bram Moolenaar
Andrei Zimieski
Jean-François Berroyer
Perrick Penet
L'AFUP
Le créateur du paracétamol
14 of 14 11/13/2009 03:28 PM