juil 24 2009

Afficher les caractères spéciaux dans Vim

Tag: Logiciels divers, VimSylvain @ 16:52

De temps à autre, lors de l’écriture de scripts, il m’arrive d’accompagner l’appui de la touche espace de sa voisine, la touche « ALT-GR » ce qui du coup crée une espace insécable, invisible sur le moment jusqu’à ce que le script plante (la plupart du temps après un « pipeALT-GR + 8 »)…

Heureusement, grâce à Vim, il est possible d’afficher certains caractères spéciaux via les variables « list » et « listchars ».

« list » permet d’activer l’affichage des caractères spéciaux, on l’active en tapant « set list » et on le désactive en tapant « set list! » ou « set nolist ».
« listchars » contient la liste des caractères spéciaux à afficher séparés par des virgules (le « c » après le « : » étant le caractère de remplacement à afficher) :

  • Fin de ligne : « eol:c »
  • Tabulation : « tab:xy » (« x » étant le premier caractère de la tabulation, « y » étant le reste qui peut varier)
  • Espaces de fin de ligne : « trail:c »
  • Débordement à droite de la ligne par rapport à l’écran : « extends:c »
  • Débordement à gauche de la ligne par rapport à l’écran : « precedes:c »
  • Espace insécable : « nbsp:c »

Voici, pour exemple, les paramètres provenant de mon fichier « ~/.vimrc » :

" Affiche les caractères spéciaux
set listchars=nbsp:¤,tab:>-,trail:¤,extends:>,precedes:<
set list

Avant :
VIM (list = false)

Après:
VIM (list = true)

Sympa, non ? Merci vim ! :)


juil 22 2009

Habillez vos commentaires facilement grâce à Vim

Tag: Logiciels divers, VimSylvain @ 13:20

J’ai pour habitude d’afficher de jolis commentaires bien démarqués du code source afin de pouvoir les lire très rapidement sans devoir les chercher. Hors, selon les langages de programmation, ceux-ci ne s’écrivent pas de la même façon. Je vous propose donc une petite macro (à placer dans votre « ~/.vimrc ») permettant d’habiller facilement vos commentaires ; celle-ci étant accessible grâce à la touche F8 en mode normal.

Voici la macro en question :

map <F8> :call Comment()<CR>

function! Comment()
    let ext = expand("%:e")

    if ext == 'html' || ext == 'htm'
        execute "normal yyPPI<!--^[lDjI   ^[j^DI-->^[j"
        return
    endif

    if ext == 'php' || ext == 'js'
        execute "normal I// ^[A //^[yyPv$r/yyjpj"
        return
    endif

    if ext == 'txt'
        execute "normal I| ^[A |^[yyPr+lv$r-$r+yyjpj"
        return
    endif

    if ext == 'tex'
        execute "normal I% ^[A %^[yyPr%lv$r/$r%yyjpj"
        return
    endif

    if ext == 'c' || ext == 'cpp' || ext == 'cc' || ext == 'h' || ext == 'hpp'
        execute "normal yyPPI/*^[lDjI   ^[j^DI*/^[j"
        return
    endif

    " Style de commentaire par défaut
    if ext == 'sh' || ext == 'py' || ext == 'pl' || 1
        execute "normal I# ^[A #^[yyPr#lv$r/$r#yyjpj"
        return
    endif
endfunction

J’ai deux petites remarques à faire :

  1. « ^[ » correspond à « ECHAP » que l’on écrit en appuyant sur « CTRL+V » puis « ECHAP »;
  2. le style de commentaire par défaut doit être sur la dernière ligne à cause du test « || 1 » qui dans tous les cas validera la condition.

Voici le résultat obtenu selon le format de fichier :

  • Extension du fichier html ou htm :

    <!--
       Hello GNU Squad !
    -->
    
  • Extension du fichier php ou js :

    ///////////////////////
    // Hello GNU Squad ! //
    ///////////////////////
    
  • Extension du fichier txt :

    +-------------------+
    | Hello GNU Squad ! |
    +-------------------+
    
  • Extension du fichier tex :

    %///////////////////%
    % Hello GNU Squad ! %
    %///////////////////%
    
  • Extension du fichier c, cpp, h ou hpp :

    /*
       Hello GNU Squad !
    */
    
  • Extension du fichier sh, py, pl et tout le reste :

    #///////////////////#
    # Hello GNU Squad ! #
    #///////////////////#
    

À vous d’agrémenter ou de modifier selon vos besoins, si vous avez besoin d’aide, n’hésitez-pas à passer par les commentaires ;)


juin 25 2009

Gérer ses templates pour Vim sans fichiers externes

Tag: Logiciels divers, VimSylvain @ 12:50

Suite à un billet posté sur le site Informatique et liberté évoquant une solution originale pour gérer ses templates avec Vim, j’ai décidé d’améliorer un peu la technique en utilisant la puissance de ce superbe éditeur combinée à celle de sed.

Habituellement, pour chaque template, nous créons un fichier externe placé dans notre dossier personnel ~/.vim. Prenons l’exemple d’un template HTML dans ~/.vim/templates/html que l’on appellerait de cette manière dans notre fichier de configuration ~/.vimrc :

autocmd BufNewFile *.html 0r ~/.vim/templates/html

Logiciels utilisés :

  • Vim 7.2
  • GNU Sed 4.2

Le but du jeu est de centraliser toute notre configuration dans notre ~/.vimrc et donc d’y inclure nos templates. Le seul moyen, à ma connaissance, est de mettre ceux-ci en commentaires afin qu’ils n’interfèrent pas avec le reste de la configuration, il ne restera plus alors qu’à trouver le template adéquat, pour cela on passera par des marqueurs de début et de fin de template, voici donc ma solution :

" BEGIN HTML
" <html>
"     <head>
"         <title>Hello gnusquad !</title>
"     </head>
" </html>
" END HTML

autocmd BufNewFile *.html call Template('HTML')

function! Template(type)
    exe "0r !sed -n '/^\"\\s*BEGIN " . a:type . "$/,/^\"\\s*END " . a:type . "$/ {s///;/^$/d;s/^\" //;p}' $MYVIMRC"
    echo '--> INFO : Template ' . a:type . ' charge < --'
endfunction

Nous retrouvons donc en première partie le template mis en commentaire et délimité par les marqueurs « BEGIN HTML » et « END HTML », la deuxième partie appelle la fonction « Template » avec en paramètre « HTML » lorsque l'on crée un nouveau fichier ayant son nom correspondant au motif « *.html », la troisième et dernière partie contient la fonction « Template » proprement dite qui prend donc un paramètre servant à délimiter le template, on y trouve une jolie ligne de sed qui paraît obscure à première vue mais qui est très simple : on localise et ne traite que la partie contenue entre « BEGIN xxx » et « END xxx », on supprime ces deux lignes puis les lignes vides puis on décommente le template, le tout étant inséré dans le buffer courant. :)

Vous aurez donc compris qu'il est très simple d'ajouter de nouveaux templates : il suffit juste que le paramètre passé à la fonction « Template » corresponde à la partie présente après « BEGIN » et « END » de votre template. ;)


mar 06 2009

Visualisez la hiérarchie de vos inclusions PHP avec « Inclued »

Tag: Debian GNU/Linux, Développement, Langages, PHP, SystèmeSylvain @ 20:58

L’extension PECL « Inclued » permet de tracer et d’enregistrer sous forme hiérarchique, l’ensemble des inclusions de fichiers durant l’exécution d’un script PHP.

Prenons pour exemple le monstrueux WordPress, voici ce que l’on peut obtenir :

WordPress Inclued

Mis à part le fait que ce genre de graphe est toujours sympa à voir, il permet de se faire une idée sur la qualité d’un code :

  • Pourquoi ce fichier est inclut alors qu’il n’est pas utilisé ?
  • Pourquoi ce fichier est inclut ici plutôt que là ?
  • Pourquoi ce fichier n’est pas inclus en utilisant les primitives *_once ?
  • Pourquoi les inclusions proviennent uniquement de ce fichier ?
  • etc.

Passons au vif du sujet ! Pour commencer nous allons installer les paquets nécessaires pour la suite des opérations :

  • php5-dev et make pour la compilation de l’extension
  • php5-cli et graphviz pour la génération des images
root@gnusquad:~# aptitude install php5-dev php5-cli make graphviz

Une fois ces paquets installés, téléchargeons l’extension « Inclued » et décompressons la d’un trait :

root@gnusquad:~# wget -q -O - http://pecl.php.net/get/inclued | tar zx

Compilons cette dernière :

root@gnusquad:~# cd inclued-0.1.0
root@gnusquad:~/inclued-0.1.0# phpize
root@gnusquad:~/inclued-0.1.0# ./configure
root@gnusquad:~/inclued-0.1.0# make

L’étape qui suit consiste à indiquer à PHP de charger cette nouvelle extension :

root@gnusquad:~/inclued-0.1.0# cp modules/inclued.so /usr/lib/php5/20060613+lfs
root@gnusquad:~/inclued-0.1.0# vi /etc/php5/conf.d/inclued.ini

extension=inclued.so
inclued.enabled=on
inclued.dumpdir=/tmp

On peut dès lors redémarrer le serveur web, Apache en l’occurence, sachant que désormais, chaque accès à un fichier PHP (via le web ou en CLI) générera un fichier dans le répertoire /tmp donc méfiance !

root@gnusquad:~/inclued-0.1.0# /etc/init.d/apache2 restart

Sachez qu’il est également possible d’activer l’extension au niveau du serveur web en utilisant les directives php_admin_flag et php_admin_value ce qui permet de limiter l’extension à un vhost par exemple. Malheureusement, et contrairement à ce qui est indiqué sur le site PHP, il n’est pas possible d’utiliser ces directives dans un fichier .htaccess.

Les fichiers générés n’étant pas directement des images, il faut les convertir à l’aide d’un script fourni avec l’extension que nous enroberons de notre propre script afin de nous faciliter la vie :

root@gnusquad:~/inclued-0.1.0# cp gengraph.php /usr/local/bin
root@gnusquad:~/inclued-0.1.0# cd $_
root@gnusquad:/usr/local/bin# vi gengraph

#!/bin/bash
echo "Generating file $1.png"
exec >/dev/null
php -d "inclued.enabled=Off" $(dirname $0)/gengraph.php -i $1 -o $1.dot
dot -Tpng -o $1.png $1.dot
rm $1
rm $1.dot

root@gnusquad:/usr/local/bin# chmod +x $_

Voilà, le plus dur est fait, il ne vous reste plus qu’à aller sur une page web PHP et à générer l’image :

root@gnusquad:/usr/local/bin# cd /tmp
root@gnusquad:/tmp# ls
inclued.00688.1
root@gnusquad:/tmp# gengraph inclued.00688.1
root@gnusquad:/tmp# ls
inclued.00688.1.png

À lire :

Mise à jour du 05 mai 2009 : pour effectuer la compilation encore plus simplement, il suffit de taper « pecl install channel://pecl.php.net/inclued-0.1.0 » et le tour est joué ! :)


« Page précédentePage suivante »