Informatique et liberté

23 juin 2009

VIM et son .vimrc : la gestion des templates

Classé dans : Planet Libre, Planet Vim-FR — Mots-clefs :, , — Phil @ 21 h 50 min

Une nouvelle astuce pour votre fichier de configuration de VIM : les templates. Il s’agit de modèles de document qui servent de base à la création d’un nouveau fichier correspondant à format donné. Ainsi, le développeur Web peut voir s’insérer automatiquement ses meta balises et autres basiques d’un document HTML structuré en éditant un nouveau fichier dont l’extension serait html.

Bon, là je suppose que je vais en faire réagir tant la manipulation peut paraître « disgracieuse » mais il s’avère que j’ai vu des choses pas forcément plus nobles dans certains scripts pour VIM alors du coup… À vous de me dire si vous avez mieux !

Ici, l’exemple choisit est celui du fichier HTML justement… On peut bien-sûr l’adapter à beaucoup de templates différents.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
" TEMPLATE-HTML <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
" TEMPLATE-HTML <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
" TEMPLATE-HTML <head>
" TEMPLATE-HTML         <title>blabla</title>
" TEMPLATE-HTML         <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
" TEMPLATE-HTML         <meta http-equiv="Content-Language" content="fr" />
" TEMPLATE-HTML         <meta name="author" content="Phil" />
" TEMPLATE-HTML         <meta name="generator" content="vim" />
" TEMPLATE-HTML         <meta name="keywords" lang="fr" content="fr" />
" TEMPLATE-HTML         <meta name="description" content="blabla" />
" TEMPLATE-HTML </head>
" TEMPLATE-HTML <body>
" TEMPLATE-HTML
" TEMPLATE-HTML </body>
" TEMPLATE-HTML </html>
 
call system("grep \"^..TEMPLATE-HTML\" ~/.vimrc | sed 's/^\" TEMPLATE-HTML //' > /tmp/vim_html.tpl")
autocmd bufNewFile *.html 0r /tmp/vim_html.tpl

Bien entendu, vous comprendrez que le but, pour le moment, n’est pas de discuter de la qualité du code HTML fait un peu à la va-vite mais bien de la technique employée. Mon idée est de n’avoir qu’un Vimrc et de me dispenser des fichiers de templates habituellement situés dans ~/.vim/templates. Cependant, VIM veut bel et bien un fichier comme source de travail pour son template. Du coup, j’ai opté pour la solution qui consiste à insérer directement le template (et les autres par la suite) dans le Vimrc (en commentant les lignes évidemment) en le préfixant par une chaîne facilement identifiable (dans mon exemple : TEMPLATE-HTML). Dès lors, il est aisé d’appeler la commande qui va bien via un « call system » de VIM pour lire le Vimrc (lui-même) afin d’en isoler par un bon vieux grep le template recherché et enfin (après un nettoyage à coup de sed) alimenter un fichier temporaire. La dernière instruction est une commande automatique pour VIM qui peut se traduire comme suit : « si le buffer est vierge (résultat un tabnew sans argument ou d’une ouverture de fichier inexistant par exemple) et que l’extension est HTML alors tu me donnes comme base de travail le contenu du fichier généré au-dessus ».

La technique est facilement adaptable pour tous les autres templates. Est-ce que ça vous paraît être une bonne façon de travailler pour qui veut se prémunir d’un Vimrc « portable » d’une machine à une autre sans s’encombrer du répertoire de VIM ? J’attends vos commentaires…

L’astuce peut être optimisée ! Si vous lisez les commentaires de cet article, vous comprendrez les détails de l’optimisation soumise par Sylvain et que j’ai adaptée à mes besoins en permettant notamment d’insérer des tabulations avant les templates :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
" Creation des templates {{{1
 
" Je teste le systeme car j'ai besoin de la commande GNU sed
if has("unix") || has("win32unix")
 
        " TEMPLATE HTML {{{2
        " <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        " <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
        " <head>
        "       <title>######</title>
        "       <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
        "       <meta http-equiv="Content-Language" content="fr" />
        "       <meta name="author" content="Philippe B." />
        "       <meta name="generator" content="vim" />
        "       <meta name="keywords" lang="fr" content="fr" />
        "       <meta name="description" content="######" />
        " </head>
        " <body>
        " 
        " </body>
        " </html>
        " END TEMPLATE HTML }}}2
 
        autocmd BufNewFile *.html call Template('HTML')
 
        function! Template(type)
                exe "0r !sed -n '/^.*\"\\s*TEMPLATE " . a:type . ".*$/,/^.*\"\\s*END TEMPLATE " . a:type . ".*$/ {s///;/^$/d;s/^.\" //;p}' $MYVIMRC"
                echo '--> INFO : Template ' . a:type . ' charge <--'
        endfunction
 
endif
 
" }}}1

Partagez cet article

  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Identi.ca
  • LinkedIn
  • MySpace
  • Netvibes
  • Reddit
  • Technorati
  • Twitter
  • Wikio FR
  • email

Ces articles pourraient vous intéresser...

6 commentaires »

  1. En effet, j’utilise cette astuce depuis que je l’ai découverte (presque à l’identique) il y a quelques mois sur le site d’Asher.
    http://achraf.cherti.name/blog/vim-avoir-un-systeme-de-templates-pour-programmeur/
    Vraiment très pratique.

    Commentaire par Ricard — 23 juin 2009 @ 23 h 16 min

  2. Et bien ne cherche pas, nous avons les mêmes lectures =) J’ai indiqué dans ses commentaires que j’avais modifié la gestion du template pour qu’il soit incrusté dans le VIMRC.

    Commentaire par Phil — 24 juin 2009 @ 0 h 56 min

  3. Y’a moyen de faire plus court et plus propre (tu gagnes un pipe et tu n’exécutes le sed que si c’est un .html et non systèmatiquement) en n’utilisant que sed et contrairement à ce que tu dis : tu n’es pas obligé de passer par un fichier (en fait Vim le fait mais c’est son brin, pas l’notre ;-))

    autocmd BufNewFile *.html 0r !/bin/sed ‘/^..TEMPLATE-HTML/\!d;s///’ $MYVIMRC

    Sinon sur le principe, c’est amha une bonne astuce même si on pourrait encore améliorer la chose en évitant par exemple la recopie de TEMPLATE_HTML sur chaque ligne, si j’ai l’temps et l’courage j’ferais un p’tit billet sur mon blog qui est est désespérément vide depuis des mois ! :(

    Commentaire par Sylvain — 24 juin 2009 @ 14 h 55 min

  4. Bonjour Sylvain, je suis ravi que mon astuce te plaise et encore plus que tu aies la bonne idée de m’aider à l’améliorer :)

    Alors pour le moment, je t’avoue que je n’ai eu le temps que de la tester très sommairement mais ton autocmd ne semble pas tout à fait au point. À creuser donc ces prochains jours (quand j’aurai un tout petit peu plus de temps). Je ne manquerai pas de poster mes remarques ! C’est vraiment gentil !

    Commentaire par Phil — 25 juin 2009 @ 7 h 41 min

  5. Attention : ton blog à modifié les simple quotes en backquotes, ça doit venir de ça parce que chez moi ça marche ;)
    Sinon hier soir j’ai commencé à écrire un billet contenant l’amélioration que je propose dans mon commentaire précédent, stay tuned ;)

    Commentaire par Sylvain — 25 juin 2009 @ 8 h 55 min

  6. J’ai pu tester ton astuce qui est excellente, une belle optimisation ! Là j’ai vu ton article sur ton blog et je vais modifié mon article pour y insérer ce que tu proposes.

    Merci pour tout !

    Commentaire par Phil — 27 juin 2009 @ 9 h 21 min

Flux RSS des commentaires de cet article. Adresse web de rétrolien

Laisser un commentaire

  • Flux RSS
  • Pages
  • Catégories
  • Archives
  • Étiquettes
  • Propulsé par WordPress