home *** CD-ROM | disk | FTP | other *** search
- " 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.
-