forked from aniani/vim
		
	
		
			
	
	
		
			126 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
		
		
			
		
	
	
			126 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
|   | " Vim filetype plugin file utility | ||
|  | " Language:    * (various) | ||
|  | " Maintainer:  Dave Silvia <dsilvia@mchsi.com> | ||
|  | " Date:        6/30/2004 | ||
|  | 
 | ||
|  | " The start of match (b:SOM) default is: | ||
|  | "       '\<' | ||
|  | " The end of match (b:EOM) default is: | ||
|  | "       '\>' | ||
|  | " | ||
|  | " If you want to use some other start/end of match, just assign the | ||
|  | " value to the b:SOM|EOM variable in your filetype script. | ||
|  | " | ||
|  | " SEE: :h pattern.txt | ||
|  | "      :h pattern-searches | ||
|  | "      :h regular-expression | ||
|  | "      :h matchit | ||
|  | 
 | ||
|  | let s:myName=expand("<sfile>:t") | ||
|  | 
 | ||
|  | " matchit.vim not loaded -- don't do anyting | ||
|  | if !exists("loaded_matchit") | ||
|  | 	echomsg s:myName.": matchit.vim not loaded -- finishing without loading" | ||
|  | 	finish | ||
|  | endif | ||
|  | 
 | ||
|  | " already been here -- don't redefine | ||
|  | if exists("*AppendMatchGroup") | ||
|  | 	finish | ||
|  | endif | ||
|  | 
 | ||
|  | " Function To Build b:match_words | ||
|  | " The following function, 'AppendMatchGroup', helps to increase | ||
|  | " readability of your filetype script if you choose to use matchit. | ||
|  | " It also precludes many construction errors, reducing the | ||
|  | " construction to simply invoking the function with the match words. | ||
|  | " As an example, let's take the ubiquitous if/then/else/endif type | ||
|  | " of construct.  This is how the entry in your filetype script would look. | ||
|  | " | ||
|  | "     " source the AppendMatchGroup function file | ||
|  | "     runtime ftplugin/AppendMatchGroup.vim | ||
|  | " | ||
|  | "     " fill b:match_words | ||
|  | "     call AppendMatchGroup('if,then,else,endif') | ||
|  | " | ||
|  | " And the b:match_words constructed would look like: | ||
|  | " | ||
|  | "     \<if\>:\<then\>:\<else\>:\<endif\> | ||
|  | "  | ||
|  | " Use of AppendMatchGroup makes your filetype script is a little | ||
|  | " less busy and a lot more readable.  Additionally, it | ||
|  | " checks three critical things: | ||
|  | " | ||
|  | "      1)  Do you have at least 2 entries in your match group. | ||
|  | " | ||
|  | "      2)  Does the buffer variable 'b:match_words' exist?  if not, create it. | ||
|  | " | ||
|  | "      3)  If the buffer variable 'b:match_words' does exist, is the last | ||
|  | "          character a ','?  If not, add it before appending. | ||
|  | "  | ||
|  | " You should now be able to match 'if/then/else/endif' in succession | ||
|  | " in your source file, in just about any construction you may have | ||
|  | " chosen for them. | ||
|  | " | ||
|  | " To add another group, simply call 'AppendMatchGroup again.  E.G.: | ||
|  | " | ||
|  | "      call AppendMatchGroup('while,do,endwhile') | ||
|  | 
 | ||
|  | function AppendMatchGroup(mwordList) | ||
|  | 	let List=a:mwordList | ||
|  | 	let Comma=match(List,',') | ||
|  | 	if Comma == -1 || Comma == strlen(List)-1 | ||
|  | 		echoerr "Must supply a comma separated list of at least 2 entries." | ||
|  | 		echoerr "Supplied list: <".List.">" | ||
|  | 		return | ||
|  | 	endif | ||
|  | 	let listEntryBegin=0 | ||
|  | 	let listEntryEnd=Comma | ||
|  | 	let listEntry=strpart(List,listEntryBegin,listEntryEnd-listEntryBegin) | ||
|  | 	let List=strpart(List,Comma+1) | ||
|  | 	let Comma=match(List,',') | ||
|  | 	" if listEntry is all spaces || List is empty || List is all spaces | ||
|  | 	if (match(listEntry,'\s\+') == 0 && match(listEntry,'\S\+') == -1) | ||
|  | 			\ || List == '' || (match(List,'\s\+') == 0 && match(List,'\S\+') == -1) | ||
|  | 		echoerr "Can't use all spaces for an entry <".listEntry.">" | ||
|  | 		echoerr "Remaining supplied list: <".List.">" | ||
|  | 		return | ||
|  | 	endif | ||
|  | 
 | ||
|  | 	if !exists("b:SOM") | ||
|  | 		let b:SOM='\<' | ||
|  | 	endif | ||
|  | 	if !exists("b:EOM") | ||
|  | 		let b:EOM='\>' | ||
|  | 	endif | ||
|  | 	if !exists("b:match_words") | ||
|  | 		let b:match_words='' | ||
|  | 	endif | ||
|  | 	if b:match_words != '' && match(b:match_words,',$') == -1 | ||
|  | 		let b:match_words=b:match_words.',' | ||
|  | 	endif | ||
|  | 	" okay, all set add first entry in this list | ||
|  | 	let b:match_words=b:match_words.b:SOM.listEntry.b:EOM.':' | ||
|  | 	while Comma != -1 | ||
|  | 		let listEntryEnd=Comma | ||
|  | 		let listEntry=strpart(List,listEntryBegin,listEntryEnd-listEntryBegin) | ||
|  | 		let List=strpart(List,Comma+1) | ||
|  | 		let Comma=match(List,',') | ||
|  | 		" if listEntry is all spaces | ||
|  | 		if match(listEntry,'\s\+') == 0 && match(listEntry,'\S\+') == -1 | ||
|  | 			echoerr "Can't use all spaces for an entry <".listEntry."> - skipping" | ||
|  | 			echoerr "Remaining supplied list: <".List.">" | ||
|  | 			continue | ||
|  | 		endif | ||
|  | 		let b:match_words=b:match_words.b:SOM.listEntry.b:EOM.':' | ||
|  | 	endwhile | ||
|  | 	let listEntry=List | ||
|  | 	let b:match_words=b:match_words.b:SOM.listEntry.b:EOM | ||
|  | endfunction | ||
|  | 
 | ||
|  | " TODO:  Write a wrapper to handle multiple groups in one function call. | ||
|  | "        Don't see a lot of utility in this as it would undoubtedly warrant | ||
|  | "        continuation lines in the filetype script and it would be a toss | ||
|  | "        up as to which is more readable: individual calls one to a line or | ||
|  | "        a single call with continuation lines.  I vote for the former. |