Bram Moolenaar | cfbc5ee | 2004-07-02 15:38:35 +0000 | [diff] [blame] | 1 | " Vim filetype plugin file utility
|
| 2 | " Language: * (various)
|
| 3 | " Maintainer: Dave Silvia <dsilvia@mchsi.com>
|
| 4 | " Date: 6/30/2004
|
| 5 |
|
| 6 | " The start of match (b:SOM) default is:
|
| 7 | " '\<'
|
| 8 | " The end of match (b:EOM) default is:
|
| 9 | " '\>'
|
| 10 | "
|
| 11 | " If you want to use some other start/end of match, just assign the
|
| 12 | " value to the b:SOM|EOM variable in your filetype script.
|
| 13 | "
|
| 14 | " SEE: :h pattern.txt
|
| 15 | " :h pattern-searches
|
| 16 | " :h regular-expression
|
| 17 | " :h matchit
|
| 18 |
|
| 19 | let s:myName=expand("<sfile>:t")
|
| 20 |
|
| 21 | " matchit.vim not loaded -- don't do anyting
|
| 22 | if !exists("loaded_matchit")
|
| 23 | echomsg s:myName.": matchit.vim not loaded -- finishing without loading"
|
| 24 | finish
|
| 25 | endif
|
| 26 |
|
| 27 | " already been here -- don't redefine
|
| 28 | if exists("*AppendMatchGroup")
|
| 29 | finish
|
| 30 | endif
|
| 31 |
|
| 32 | " Function To Build b:match_words
|
| 33 | " The following function, 'AppendMatchGroup', helps to increase
|
| 34 | " readability of your filetype script if you choose to use matchit.
|
| 35 | " It also precludes many construction errors, reducing the
|
| 36 | " construction to simply invoking the function with the match words.
|
| 37 | " As an example, let's take the ubiquitous if/then/else/endif type
|
| 38 | " of construct. This is how the entry in your filetype script would look.
|
| 39 | "
|
| 40 | " " source the AppendMatchGroup function file
|
| 41 | " runtime ftplugin/AppendMatchGroup.vim
|
| 42 | "
|
| 43 | " " fill b:match_words
|
| 44 | " call AppendMatchGroup('if,then,else,endif')
|
| 45 | "
|
| 46 | " And the b:match_words constructed would look like:
|
| 47 | "
|
| 48 | " \<if\>:\<then\>:\<else\>:\<endif\>
|
| 49 | "
|
| 50 | " Use of AppendMatchGroup makes your filetype script is a little
|
| 51 | " less busy and a lot more readable. Additionally, it
|
| 52 | " checks three critical things:
|
| 53 | "
|
| 54 | " 1) Do you have at least 2 entries in your match group.
|
| 55 | "
|
| 56 | " 2) Does the buffer variable 'b:match_words' exist? if not, create it.
|
| 57 | "
|
| 58 | " 3) If the buffer variable 'b:match_words' does exist, is the last
|
| 59 | " character a ','? If not, add it before appending.
|
| 60 | "
|
| 61 | " You should now be able to match 'if/then/else/endif' in succession
|
| 62 | " in your source file, in just about any construction you may have
|
| 63 | " chosen for them.
|
| 64 | "
|
| 65 | " To add another group, simply call 'AppendMatchGroup again. E.G.:
|
| 66 | "
|
| 67 | " call AppendMatchGroup('while,do,endwhile')
|
| 68 |
|
| 69 | function AppendMatchGroup(mwordList)
|
| 70 | let List=a:mwordList
|
| 71 | let Comma=match(List,',')
|
| 72 | if Comma == -1 || Comma == strlen(List)-1
|
| 73 | echoerr "Must supply a comma separated list of at least 2 entries."
|
| 74 | echoerr "Supplied list: <".List.">"
|
| 75 | return
|
| 76 | endif
|
| 77 | let listEntryBegin=0
|
| 78 | let listEntryEnd=Comma
|
| 79 | let listEntry=strpart(List,listEntryBegin,listEntryEnd-listEntryBegin)
|
| 80 | let List=strpart(List,Comma+1)
|
| 81 | let Comma=match(List,',')
|
| 82 | " if listEntry is all spaces || List is empty || List is all spaces
|
| 83 | if (match(listEntry,'\s\+') == 0 && match(listEntry,'\S\+') == -1)
|
| 84 | \ || List == '' || (match(List,'\s\+') == 0 && match(List,'\S\+') == -1)
|
| 85 | echoerr "Can't use all spaces for an entry <".listEntry.">"
|
| 86 | echoerr "Remaining supplied list: <".List.">"
|
| 87 | return
|
| 88 | endif
|
| 89 |
|
| 90 | if !exists("b:SOM")
|
| 91 | let b:SOM='\<'
|
| 92 | endif
|
| 93 | if !exists("b:EOM")
|
| 94 | let b:EOM='\>'
|
| 95 | endif
|
| 96 | if !exists("b:match_words")
|
| 97 | let b:match_words=''
|
| 98 | endif
|
| 99 | if b:match_words != '' && match(b:match_words,',$') == -1
|
| 100 | let b:match_words=b:match_words.','
|
| 101 | endif
|
| 102 | " okay, all set add first entry in this list
|
| 103 | let b:match_words=b:match_words.b:SOM.listEntry.b:EOM.':'
|
| 104 | while Comma != -1
|
| 105 | let listEntryEnd=Comma
|
| 106 | let listEntry=strpart(List,listEntryBegin,listEntryEnd-listEntryBegin)
|
| 107 | let List=strpart(List,Comma+1)
|
| 108 | let Comma=match(List,',')
|
| 109 | " if listEntry is all spaces
|
| 110 | if match(listEntry,'\s\+') == 0 && match(listEntry,'\S\+') == -1
|
| 111 | echoerr "Can't use all spaces for an entry <".listEntry."> - skipping"
|
| 112 | echoerr "Remaining supplied list: <".List.">"
|
| 113 | continue
|
| 114 | endif
|
| 115 | let b:match_words=b:match_words.b:SOM.listEntry.b:EOM.':'
|
| 116 | endwhile
|
| 117 | let listEntry=List
|
| 118 | let b:match_words=b:match_words.b:SOM.listEntry.b:EOM
|
| 119 | endfunction
|
| 120 |
|
| 121 | " TODO: Write a wrapper to handle multiple groups in one function call.
|
| 122 | " Don't see a lot of utility in this as it would undoubtedly warrant
|
| 123 | " continuation lines in the filetype script and it would be a toss
|
| 124 | " up as to which is more readable: individual calls one to a line or
|
| 125 | " a single call with continuation lines. I vote for the former.
|