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.

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.
- Créez un fichier
~/.vim/templates/php.php
et ajoutez-y le contenu que vous souhaitez insérer automatiquement dans chaque nouveau fichier PHP. - 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.
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
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 » !
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/
Vim c’est pour les vrais geeks qui ont un cerveau remplaçant l’IDE 😛
Les IDEs, c’est pour les autres 😛
😀
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
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é !
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 !
Merci beaucoup pour cette astuce !
C’est vraiment pratique 🙂
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.
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.