diff runtime/autoload/xmlcomplete.vim @ 644:e4fa26ce8769 v7.0187

updated for version 7.0187
author vimboss
date Wed, 25 Jan 2006 22:10:52 +0000
parents 25a70b1cd2da
children d6a69271cb9a
line wrap: on
line diff
--- a/runtime/autoload/xmlcomplete.vim
+++ b/runtime/autoload/xmlcomplete.vim
@@ -1,7 +1,7 @@
 " Vim completion script
-" Language:	XHTML 1.0 Strict
+" Language:	XML
 " Maintainer:	Mikolaj Machowski ( mikmach AT wp DOT pl )
-" Last Change:	2005 Nov 22
+" Last Change:	2006 Jan 24
 
 " This function will create Dictionary with users namespace strings and values
 " canonical (system) names of data files.  Names should be lowercase,
@@ -54,6 +54,7 @@ endfunction
 function! xmlcomplete#CompleteTags(findstart, base)
   if a:findstart
     " locate the start of the word
+	let curline = line('.')
     let line = getline('.')
     let start = col('.') - 1
 	let compl_begin = col('.') - 2
@@ -69,11 +70,32 @@ function! xmlcomplete#CompleteTags(finds
 	endif
 
 	let b:compl_context = getline('.')[0:(compl_begin)]
-	let b:compl_context = matchstr(b:compl_context, '.*<\zs.*')
+	if b:compl_context !~ '<[^>]*$'
+		" Look like we may have broken tag. Check previous lines. Up to
+		" 10?
+		let i = 1
+		while 1
+			let context_line = getline(curline-i)
+			if context_line =~ '<[^>]*$'
+				" Yep, this is this line
+				let context_lines = getline(curline-i, curline)
+				let b:compl_context = join(context_lines, ' ')
+				break
+			elseif context_line =~ '>[^<]*$'
+				" Normal tag line, no need for completion at all
+				let b:compl_context = ''
+				break
+			endif
+			let i += 1
+		endwhile
+		" Make sure we don't have counter
+		unlet! i
+	endif
+	let b:compl_context = matchstr(b:compl_context, '.*\zs<.*')
 
 	" Make sure we will have only current namespace
 	unlet! b:xml_namespace
-	let b:xml_namespace = matchstr(b:compl_context, '^\k*\ze:')
+	let b:xml_namespace = matchstr(b:compl_context, '^<\zs\k*\ze:')
 	if b:xml_namespace == ''
 		let b:xml_namespace = 'DEFAULT'
 	endif
@@ -89,7 +111,10 @@ function! xmlcomplete#CompleteTags(finds
     let res = []
     let res2 = []
 	" a:base is very short - we need context
-	let context = b:compl_context
+	if len(b:compl_context) == 0  && !exists("b:entitiescompl")
+		return []
+	endif
+	let context = matchstr(b:compl_context, '^<\zs.*')
 	unlet! b:compl_context
 
 	" Make entities completion
@@ -111,13 +136,24 @@ function! xmlcomplete#CompleteTags(finds
 			let values = intent + values
 		endif
 
-		for m in values
-			if m =~ '^'.a:base
-				call add(res, m.';')
-			endif
-		endfor
+		if len(a:base) == 1
+			for m in values
+				if m =~ '^'.a:base
+					call add(res, m.';')
+				endif
+			endfor
+			return res
+		else
+			for m in values
+				if m =~? '^'.a:base
+					call add(res, m.';')
+				elseif m =~? a:base
+					call add(res2, m.';')
+				endif
+			endfor
 
-		return res
+			return res + res2
+		endif
 
 	endif
 	if context =~ '>'
@@ -265,6 +301,9 @@ function! xmlcomplete#CompleteTags(finds
 	" Deal with tag completion.
 	let opentag = xmlcomplete#GetLastOpenTag("b:unaryTagsStack")
 	let opentag = substitute(opentag, '^\k*:', '', '')
+	if opentag == ''
+		return []
+	endif
 
 	let tags = g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[opentag][0]
 	let context = substitute(context, '^\k*:', '', '')