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