]> gitweb.factorcode.org Git - factor.git/blob - misc/vim/syntax/factor.vim
misc/vim: fix SYNTAX: highlighting.
[factor.git] / misc / vim / syntax / factor.vim
1 " Vim syntax file
2 " Language: Factor
3 " Maintainer: Alex Chapman <chapman.alex@gmail.com>
4 " Last Change: 2020 Sep 30
5 " Minimum Version: 600
6
7 " Factor |syntax| file guide & conventions:
8 "
9 " Inside |:comment|s, words in |bars| contain |:help| keywords.
10 "   |K| looks these up.
11 "
12 " Alignment columns should normally occur on multiples of 4.
13 " Align Vim syntax alternatives naturally. E.g.:
14 "   "syn match   ..."
15 "   "syn cluster ..."
16 "   "syn region  ..."
17 " Align |:syn-start|, |:syn-skip|, and |:syn-end| on their patterns.
18 " ":echo (col('.') - 1) % 4" is handy here.
19 "
20 " All syntax patterns (|:syn-pattern|) are "very magic" (|/\v|).
21 " Escape all literal [^[:alnum:]_-!:;] characters in these patterns.
22 " (Not escaping [-!:;] characters risks forward-incompatibility,
23 "   but fixes if an incompatible Vim arises would be trivial,
24 "   and Factor likes these characters.)
25 "
26 " Syntax groups ending in "Error" match errors via |:syn-priority|,
27 "   and should normally |:hi-link| to "Error".
28 "
29 " Syntax groups named "{group-name}Trans" are |:syn-transparent|.
30 "
31 " |:syn-cluster|s named "{group-name}" mean to allow |:syn-contains| use of
32 "   |:syn-priority|-based error-detection.
33 " This still applies to clusters named "{group-name}Trans".
34 "
35 " Syntax groups "{group-name}Skip" have the form:
36 " "syn match {group-name}Skip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup={group-name} transparent contained"
37 " Specifying "nextgroup={group-name}Skip skipempty" works like a Factor-aware
38 "   "nextgroup={group-name} skipwhite skipempty"
39 "   with required initial space (not optional).
40 " "{cluster-name}Skip" works similarly, but with "nextgroup=@{cluster-name}".
41 "
42 " Vim's syntax highlighting freaks at paired "/\v\(" and "/\v\)". ☹
43 " Switching into very nomagic (with "/\V(\v/" or "/\V)\v") averts that,
44 "   as non-escaped parentheses don't extend pattern regions.
45 "
46 " A handy testing command:
47 " "echo join(map(synstack(line('.'),col('.')),{sn->{i,s->{t->sn(s).(s==t?'':' ('.sn(t).')')}(synIDtrans(s))}}({s->synIDattr(s,'name')})),' -> ')"
48 "   Outputs in the form "hi<...> trans<...> lo<...>":
49 "     "hi": syntax group
50 "     "trans": transparent syntax group (if not applicable, same as "hi")
51 "     "lo": highlight group
52
53 if exists('b:current_syntax')
54   finish
55 endif
56
57 " Factor is case sensitive.
58 syn case match
59
60 syn match   factorWord   /\v<\S+>/  contains=@factorWord transparent display
61 syn cluster factorCluster           contains=factorWord,factorComment,factorMultilineComment,@factorClusterValue,factorDeclaration,factorCall,factorCallNextMethod,@factorWordOps,factorAlien,factorSlot,factorTuple,factorStruct
62 syn cluster factorClusterValue      contains=factorBreakpoint,factorBoolean,factorFrySpecifier,factorLocalsSpecifier,factorChar,factorString,@factorNumber,factorBackslash,factorMBackslash,factorLiteral,@factorEffect,@factorQuotation,@factorArray,factorRegexp
63
64 " A crash course on Factor's lexer:
65 "
66 " The "lexer" vocabulary parses lines (arrays of strings) into tokens.
67 " Tokens are non-space strings, effectively words.
68 " The "lexer" class holds lex state.
69 " Lexer method "skip-word" advances to the next space
70 "     while also counting leading double quotation marks as their own words.
71 "   I.e., this advances to the end of the current token
72 "     (if currently at a token, otherwise nothing changes).
73 " Method "skip-blank" advances to the next non-space
74 "     while also skipping shebangs at the beginning of the first line.
75 "   I.e., this advances to the start of the next token
76 "     (if one is present, otherwise it advances to the line's end).
77 " "(parse-raw)" advances a lexer through an immediate token via "skip-word",
78 "   and returns the (sub)token advanced through.
79 "   Note that this will not advance a lexer at space,
80 "     and an empty string will be returned.
81 " "next-line" advances a lexer to the start of the next line,
82 "   adding an effectively empty line to the end (as an EOF state).
83 " "parse-raw" advances a lexer through the next token,
84 "   first via alternating "skip-blank" & "next-line" if the line ended,
85 "     then via "(parse-raw)",
86 "   and returns it if found, otherwise (i.e. upon EOF) returning "f".
87 "     Note that the lexer will be advanced to EOF if "f" is returned.
88 " Comments are (unprocessed) remainders of lines, after a "!" word.
89 " "parse-token" advances a lexer though the next token via "parse-raw",
90 "   then returns it if found, otherwise returning "f".
91 "   while also advancing through comments
92 "     via mutual recursion with "skip-comment".
93 "   "[ skip-comment ] call( lexer str -- str' )" tests if a token is "!",
94 "     returning that token if so,
95 "     otherwise first advancing a lexer to the next line via "next-line"
96 "         (i.e. discarding the rest of the current line)
97 "       and then advancing it via "parse-token" & returning that token,
98 "     ensuring the return of "parse-token"'s desired non-comment token.
99 " The "lexer" dynamic variable holds the ambient lexer.
100 " "?scan-token" advances the ambient lexer through the next token
101 "     via "parse-token",
102 "   and returns it if found, otherwise returning "f".
103 " "scan-token" advances the ambient lexer through the next token
104 "     via "?scan-token",
105 "   and returns it if found, otherwise throwing an exception.
106 " All other words in the "lexer" vocabulary read via "scan-token", if at all.
107 " So! To know when double quotes & exclamation marks aren't special,
108 "   grep for "parse-raw". (Mostly. To be certain, grep for "lexer".)
109
110 syn match   factorShebang           /\v%^\#!.*$/ display
111
112 syn cluster factorComment           contains=factorComment
113 syn match   factorComment           /\v<!>.*$/ contains=@factorCommentContents
114 syn cluster factorCommentContents   contains=factorTodo,@Spell
115 syn match   factorTodo              /\v(TODO|FIXME|XXX):=/ contained
116
117 syn region  factorDefn  matchgroup=NONE  start=/\v<%(SYNTAX|CONSTRUCTOR|%(M|MACRO|MEMO|TYPED)?:?):>/  skip=/\v<!>.*/  matchgroup=factorDefnDelims  end=/\v<;>/  contains=factorDefnDelims,@factorCluster keepend transparent
118 syn region  factorDefnDelims        start=/\v<SYNTAX:>/                            skip=/\v<!>.*/  end=/\v<\S+>/  contains=@factorComment skipempty keepend contained
119 syn region  factorDefnDelims        start=/\v<%(MACRO|MEMO|TYPED)?:?:>/            skip=/\v<!>.*/  end=/\v<\S+>/  contains=@factorComment nextgroup=factorEffectSkip skipempty keepend contained
120 syn region  factorDefnDelims        start=/\v<M:>/                                 skip=/\v<!>.*/  end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment skipempty keepend contained
121 syn region  factorDefnDelims        start=/\v<M::>/                                skip=/\v<!>.*/  end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment nextgroup=factorEffectSkip skipempty keepend contained
122 syn region  factorDefnDelims        start=/\v<CONSTRUCTOR:>/                       skip=/\v<!>.*/  end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment nextgroup=factorEffectSkip skipempty keepend contained
123 syn region  factorDeclDelims        start=/\v<%(GENERIC|MATH|PRIMITIVE):>/         skip=/\v<!>.*/  end=/\v<\S+>/                       contains=@factorComment nextgroup=factorEffectSkip skipempty keepend
124 syn region  factorDeclDelims        start=/\v<GENERIC\#:>/                         skip=/\v<!>.*/  end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/   contains=@factorComment nextgroup=factorEffectSkip skipempty keepend
125 syn region  factorDeclDelims        start=/\v<HOOK:>/                              skip=/\v<!>.*/  end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment nextgroup=factorEffectSkip skipempty keepend
126 syn region  factorDeclDelims        start=/\v<C:>/                                 skip=/\v<!>.*/  end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment skipempty keepend
127
128 syn region  factorPDefn  matchgroup=NONE  start=/\v<%(SYNTAX|CONSTRUCTOR|%(M|MACRO|MEMO|TYPED)?:?):>/  skip=/\v<!>.*/  matchgroup=factorPDefnDelims  end=/\v<;>/  contains=factorPDefnDelims,@factorCluster keepend contained
129 syn region  factorPDefnDelims       start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/  skip=/\v<!>.*/  end=/\v<\S+>/                       contains=@factorComment nextgroup=factorEffectSkip skipempty keepend contained
130 syn region  factorPDefnDelims       start=/\v<M:>/                                 skip=/\v<!>.*/  end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment skipempty keepend contained
131 syn region  factorPDefnDelims       start=/\v<M::>/                                skip=/\v<!>.*/  end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment nextgroup=factorEffectSkip skipempty keepend contained
132 syn region  factorPDefnDelims       start=/\v<CONSTRUCTOR:>/                       skip=/\v<!>.*/  end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment nextgroup=factorEffectSkip skipempty keepend contained
133 syn region  factorPDeclDelims       start=/\v<%(GENERIC|MATH|PRIMITIVE):>/         skip=/\v<!>.*/  end=/\v<\S+>/                       contains=@factorComment nextgroup=factorEffectSkip skipempty keepend contained
134 syn region  factorPDeclDelims       start=/\v<GENERIC\#:>/                         skip=/\v<!>.*/  end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/   contains=@factorComment nextgroup=factorEffectSkip skipempty keepend contained
135 syn region  factorPDeclDelims       start=/\v<HOOK:>/                              skip=/\v<!>.*/  end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment nextgroup=factorEffectSkip skipempty keepend contained
136 syn region  factorPDeclDelims       start=/\v<C:>/                                 skip=/\v<!>.*/  end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment skipempty keepend contained
137
138 syn region  factorPrivate           start=/\v<\<PRIVATE>/ end=/\v<PRIVATE\>>/ contains=@factorCluster,factorPDefn,factorPDeclDelims skipempty keepend
139
140 syn keyword factorBoolean           f t
141 syn keyword factorBreakpoint        B
142 syn keyword factorFrySpecifier      @ _ contained
143 syn keyword factorLocalsSpecifier   :> contained
144 syn keyword factorDeclaration       delimiter deprecated final flushable foldable inline recursive
145 syn region  factorCall  matchgroup=factorCallDelims  start=/\v<%(call|execute)\V(\v>/  end=/\v<\V)\v>/ contains=@factorEffectContents
146 syn keyword factorCallNextMethod    call-next-method
147
148 syn region  factorChar              start=/\v<CHAR:>/  end=/\v\S+>/
149 syn region  factorColor             start=/\v<COLOR:>/ end=/\v\S+>/
150
151 syn match   factorEscape            /\v\\([\\astnrbvf0e\"]|u\x{6}|u\{\S+}|x\x{2})/  contained display
152 syn region  factorString            matchgroup=factorStringDelims   start=/\v<"/                 skip=/\v\\"/ end=/\v"/           contains=factorEscape
153 syn region  factorString            matchgroup=factorStringDelims   start=/\v<"""/               skip=/\v\\"/ end=/\v"""/         contains=factorEscape
154 syn region  factorString            matchgroup=factorStringDelims   start=/\v<[^[:blank:]"]+"/   skip=/\v\\"/ end=/\v"/           contains=factorEscape
155 syn region  factorString            matchgroup=factorStringDelims   start=/\v\[\z(\=*)\[/                     end=/\]\z1\]/       contains=factorEscape
156 syn region  factorString            matchgroup=factorStringDelims   start=/\v<[^[\][:blank:]]+\[\z(\=*)\[>/   end=/\v\]\z1\]/
157
158 syn region  factorNamedString       matchgroup=factorNamedStringDelims   start=/\v<STRING:\s+\S+$>/   end=/\v^<;>$/  contains=factorEscape
159
160 syn region  factorMultilineComment  start=/\v<\/\*>/              end=/\v\*\//       contains=@factorCommentContents keepend
161 syn region  factorMultilineComment  start=/\v<!\[\z(\=*)\[/       end=/\v\]\z1\]/    contains=@factorCommentContents keepend
162
163 syn region factorRegexp             start=/\v<%(R\/\s)/  skip=/\v%(\\\/)/  end=/\v%(\/\S*)>/
164
165 syn cluster factorReal              contains=@factorInteger,@factorFloat,@factorRatio,@factorBin,@factorOct,@factorHex,factorNan
166 syn cluster factorNumber            contains=@factorReal,factorComplex
167
168 syn cluster factorInteger           contains=factorInteger
169 if !exists('g:factor_syn_no_error') " more general
170   syn cluster factorInteger         add=factorIntegerError
171   syn match   factorIntegerError    /\v<[+-]=%(\d|,){-}\d%(\d|,)*>/
172 endif
173 syn match   factorInteger           /\v<[+-]=\d%(\d|,)*,@1<!>/
174
175 syn cluster factorFloat             contains=factorFloat
176 if !exists('g:factor_syn_no_error') " more general
177   syn cluster factorFloat           add=factorFloatError
178   syn match   factorFloatError      /\v<[+-]=%(\S{-}\d&%(\d|,)*%([eE][+-]=%(\d|,)*|\.%(\d|,)*%([eE][+-]=%(\d|,)*)?)|\.%(\d|,)+%([eE][+-]=%(\d|,)*)?)>/
179 endif
180 syn match   factorFloat             /\v<[+-]=%(\d%(\d|,)*,@1<!%([eE][+-]=\d%(\d|,)*,@1<!|\.%(\d%(\d|,)*,@1<!)?%([eE][+-]=\d%(\d|,)*,@1<!)?)|\.\d%(\d|,)*,@1<!%([eE][+-]=\d%(\d|,)*,@1<!)?)>/
181
182 syn cluster factorRatio             contains=factorRatio
183 if !exists('g:factor_syn_no_error') " more general
184   syn cluster factorRatio           add=factorRatioError
185   syn match   factorRatioError      /\v<[+-]=%(\S{-}\d.{-}\/&%(\d|,)*\.?%(\d|,)*%([+-]%(\d|,)*)?)\/[+-]=%(\S{-}\d&%(\d|,)*\.?%(\d|,)*%([eE][+-]=%(\d|,)*)?)>/
186 endif
187 syn match   factorRatio             /\v<([+-]=)\d%(\d|,)*,@1<!%(\1@=[+-](\d%(\d|,)*,@1<!)\/\2@!\d%(\d|,)*,@1<!|\/%(\d%(\d|,)*,@1<!%(\.%(\d%(\d|,)*,@1<!)?)?|\.\d%(\d|,)*,@1<!)%([eE][+-]=\d%(\d|,)*,@1<!)?)%(\/0)@2<!>/
188
189 syn region  factorComplex           start=/\v<C\{>/   skip=/\v<!>.*/ end=/\v<\}>/    contains=@factorComment,@factorReal
190
191 syn cluster factorBin               contains=factorBin
192 if !exists('g:factor_syn_no_error')
193   syn cluster factorBin             add=factorBinError
194   syn match   factorBinError        /\v<[+-]=0[bB]%(\S{-}\w&%(\w|,)*\.?%(\w|,)*%([pP][+-]=%(\w|,)*)?)>/
195 endif
196 syn match   factorBin               /\v<[+-]=0[bB]%([01][01,]*,@1<!%(\.%([01][01,]*,@1<!)?)?|\.[01][01,]*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/
197
198 syn cluster factorOct               contains=factorOct
199 if !exists('g:factor_syn_no_error')
200   syn cluster factorOct             add=factorOctError
201   syn match   factorOctError        /\v<[+-]=0[oO]%(\S{-}\o&%(\w|,)*\.?(\w|,)*%([pP][+-]=%(\w|,)*)?)>/
202 endif
203 syn match   factorOct               /\v<[+-]=0[oO]%(\o%(\o|,)*,@1<!%(\.%(\o%(\o|,)*,@1<!)?)?|\.\o%(\o|,)*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/
204
205 syn cluster factorHex               contains=factorHex
206 syn cluster factorHexNoRadix        contains=factorHexNoRadix
207 if !exists('g:factor_syn_no_error')
208   syn cluster factorHex             add=factorHexError
209   syn match   factorHexError        /\v<[+-]=0[xX]%(\S{-}\x&%(\x|,)*\.?(\x|,)*%([pP][+-]=%(\w|,)*)?)>/
210   syn cluster factorHexNoRadix      add=factorHexNoRadixError
211   syn match   factorHexNoRadixError /\v<[+-]=%(\S{-}\x&%(\w|,)*\.?(\w|,)*%([pP][+-]=%(\w|,)*)?)>/   contained
212 endif
213 syn match   factorHex               /\v<[+-]=0[xX]%(\x%(\x|,)*,@1<!%(\.%(\x%(\x|,)*,@1<!)?)?|\.\x%(\x|,)*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/
214 syn match   factorHexNoRadix        /\v<[+-]=%(\x%(\x|,)*,@1<!%(\.%(\x%(\x|,)*,@1<!)?)?|\.\x%(\x|,)*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/  contained
215
216 syn region  factorNan matchgroup=factorNan    start=/\v<NAN:>/ matchgroup=NONE skip=/\v<!>.*/   end=/\v<\S+>/   contains=@factorComment,@factorHexNoRadix keepend
217
218 syn region  factorBackslash         start=/\v<\\>/     skip=/\v<!>.*/       end=/\v<\S+>/   contains=@factorComment
219 syn region  factorMBackslash        start=/\v<M\\>/    skip=/\v<!>.*/       end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment keepend
220 syn region  factorLiteral           start=/\v<\$>/     skip=/\v<!>.*/       end=/\v<\S+>/   contains=@factorComment
221
222 syn match   factorSlotAttrReadOnly      /\v<read-only>/ contained
223 syn match   factorSlotAttrInitial       /\v<initial:>%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=factorWord,@factorClusterValue contained
224 syn cluster factorSlotAttr              contains=factorSlotAttrInitial,factorSlotAttrReadOnly
225
226 syn cluster factorTupleSlotAttr         contains=@factorSlotAttr
227 syn match   factorTupleSlotAttrSkip     /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=@factorTupleSlotAttr contained transparent
228 syn match   factorTupleSlotName         /\v<\S+>/ nextgroup=factorTupleSlotClassSkip skipempty contained
229 syn match   factorTupleSlotNameSkip     /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorTupleSlotName transparent contained
230 syn match   factorTupleSlotClass        /\v<\S+>/ nextgroup=factorTupleSlotAttrSkip skipempty contained
231 syn match   factorTupleSlotClassSkip    /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=@factorTupleSlotAttr,factorTupleSlotClass transparent contained
232 syn region  factorTupleSlot   matchgroup=factorTupleSlotDelims  start=/\v<\{>/                end=/\v<\}>/    contains=@factorComment,factorTupleSlotName,@factorTupleSlotAttr contained
233 "syn match   factorTupleClass            /\v<\S+>/ nextgroup=factorTupleSuperClass,factorTupleSlot contained
234 "syn region  factorTupleSuperClass  matchgroup=NONE     start=/\v%(\s+\<\s+)/     matchgroup=Identifier end=/\v<\S+>/   contains=@factorComment contained nextgroup=factorTupleSlot
235 syn region  factorTuple   matchgroup=factorTupleDelims          start=/\v<%(TUPLE|BUILTIN|ERROR):>/ end=/\v<;>/     contains=@factorComment,factorTupleSlot
236 syn region  factorPredicate   matchgroup=factorPredicateDelims  start=/\v<%(PREDICATE):>/     end=/\v<;>/     contains=@factorComment,factorTupleSlot
237
238 syn match   factorStructSlotAttrBits    /\v<bits:>%(\_\s+%(!>.*)?)+/    contains=@factorComment nextgroup=factorWord,@factorReal contained
239 syn cluster factorStructSlotAttr        contains=@factorSlotAttr,factorStructSlotAttrBits
240 syn match   factorStructSlotName        /\v<\S+>/ nextgroup=factorStructSlotTypeSkip skipempty contained
241 syn match   factorStructSlotNameSkip    /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStructSlotName contained transparent
242 syn match   factorStructSlotType        /\v<\S+>/ contained
243 syn match   factorStructSlotTypeSkip    /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStructSlotType contained transparent
244 syn region  factorStructSlot      matchgroup=factorStructSlotDelims start=/\v<\{>/                   skip=/\v<!>.*/  end=/\v<\}>/ contains=@factorComment,factorStructSlotName,@factorStructSlotAttr contained
245 syn region  factorStruct          matchgroup=factorStructDelims     start=/\v<%(%(UNION-)?STRUCT):>/ skip=/\v<!>.*/  end=/\v<;>/  contains=@factorComment,factorStructSlot
246
247 syn region  factorAlias             start=/\v<ALIAS:>/           skip=/\v<!>.*/     end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment keepend
248 syn region  factorAlien             start=/\v<ALIEN:>/           skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment,@factorHexNoRadix
249 syn region  factorConstant          start=/\v<CONSTANT:>/        skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
250 syn region  factorDefer             start=/\v<DEFER:>/           skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
251 syn region  factorExclude           start=/\v<EXCLUDE:>/         skip=/\v<!>.*/     end=/\v<;>/     contains=@factorComment
252 syn region  factorForget            start=/\v<FORGET:>/          skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
253 syn region  factorFrom              start=/\v<FROM:>/            skip=/\v<!>.*/     end=/\v<;>/     contains=@factorComment
254 syn region  factorIn                start=/\v<IN:>/              skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
255 syn region  factorInstance          start=/\v<INSTANCE:>/        skip=/\v<!>.*/     end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment keepend
256 syn region  factorIntersection      start=/\v<INTERSECTION:>/    skip=/\v<!>.*/     end=/\v<;>/     contains=@factorComment
257 syn region  factorMain              start=/\v<MAIN:>/            skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
258 syn region  factorMixin             start=/\v<MIXIN:>/           skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
259 syn region  factorPostpone          start=/\v<POSTPONE:>/        skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
260 syn region  factorQualified         start=/\v<QUALIFIED:>/       skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
261 syn region  factorQualifiedWith     start=/\v<QUALIFIED-WITH:>/  skip=/\v<!>.*/     end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment keepend
262 syn region  factorRename            start=/\v<RENAME:>/          skip=/\v<!>.*/     end=/\v<\S+%(\_\s+%(!>.*)?)+\S+%(\_\s+%(!>.*)?)+\=\>%(\_\s+%(!>.*)?)+\S+>/  contains=@factorComment keepend
263 syn region  factorSingleton         start=/\v<SINGLETON:>/       skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
264 syn region  factorSingletons        start=/\v<SINGLETONS:>/      skip=/\v<!>.*/     end=/\v<;>/     contains=@factorComment
265 syn region  factorSlot              start=/\v<SLOT:>/            skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
266 syn region  factorSymbol            start=/\v<SYMBOL:>/          skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
267 syn region  factorSymbols           start=/\v<SYMBOLS:>/         skip=/\v<!>.*/     end=/\v<;>/     contains=@factorComment
268 syn region  factorUnion             start=/\v<UNION:>/           skip=/\v<!>.*/     end=/\v<;>/     contains=@factorComment
269 syn region  factorUnuse             start=/\v<UNUSE:>/           skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
270 syn region  factorUse               start=/\v<USE:>/             skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
271 syn region  factorUsing             start=/\v<USING:>/           skip=/\v<!>.*/     end=/\v<;>/     contains=@factorComment
272
273 syn cluster factorWordOps   contains=factorConstant,factorAlias,factorSingleton,factorSingletons,factorSymbol,factorSymbols,factorPostpone,factorDefer,factorForget,factorMixin,factorInstance,factorHook,factorMain
274
275 " HELP:
276 " ARTICLE:
277 " C-ENUM:
278 " FUNCTION:
279 " TYPEDEF:
280 " LIBRARY:
281
282 if !exists('g:factor_syn_no_error')
283   syn match   factorEffectRequired /\v<\V(\@!\v\S+>/    contained
284 endif
285 syn cluster factorEffectContents   contains=@factorComment,factorEffectDelims,factorEffectVar,factorEffectType,factorEffectRowVar
286 syn cluster factorEffect           contains=factorEffect
287 " Erroring on stack effects without a "--" separator would be nice.
288 " Unfortunately, that sort of vacuous detection is above Vim's pay-grade,
289 "   especially when stack effects can be nested arbitrarily via types.
290 syn match   factorEffectSkip       /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorEffectRequired,@factorEffect transparent contained
291 syn region  factorEffect       matchgroup=factorEffectDelims    start=/\v\V(\v>/  end=/\v<\V)\v>/ contains=@factorEffectContents
292 syn match   factorEffectVar        /\v<\S+>/           contained
293 " Note that ":!" parses to the "!" word and doesn't lex as a comment.
294 " Also, even though we take any value, the leading ":" breaking the word
295 "   boundary means a lot of our nicer syntax patterns don't match on
296 "   "factorEffectType".
297 " syn cluster factorEffectType contains=factorWord,@factorEffect
298 syn cluster factorEffectType       contains=factorWord,@factorClusterValue
299 syn match   factorEffectTypeSkip   /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=@factorEffectType transparent contained
300 syn match   factorEffectVar        /\v<\S+:>/          nextgroup=factorEffectTypeSkip skipempty contained
301 syn match   factorEffectType       /\v<:/              nextgroup=@factorEffectType contained
302 syn match   factorEffectRowVar     /\v<\.\.\S+>/       contained
303 syn match   factorEffectRowVar     /\v<\.\.\S+:>/      nextgroup=factorEffectTypeSkip skipempty contained
304 syn match   factorEffectDelims     /\v<-->/            contained
305 if !exists('g:factor_syn_no_error')
306   syn cluster factorEffectContents add=factorEffectError
307   syn keyword factorEffectError    (                   contained
308 endif
309
310 " adapted from lisp.vim
311 if exists('g:factor_syn_no_rainbow')
312   syn cluster factorQuotation   contains=factorQuotation
313   syn region  factorQuotation      matchgroup=factorDelimiter start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=ALL
314 else
315   syn cluster factorQuotation   contains=factorQuotation0
316   syn region  factorQuotation0            matchgroup=hlLevel0 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation1,factorArray1
317   syn region  factorQuotation1 contained  matchgroup=hlLevel1 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation2,factorArray2
318   syn region  factorQuotation2 contained  matchgroup=hlLevel2 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation3,factorArray3
319   syn region  factorQuotation3 contained  matchgroup=hlLevel3 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation4,factorArray4
320   syn region  factorQuotation4 contained  matchgroup=hlLevel4 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation5,factorArray5
321   syn region  factorQuotation5 contained  matchgroup=hlLevel5 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation6,factorArray6
322   syn region  factorQuotation6 contained  matchgroup=hlLevel6 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation7,factorArray7
323   syn region  factorQuotation7 contained  matchgroup=hlLevel7 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation8,factorArray8
324   syn region  factorQuotation8 contained  matchgroup=hlLevel8 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation9,factorArray9
325   syn region  factorQuotation9 contained  matchgroup=hlLevel9 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation0,factorArray0
326 endif
327
328 if exists('g:factor_syn_no_rainbow')
329   syn cluster factorArray       contains=factorArray
330   syn region  factorArray         matchgroup=factorDelimiter start=/\v<\S*\{>/         end=/\v<\}>/    contains=ALL
331 else
332   syn cluster factorArray       contains=factorArray0
333   syn region  factorArray0               matchgroup=hlLevel0 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray1,factorQuotation1
334   syn region  factorArray1     contained matchgroup=hlLevel1 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray2,factorQuotation2
335   syn region  factorArray2     contained matchgroup=hlLevel2 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray3,factorQuotation3
336   syn region  factorArray3     contained matchgroup=hlLevel3 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray4,factorQuotation4
337   syn region  factorArray4     contained matchgroup=hlLevel4 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray5,factorQuotation5
338   syn region  factorArray5     contained matchgroup=hlLevel5 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray6,factorQuotation6
339   syn region  factorArray6     contained matchgroup=hlLevel6 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray7,factorQuotation7
340   syn region  factorArray7     contained matchgroup=hlLevel7 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray8,factorQuotation8
341   syn region  factorArray8     contained matchgroup=hlLevel8 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray9,factorQuotation9
342   syn region  factorArray9     contained matchgroup=hlLevel9 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray0,factorQuotation0
343 endif
344
345 if !exists('g:factor_syn_no_error')
346   syn match   factorBracketError    /\v<\]>/
347   syn match   factorBracketError    /\v<\}>/
348 endif
349
350 syn sync lines=100
351
352 if !exists('g:factor_syn_no_init')
353   command -nargs=+ -bar HiLink hi def link <args>
354
355   if !exists('g:factor_syn_no_error')
356     HiLink factorBracketError           Error
357     HiLink factorIntegerError           Error
358     HiLink factorFloatError             Error
359     HiLink factorRatioError             Error
360     HiLink factorBinError               Error
361     HiLink factorHexNoRadixError        Error
362     HiLink factorHexError               Error
363     HiLink factorOctError               Error
364     HiLink factorEffectRequired         Error
365     HiLink factorEffectError            Error
366   endif
367
368   HiLink   factorError                  Error
369   HiLink   factorShebang                PreProc
370   HiLink   factorComment                Comment
371   HiLink   factorMultilineComment       Comment
372   HiLink   factorTodo                   Todo
373   HiLink   factorEffect                 Type
374   HiLink   factorEffectDelims           Delimiter
375   HiLink   factorEffectVar              Identifier
376   HiLink   factorEffectRowVar           factorEffectVar
377   HiLink   factorEffectType             Type
378   HiLink   factorInclude                Include
379   HiLink   factorWord                   Keyword
380   HiLink   factorCallDelims             Keyword
381   HiLink   factorCallNextMethod         Keyword
382   HiLink   factorOperator               Operator
383   HiLink   factorFrySpecifier           Operator
384   HiLink   factorLocalsSpecifier        Operator
385   HiLink   factorBoolean                Boolean
386   HiLink   factorBreakpoint             Debug
387   HiLink   factorDefnDelims             Typedef
388   HiLink   factorDeclDelims             Typedef
389   HiLink   factorPrivate                Special
390   HiLink   factorPDefnDelims            Special
391   HiLink   factorPDeclDelims            Special
392   HiLink   factorEscape                 SpecialChar
393   HiLink   factorString                 String
394   HiLink   factorStringDelims           factorString
395   HiLink   factorNamedString            String
396   HiLink   factorNamedStringDelims      Typedef
397   HiLink   factorComplex                Number
398   HiLink   factorRatio                  Number
399   HiLink   factorBin                    Number
400   HiLink   factorHexNoRadix             Number
401   HiLink   factorHex                    Number
402   HiLink   factorNan                    Number
403   HiLink   factorOct                    Number
404   HiLink   factorFloat                  Float
405   HiLink   factorInteger                Number
406   HiLink   factorUsing                  Include
407   HiLink   factorQualified              Include
408   HiLink   factorQualifiedWith          Include
409   HiLink   factorExclude                Include
410   HiLink   factorFrom                   Include
411   HiLink   factorRename                 Include
412   HiLink   factorUse                    Include
413   HiLink   factorUnuse                  Include
414   HiLink   factorIn                     Define
415   HiLink   factorChar                   Character
416   HiLink   factorColor                  Constant
417   HiLink   factorDelimiter              Delimiter
418   HiLink   factorBackslash              Special
419   HiLink   factorMBackslash             Special
420   HiLink   factorLiteral                Special
421   HiLink   factorDeclaration            Typedef
422   HiLink   factorSymbol                 Define
423   HiLink   factorSymbols                Define
424   HiLink   factorConstant               Define
425   HiLink   factorAlias                  Define
426   HiLink   factorSingleton              Typedef
427   HiLink   factorSingletons             Typedef
428   HiLink   factorMixin                  Typedef
429   HiLink   factorInstance               Typedef
430   HiLink   factorHook                   Typedef
431   HiLink   factorMain                   Define
432   HiLink   factorPostpone               Define
433   HiLink   factorDefer                  Define
434   HiLink   factorForget                 Define
435   HiLink   factorAlien                  Define
436   HiLink   factorSlot                   Define
437   HiLink   factorIntersection           Typedef
438   HiLink   factorRegexp                 Constant
439   HiLink   factorSlot                   Typedef
440   HiLink   factorSlotDelims             factorSlot
441   HiLink   factorSlotName               Identifier
442   HiLink   factorSlotClass              Type
443   HiLink   factorSlotType               factorSlotClass
444   HiLink   factorSlotAttr               Special
445   HiLink   factorSlotAttrInitial        factorSlotAttr
446   HiLink   factorSlotAttrReadOnly       factorSlotAttr
447   HiLink   factorStructSlotAttr         factorSlotAttr
448   HiLink   factorStructSlotAttrBits     factorStructSlotAttr
449   HiLink   factorPredicate              Typedef
450   HiLink   factorPredicateDelims        factorTuple
451   HiLink   factorTuple                  Typedef
452   HiLink   factorTupleDelims            factorTuple
453   HiLink   factorTupleSlot              factorSlot
454   HiLink   factorTupleClass             Identifier
455   HiLink   factorTupleSlotDelims        factorSlotDelims
456   HiLink   factorTupleSlotName          factorSlotName
457   HiLink   factorTupleSlotClass         factorSlotClass
458   HiLink   factorUnion                  Typedef
459   HiLink   factorStruct                 Typedef
460   HiLink   factorStructDelims           factorStruct
461   HiLink   factorStructSlot             factorSlot
462   HiLink   factorStructSlotDelims       factorSlotDelims
463   HiLink   factorStructSlotName         factorSlotName
464   HiLink   factorStructSlotType         factorSlotType
465
466   if &bg == 'dark'
467     hi   hlLevel0 ctermfg=red           guifg=red1
468     hi   hlLevel1 ctermfg=yellow        guifg=orange1
469     hi   hlLevel2 ctermfg=green         guifg=yellow1
470     hi   hlLevel3 ctermfg=cyan          guifg=greenyellow
471     hi   hlLevel4 ctermfg=magenta       guifg=green1
472     hi   hlLevel5 ctermfg=red           guifg=springgreen1
473     hi   hlLevel6 ctermfg=yellow        guifg=cyan1
474     hi   hlLevel7 ctermfg=green         guifg=slateblue1
475     hi   hlLevel8 ctermfg=cyan          guifg=magenta1
476     hi   hlLevel9 ctermfg=magenta       guifg=purple1
477   else
478     hi   hlLevel0 ctermfg=red           guifg=red3
479     hi   hlLevel1 ctermfg=darkyellow    guifg=orangered3
480     hi   hlLevel2 ctermfg=darkgreen     guifg=orange2
481     hi   hlLevel3 ctermfg=blue          guifg=yellow3
482     hi   hlLevel4 ctermfg=darkmagenta   guifg=olivedrab4
483     hi   hlLevel5 ctermfg=red           guifg=green4
484     hi   hlLevel6 ctermfg=darkyellow    guifg=paleturquoise3
485     hi   hlLevel7 ctermfg=darkgreen     guifg=deepskyblue4
486     hi   hlLevel8 ctermfg=blue          guifg=darkslateblue
487     hi   hlLevel9 ctermfg=darkmagenta   guifg=darkviolet
488   endif
489 endif
490 delcommand HiLink
491
492 let b:current_syntax = 'factor'
493
494 " vim: set ft=vim et sw=2 isk+=/,\\ :