mageekblog Le blog personnel de Frédéric Hardy. Au menu, PHP, agilité, FreeBSD, cuisine et photographies.

Aller au contenu | Aller au menu | Aller à la recherche

cv | twitter | linkedin subversion atoum

Cadeau de noël pour les utilisateurs de VIM

J'ai souvent des commandes à exécuter lorsque je développe, comme par exemple :

#php symfony phpunit:unit path/to/test/file.php

Jusqu'à récemment, j'avais ajouté la ligne suivante à mon .vimrc pour ne pas avoir à sortir de VIM pour exécuter ce type de commande :

nnoremap <F12> :!php symfony phpunit:unit % 2>&1 \| more<CR> 

Ainsi, en appuyant sur la touche F12 de mon clavier, je déclenchais l'exécution du fichier de tests en cours d'édition.

Cette solution fonctionne, mais à quelques inconvénients induit par le fait que le résultat de la commande n'est pas affiché dans une fenêtre de VIM :

  1. Il n'est pas possible de conserver ou éditer les résultats de la commande.
  2. Si plusieurs tests ne passent pas, la sortie de la commande peut être très longue.

Bref, à l'usage, ce n'est pas le plus pratique.

La solution consiste donc à injecter le résultat de la commande dans un buffer afin de l'avoir dans une fenêtre et ainsi disposer de l'ensemble des commandes de VIM pour le manipuler.

Sur la base de cette astuce, j'ai donc ajouté à mon .vimrc le code suivant :

let s:_ = ''

function! s:ExecuteInShell(command, bang)
let _ = a:bang != '' ? s:_ : a:command == '' ? '' : join(map(split(a:command), 'expand(v:val)'))

if (_ != '')
let s:_ = _
let bufnr = bufnr('%')
let winnr = bufwinnr('^' . _ . '$')
silent! execute winnr < 0 ? 'new ' . fnameescape(_) : winnr . 'wincmd w'
setlocal buftype=nowrite bufhidden=wipe nobuflisted noswapfile nowrap number
silent! :%d
let message = 'Execute ' . _ . '...'
call append(0, message)
echo message
silent! redraw
silent! execute 'silent! %!'. _
silent! execute 'resize ' . line('$')
silent! execute 'au BufUnload <buffer> execute bufwinnr(' . bufnr . ') . ''wincmd w'''
silent! execute 'nnoremap <silent> <buffer> <LocalLeader>r :call <SID>ExecuteInShell(''' . _ . ''', '''')<CR>'
silent! execute 'nnoremap <silent> <buffer> <LocalLeader>g :execute bufwinnr(' . bufnr . ') . ''wincmd w''<CR>'
endif
endfunction

command! -complete=shellcmd -nargs=* -bang Shell call s:ExecuteInShell(<q-args>, '<bang>')

La commande suivante me permet donc maintenant d'exécuter la commande de mon choix et d'en obtenir le résultat dans une fenêtre :

:Shell php symfony phpunit:unit %

Cerise sur le gâteau, s'il existe déjà une fenêtre de résultat pour cette commande, elle sera réutilisée, afin de ne pas multiplier inutilement les fenêtres de résultat.

Et enfin, il est possible d'exécuter à nouveau la commande à partir de la fenêtre de résultat en tapant <localleader>r en mode normal, ou bien à l'aide de la commande :Shell!.

Et comme le code évolue rapidement, à tel point que je suis en train de me dire qu'en faire une extension serait intéressant, je vous conseille d'aller consulter mon .vimrc.

Forum PHP 2009

Comme l'année dernière, je serais au forum PHP, mais cette fois-ci en tant que conférencier.

J'y présenterais avec mon collégue Matthieu Valleton de chez no parking une conférence à propos de VIM.

Si vous n'êtes pas un fan d'emacs ou d'eclipse vous avez envie de découvrir la face cachée d'un éditeur gratuit, puissant et léger, alors, nous nous retrouverons le 12/11/2009 entre 14 h et 15 h.

Et pour les plus masochistes curieux, les fichiers utilisés pour la première mouture de cette conférence et sur lesquels nous nous appuierons pour la conférence du forum sont déjà disponibles.

Vim, un besoin, un plug-in !

Depuis quelque temps, je pestais lorsque je voulais effectuer un chercher/remplacer dans vim (un :s pour les initiés, pour les non-initiés, téléchargez vim, installez-le et faites un :h substitute).

En effet, lorsqu'on ne sait pas exactement ce que l'on veut remplacer, ou que l'on est un fainéant et/ou que l'on n'a pas envie d'avoir le bout des doigts carrés, ce qui est mon cas, il faut commencer par faire une recherche, récupérer le résultat de cette recherche, et enfin effectuer la substitution.

Il n'est pas possible de dire que cette procédure soit bien efficace...

Lire la suite...

Plus de 400 téléchargements de myprojects.vim en un mois !

Je ne m'attendais pas vraiment à cela.

Pourtant, le code est toujours en version alpha, même si le développement est rapide puisqu'il y a pratiquement une nouvelle version par jour à cause :

  • De l'implémentations de nouvelles fonctionnalités.
  • Du remaniement du code pour en améliorer la maintenance et l'efficacité.
  • Des inévitables corrections à apporter pour avoir un fonctionnement correct.

myprojects.vim vous permet donc actuellement :

  • D'avoir un panneau d'exploration de vos projects.
  • D'appliquer des filtres sur chacun des répertoires de vos projets.
  • De définir le rôle des touches F1 à F12 pour chaque fichier ou répertoire.
  • De définir le répertoire de travail de vim par fichier ou répertoire.
  • De définir la commande make pour chaque fichier ou répertoire.
  • De définir la variable errorformat pour chaque fichier ou répertoire.
  • De faire une recherche dans un fichier ou parmi tous les fichiers d'un répertoire, en fonction du filtre du répertoire.
  • D'utiliser subversion sur chaque fichier ou répertoire.
  • De naviguer parmi tous les buffers en relation avec le projet dans lequel vous êtes.
  • De sauvegarder votre session vim par projet.
  • De générer le fichier de tags de votre projet.

Et comme il s'agit dans les faits d'un fichier texte tout ce qu'il y a de plus banal, vous disposez donc de toute la puissance de vim pour le manipuler et le modifier.

J'ajouterais qu'il y a encore beaucoup de fonctionnalités de prévues, mais que toutes les suggestions sont les bienvenues.

Plug-in vim

Je viens de mettre officiellement à disposition mon premier plug-in vim.

C'est un clone de project.vim, qui utilise l'indentation au lieu de { et } pour définir les répertoires.

Lire la suite...

- page 1 de 2