summaryrefslogtreecommitdiffhomepage
path: root/tools/vim/plugin/template.vim
blob: 811ebaa0864120dda96170e82b8bcc5125f7ee50 (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
128
129
130
131
132
133
134
135
136
" Name:		ni-template
" Author:	Nicolas Schodet <nico at ni.fr.eu.org>
" Last Update:	2007-03-29
" Version:	0.84
" 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
"		 @PATH@ : path/to/template.vim
"		 @PATHBASE@ : path/to/template
"		 @PATHCAP@ : PATH_TO_TEMPLATE_VIM
"		 @PATHDEF@ : path_to_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'
      let path = expand ('%')
      silent exe 'keepjumps %s:@PATH@:' . path . ':ge'
      silent exe 'keepjumps %s:@PATHBASE@:' . expand ('%:r') . ':ge'
      silent exe 'keepjumps %s:@PATHCAP@:' . toupper (substitute (path, '[/\.]', '_', 'g')) . ':ge'
      silent exe 'keepjumps %s:@PATHDEF@:' . substitute (path, '[/\.]', '_', '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