Espace d'Asher256

Vim : comment mettre en place un système de templates pour le HTML, PHP, C++, Python, etc.





Dans cet article, vous apprendrez à configurer Vim de manière à ce qu’il insère automatiquement un contenu prédéfini dans tout nouveau fichier, selon son type.

Ce système de templates permet de gagner du temps, notamment pour les fichiers de programmation ou de balisage. Une fois configuré, Vim remplira automatiquement vos fichiers vierges avec une structure de base correspondant à leur extension.

Vim / gVim, éditeur texte, une icône

Les étapes pour avoir le système de templates avec Vim

Nous allons illustrer cette configuration avec un exemple simple pour les fichiers HTML.

Commencez par créer le répertoire de stockage des templates :

mkdir -p ~/.vim/templates

Créez le fichier ~/.vim/templates/xhtml.html et ajoutez-y le contenu suivant :

<!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>Titre de la page</title>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
    <meta http-equiv="Content-Language" content="fr" />
    <meta name="author" content="Prénom Nom" />
    <meta name="generator" content="vim" />
    <meta name="keywords" lang="fr" content="" />
    <meta name="description" content="la description de la page" />
   </head>
<body>
    <p>Contenu !</p>
</body>
</html>

Ajoutez la ligne suivante à votre fichier ~/.vimrc :

au bufNewFile *.html 0r ~/.vim/templates/xhtml.html

Cette commande indique à Vim d’insérer le contenu du fichier xhtml.html lors de la création d’un nouveau fichier avec l’extension .html.

Fermez Vim, puis créez un nouveau fichier HTML :

vim $HOME∕hello.html

Le fichier sera automatiquement rempli avec le contenu du template défini.

Utiliser un système de templates Vim avec d’autres langages (ex. PHP)

Prenons l’exemple du langage PHP.

La configuration est identique à celle utilisée pour le HTML. Il vous suffit d’adapter l’extension et le nom du fichier template.

  1. Créez un fichier ~/.vim/templates/php.php et ajoutez-y le contenu que vous souhaitez insérer automatiquement dans chaque nouveau fichier PHP.
  2. Modifiez votre fichier ~/.vimrc en y ajoutant la ligne suivante :
au BufNewFile *.php 0r ~/.vim/templates/php.php

Ainsi, chaque fois que vous créerez un fichier avec l’extension .php, Vim y insérera automatiquement le contenu du template défini dans php.php.

Cette méthode peut naturellement être répétée pour d’autres langages comme Python, C++, Bash, etc., en changeant simplement les extensions et les fichiers associés.





Déjà 11 commentaires dans “Vim : comment mettre en place un système de templates pour le HTML, PHP, C++, Python, etc.”
  1. gil gam

    Bonjour

    en applicant le contneu de cet article sur une ubuntu intrepid dernier modèle (je cherche à me perfectionner dans vi) cela ne focntionne pas j’ai une erreur

    E319: Sorry, the command is not available in this version: au bufNewFile *.html 0r ~/.vim/templates/xhtml.html
    Press ENTER or type command to continue

    Un idée pour y remédier ?

    Merci

  2. Asher256

    Il faut utiliser « Vim » et pas « Vi » pour que cela fonctionne.

    sudo apt-get install vim

    et lance Vim avec la commande « vim » et pas « vi » !

  3. Edmeral

    je crois que utiliser un éditeur WYSIWYG ou un IDE sera mieux je comprends pas pourquoi utiliser Vim alors qui y en a des outils plus pratique à mon avis

    http://edmeral.12r.org/

  4. Asher256

    Vim c’est pour les vrais geeks qui ont un cerveau remplaçant l’IDE 😛

    Les IDEs, c’est pour les autres 😛

    😀

  5. yohann

    merci pour les explication c’est très clair.
    je rencontre cependant un probleme:
    un saut de ligne est inseré a la fin du fichier:

    exemple:
    ~/.vim/templates/php.php:

    1
    ~

    vim new.php
    1
    3
    ~

    Je pense que c’est la ligne d’insertion originale qui est conservée et ajoutée à la fin du template.
    Rencontre tu aussi ce probleme?
    Y a t il un moyen pour que la dernière ligne du template corresponde à la dernière ligne du nouveau fichier?

    d’avance merci

  6. Phil

    Merci pour ton article. Je ne voulais pas faire d’autres fichiers (je veux que mon vimrc se suffise à lui-même) alors j’ai pensé à l’astuce suivante que je partage ici et que je posterai sur mon blog dans la lancée de mes config vimrc !

     » TEMPLATE-HTML
     » TEMPLATE-HTML
     » TEMPLATE-HTML
     » TEMPLATE-HTML ______
     » TEMPLATE-HTML
     » TEMPLATE-HTML
     » TEMPLATE-HTML
     » TEMPLATE-HTML
     » TEMPLATE-HTML
     » TEMPLATE-HTML
     » TEMPLATE-HTML
     » TEMPLATE-HTML
     » TEMPLATE-HTML
     » TEMPLATE-HTML
     » TEMPLATE-HTML

    call system(« grep « ^..TEMPLATE-HTML » ~/.vimrc | sed ‘s/^ » TEMPLATE-HTML //’ > /tmp/template_vim.html »)
    autocmd bufNewFile *.html 0r /tmp/template_vim.html

    Sur le même principe, on peut bien-sûr enchaîner les templates, là, c’est une adaptation du tien.

    Merci encore pour ton article de qualité !

  7. Phil

    Le code HTML n’est pas passé mais tes lecteurs comprendront que chaque ligne commentée et commençant par TEMPLATE-HTML est un copié/collé de l’exemple que tu fournis dans ton billet et que je recherche avec un grep avant de nettoyer ces fameux caractères pour obtenir mon template. J’alimente ainsi un fichier temporaire qui est relayé à la commande VIM que tu m’as apprise.

    J’ai conscience que ce n’est pas forcément une technique très propre… Je suis ouvert aux commentaires !

  8. Philippe

    Merci beaucoup pour cette astuce !
    C’est vraiment pratique 🙂

  9. barmic

    Bonjour,

    J’ai pleins de petites choses à rajouter 🙂

    Pour Phil :
    Tu peut remplacer
    call system(« grep \ »^..TEMPLATE-HTML\ » ~/.vimrc | sed ‘s/^\ » TEMPLATE-HTML //’ > /tmp/template_vim.html »)
    par call system(« sed -n ‘s/^\ » TEMPLATE-HTML //p’ ~/.vimrc > /tmp/template_vim.html »)
    Comme ça la commande est plus simple.
    Ensuite tu peut faire directement appel à un programme externe avec la commande r donc tu peut faire ça :
    autocmd bufNewFile *.html 0r!sed -n ‘s/^\ » TEMPLATE-HTML //p’ ~/.vimrc

    Je pense qu’il est possible de faire plus simple encore en n’appelant pas sed (et rester en vim de bout à bout), mais je sais pas encore comment.

  10. barmic

    Ensuite (je le fais en deux commentaires pour me simplifier la vie) j’ai moi même mon propre moteur de template. L’interêt du mien c’est que les modèles sont dynamique. En effet il est possible de définir des champs qui seront remplis au moment voulu (par exemple la date ou le nom du fichier).

    Je rajoute une ligne dans mon .vimrc :
    au BufNewFile * silent! call LoadTemplate(‘%:t’, ‘%:e’)

    La fonction LoadTemplate est définie ainsi :
    function! LoadTemplate(name, extension)
    echohl Todo
    echo a:name
    echohl None
    let bou = expand(‘%:e’)
    silent! execute ‘0r ‘ . $HOME . ‘/.vim/template/’ . bou . ‘.tpl’
    silent! execute ‘source ‘ . $HOME . ‘/.vim/template/autocompletion.vim’
    endfunction

    Voici mon fichier autocompletion.vim :
    :%s//\=strftime(« %A %d %B %Y »)/ge
    :%s//\=expand(‘%:t’)/ge
    :%s//\=expand(‘%:t:r’)/ge
    let macro = substitute(expand(‘%:t’), ‘\.’, ‘_’, ‘g’)
    let macro = ‘__’ . toupper(macro) . ‘__’
    :%s//\=expand(macro)/ge

    let nom = system(« sed -n -e ‘s/^’$USER’:x:[0-9]*:[0-9]*:\([^,:]*\)[:,].*$/\1/p’ /etc/passwd »)
    :%s//\=nom\b/ge

    3match Todo //

    Et pour exemple le fichier h.tpl :
    #ifndef
    #define

    #endif //

    Il y a encore du boulot pour ne plus faire appel à des commandes externes (lors de la récupération du nom d’utilisateur). Mais c’est assez efficace.