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 " A crash course on Factor's lexer:
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
102 " and returns it if found, otherwise returning "f".
103 " "scan-token" advances the ambient lexer through the next 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".)
110 syn match factorShebang /\v%^\#!.*$/ display
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
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
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
138 syn region factorPrivate start=/\v<\<PRIVATE>/ end=/\v<PRIVATE\>>/ contains=@factorCluster,factorPDefn,factorPDeclDelims skipempty keepend
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
148 syn region factorChar start=/\v<CHAR:>/ end=/\v\S+>/
149 syn region factorColor start=/\v<COLOR:>/ end=/\v\S+>/
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\]/
158 syn region factorNamedString matchgroup=factorNamedStringDelims start=/\v<STRING:\s+\S+$>/ end=/\v^<;>$/ contains=factorEscape
160 syn region factorMultilineComment start=/\v<\/\*>/ end=/\v\*\// contains=@factorCommentContents keepend
161 syn region factorMultilineComment start=/\v<!\[\z(\=*)\[/ end=/\v\]\z1\]/ contains=@factorCommentContents keepend
163 syn region factorRegexp start=/\v<%(R\/\s)/ skip=/\v%(\\\/)/ end=/\v%(\/\S*)>/
165 syn cluster factorReal contains=@factorInteger,@factorFloat,@factorRatio,@factorBin,@factorOct,@factorHex,factorNan
166 syn cluster factorNumber contains=@factorReal,factorComplex
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|,|_)*>/
173 syn match factorInteger /\v<[+-]=\d%(\d|,|_)*,@1<!>/
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|,|_)*)?)>/
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<!)?)>/
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|,|_)*)?)>/
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<!>/
189 syn region factorComplex start=/\v<C\{>/ skip=/\v<!>.*/ end=/\v<\}>/ contains=@factorComment,@factorReal
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|,|_)*)?)>/
196 syn match factorBin /\v<[+-]=0[bB]%([01][01,_]*,@1<!%(\.%([01][01,_]*,@1<!)?)?|\.[01][01,_]*,@1<!)%([pP][+-]=\d%(\d|,|_)*,@1<!)?>/
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|,|_)*)?)>/
203 syn match factorOct /\v<[+-]=0[oO]%(\o%(\o|,|_)*,@1<!%(\.%(\o%(\o|,|_)*,@1<!)?)?|\.\o%(\o|,|_)*,@1<!)%([pP][+-]=\d%(\d|,|_)*,@1<!)?>/
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
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
216 syn region factorNan matchgroup=factorNan start=/\v<NAN:>/ matchgroup=NONE skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment,@factorHexNoRadix keepend
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
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
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
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
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
273 syn cluster factorWordOps contains=factorConstant,factorAlias,factorSingleton,factorSingletons,factorSymbol,factorSymbols,factorPostpone,factorDefer,factorForget,factorMixin,factorInstance,factorHook,factorMain
282 if !exists('g:factor_syn_no_error')
283 syn match factorEffectRequired /\v<\V(\@!\v\S+>/ contained
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
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
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
328 if exists('g:factor_syn_no_rainbow')
329 syn cluster factorArray contains=factorArray
330 syn region factorArray matchgroup=factorDelimiter start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=ALL
332 syn cluster factorArray contains=factorArray0
333 syn region factorArray0 matchgroup=hlLevel0 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray1,factorQuotation1
334 syn region factorArray1 contained matchgroup=hlLevel1 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray2,factorQuotation2
335 syn region factorArray2 contained matchgroup=hlLevel2 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray3,factorQuotation3
336 syn region factorArray3 contained matchgroup=hlLevel3 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray4,factorQuotation4
337 syn region factorArray4 contained matchgroup=hlLevel4 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray5,factorQuotation5
338 syn region factorArray5 contained matchgroup=hlLevel5 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray6,factorQuotation6
339 syn region factorArray6 contained matchgroup=hlLevel6 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray7,factorQuotation7
340 syn region factorArray7 contained matchgroup=hlLevel7 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray8,factorQuotation8
341 syn region factorArray8 contained matchgroup=hlLevel8 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray9,factorQuotation9
342 syn region factorArray9 contained matchgroup=hlLevel9 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray0,factorQuotation0
345 if !exists('g:factor_syn_no_error')
346 syn match factorBracketError /\v<\]>/
347 syn match factorBracketError /\v<\}>/
352 if !exists('g:factor_syn_no_init')
353 command -nargs=+ -bar HiLink hi def link <args>
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
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
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
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
492 let b:current_syntax = 'factor'
494 " vim: set ft=vim et sw=2 isk+=/,\\ :