Click here to load reader
Upload
frederic-hardy
View
2.645
Download
1
Embed Size (px)
DESCRIPTION
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
Citation preview
Forum PHP 2009Paris - La Villette
VIM = VI IMproved !
Frédéric HardyMatthieu 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
~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
1 of 14 11/13/2009 03:28 PM
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
~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
2 of 14 11/13/2009 03:28 PM
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
~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
3 of 14 11/13/2009 03:28 PM
/* 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}
~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
4 of 14 11/13/2009 03:28 PM
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
~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
5 of 14 11/13/2009 03:28 PM
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
~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
6 of 14 11/13/2009 03:28 PM
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 |
~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
7 of 14 11/13/2009 03:28 PM
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,$
~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
8 of 14 11/13/2009 03:28 PM
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
~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
9 of 14 11/13/2009 03:28 PM
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
~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
10 of 14 11/13/2009 03:28 PM
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
~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
11 of 14 11/13/2009 03:28 PM
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 ...
~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
12 of 14 11/13/2009 03:28 PM
$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/)
~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
13 of 14 11/13/2009 03:28 PM
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 [email protected] Frédéric Hardy [email protected] 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
~/src/vim/forumphp/forumPHP2009/vim.txt.html file:///home/seeschloss/src/vim/forumphp/forumPH...
14 of 14 11/13/2009 03:28 PM