vim est un IDE PHP

08/12/2008

Après pas mal de temps passé sur Eclipse, la lourdeur en mémoire, les problème d’encoding qui apparaissent, et j’en passe, j’ai entrepris de repasser à vim pour travailler. “Il est fou” je vous entend dire, “n’importe quoi, encore un geek qui veut trop en faire” j’entends encore… pourtant si je repasse à vim c’est qu’il y a une raison. D’abord j’aime utiliser le terminal, c’est très rapide pour travailler sur un lot de fichier, c’est plus clair pour beaucoup d’opéarations et je peux rapidement switcher de vim au terminal **en pressant CTRL+Z et en revenant sur vim en tapant la commande “fg”**. Mais en plus Vim est configurable en profondeur, il me permet de créer des fonctions d’une puissance rare, l’auto-completion est bien gérée, la vue en plusieurs fenêtres et/ou en colonnes… vous allez voir, je vais vous montrer, c’est étonnant !

Ce ne sera pas Damien qui dira le contraire, vim est bien plus qu’un simple éditeur de texte. Il peut rapidement se transformer en un véritable IDE, à condition se s’entrainer un peu. Je vais donc vous montrer ma configuration (de base) que j’ai mis sur Vim afin de travailler en PHP. Je vais aussi vous présenter comment utiliser les plugins de vim. Attention tout de même, j’estime ici que vous savez utiliser vim de manière basique (édition, enregistrement, copier coller… ), si ce n’est pas le cas allez d’abord faire un tour sur la page http://geekblog.over-blog.com/article-5884386.html que je trouve plutôt bien fichue.

Avant de commencer, créez (si il n’existe pas) un répertoire caché nommé “.vim” dans votre répertoire personnel. Simplement dans un terminal:

mkdir -p ~/.vim

Ce répertoire va nous servir à déposer les plugins, les docs, et quelques scripts vim que nous pourrons nous concocter plus tard.

Voilà donc un petit aperçut du à quoi mon vim ressemble (**cliquer sur la loupe en bas des images pour agrandir**) et surtout ce que nous allons paramètrer dans ce billet:

D’abord, la vue multi avec **//Project//**:\\ \\ \\

Voilà, on y est, on va se paramétrer vim pour travailler avec: -PHP -Subversion -un Framework (Copix, Symphony,…) Ce qui nous intéresse donc, c’est de travailler sur un **projet** et donc que vim puisse gérer cela. Et bien on commence donc par prendre le plugin Project. Ce plugin va permettre de gérer un ou plusieurs projets avec en prime une bonne gestion de “maps” (des raccourcis) qui seront utiles.

La gueguerre avec Emacs…

A tous ceux qui sont fans de Emacs, ne venez pas ici pour taper sur Vim comme quoi Emacs c’est trop fort, vim c’est trop dur… etc… passez votre chemin ou vos commentaires seront supprimés :)

Oui, Emacs c’est très bon, c’est puissant, mais chacun ses goûts, personnellement je n’aime pas… c’est tout… et heureusement le monde libre est ouvert à l’alternative, à la différence et à la joie d’un écosystème de logiciels adaptés et adaptable à chacun…

Vim m’a plut bien plus que Emacs, si vous avez des ressources Emacs et que vous les donnez en commentaire sans troll mesquins, je les laisserait évidemment sur ce ticket. Je n’ai aucune animosité envers Emacs, je pense même m’y pencher un peu plus sérieusement plus tard.

Vim, les paquets dont je me sers

Afin de ne pas se retrouver comme un âne devant un vim qui ne colore rien et qui refuse les plugins, **assurez vous d’avoir bien “vim” et non “vim-tiny” !** En effet, vim-tiny est un vi minimaliste qui ne va pas pouvoir gérer grand chose. Il nous faut un “vim” version 7 minimum.

J’uitilise aussi très souvent **“ctags” et/ou “exhuberant-ctags”** (selon la distribution utilisée), qui permet de redéfinir les “tags” d’un projet pour autocompletion. Etant donné que nous allons utiliser un framework dont les fonctions et classes ne sont pas forcément définies dans la doc PHP, il est intéressant de pouvoir tout de même avoir cette liste dans la completion de mot. Nous ferons un raccourcis pour rafraichir.

Un dernier point, si nous codons en PHP, il est judicieux d’avoir une version cliente de php (généralement le paquet s’appelle **php-cli**) qui va nous permettre de faire de la vérification syntaxique de notre code. Il est aussi possible d’utiliser php_codesniffer (dans les paquets PEAR) mais qui risque de retourner beaucoup d’erreurs…

Télécharger les plugins et syntaxes

Voici la totalité des plugins et fichiers dont j’ai besoin pour vim, je vous présente les lignes à taper pour aller plus vite:

cd /tmp
wget http://www.vim.org/scripts/download_script.php?src_id=6273 -O project.tar.gz
tar zxvf project.tar.gz -C ~/.vim
rm -f project.tar.gz

cela télécharge le fichier (avec wget), décompresse l’archive dans ~/.vim puis supprime l’archive inutile.

Continuons, j’aime bien automcompleter mes fichiers PHP, le script word_complete est plutôt bien fichu, donc on l’installe:

wget http://vim.sourceforge.net/scripts/download_script.php?src_id=6504 -O ~/.vim/plugin/word_complete.vim

Reste un dernier plugin que j’aime beaucoup, je travailler avec une équipe sur subversion, donc il me faut quelque chose qui me permet de rapidement commiter, faire un diff, voir un log… Et le plugin VCSCommands est bien adapté, alors je l’installe:

cd /tmp
wget http://www.vim.org/scripts/download_script.php?src_id=9279 -O vcscommands.zip
unzip vcscommands.zip -d ~/.vim/
rm -f vcscommands.zip

Voilà voilà… on a mis à peu près tout ce dont j’avais besoin en plugins vim. Maintenant on passe à quelques petits réglages, d’abord j’ai besoin des fonctions PHP listées dans un fichier afin de définir à vim quoi compléter :) Une bonne liste existe, celle de “scintilla” que je vais récupérer:

wget http://www.scintilla.org/php.api -O ~/.vim/syntax/php.api

Nous en avons fini avec nos téléchargements, passon maintenant au paramétrage de vim.

Préparer vim

Il est donc temps de configurer notre vim avant de continuer à travailler. Fermer vim si vous l’avez ouvert (cela permettra de voir les modification directement après nos modifications à la porchaine ouverture) et attaquons nous au fichier ~/.vimrc (il se peut qu’il n’existe pas, vous pouvez le créer).

Voici donc mes options et redéfinitions:

" Let unix format, utf8, see line number... etc...
set fileformat=unix
set encoding=utf-8
set number
syn on
set nocompatible 

"My prefered values :)
set shiftwidth=4
set tabstop=4
set nowrapscan
set ignorecase
set expandtab
set showtabline=2
set foldmethod=marker
set hlsearch


"Use mouse... comment this if you don't like
set mouse=a


" autocommads on php files
set complete=.,w,b,u,t,i,k~/.vim/syntax/php.api
autocmd FileType php set omnifunc=phpcomplete#CompletePHP
source ~/.vim/plugin/word_complete.vim
call DoWordComplete() 

" <Leader> is "\"... but on azerty keyboard it better to use "," wich is more accessible
:let mapleader = ","

"Use Project"
runtime! ~/.vim/plugin/Project.vim


" Create tags with '\1' command
function! Phptags()    
    "change exclude for your project, here it's a good exclude for Copix temp and var files"
    let cmd = '!ctags -f .tags -h ".php" -R --exclude="\.svn" --exclude="./var" --exclude="./temp" --totals=yes --tag-relative=yes'
    exec cmd
    set tags=.tags
endfunction
:let g:proj_run1='call Phptags()'

"to remap \1 on ,1
nmap ,1 \1

" F9 will do a PHP lint !
set makeprg = "php -l %"
nmap <F9> :make<ENTER>:copen<ENTER><CTRL>L


" \2 on project view will svn update current directory
:let g:proj_run2='!svn ci %R'

" \5 on project view will commit current directory
:let g:proj_run5='!svn up %R'

Pour résumer, j’ai défini que je travaillais tout le temps en mode “unix” (retour chariot ==> \n), en utf8, que je veux toujours voir les numéros de ligne, que je veux la coloration syntaxique si possible…

Mais aussi, une tabulation en 4 espaces, que j’ignore la casse de caractère pour la recherche, et que je veux pouvoir plier le code (fold).

La souris marche bien dans la console, je veux pouvoir l’utiliser pour redimensionner mes fenêtre vim (vous verrez après), et je défini comment je vais autocompléter mes mots php si je suis dans un fichier php.

Un truc important, vim utiliser “\” pour pas mal de commande, ce caractère se nomme “Leader”, sur un clavier AZERTY c’est plutôt contraignant, je le redéfini donc en une virgule ‘,’ afin d’aller plus vite.

Je me suis créé une petite fonction qui appelle “ctags” sur mon projet afin de générer la completion sur PHP dans mon projet, je remape aussi “\1” par “,1”, à priori certains raccourcis n’ont pas été bien écrit…

Je défini que mon “make” est en fait un appel à “php -l” pour vérifier ma syntaxe de fichier et j’utilise la console d’erreur pour voir les soucis… Je me mappe ça sur la touche F9 (souvent c’est la touche utilisée pour compiler un projet…)

Voilà, à vous de modifier, ajouter, supprimer des trucs…

  • - //notes://** les variables g:proj_runW fonctionnent seulement dans la vue projet, c’est à dire dans l’arborescence à gauche (que nous allons voir après), en fait vous pouvez en définir 9: g:proj_run1, g:proj_run2, g:proj_run3… Je les défini pour le projet car un peu sensible, et surtout j’avais besoin des chemins… On verra plus tard.
Travaillons

C’est parti !

Le plugin Project

Le reflexe à prendre est de lancer vim avec l’option “+Project” qui chargera directement la vue projet dans vim. Reste à configurer un projet. Il suffit de presser “\c” et de répondre aux questions.

Par exemple, mon projet Copix est dans ~/public_html/copix_trunk. Je déclare donc que le projet est dans ce chemin, et je donne le même chemin à la seconde question en ce qui concerne le “CD” (préfix qui permet de se placer dans un répertoire avant d’effectuer une commande)

en terme de filtre, pour Copix, je donne *.php *.css *.js *.tpl *.ptpl *.properties *.xml, vous pourrez le modifier par la suite si vous en avez oublié un. Dés lors, le répertoire est parsé et la liste des fichier apparait en arborescence sur la fenêtre de gauche.

Pour aggrandir rapidement cette vue, pressez la touche **ESPACE**. En sélectionnant un fichier, pressez **ENTREE** et le fichier s’ouvre sur la droite. Voilà donc déjà un bon point d’entrée pour travailler en projet.

Chaque fois que vous allez sur la fenêtre de gauche, vos commandes seront appliquées au répertoire défini dans CD (la réponse à la seconde question de création de projet).

Par exemple, pour la recherche dans les fichiers, allez dans la vue projet, allez dans la vue projet puis pressez “\G”, on vous propose une recherce à laquelle vous pouvez ajouter des options… j’aime utiliser “-iHn blablabla” ce qui va rechercher “blablabla” et me donner une vue globale de ce qu’il trouve, pressez **CTRL+L** pour rafraichir un peu la vue si vous avez des souci de rafraichissment. Vous pouvez vous balader dans les occurences trouvées dans le vue du bas, comme dans Eclipse :)

Bref, vous pouvez faire une recherche dans la vue projet comme dans un fichier (:/nom_de_fichier) et passer d’un fichier à l’autre avec la touche “n”, Shift+N servant à revenir en arrière. Je trouve ce truc supra pratique…

Pour enregistrer le projet, pressez dans sa vue (donc en **allant dans la vue de gauche**) “:w”, vous pourrez enregistrer plusieurs projets de cette manière, le plugin se débrouille tout seul. Son index se trouve dans .vimprojects à la racide de votre “home”. Vous pourre même l’éditer pour modifier des choses dedans !

Le plugin word_complete

Si tout se passe bien, en éditant un fichier php, vous allez avoir la completion qui va apparaitre, commencez par taper “str” par exemple… puis faites la combinaison **CTRL+N_P” (touche contrôle pressée, tapez N puis P)… et hop vous avez les deux possibilités qui apparaissent, vous pouvez vous déplacer dans la liste avec les flèches et choisir la bonne fonction.

Toutes les variables, les fonctions, les classes que vous créez dans ce fichier seront alors utilisables par la completion. **Mais ce n’est pas tout !**, nous allons utiliser **ctags** pour créer notre dictionnaire de mots pour le projet.

Allez sur le projet et pressez “,1”, hop la commande de génération de tags PHP commence, puis nous revenons dans vim, maintenant les classes et fonctions php de notre projet sont accessible dans la completion.

Plugins Subversion et CVS

Avec le plugin VCSCommands, vous aurez à loisirs de faire : -,cl pour voir le log de votre fichier -,cd ou ,cv pour voir un diff normal ou en vue splittée -,cc pour commiter -,cu pour updater

et bien d’autre encore à lire dans la doc ~/.vim/doc/vcscommands.txt

Racourcis en plus

-CTRL+W puis s split la vue horizontalement, -CTRL+W puis v split la vue verticalement,

N’oubliez pas les racourcis de base, La touche Echap passe en mode normal puis: -dd coupe la ligne -yy la copie -p la colle -passe en mode visual

Faire ces propres racourcis ou commandes

Réellement, vim n’est pas qu’un simple éditeur, c’est une mini framework bien pensé et complet qui permet d’étendre ses capacités à un point que vous ne pouvez pas imaginer. J’aodre mapper rapidement des choses dans vim en tapant simplement:

Echap
:map <Ctrl>j ma_commande<ENTER>

Les commandes shell sont précédées de “!”, par exemple:

Echap
:map ,l !'ls -la'<ENTER>

N’oubliez pas le pour simuler la touche “Entrée”, sinon cela va jute vous assigner la commande sans l’executer, il faudra alors valider; d’un autre coté… ça peut être utile :)

===== Comment ça se passe alors ====

En gros, ma séquence de travaille est:

vim +Project
#création de projet si ce n'est pas le cas, sinon il s'ouvre automatiquement

#dans la vue projet (selection avec CTRLW <-- (flèche gauche))
\5

#svn mis à jour... je continue

#je bosse... je bosse... de temps en temps un F9 sur un fichier pour voir les soucis de syntaxe

#tien j'ai fait quoi sur ce fichier ?
,cv

#ha oui ok..., bon je peux le commiter:
:q
Echap ,cc

#je décide de commiter un répertoire:
#je vais la vue projet, je me place sur le répertoire et 
\2

#je quitte
:qa

#je rentre chez moi :)

Bref, vous l’aurez compris, en connaissant quelques raccourcis, en s’entrainant, on va **très très vite** par la suite !!

Retenez juste les raccourcis dont vous avez besoin, ou mieux, faites vos propres maps ! -map A B (pour mapper la commande dans tous les cas) -nmap A B (pour mapper la commande en mode “Normal”) -imap A B (pour mapper la commande en mode “Insertion”) -etc… allez vois la doc ou tapez :help map dans vim

Bref, voilà… je pense faire une vidéo de présentation un de ces 4… sur ce, amusez vous !

Et pour la suite

Je pense créer un plugin pour Copix, mais alors sans promesse et surtout si j’ai rien à faire un soir :)

Ça peut vous intéresser aussi


Thread PHP dans Copix

Alors qu’on discutait sur le canal #fedora-fr de langages,...


Optimisations Copix PHP et Apache

Les temps de réponse… Dieu sait à quel point cela ...


Thread PHP dans Copix via HTTP

Dans le précédent post Thread PHP dans Copix, j’ai présenté la ...


PHP vs Java

On vient de lever la polémique au taff et du ...

Merci de m'aider à financer mes services

Si vous avez apprécié cet article, je vous serai reconnaissant de m'aider à me payer une petite bière :)

Si vous voulez en savoir plus sur l'utilisation de flattr sur mon blog, lisez cette page: Ayez pitié de moi

Commentaires

Ajouter un commentaire

lolo - 19/02/2009

génial ces infos, merci !

Luc Martineau - 08/07/2009

Bonjour,

Je viens de mettre en place la configuration mentionnée.

Je dois dire que je n’ai pas apprécié le plugin WordComplete.

À chaque lettre que l’on tape, on me présente toutes les possibilités. Lorsque je tape var_dump par exemple j’ai déjà terminé de taper le “a” alors que l’on est en encore en train de me présenter les choix des items commençant par v. Le a n’est pas “capté” et je me retrouve avec quelque chose comme vr_dump…

Probablement que ma machine n’est pas assez puissante. Je dois dire que xorg m’en fait voir de toutes les couleurs depuis que je passé à Fedora 11. Mais c’est une autre histoire.

Malgré ma douloureuse expérience (ça m’a pris quelques temps de comprendre qu’il fallait que je détruise les fichiers dans $HOME/.vim/view pour que le plugin WordComplete soit ignoré…) j’ai très apprécié la qualité des informations. Ce fut tout de même enrichissant.

Bravo!

Luc

Metal3d - 08/07/2009

Et bien j’avoue que Wordcomplete est assez encombrant pour moi aussi mais il suffisait simplement de supprimer la ligne:

call DoWordComplete()

du fichier vimrc que je fourni. Bref, en ce qui concerne Fedora 11 je n’ai (au contraire) plus aucun souci avec Xorg… Il faudrait aller voir les gens du forum Fedora dans ce cas.

En tout cas, vim (tout comme Emacs) est véritablement une mine de possibilités et de fonctionnalités. Quand on l’a pris en main et qu’on connait les raccourcis, sa productivité est au delà de tout IDE que l’on peut trouver.

Je n’utilise plus Eclipse ou Netbeans depuis des semaines, vim est largement au dessus de toutes mes attentes. Mais j’avoue qu’il faut vraiment s’entrainer et retenir des raccourcis pas forcément évident au premier abord.

teke - 11/07/2009

Bonjour et merci pour le billet.

j’aurais juste une question : comment attendre la touche mappée par “,l” ?

si je fais : ,l | :,l | ctrl-l | alt-l cela ne me donne rien.

ou… que veut dire le ,l ? touche l ou, mais en combinaison avec ? merci d’avance !!!

Metal3d - 13/07/2009

@teke je n’ai pas compris ton souci mais je vais tenter de répondre quand même.

Normalement, les raccourcis Vim de base commencent par “\” mais comme sur un clavier azerty ce n’est pas pratique je change ce “mod”. A la place je préfère utiliser “,”.

Pour faire “,1” tu dois simplement faire “Echap” pour quitter le mode édition ou le mode commande, et pressez ensuite “,1”.

Maintenant je vois pas trop où tu bloques…

teke - 14/07/2009

Merci pour la réponse.

et bien lorsque, en mode commande, je tape “,l” il me répond : “E20: Marque non positionnée”…

Simon - 15/04/2010

Excellent tutoriel ! J’utilise déjà vim tous les jours mais je ne connaissais pas ce plugin project qui va changer ma vie :)

IgiX - 07/06/2010

Excellent! pour débuter vim : il existe la commande vimtutor :)

charles - 19/10/2010

Moi, j ai un gros problème, j ai voulu installer le plugin project pour améliorer mon vim, j ai voulu créer un projet à partir d’une path qui contient deja un de nos projet php (juste une suite de dossier et de fichiers). Le problème est que lorsque je crée mon projet en spécifiant la racinne du dossier contenant mes fichiers et sous dossiers il ne me liste que les fichiers present à la racinne et ne fait pas de recherche récurssive .. c est embetant , une idée ?

pong - 05/12/2010

merci pour le petit tuto concernant cvscommand, vraiment très pratique. Le diff vertical sur le fichier courant est must-have

En revanche je préfère NERDTree et ses bookmarks (qui permettent de passer facilement d’un projet à un autre du coup) à project.

Nicolas - 04/04/2012

Excellent tuto effectivement ! Merci à toi ;)

Baronsed - 11/11/2012

Chez moi, F9 ouvre bien un nouveau buffer, mais aucun message d’erreur ne s’y affiche…

Et est-ce que tu aurais une idée pour amener le curseur aux positions successives des erreurs ?

mansoulx - 15/11/2012

Excellent le post ! j’ai parametré l’autocompletion et tout, et tout fonctionnait bien, je sais plus quelle manip j’ai fait et maintenant mon Project affiche seulement les fichiers qui sont dans la racine du repertoire absolu spécifié, mais pas les sous repertoires , need help !!!

Ajouter un commentaire

(*) Votre e-mail ne sera ni revendu, ni rendu public, ni utilisé pour vous proposer des mails commerciaux. Il n'est utilisé que pour vous contacter en cas de souci avec le contenu du commentaire, ou pour vous prévenir d'un nouveau commentaire si vous avez coché la case prévue à cet effet.