| 
									
										
										
										
											2005-07-05 21:48:14 +00:00
										 |  |  | " 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. |