14

Click here to load reader

VIM puissance PHP = VI Improved !

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

Page 1: VIM puissance PHP = VI Improved !

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

Page 2: VIM puissance PHP = VI Improved !

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

Page 3: VIM puissance PHP = VI Improved !

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

Page 4: VIM puissance PHP = VI Improved !

/* 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

Page 5: VIM puissance PHP = VI Improved !

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

Page 6: VIM puissance PHP = VI Improved !

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

Page 7: VIM puissance PHP = VI Improved !

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

Page 8: VIM puissance PHP = VI Improved !

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

Page 9: VIM puissance PHP = VI Improved !

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

Page 10: VIM puissance PHP = VI Improved !

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

Page 11: VIM puissance PHP = VI Improved !

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

Page 12: VIM puissance PHP = VI Improved !

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

Page 13: VIM puissance PHP = VI Improved !

$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

Page 14: VIM puissance PHP = VI Improved !

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