vim est un IDE PHP

Tags:: vim :: linux :: php :: copix

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:
vim_multidownload
vim_lintdownload
vim_grepdownload

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 <ENTER> 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 :)

Utilisez le code barre pour ouvrir le ticket dans votre mobile:
This ticket on you mobile
1 Jeudi 19 Février 2009 23:10:04, lolo

génial ces infos, merci !

2 Mercredi 08 Juillet 2009 04:32:49, Luc Martineau

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

3 Mercredi 08 Juillet 2009 11:38:04, Metal3d

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.

4 Samedi 11 Juillet 2009 16:36:19, teke

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 !!!

5 Lundi 13 Juillet 2009 13:41:03, Metal3d

@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...

6 Mardi 14 Juillet 2009 09:58:21, teke

Merci pour la réponse.

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

7 Vendredi 25 Septembre 2009 00:55:20, yohann

je viens de remplacer le wordComplete par snipMate,
c'est une tuerie ce plugin, je ne peux que vous le conseiller!
prise en main hyper rapide, et efficacité maximum.

une petite video valant toujours mieux qu'un long discours:
http://www.vimeo.com/3535418

sinon merci pour cette belle présentation!

8 Jeudi 15 Avril 2010 16:48:36, Simon

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

9 Lundi 07 Juin 2010 20:20:04, IgiX

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

10 Mardi 19 Octobre 2010 11:02:02, charles

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 ?

11 Dimanche 05 Décembre 2010 23:23:51, pong

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.

Ajouter un commentaire
Veuillez répondre à la question suivante : Combien font un et deux, indiquez la réponse en chiifre

Trackbacks

Pour ajouter un trackback (retrolien) sur ce ticket, utilisez cette adresse: http://www.metal3d.org/index.php/trackback/default/tb?id=blog%2F160

Tags

Blog Copix Communication PC Config Fedora Vidéo Humour Autre Web Materiel Informatique PHP Développement Mootools HTML Linux WEB IE CSS Vista Microsoft Sympa XHTML Quizz Widget Klik CWE Voeux Bonne année Musique CCRMA Son Audio MAO Reconnaissance vocale Windows Mac Compiz MacOS Mysql Sun Base de données BD Screenlets Screenlet RPM compiz Ubuntu Live FireFox Derambarsh Facebook media informations Sécurité javascript SSH Commande Marketing concours ipod wii QT Trooltech Nokia Libre Logiciels GPL Attali Gnome Dock Compiler Bench undelete reiserfs recovery recover Thread Serveur Optimisation Server Apache Album RSS Flash Air XML Firefox Blender Opensource Orange Internet LiveBox Animaux Droits Logiciels Libres Google Loi RBS netcat Bash Téléphone Spam 3D NIDIA Standards Widgets Merise UML Streaming Developpement Perl MySQL Firewall Parfeu Bayes Novell Réseau Python LVS Salon FTP Dedibox Chrome Administration IRC Gentoo troll video Nouveauté Finance Etudiant spéctacle OpenOffice Javascript Java Info Eclpise ATI design mootools KDE Bureau Design GNU C Pages Jaunes Fun Bijoux Art mail Admin vmware fedora linux VirtualBox VMWare Qemu KVM vim Grep Fglrx Webkit GTK google web JQuery Coup de gueule coup de gueule Lois SVG Raycaster Canvas Hadopi Desktop Jeux Les Sims développement astuces Screen firefox Mobile Safaru Wine bash commande astuce Wave ooc C++ C# Netbook Hercules Bureautique Twitter Safari W3C chrome kazehakaze midori navigateur gecko webkit Links Liens Pyhon Nouvelles Metal Perso Conférence JDLL PCC Roadsend OOC News Acteur Cinéma Chanteur Seven windows orthographe pcc php jdll Slide Application mysql Html twitter python screen curses SVN Android Gphone iPhone OpenGL MindMap Projet Javascrtip Ajax Guitare Tab Tablature JSON firebug Chromium Iphone Titanium music sound android ogg ogv streaming Arkyne svn subversion gnome VLC Tv encoder ffmpeg Cryptage apple microsoft HTML5 Max Apple code youtube quvi git uzbl webgl chromium

  Catalogue professionnel de musique libre


  • twitter entries...
follow me on Twitter

Valid XHTML 1.0 Strict

tumblr visitor