vim est un IDE PHP

Publié le 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 :)

comments powered by Disqus