Mercurial > vim
diff runtime/ftplugin/AppendMatchGroup.vim @ 391:289b19a6f2ed v7.0103
updated for version 7.0103
author | vimboss |
---|---|
date | Tue, 05 Jul 2005 21:48:14 +0000 |
parents | bdeee1504ac1 |
children |
line wrap: on
line diff
--- a/runtime/ftplugin/AppendMatchGroup.vim +++ b/runtime/ftplugin/AppendMatchGroup.vim @@ -1,125 +1,125 @@ -" 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. +" 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.