summaryrefslogtreecommitdiff
path: root/d/tools/vim/plugin/template.vim
blob: 715898642247dfe02408cc15238b43f864ea41e4 (plain)
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
" Name:		ni-template
" Author:	Nicolas Schodet <schodet@efrei.fr>
" Last Update:	2005-07-23
" Version:	0.83
" Description:	Chargeur de templates.
" License:	Domaine public.
" Installation:	Mettre le script dans &runtimepath/plugin, et les templates
" 		dans &runtimepath/templates.
"
"		Appeler la commande :Template [filetype] pour charger un
"		template. filetype est optionnel, il est detect� sinon.
"
"		La commande :TemplateHeader essaye de d�tecter si le fichier
"		est un en-t�te (h au lieu de c, hpp au lieu de cpp).
"
"		Exemple : Mettre le script dans ~/.vim/plugin, et les
"		templates dans ~/.vim/templates. Mettre une autocommande :
"		au BufNewFile * TemplateHeader
"
" Usage:	Les fichiers de templates peuvent contenir des expressions
"		remplac�es par le script :
"		 @DATE@ : Tue Jan 28 00:42:47 2003
"		 @ISODATE@ : 2003-01-28
"		 @YEAR@ : 2003
"		 @FILE@ : template.vim
"		 @FILEBASE@ : template
"		 @FILECAP@ : TEMPLATE_VIM
"		 @FILEDEF@ : template_vim
"		 @AUTHOR@ : valeur de g:fullname
"		 @EMAIL@ : valeur de g:email
"		 @NICK@ : valeur de g:nick
"		 @WEB@ : valeur de g:web
"		 @COPYRIGHT@ : valeur de g:copyright
"		 @%...@ : utilise expand pour construire un nom de fichier
"		 @!...@ : evalue une expression VIM
"		 @=...@ : evalue une expression VIM et remplace par le
"		 	  r�sultat.

if exists('g:ni_template_plugin') | finish | endif
let g:ni_template_plugin = 1

function! s:Eval(expr)
   exe 'return' a:expr
endf

function! s:Exec(expr)
   exe a:expr
   return ''
endf

" Find a template file for a given filetype.
function! s:Template_find_file(ft)
   if exists ('b:template_variant')
      let template_file = globpath (&runtimepath, 'templates/' . b:template_variant . '.' . a:ft)
      if filereadable (template_file)
	 return template_file
      endif
   endif
   if exists ('g:template_variant')
      let template_file = globpath (&runtimepath, 'templates/' . g:template_variant . '.' . a:ft)
      if filereadable (template_file)
	 return template_file
      endif
   endif
   let template_file = globpath (&runtimepath, 'templates/default.' . a:ft)
   return template_file
endf

" Insert template.
function! s:Template(...)
   let dellast = line ('$') == 1 && getline ('$') == ''
   let ft = (a:0) ? (a:1) : (strlen (&ft) ? &ft : 'default')
   let template_file = s:Template_find_file (ft)
   if filereadable (template_file)
      silent exe '0r ' . template_file
      keepjumps silent %s/@=\([^@]*\)@/\=s:Eval(submatch(1))/ge
      keepjumps silent %s/@!\([^@]*\)@/\=s:Exec(submatch(1))/ge
      keepjumps silent %s/@\(%[^@]*\)@/\=expand(submatch(1))/ge
      silent exe 'keepjumps %s/@DATE@/' . strftime ('%c') . '/ge'
      silent exe 'keepjumps %s/@ISODATE@/' . strftime ('%Y-%m-%d') . '/ge'
      silent exe 'keepjumps %s/@YEAR@/' . strftime ('%Y') . '/ge'
      let file = expand ('%:t')
      silent exe 'keepjumps %s/@FILE@/' . file . '/ge'
      silent exe 'keepjumps %s/@FILEBASE@/' . expand ('%:t:r') . '/ge'
      silent exe 'keepjumps %s/@FILECAP@/' . toupper (substitute (file, '\.', '_', 'g')) . '/ge'
      silent exe 'keepjumps %s/@FILEDEF@/' . substitute (file, '\.', '_', 'g') . '/ge'
      if exists ('g:fullname')
	 silent exe 'keepjumps %s/@AUTHOR@/' . g:fullname . '/ge'
      endif
      if exists ('g:email')
	 silent exe 'keepjumps %s/@EMAIL@/' . g:email . '/ge'
      endif
      if exists ('g:nick')
	 silent exe 'keepjumps %s/@NICK@/' . g:nick . '/ge'
      endif
      if exists ('g:web')
	 silent exe 'keepjumps %s/@WEB@/' . g:web . '/ge'
      endif
      if exists ('g:copyright')
	 silent exe 'keepjumps %s/@COPYRIGHT@/' . g:copyright . '/ge'
      endif
      if dellast
	 keepjumps $d _
      endif
      keepjumps 0
   endif
endf

" Detect headers files, then call Template().
function! s:TemplateHeader()
   if &filetype == 'c' && expand ('%') =~ '\.h$'
      call s:Template ('h')
   elseif &filetype == 'cpp' && expand ('%') =~ '\.\(h\|H\|hh\|hxx\|hpp\|tcc\|inl\)$'
      call s:Template ('hpp')
   else
      call s:Template ()
   endif
endfunction

if !exists(':Template')
   command -nargs=? Template :call s:Template (<f-args>)
endif

if !exists(':TemplateHeader')
   command -nargs=0 TemplateHeader :call s:TemplateHeader ()
endif