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.
 |