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