utils 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +68 -0
- data/VERSION +1 -0
- data/bin/chroot-exec +12 -0
- data/bin/chroot-libs +18 -0
- data/bin/classify +37 -0
- data/bin/discover +137 -0
- data/bin/edit +74 -0
- data/bin/errf +32 -0
- data/bin/git-empty +8 -0
- data/bin/myex +90 -0
- data/bin/number_files +26 -0
- data/bin/same_files +37 -0
- data/bin/search +205 -0
- data/bin/sedit +3 -0
- data/bin/sshscreen +68 -0
- data/bin/term +21 -0
- data/bin/unquarantine_apps +8 -0
- data/bin/untest +17 -0
- data/bin/utils-install-config +10 -0
- data/bin/vacuum_firefox_sqlite +22 -0
- data/bin/xmp +74 -0
- data/lib/utils.rb +8 -0
- data/lib/utils/config.rb +23 -0
- data/lib/utils/config/gdb/asm +179 -0
- data/lib/utils/config/gdb/ruby +528 -0
- data/lib/utils/config/gdbinit +8 -0
- data/lib/utils/config/irbrc +455 -0
- data/lib/utils/config/rdebugrc +2 -0
- data/lib/utils/config/screenrc +143 -0
- data/lib/utils/config/vim/autoload/Align.vim +1029 -0
- data/lib/utils/config/vim/autoload/AlignMaps.vim +330 -0
- data/lib/utils/config/vim/autoload/rails.vim +4744 -0
- data/lib/utils/config/vim/autoload/rubycomplete.vim +801 -0
- data/lib/utils/config/vim/autoload/sqlcomplete.vim +741 -0
- data/lib/utils/config/vim/autoload/vimball.vim +750 -0
- data/lib/utils/config/vim/colors/flori.vim +113 -0
- data/lib/utils/config/vim/compiler/eruby.vim +40 -0
- data/lib/utils/config/vim/compiler/ruby.vim +67 -0
- data/lib/utils/config/vim/compiler/rubyunit.vim +34 -0
- data/lib/utils/config/vim/ftdetect/ragel.vim +2 -0
- data/lib/utils/config/vim/ftdetect/ruby.vim +17 -0
- data/lib/utils/config/vim/ftplugin/eruby.vim +100 -0
- data/lib/utils/config/vim/ftplugin/ruby.vim +260 -0
- data/lib/utils/config/vim/ftplugin/xml.vim +941 -0
- data/lib/utils/config/vim/indent/IndentAnything_html.vim +35 -0
- data/lib/utils/config/vim/indent/eruby.vim +77 -0
- data/lib/utils/config/vim/indent/javascript.vim +116 -0
- data/lib/utils/config/vim/indent/ruby.vim +377 -0
- data/lib/utils/config/vim/plugin/AlignMapsPlugin.vim +242 -0
- data/lib/utils/config/vim/plugin/AlignPlugin.vim +41 -0
- data/lib/utils/config/vim/plugin/Decho.vim +592 -0
- data/lib/utils/config/vim/plugin/IndentAnything.vim +675 -0
- data/lib/utils/config/vim/plugin/bufexplorer.vim +1144 -0
- data/lib/utils/config/vim/plugin/cecutil.vim +482 -0
- data/lib/utils/config/vim/plugin/fugitive.vim +1703 -0
- data/lib/utils/config/vim/plugin/lusty-explorer.vim +1509 -0
- data/lib/utils/config/vim/plugin/rails.vim +340 -0
- data/lib/utils/config/vim/plugin/rubyextra.vim +193 -0
- data/lib/utils/config/vim/plugin/surround.vim +628 -0
- data/lib/utils/config/vim/plugin/taglist.vim +4546 -0
- data/lib/utils/config/vim/plugin/test/IndentAnything/test.js +131 -0
- data/lib/utils/config/vim/plugin/vimballPlugin.vim +40 -0
- data/lib/utils/config/vim/syntax/Decho.vim +101 -0
- data/lib/utils/config/vim/syntax/eruby.vim +73 -0
- data/lib/utils/config/vim/syntax/javascript.vim +246 -0
- data/lib/utils/config/vim/syntax/ragel.vim +165 -0
- data/lib/utils/config/vim/syntax/ruby.vim +367 -0
- data/lib/utils/config/vimrc +461 -0
- data/lib/utils/file.rb +49 -0
- data/lib/utils/find.rb +54 -0
- data/lib/utils/md5.rb +23 -0
- data/lib/utils/patterns.rb +34 -0
- data/lib/utils/version.rb +8 -0
- data/utils.gemspec +33 -0
- metadata +183 -0
@@ -0,0 +1,941 @@
|
|
1
|
+
" Vim script file vim600:fdm=marker:
|
2
|
+
" FileType: XML
|
3
|
+
" Author: Devin Weaver <vim (at) tritarget.com>
|
4
|
+
" Maintainer: Devin Weaver <vim (at) tritarget.com>
|
5
|
+
" Last Change: $Date: 2008-10-16 10:01:12 -0400 (Thu, 16 Oct 2008) $
|
6
|
+
" Version: $Revision: 78 $
|
7
|
+
" Location: http://www.vim.org/scripts/script.php?script_id=301
|
8
|
+
" Licence: This program is free software; you can redistribute it
|
9
|
+
" and/or modify it under the terms of the GNU General Public
|
10
|
+
" License. See http://www.gnu.org/copyleft/gpl.txt
|
11
|
+
" Credits: Brad Phelan <bphelan (at) mathworks.co.uk> for completing
|
12
|
+
" tag matching and visual tag completion.
|
13
|
+
" Ma, Xiangjiang <Xiangjiang.Ma (at) broadvision.com> for
|
14
|
+
" pointing out VIM 6.0 map <buffer> feature.
|
15
|
+
" Luc Hermitte <hermitte (at) free.fr> for testing the self
|
16
|
+
" install documentation code and providing good bug fixes.
|
17
|
+
" Guo-Peng Wen for the self install documentation code.
|
18
|
+
" Shawn Boles <ickybots (at) gmail.com> for fixing the
|
19
|
+
" <Leader>x cancelation bug.
|
20
|
+
" Martijn van der Kwast <mvdkwast@gmx.net> for patching
|
21
|
+
" problems with multi-languages (XML and PHP).
|
22
|
+
|
23
|
+
" This script provides some convenience when editing XML (and some SGML)
|
24
|
+
" formated documents.
|
25
|
+
|
26
|
+
" Section: Documentation
|
27
|
+
" ----------------------
|
28
|
+
"
|
29
|
+
" Documentation should be available by ":help xml-plugin" command, once the
|
30
|
+
" script has been copied in you .vim/plugin directory.
|
31
|
+
"
|
32
|
+
" You still can read the documentation at the end of this file. Locate it by
|
33
|
+
" searching the "xml-plugin" string (and set ft=help to have
|
34
|
+
" appropriate syntaxic coloration).
|
35
|
+
|
36
|
+
" Note: If you used the 5.x version of this file (xmledit.vim) you'll need to
|
37
|
+
" comment out the section where you called it since it is no longer used in
|
38
|
+
" version 6.x.
|
39
|
+
|
40
|
+
" TODO: Revamp ParseTag to pull appart a tag a rebuild it properly.
|
41
|
+
" a tag like: < test nowrap testatt=foo >
|
42
|
+
" should be fixed to: <test nowrap="nowrap" testatt="foo"></test>
|
43
|
+
|
44
|
+
"==============================================================================
|
45
|
+
|
46
|
+
" Only do this when not done yet for this buffer
|
47
|
+
if exists("b:did_ftplugin")
|
48
|
+
finish
|
49
|
+
endif
|
50
|
+
" sboles, init these variables so vim doesn't complain on wrap cancel
|
51
|
+
let b:last_wrap_tag_used = ""
|
52
|
+
let b:last_wrap_atts_used = ""
|
53
|
+
|
54
|
+
" WrapTag -> Places an XML tag around a visual selection. {{{1
|
55
|
+
" Brad Phelan: Wrap the argument in an XML tag
|
56
|
+
" Added nice GUI support to the dialogs.
|
57
|
+
" Rewrote function to implement new algorythem that addresses several bugs.
|
58
|
+
if !exists("*s:WrapTag")
|
59
|
+
function s:WrapTag(text)
|
60
|
+
if (line(".") < line("'<"))
|
61
|
+
let insert_cmd = "o"
|
62
|
+
elseif (col(".") < col("'<"))
|
63
|
+
let insert_cmd = "a"
|
64
|
+
else
|
65
|
+
let insert_cmd = "i"
|
66
|
+
endif
|
67
|
+
if strlen(a:text) > 10
|
68
|
+
let input_text = strpart(a:text, 0, 10) . '...'
|
69
|
+
else
|
70
|
+
let input_text = a:text
|
71
|
+
endif
|
72
|
+
let wraptag = inputdialog('Tag to wrap "' . input_text . '" : ')
|
73
|
+
if strlen(wraptag)==0
|
74
|
+
if strlen(b:last_wrap_tag_used)==0
|
75
|
+
undo
|
76
|
+
return
|
77
|
+
endif
|
78
|
+
let wraptag = b:last_wrap_tag_used
|
79
|
+
let atts = b:last_wrap_atts_used
|
80
|
+
else
|
81
|
+
let atts = inputdialog('Attributes in <' . wraptag . '> : ')
|
82
|
+
endif
|
83
|
+
if (visualmode() ==# 'V')
|
84
|
+
let text = strpart(a:text,0,strlen(a:text)-1)
|
85
|
+
if (insert_cmd ==# "o")
|
86
|
+
let eol_cmd = ""
|
87
|
+
else
|
88
|
+
let eol_cmd = "\<Cr>"
|
89
|
+
endif
|
90
|
+
else
|
91
|
+
let text = a:text
|
92
|
+
let eol_cmd = ""
|
93
|
+
endif
|
94
|
+
if strlen(atts)==0
|
95
|
+
let text = "<".wraptag.">".text."</".wraptag.">"
|
96
|
+
let b:last_wrap_tag_used = wraptag
|
97
|
+
let b:last_wrap_atts_used = ""
|
98
|
+
else
|
99
|
+
let text = "<".wraptag." ".atts.">".text."</".wraptag.">"
|
100
|
+
let b:last_wrap_tag_used = wraptag
|
101
|
+
let b:last_wrap_atts_used = atts
|
102
|
+
endif
|
103
|
+
execute "normal! ".insert_cmd.text.eol_cmd
|
104
|
+
endfunction
|
105
|
+
endif
|
106
|
+
|
107
|
+
" NewFileXML -> Inserts <?xml?> at top of new file. {{{1
|
108
|
+
if !exists("*s:NewFileXML")
|
109
|
+
function s:NewFileXML( )
|
110
|
+
" Where is g:did_xhtmlcf_inits defined?
|
111
|
+
if &filetype == 'xml' || (!exists ("g:did_xhtmlcf_inits") && exists ("g:xml_use_xhtml") && (&filetype == 'html' || &filetype == 'xhtml'))
|
112
|
+
if append (0, '<?xml version="1.0"?>')
|
113
|
+
normal! G
|
114
|
+
endif
|
115
|
+
endif
|
116
|
+
endfunction
|
117
|
+
endif
|
118
|
+
|
119
|
+
|
120
|
+
" Callback -> Checks for tag callbacks and executes them. {{{1
|
121
|
+
if !exists("*s:Callback")
|
122
|
+
function s:Callback( xml_tag, isHtml )
|
123
|
+
let text = 0
|
124
|
+
if a:isHtml == 1 && exists ("*HtmlAttribCallback")
|
125
|
+
let text = HtmlAttribCallback (a:xml_tag)
|
126
|
+
elseif exists ("*XmlAttribCallback")
|
127
|
+
let text = XmlAttribCallback (a:xml_tag)
|
128
|
+
endif
|
129
|
+
if text != '0'
|
130
|
+
execute "normal! i " . text ."\<Esc>l"
|
131
|
+
endif
|
132
|
+
endfunction
|
133
|
+
endif
|
134
|
+
|
135
|
+
|
136
|
+
" IsParsableTag -> Check to see if the tag is a real tag. {{{1
|
137
|
+
if !exists("*s:IsParsableTag")
|
138
|
+
function s:IsParsableTag( tag )
|
139
|
+
" The "Should I parse?" flag.
|
140
|
+
let parse = 1
|
141
|
+
|
142
|
+
" make sure a:tag has a proper tag in it and is not a instruction or end tag.
|
143
|
+
if a:tag !~ '^<[[:alnum:]_:\-].*>$'
|
144
|
+
let parse = 0
|
145
|
+
endif
|
146
|
+
|
147
|
+
" make sure this tag isn't already closed.
|
148
|
+
if strpart (a:tag, strlen (a:tag) - 2, 1) == '/'
|
149
|
+
let parse = 0
|
150
|
+
endif
|
151
|
+
|
152
|
+
return parse
|
153
|
+
endfunction
|
154
|
+
endif
|
155
|
+
|
156
|
+
|
157
|
+
" ParseTag -> The major work hourse for tag completion. {{{1
|
158
|
+
if !exists("*s:ParseTag")
|
159
|
+
function s:ParseTag( )
|
160
|
+
" Save registers
|
161
|
+
let old_reg_save = @"
|
162
|
+
let old_save_x = @x
|
163
|
+
|
164
|
+
if (!exists("g:xml_no_auto_nesting") && strpart (getline ("."), col (".") - 2, 2) == '>>')
|
165
|
+
let multi_line = 1
|
166
|
+
execute "normal! \"xX"
|
167
|
+
else
|
168
|
+
let multi_line = 0
|
169
|
+
endif
|
170
|
+
|
171
|
+
let @" = ""
|
172
|
+
execute "normal! \"xy%%"
|
173
|
+
let ltag = @"
|
174
|
+
if (&filetype == 'html' || &filetype == 'xhtml') && (!exists ("g:xml_no_html"))
|
175
|
+
let html_mode = 1
|
176
|
+
let ltag = substitute (ltag, '[^[:graph:]]\+', ' ', 'g')
|
177
|
+
let ltag = substitute (ltag, '<\s*\([^[:alnum:]_:\-[:blank:]]\=\)\s*\([[:alnum:]_:\-]\+\)\>', '<\1\2', '')
|
178
|
+
else
|
179
|
+
let html_mode = 0
|
180
|
+
endif
|
181
|
+
|
182
|
+
if <SID>IsParsableTag (ltag)
|
183
|
+
" find the break between tag name and atributes (or closing of tag)
|
184
|
+
let index = matchend (ltag, '[[:alnum:]_:\-]\+')
|
185
|
+
|
186
|
+
let tag_name = strpart (ltag, 1, index - 1)
|
187
|
+
if strpart (ltag, index) =~ '[^/>[:blank:]]'
|
188
|
+
let has_attrib = 1
|
189
|
+
else
|
190
|
+
let has_attrib = 0
|
191
|
+
endif
|
192
|
+
|
193
|
+
" That's (index - 1) + 2, 2 for the '</' and 1 for the extra character the
|
194
|
+
" while includes (the '>' is ignored because <Esc> puts the curser on top
|
195
|
+
" of the '>'
|
196
|
+
let index = index + 2
|
197
|
+
|
198
|
+
" print out the end tag and place the cursor back were it left off
|
199
|
+
if html_mode && tag_name =~? '^\(img\|input\|param\|frame\|br\|hr\|meta\|link\|base\|area\)$'
|
200
|
+
if has_attrib == 0
|
201
|
+
call <SID>Callback (tag_name, html_mode)
|
202
|
+
endif
|
203
|
+
if exists ("g:xml_use_xhtml")
|
204
|
+
execute "normal! i /\<Esc>l"
|
205
|
+
endif
|
206
|
+
else
|
207
|
+
if multi_line
|
208
|
+
" Can't use \<Tab> because that indents 'tabstop' not 'shiftwidth'
|
209
|
+
" Also >> doesn't shift on an empty line hence the temporary char 'x'
|
210
|
+
let com_save = &comments
|
211
|
+
set comments-=n:>
|
212
|
+
execute "normal! a\<Cr>\<Cr>\<Esc>kAx\<Esc>>>$\"xx"
|
213
|
+
execute "set comments=" . substitute(com_save, " ", "\\\\ ", "g")
|
214
|
+
else
|
215
|
+
if has_attrib == 0
|
216
|
+
call <SID>Callback (tag_name, html_mode)
|
217
|
+
endif
|
218
|
+
if exists("g:xml_jump_string")
|
219
|
+
let index = index + strlen(g:xml_jump_string)
|
220
|
+
let jump_char = g:xml_jump_string
|
221
|
+
call <SID>InitEditFromJump()
|
222
|
+
else
|
223
|
+
let jump_char = ""
|
224
|
+
endif
|
225
|
+
execute "normal! a</" . tag_name . ">" . jump_char . "\<Esc>" . index . "h"
|
226
|
+
endif
|
227
|
+
endif
|
228
|
+
endif
|
229
|
+
|
230
|
+
" restore registers
|
231
|
+
let @" = old_reg_save
|
232
|
+
let @x = old_save_x
|
233
|
+
|
234
|
+
if multi_line
|
235
|
+
startinsert!
|
236
|
+
else
|
237
|
+
execute "normal! l"
|
238
|
+
startinsert
|
239
|
+
endif
|
240
|
+
endfunction
|
241
|
+
endif
|
242
|
+
|
243
|
+
|
244
|
+
" ParseTag2 -> Experimental function to replace ParseTag {{{1
|
245
|
+
"if !exists("*s:ParseTag2")
|
246
|
+
"function s:ParseTag2( )
|
247
|
+
" My thought is to pull the tag out and reformat it to a normalized tag
|
248
|
+
" and put it back.
|
249
|
+
"endfunction
|
250
|
+
"endif
|
251
|
+
|
252
|
+
|
253
|
+
" BuildTagName -> Grabs the tag's name for tag matching. {{{1
|
254
|
+
if !exists("*s:BuildTagName")
|
255
|
+
function s:BuildTagName( )
|
256
|
+
"First check to see if we Are allready on the end of the tag. The / search
|
257
|
+
"forwards command will jump to the next tag otherwise
|
258
|
+
|
259
|
+
" Store contents of register x in a variable
|
260
|
+
let b:xreg = @x
|
261
|
+
|
262
|
+
exec "normal! v\"xy"
|
263
|
+
if @x=='>'
|
264
|
+
" Don't do anything
|
265
|
+
else
|
266
|
+
exec "normal! />/\<Cr>"
|
267
|
+
endif
|
268
|
+
|
269
|
+
" Now we head back to the < to reach the beginning.
|
270
|
+
exec "normal! ?<?\<Cr>"
|
271
|
+
|
272
|
+
" Capture the tag (a > will be catured by the /$/ match)
|
273
|
+
exec "normal! v/\\s\\|$/\<Cr>\"xy"
|
274
|
+
|
275
|
+
" We need to strip off any junk at the end.
|
276
|
+
let @x=strpart(@x, 0, match(@x, "[[:blank:]>\<C-J>]"))
|
277
|
+
|
278
|
+
"remove <, >
|
279
|
+
let @x=substitute(@x,'^<\|>$','','')
|
280
|
+
|
281
|
+
" remove spaces.
|
282
|
+
let @x=substitute(@x,'/\s*','/', '')
|
283
|
+
let @x=substitute(@x,'^\s*','', '')
|
284
|
+
|
285
|
+
" Swap @x and b:xreg
|
286
|
+
let temp = @x
|
287
|
+
let @x = b:xreg
|
288
|
+
let b:xreg = temp
|
289
|
+
endfunction
|
290
|
+
endif
|
291
|
+
|
292
|
+
" TagMatch1 -> First step in tag matching. {{{1
|
293
|
+
" Brad Phelan: First step in tag matching.
|
294
|
+
if !exists("*s:TagMatch1")
|
295
|
+
function s:TagMatch1()
|
296
|
+
" Save registers
|
297
|
+
let old_reg_save = @"
|
298
|
+
|
299
|
+
"Drop a marker here just in case we have a mismatched tag and
|
300
|
+
"wish to return (:mark looses column position)
|
301
|
+
normal! mz
|
302
|
+
|
303
|
+
call <SID>BuildTagName()
|
304
|
+
|
305
|
+
"Check to see if it is an end tag. If it is place a 1 in endtag
|
306
|
+
if match(b:xreg, '^/')==-1
|
307
|
+
let endtag = 0
|
308
|
+
else
|
309
|
+
let endtag = 1
|
310
|
+
endif
|
311
|
+
|
312
|
+
" Extract the tag from the whole tag block
|
313
|
+
" eg if the block =
|
314
|
+
" tag attrib1=blah attrib2=blah
|
315
|
+
" we will end up with
|
316
|
+
" tag
|
317
|
+
" with no trailing or leading spaces
|
318
|
+
let b:xreg=substitute(b:xreg,'^/','','g')
|
319
|
+
|
320
|
+
" Make sure the tag is valid.
|
321
|
+
" Malformed tags could be <?xml ?>, <![CDATA[]]>, etc.
|
322
|
+
if match(b:xreg,'^[[:alnum:]_:\-]') != -1
|
323
|
+
" Pass the tag to the matching
|
324
|
+
" routine
|
325
|
+
call <SID>TagMatch2(b:xreg, endtag)
|
326
|
+
endif
|
327
|
+
" Restore registers
|
328
|
+
let @" = old_reg_save
|
329
|
+
endfunction
|
330
|
+
endif
|
331
|
+
|
332
|
+
|
333
|
+
" TagMatch2 -> Second step in tag matching. {{{1
|
334
|
+
" Brad Phelan: Second step in tag matching.
|
335
|
+
if !exists("*s:TagMatch2")
|
336
|
+
function s:TagMatch2(tag,endtag)
|
337
|
+
let match_type=''
|
338
|
+
|
339
|
+
" Build the pattern for searching for XML tags based
|
340
|
+
" on the 'tag' type passed into the function.
|
341
|
+
" Note we search forwards for end tags and
|
342
|
+
" backwards for start tags
|
343
|
+
if a:endtag==0
|
344
|
+
"let nextMatch='normal /\(<\s*' . a:tag . '\(\s\+.\{-}\)*>\)\|\(<\/' . a:tag . '\s*>\)'
|
345
|
+
let match_type = '/'
|
346
|
+
else
|
347
|
+
"let nextMatch='normal ?\(<\s*' . a:tag . '\(\s\+.\{-}\)*>\)\|\(<\/' . a:tag . '\s*>\)'
|
348
|
+
let match_type = '?'
|
349
|
+
endif
|
350
|
+
|
351
|
+
if a:endtag==0
|
352
|
+
let stk = 1
|
353
|
+
else
|
354
|
+
let stk = 1
|
355
|
+
end
|
356
|
+
|
357
|
+
" wrapscan must be turned on. We'll recored the value and reset it afterward.
|
358
|
+
" We have it on because if we don't we'll get a nasty error if the search hits
|
359
|
+
" BOF or EOF.
|
360
|
+
let wrapval = &wrapscan
|
361
|
+
let &wrapscan = 1
|
362
|
+
|
363
|
+
"Get the current location of the cursor so we can
|
364
|
+
"detect if we wrap on ourselves
|
365
|
+
let lpos = line(".")
|
366
|
+
let cpos = col(".")
|
367
|
+
|
368
|
+
if a:endtag==0
|
369
|
+
" If we are trying to find a start tag
|
370
|
+
" then decrement when we find a start tag
|
371
|
+
let iter = 1
|
372
|
+
else
|
373
|
+
" If we are trying to find an end tag
|
374
|
+
" then increment when we find a start tag
|
375
|
+
let iter = -1
|
376
|
+
endif
|
377
|
+
|
378
|
+
"Loop until stk == 0.
|
379
|
+
while 1
|
380
|
+
" exec search.
|
381
|
+
" Make sure to avoid />$/ as well as /\s$/ and /$/.
|
382
|
+
exec "normal! " . match_type . '<\s*\/*\s*' . a:tag . '\([[:blank:]>]\|$\)' . "\<Cr>"
|
383
|
+
|
384
|
+
" Check to see if our match makes sence.
|
385
|
+
if a:endtag == 0
|
386
|
+
if line(".") < lpos
|
387
|
+
call <SID>MisMatchedTag (0, a:tag)
|
388
|
+
break
|
389
|
+
elseif line(".") == lpos && col(".") <= cpos
|
390
|
+
call <SID>MisMatchedTag (1, a:tag)
|
391
|
+
break
|
392
|
+
endif
|
393
|
+
else
|
394
|
+
if line(".") > lpos
|
395
|
+
call <SID>MisMatchedTag (2, '/'.a:tag)
|
396
|
+
break
|
397
|
+
elseif line(".") == lpos && col(".") >= cpos
|
398
|
+
call <SID>MisMatchedTag (3, '/'.a:tag)
|
399
|
+
break
|
400
|
+
endif
|
401
|
+
endif
|
402
|
+
|
403
|
+
call <SID>BuildTagName()
|
404
|
+
|
405
|
+
if match(b:xreg,'^/')==-1
|
406
|
+
" Found start tag
|
407
|
+
let stk = stk + iter
|
408
|
+
else
|
409
|
+
" Found end tag
|
410
|
+
let stk = stk - iter
|
411
|
+
endif
|
412
|
+
|
413
|
+
if stk == 0
|
414
|
+
break
|
415
|
+
endif
|
416
|
+
endwhile
|
417
|
+
|
418
|
+
let &wrapscan = wrapval
|
419
|
+
endfunction
|
420
|
+
endif
|
421
|
+
|
422
|
+
" MisMatchedTag -> What to do if a tag is mismatched. {{{1
|
423
|
+
if !exists("*s:MisMatchedTag")
|
424
|
+
function s:MisMatchedTag( id, tag )
|
425
|
+
"Jump back to our formor spot
|
426
|
+
normal! `z
|
427
|
+
normal zz
|
428
|
+
echohl WarningMsg
|
429
|
+
" For debugging
|
430
|
+
"echo "Mismatched tag " . a:id . ": <" . a:tag . ">"
|
431
|
+
" For release
|
432
|
+
echo "Mismatched tag <" . a:tag . ">"
|
433
|
+
echohl None
|
434
|
+
endfunction
|
435
|
+
endif
|
436
|
+
|
437
|
+
" DeleteTag -> Deletes surrounding tags from cursor. {{{1
|
438
|
+
" Modifies mark z
|
439
|
+
if !exists("*s:DeleteTag")
|
440
|
+
function s:DeleteTag( )
|
441
|
+
if strpart (getline ("."), col (".") - 1, 1) == "<"
|
442
|
+
normal! l
|
443
|
+
endif
|
444
|
+
if search ("<[^\/]", "bW") == 0
|
445
|
+
return
|
446
|
+
endif
|
447
|
+
normal! mz
|
448
|
+
normal \5
|
449
|
+
normal! d%`zd%
|
450
|
+
endfunction
|
451
|
+
endif
|
452
|
+
|
453
|
+
" VisualTag -> Selects Tag body in a visual selection. {{{1
|
454
|
+
" Modifies mark z
|
455
|
+
if !exists("*s:VisualTag")
|
456
|
+
function s:VisualTag( )
|
457
|
+
if strpart (getline ("."), col (".") - 1, 1) == "<"
|
458
|
+
normal! l
|
459
|
+
endif
|
460
|
+
if search ("<[^\/]", "bW") == 0
|
461
|
+
return
|
462
|
+
endif
|
463
|
+
normal! mz
|
464
|
+
normal \5
|
465
|
+
normal! %
|
466
|
+
exe "normal! " . visualmode()
|
467
|
+
normal! `z
|
468
|
+
endfunction
|
469
|
+
endif
|
470
|
+
|
471
|
+
" InsertGt -> close tags only if the cursor is in a HTML or XML context {{{1
|
472
|
+
" Else continue editing
|
473
|
+
if !exists("*s:InsertGt")
|
474
|
+
function s:InsertGt( )
|
475
|
+
let save_matchpairs = &matchpairs
|
476
|
+
set matchpairs-=<:>
|
477
|
+
execute "normal! a>"
|
478
|
+
execute "set matchpairs=" . save_matchpairs
|
479
|
+
" When the current char is text within a tag it will not proccess as a
|
480
|
+
" syntax'ed element and return nothing below. Since the multi line wrap
|
481
|
+
" feture relies on using the '>' char as text within a tag we must use the
|
482
|
+
" char prior to establish if it is valid html/xml
|
483
|
+
if (getline('.')[col('.') - 1] == '>')
|
484
|
+
let char_syn=synIDattr(synID(line("."), col(".") - 1, 1), "name")
|
485
|
+
endif
|
486
|
+
if -1 == match(char_syn, "xmlProcessing") && (0 == match(char_syn, 'html') || 0 == match(char_syn, 'xml'))
|
487
|
+
call <SID>ParseTag()
|
488
|
+
else
|
489
|
+
if col(".") == col("$") - 1
|
490
|
+
startinsert!
|
491
|
+
else
|
492
|
+
execute "normal! l"
|
493
|
+
startinsert
|
494
|
+
endif
|
495
|
+
endif
|
496
|
+
endfunction
|
497
|
+
endif
|
498
|
+
|
499
|
+
" InitEditFromJump -> Set some needed autocommands and syntax highlights for EditFromJump. {{{1
|
500
|
+
if !exists("*s:InitEditFromJump")
|
501
|
+
function s:InitEditFromJump( )
|
502
|
+
" Add a syntax highlight for the xml_jump_string.
|
503
|
+
execute "syntax match Error /\\V" . g:xml_jump_string . "/"
|
504
|
+
" Remove left over garbage from xml_jump_string on file save.
|
505
|
+
augroup xml
|
506
|
+
execute "au BufWritePre <buffer> %s/" . g:xml_jump_string . "//ge"
|
507
|
+
augroup END
|
508
|
+
endfunction
|
509
|
+
endif
|
510
|
+
|
511
|
+
" EditFromJump -> Jump to the end of the tag and continue editing. {{{1
|
512
|
+
" g:xml_jump_string must be set.
|
513
|
+
if !exists("*s:EditFromJump")
|
514
|
+
function s:EditFromJump( )
|
515
|
+
if exists("g:xml_jump_string")
|
516
|
+
let foo = search(g:xml_jump_string, 'csW') " Moves cursor by default
|
517
|
+
execute "normal! " . strlen(g:xml_jump_string) . "x"
|
518
|
+
if col(".") == col("$") - 1
|
519
|
+
startinsert!
|
520
|
+
else
|
521
|
+
startinsert
|
522
|
+
endif
|
523
|
+
else
|
524
|
+
echohl WarningMsg
|
525
|
+
echo "Function disabled. xml_jump_string not defined."
|
526
|
+
echohl None
|
527
|
+
endif
|
528
|
+
endfunction
|
529
|
+
endif
|
530
|
+
|
531
|
+
" Section: Doc installation {{{1
|
532
|
+
" Function: s:XmlInstallDocumentation(full_name, revision) {{{2
|
533
|
+
" Install help documentation.
|
534
|
+
" Arguments:
|
535
|
+
" full_name: Full name of this vim plugin script, including path name.
|
536
|
+
" revision: Revision of the vim script. #version# mark in the document file
|
537
|
+
" will be replaced with this string with 'v' prefix.
|
538
|
+
" Return:
|
539
|
+
" 1 if new document installed, 0 otherwise.
|
540
|
+
" Note: Cleaned and generalized by guo-peng Wen
|
541
|
+
"'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
542
|
+
|
543
|
+
function! s:XmlInstallDocumentation(full_name, revision)
|
544
|
+
" Name of the document path based on the system we use:
|
545
|
+
if (has("unix"))
|
546
|
+
" On UNIX like system, using forward slash:
|
547
|
+
let l:slash_char = '/'
|
548
|
+
let l:mkdir_cmd = ':silent !mkdir -p '
|
549
|
+
else
|
550
|
+
" On M$ system, use backslash. Also mkdir syntax is different.
|
551
|
+
" This should only work on W2K and up.
|
552
|
+
let l:slash_char = '\'
|
553
|
+
let l:mkdir_cmd = ':silent !mkdir '
|
554
|
+
endif
|
555
|
+
|
556
|
+
let l:doc_path = l:slash_char . 'doc'
|
557
|
+
"let l:doc_home = l:slash_char . '.vim' . l:slash_char . 'doc'
|
558
|
+
|
559
|
+
" Figure out document path based on full name of this script:
|
560
|
+
let l:vim_plugin_path = fnamemodify(a:full_name, ':h')
|
561
|
+
"let l:vim_doc_path = fnamemodify(a:full_name, ':h:h') . l:doc_path
|
562
|
+
let l:vim_doc_path = matchstr(l:vim_plugin_path,
|
563
|
+
\ '.\{-}\ze\%(\%(ft\)\=plugin\|macros\)') . l:doc_path
|
564
|
+
if (!(filewritable(l:vim_doc_path) == 2))
|
565
|
+
echomsg "Doc path: " . l:vim_doc_path
|
566
|
+
execute l:mkdir_cmd . l:vim_doc_path
|
567
|
+
if (!(filewritable(l:vim_doc_path) == 2))
|
568
|
+
" Try a default configuration in user home:
|
569
|
+
"let l:vim_doc_path = expand("~") . l:doc_home
|
570
|
+
let l:vim_doc_path = matchstr(&rtp,
|
571
|
+
\ escape($HOME, '\') .'[/\\]\%(\.vim\|vimfiles\)')
|
572
|
+
if (!(filewritable(l:vim_doc_path) == 2))
|
573
|
+
execute l:mkdir_cmd . l:vim_doc_path
|
574
|
+
if (!(filewritable(l:vim_doc_path) == 2))
|
575
|
+
" Put a warning:
|
576
|
+
echomsg "Unable to open documentation directory"
|
577
|
+
echomsg " type :help add-local-help for more informations."
|
578
|
+
return 0
|
579
|
+
endif
|
580
|
+
endif
|
581
|
+
endif
|
582
|
+
endif
|
583
|
+
|
584
|
+
" Exit if we have problem to access the document directory:
|
585
|
+
if (!isdirectory(l:vim_plugin_path)
|
586
|
+
\ || !isdirectory(l:vim_doc_path)
|
587
|
+
\ || filewritable(l:vim_doc_path) != 2)
|
588
|
+
return 0
|
589
|
+
endif
|
590
|
+
|
591
|
+
" Full name of script and documentation file:
|
592
|
+
let l:script_name = 'xml.vim'
|
593
|
+
let l:doc_name = 'xml-plugin.txt'
|
594
|
+
let l:plugin_file = l:vim_plugin_path . l:slash_char . l:script_name
|
595
|
+
let l:doc_file = l:vim_doc_path . l:slash_char . l:doc_name
|
596
|
+
|
597
|
+
" Bail out if document file is still up to date:
|
598
|
+
if (filereadable(l:doc_file) &&
|
599
|
+
\ getftime(l:plugin_file) < getftime(l:doc_file))
|
600
|
+
return 0
|
601
|
+
endif
|
602
|
+
|
603
|
+
" Prepare window position restoring command:
|
604
|
+
if (strlen(@%))
|
605
|
+
let l:go_back = 'b ' . bufnr("%")
|
606
|
+
else
|
607
|
+
let l:go_back = 'enew!'
|
608
|
+
endif
|
609
|
+
|
610
|
+
" Create a new buffer & read in the plugin file (me):
|
611
|
+
setl nomodeline
|
612
|
+
exe 'enew!'
|
613
|
+
exe 'r ' . l:plugin_file
|
614
|
+
|
615
|
+
setl modeline
|
616
|
+
let l:buf = bufnr("%")
|
617
|
+
setl noswapfile modifiable
|
618
|
+
|
619
|
+
norm zR
|
620
|
+
norm gg
|
621
|
+
|
622
|
+
" Delete from first line to a line starts with
|
623
|
+
" === START_DOC
|
624
|
+
1,/^=\{3,}\s\+START_DOC\C/ d
|
625
|
+
|
626
|
+
" Delete from a line starts with
|
627
|
+
" === END_DOC
|
628
|
+
" to the end of the documents:
|
629
|
+
/^=\{3,}\s\+END_DOC\C/,$ d
|
630
|
+
|
631
|
+
" Remove fold marks:
|
632
|
+
% s/{\{3}[1-9]/ /
|
633
|
+
|
634
|
+
" Add modeline for help doc: the modeline string is mangled intentionally
|
635
|
+
" to avoid it be recognized by VIM:
|
636
|
+
call append(line('$'), '')
|
637
|
+
call append(line('$'), ' v' . 'im:tw=78:ts=8:ft=help:norl:')
|
638
|
+
|
639
|
+
" Replace revision:
|
640
|
+
exe "normal :1,5s/#version#/ v" . a:revision . "/\<CR>"
|
641
|
+
|
642
|
+
" Save the help document:
|
643
|
+
exe 'w! ' . l:doc_file
|
644
|
+
exe l:go_back
|
645
|
+
exe 'bw ' . l:buf
|
646
|
+
|
647
|
+
" Build help tags:
|
648
|
+
exe 'helptags ' . l:vim_doc_path
|
649
|
+
|
650
|
+
return 1
|
651
|
+
endfunction
|
652
|
+
" }}}2
|
653
|
+
|
654
|
+
let s:revision=
|
655
|
+
\ substitute("$Revision: 78 $",'\$\S*: \([.0-9]\+\) \$','\1','')
|
656
|
+
silent! let s:install_status =
|
657
|
+
\ s:XmlInstallDocumentation(expand('<sfile>:p'), s:revision)
|
658
|
+
if (s:install_status == 1)
|
659
|
+
echom expand("<sfile>:t:r") . '-plugin v' . s:revision .
|
660
|
+
\ ': Help-documentation installed.'
|
661
|
+
endif
|
662
|
+
|
663
|
+
|
664
|
+
" Mappings and Settings. {{{1
|
665
|
+
" This makes the '%' jump between the start and end of a single tag.
|
666
|
+
setlocal matchpairs+=<:>
|
667
|
+
setlocal commentstring=<!--%s-->
|
668
|
+
|
669
|
+
" Have this as an escape incase you want a literal '>' not to run the
|
670
|
+
" ParseTag function.
|
671
|
+
if !exists("g:xml_tag_completion_map")
|
672
|
+
inoremap <buffer> <LocalLeader>. >
|
673
|
+
inoremap <buffer> <LocalLeader>> >
|
674
|
+
endif
|
675
|
+
|
676
|
+
" Jump between the beggining and end tags.
|
677
|
+
nnoremap <buffer> <LocalLeader>5 :call <SID>TagMatch1()<Cr>
|
678
|
+
nnoremap <buffer> <LocalLeader>% :call <SID>TagMatch1()<Cr>
|
679
|
+
vnoremap <buffer> <LocalLeader>5 <Esc>:call <SID>VisualTag()<Cr>
|
680
|
+
vnoremap <buffer> <LocalLeader>% <Esc>:call <SID>VisualTag()<Cr>
|
681
|
+
|
682
|
+
" Wrap selection in XML tag
|
683
|
+
vnoremap <buffer> <LocalLeader>x "xx:call <SID>WrapTag(@x)<Cr>
|
684
|
+
nnoremap <buffer> <LocalLeader>d :call <SID>DeleteTag()<Cr>
|
685
|
+
|
686
|
+
" Parse the tag after pressing the close '>'.
|
687
|
+
if !exists("g:xml_tag_completion_map")
|
688
|
+
" inoremap <buffer> > ><Esc>:call <SID>ParseTag()<Cr>
|
689
|
+
inoremap <buffer> > <Esc>:call <SID>InsertGt()<Cr>
|
690
|
+
else
|
691
|
+
execute "inoremap <buffer> " . g:xml_tag_completion_map . " <Esc>:call <SID>InsertGt()<Cr>"
|
692
|
+
endif
|
693
|
+
|
694
|
+
if exists("g:xml_jump_string")
|
695
|
+
nnoremap <buffer> <LocalLeader><Space> :call <SID>EditFromJump()<Cr>
|
696
|
+
inoremap <buffer> <LocalLeader><Space> <Esc>:call <SID>EditFromJump()<Cr>
|
697
|
+
" Clear out all left over xml_jump_string garbage
|
698
|
+
execute "nnoremap <buffer> <LocalLeader><LocalLeader> :%s/" . g:xml_jump_string . "//ge<Cr>"
|
699
|
+
" The syntax files clear out any predefined syntax definitions. Recreate
|
700
|
+
" this when ever a xml_jump_string is created. (in ParseTag)
|
701
|
+
endif
|
702
|
+
|
703
|
+
augroup xml
|
704
|
+
au!
|
705
|
+
au BufNewFile * call <SID>NewFileXML()
|
706
|
+
augroup END
|
707
|
+
"}}}1
|
708
|
+
finish
|
709
|
+
|
710
|
+
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
711
|
+
" Section: Documentation content {{{1
|
712
|
+
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
713
|
+
=== START_DOC
|
714
|
+
*xml-plugin.txt* Help edit XML and SGML documents. #version#
|
715
|
+
|
716
|
+
XML Edit {{{2 ~
|
717
|
+
|
718
|
+
A filetype plugin to help edit XML and SGML documents.
|
719
|
+
|
720
|
+
This script provides some convenience when editing XML (and some SGML
|
721
|
+
including HTML) formated documents. It allows you to jump to the beginning
|
722
|
+
or end of the tag block your cursor is in. '%' will jump between '<' and '>'
|
723
|
+
within the tag your cursor is in. When in insert mode and you finish a tag
|
724
|
+
(pressing '>') the tag will be completed. If you press '>' twice it will
|
725
|
+
complete the tag and place the cursor in the middle of the tags on it's own
|
726
|
+
line (helps with nested tags).
|
727
|
+
|
728
|
+
Usage: Place this file into your ftplugin directory. To add html support
|
729
|
+
Sym-link or copy this file to html.vim in your ftplugin directory. To activte
|
730
|
+
the script place 'filetype plugin on' in your |.vimrc| file. See |ftplugins|
|
731
|
+
for more information on this topic.
|
732
|
+
|
733
|
+
If the file edited is of type "html" and "xml_use_html" is defined then the
|
734
|
+
following tags will not auto complete:
|
735
|
+
<img>, <input>, <param>, <frame>, <br>, <hr>, <meta>, <link>, <base>, <area>
|
736
|
+
|
737
|
+
If the file edited is of type 'html' and 'xml_use_xhtml' is defined the above
|
738
|
+
tags will autocomplete the xml closing staying xhtml compatable.
|
739
|
+
ex. <hr> becomes <hr /> (see |xml-plugin-settings|)
|
740
|
+
|
741
|
+
NOTE: If you used the VIM 5.x version of this file (xmledit.vim) you'll need
|
742
|
+
to comment out the section where you called it. It is no longer used in the
|
743
|
+
VIM 6.x version.
|
744
|
+
|
745
|
+
Known Bugs {{{2 ~
|
746
|
+
|
747
|
+
- This script will modify registers ". and "x; register "" will be restored.
|
748
|
+
- < & > marks inside of a CDATA section are interpreted as actual XML tags
|
749
|
+
even if unmatched.
|
750
|
+
- Although the script can handle leading spaces such as < tag></ tag> it is
|
751
|
+
illegal XML syntax and considered very bad form.
|
752
|
+
- Placing a literal `>' in an attribute value will auto complete dispite that
|
753
|
+
the start tag isn't finished. This is poor XML anyway you should use
|
754
|
+
> instead.
|
755
|
+
- The matching algorithm can handle illegal tag characters where as the tag
|
756
|
+
completion algorithm can not.
|
757
|
+
|
758
|
+
------------------------------------------------------------------------------
|
759
|
+
*xml-plugin-mappings*
|
760
|
+
Mappings {{{2 ~
|
761
|
+
|
762
|
+
<LocalLeader> is a setting in VIM that depicts a prefix for scripts and
|
763
|
+
plugins to use. By default this is the backslash key `\'. See |mapleader|
|
764
|
+
for details.
|
765
|
+
|
766
|
+
<LocalLeader>Space
|
767
|
+
Normal or Insert - Continue editing after the ending tag. This
|
768
|
+
option requires xml_jump_string to be set to function. When a tag
|
769
|
+
is completed it will append the xml_jump_string. Once this mapping
|
770
|
+
is ran it will delete the next xml_jump_string pattern to the right
|
771
|
+
of the curser and delete it leaving you in insert mode to continue
|
772
|
+
editing.
|
773
|
+
|
774
|
+
<LocalLeader><LocalLeader>
|
775
|
+
Normal - Will clear the entire file of left over xml_jump_string garbage.
|
776
|
+
* This will also happen automatically when you save the file. *
|
777
|
+
|
778
|
+
<LocalLeader>x
|
779
|
+
Visual - Place a custom XML tag to suround the selected text. You
|
780
|
+
need to have selected text in visual mode before you can use this
|
781
|
+
mapping. See |visual-mode| for details.
|
782
|
+
|
783
|
+
<LocalLeader>. or <LocalLeader>>
|
784
|
+
Insert - Place a literal '>' without parsing tag.
|
785
|
+
|
786
|
+
<LocalLeader>5 or <LocalLeader>%
|
787
|
+
Normal or Visual - Jump to the begining or end tag.
|
788
|
+
|
789
|
+
<LocalLeader>d
|
790
|
+
Normal - Deletes the surrounding tags from the cursor. >
|
791
|
+
<tag1>outter <tag2>inner text</tag2> text</tag1>
|
792
|
+
^
|
793
|
+
< Turns to: >
|
794
|
+
outter <tag2>inner text</tag2> text
|
795
|
+
^
|
796
|
+
<
|
797
|
+
|
798
|
+
------------------------------------------------------------------------------
|
799
|
+
*xml-plugin-settings*
|
800
|
+
Options {{{2 ~
|
801
|
+
|
802
|
+
(All options must be placed in your |.vimrc| prior to the |ftplugin|
|
803
|
+
command.)
|
804
|
+
|
805
|
+
xml_tag_completion_map
|
806
|
+
Use this setting to change the default mapping to auto complete a
|
807
|
+
tag. By default typing a literal `>' will cause the tag your editing
|
808
|
+
to auto complete; pressing twice will auto nest the tag. By using
|
809
|
+
this setting the `>' will be a literal `>' and you must use the new
|
810
|
+
mapping to perform auto completion and auto nesting. For example if
|
811
|
+
you wanted Control-L to perform auto completion inmstead of typing a
|
812
|
+
`>' place the following into your .vimrc: >
|
813
|
+
let xml_tag_completion_map = "<C-l>"
|
814
|
+
<
|
815
|
+
xml_no_auto_nesting
|
816
|
+
This turns off the auto nesting feature. After a completion is made
|
817
|
+
and another `>' is typed xml-edit automatically will break the tag
|
818
|
+
accross multiple lines and indent the curser to make creating nested
|
819
|
+
tqags easier. This feature turns it off. Enter the following in your
|
820
|
+
.vimrc: >
|
821
|
+
let xml_no_auto_nesting = 1
|
822
|
+
<
|
823
|
+
xml_use_xhtml
|
824
|
+
When editing HTML this will auto close the short tags to make valid
|
825
|
+
XML like <hr /> and <br />. Enter the following in your vimrc to
|
826
|
+
turn this option on: >
|
827
|
+
let xml_use_xhtml = 1
|
828
|
+
<
|
829
|
+
xml_no_html
|
830
|
+
This turns of the support for HTML specific tags. Place this in your
|
831
|
+
.vimrc: >
|
832
|
+
let xml_no_html = 1
|
833
|
+
<
|
834
|
+
xml_jump_string
|
835
|
+
This turns of the support for continuing edits after an ending tag.
|
836
|
+
xml_jump_string can be any string how ever a simple character will
|
837
|
+
serfice. Pick a character or small string that is unique and will
|
838
|
+
not interfer with your normal editing. See the <LocalLeader>Space
|
839
|
+
mapping for more.
|
840
|
+
.vimrc: >
|
841
|
+
let xml_jump_string = "`"
|
842
|
+
<
|
843
|
+
------------------------------------------------------------------------------
|
844
|
+
*xml-plugin-callbacks*
|
845
|
+
Callback Functions {{{2 ~
|
846
|
+
|
847
|
+
A callback function is a function used to customize features on a per tag
|
848
|
+
basis. For example say you wish to have a default set of attributs when you
|
849
|
+
type an empty tag like this:
|
850
|
+
You type: <tag>
|
851
|
+
You get: <tag default="attributes"></tag>
|
852
|
+
|
853
|
+
This is for any script programmers who wish to add xml-plugin support to
|
854
|
+
there own filetype plugins.
|
855
|
+
|
856
|
+
Callback functions recive one attribute variable which is the tag name. The
|
857
|
+
all must return either a string or the number zero. If it returns a string
|
858
|
+
the plugin will place the string in the proper location. If it is a zero the
|
859
|
+
plugin will ignore and continue as if no callback existed.
|
860
|
+
|
861
|
+
The following are implemented callback functions:
|
862
|
+
|
863
|
+
HtmlAttribCallback
|
864
|
+
This is used to add default attributes to html tag. It is intended
|
865
|
+
for HTML files only.
|
866
|
+
|
867
|
+
XmlAttribCallback
|
868
|
+
This is a generic callback for xml tags intended to add attributes.
|
869
|
+
|
870
|
+
*xml-plugin-html*
|
871
|
+
Callback Example {{{2 ~
|
872
|
+
|
873
|
+
The following is an example of using XmlAttribCallback in your .vimrc
|
874
|
+
>
|
875
|
+
function XmlAttribCallback (xml_tag)
|
876
|
+
if a:xml_tag ==? "my-xml-tag"
|
877
|
+
return "attributes=\"my xml attributes\""
|
878
|
+
else
|
879
|
+
return 0
|
880
|
+
endif
|
881
|
+
endfunction
|
882
|
+
<
|
883
|
+
The following is a sample html.vim file type plugin you could use:
|
884
|
+
>
|
885
|
+
" Vim script file vim600:fdm=marker:
|
886
|
+
" FileType: HTML
|
887
|
+
" Maintainer: Devin Weaver <vim (at) tritarget.com>
|
888
|
+
" Location: http://www.vim.org/scripts/script.php?script_id=301
|
889
|
+
|
890
|
+
" This is a wrapper script to add extra html support to xml documents.
|
891
|
+
" Original script can be seen in xml-plugin documentation.
|
892
|
+
|
893
|
+
" Only do this when not done yet for this buffer
|
894
|
+
if exists("b:did_ftplugin")
|
895
|
+
finish
|
896
|
+
endif
|
897
|
+
" Don't set 'b:did_ftplugin = 1' because that is xml.vim's responsability.
|
898
|
+
|
899
|
+
let b:html_mode = 1
|
900
|
+
|
901
|
+
if !exists("*HtmlAttribCallback")
|
902
|
+
function HtmlAttribCallback( xml_tag )
|
903
|
+
if a:xml_tag ==? "table"
|
904
|
+
return "cellpadding=\"0\" cellspacing=\"0\" border=\"0\""
|
905
|
+
elseif a:xml_tag ==? "link"
|
906
|
+
return "href=\"/site.css\" rel=\"StyleSheet\" type=\"text/css\""
|
907
|
+
elseif a:xml_tag ==? "body"
|
908
|
+
return "bgcolor=\"white\""
|
909
|
+
elseif a:xml_tag ==? "frame"
|
910
|
+
return "name=\"NAME\" src=\"/\" scrolling=\"auto\" noresize"
|
911
|
+
elseif a:xml_tag ==? "frameset"
|
912
|
+
return "rows=\"0,*\" cols=\"*,0\" border=\"0\""
|
913
|
+
elseif a:xml_tag ==? "img"
|
914
|
+
return "src=\"\" width=\"0\" height=\"0\" border=\"0\" alt=\"\""
|
915
|
+
elseif a:xml_tag ==? "a"
|
916
|
+
if has("browse")
|
917
|
+
" Look up a file to fill the href. Used in local relative file
|
918
|
+
" links. typeing your own href before closing the tag with `>'
|
919
|
+
" will override this.
|
920
|
+
let cwd = getcwd()
|
921
|
+
let cwd = substitute (cwd, "\\", "/", "g")
|
922
|
+
let href = browse (0, "Link to href...", getcwd(), "")
|
923
|
+
let href = substitute (href, cwd . "/", "", "")
|
924
|
+
let href = substitute (href, " ", "%20", "g")
|
925
|
+
else
|
926
|
+
let href = ""
|
927
|
+
endif
|
928
|
+
return "href=\"" . href . "\""
|
929
|
+
else
|
930
|
+
return 0
|
931
|
+
endif
|
932
|
+
endfunction
|
933
|
+
endif
|
934
|
+
|
935
|
+
" On to loading xml.vim
|
936
|
+
runtime ftplugin/xml.vim
|
937
|
+
<
|
938
|
+
=== END_DOC
|
939
|
+
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
940
|
+
" vim: set tabstop=8 shiftwidth=4 softtabstop=4 smartindent
|
941
|
+
" vim600: set foldmethod=marker smarttab fileencoding=iso-8859-15
|