3 " Maintainer: Alex Chapman <chapman.alex@gmail.com>
4 " Last Change: 2020 Jun 05
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 incompatibile 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 factorClusterNoComment contains=factorWord,@factorMultilineComment,@factorClusterValue,factorBoolean,factorBreakpoint,factorDeclaration,factorCallQuotation,factorExecute,factorCallNextMethod,@factorWordOps,factorAlien,factorSlot,factorTuple,factorErrorSyn,factorStruct
62 syn cluster factorCluster contains=@factorComment,@factorClusterNoComment
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 " "[ f skip ] call( i seq -- n )" finds the next space, erroring on tabs.
69 " "t skip" finds the next non-space.
70 " The "lexer" class holds lex state.
71 " Lexer method "skip-word" advances to the next space (via "f skip"),
72 " while also counting leading double quotation marks as their own words.
73 " I.e., this advances to the end of the current token
74 " (if currently at a token, otherwise nothing changes).
75 " Method "skip-blank" advances to the next non-space (via "t skip"),
76 " while also skipping shebangs at the beginning of the first line.
77 " I.e., this advances to the start of the next token
78 " (if one is present, otherwise it advances to the line's end).
79 " "(parse-raw)" advances a lexer through an immediate token via "skip-word",
80 " and returns the (sub)token advanced through.
81 " Note that this will not advance a lexer at space,
82 " and an empty string will be returned.
83 " "next-line" advances a lexer to the start of the next line,
84 " adding an effectively empty line to the end (as an EOF state).
85 " "parse-raw" advances a lexer through the next token,
86 " first via alternating "skip-blank" & "next-line" if the line ended,
87 " then via "(parse-raw)",
88 " and returns it if found, otherwise (i.e. upon EOF) returning "f".
89 " Note that the lexer will be advanced to EOF if "f" is returned.
90 " Comments are (unprocessed) remainders of lines, after a "!" word.
91 " "parse-token" advances a lexer though the next token via "parse-raw",
92 " then returns it if found, otherwise returning "f".
93 " while also advancing through comments
94 " via mutual recursion with "skip-comment".
95 " "[ skip-comment ] call( lexer str -- str' )" tests if a token is "!",
96 " returning that token if so,
97 " otherwise first advancing a lexer to the next line via "next-line"
98 " (i.e. discarding the rest of the current line)
99 " and then advancing it via "parse-token" & returning that token,
100 " ensuring the return of "parse-token"'s desired non-comment token.
101 " The "lexer" dynamic variable holds the ambient lexer.
102 " "?scan-token" advances the ambient lexer through the next token
104 " and returns it if found, otherwise returning "f".
105 " "scan-token" advances the ambient lexer through the next token
107 " and returns it if found, otherwise throwing an exception.
108 " All other words in the "lexer" vocabulary read via "scan-token", if at all.
109 " So! To know when double quotes & exclamation marks aren't special,
110 " grep for "parse-raw". (Mostly. To be certain, grep for "lexer".)
112 syn cluster factorComment contains=factorComment
113 syn cluster factorCommentContents contains=factorTodo,@Spell
114 syn match factorTodo /\v(TODO|FIXME|XXX):=/ contained
116 syn cluster factorDefnContents contains=@factorCluster
118 syn region factorDefn start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ matchgroup=factorDefnDelims end=/\v<;>/ contains=factorDefnDelims,@factorDefnContents
119 syn region factorDefnDelims start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty contained
120 syn region factorMethod start=/\v<M:>/ matchgroup=factorMethodDelims end=/\v<;>/ contains=factorMethodDelims,@factorDefnContents
121 syn region factorMethodDelims start=/\v<M:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment skipempty keepend contained
122 syn region factorLocalsMethod start=/\v<M::>/ matchgroup=factorLocalsMethodDelims end=/\v<;>/ contains=factorLocalsMethodDelims,@factorDefnContents
123 syn region factorLocalsMethodDelims start=/\v<M::>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend contained
124 syn region factorGeneric start=/\v<%(GENERIC|MATH|PRIMITIVE):>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty
125 syn region factorGenericN matchgroup=factorGenericN start=/\v<GENERIC\#:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend
127 syn region factorPDefn start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ matchgroup=factorPDefnDelims end=/\v<;>/ contains=factorPDefnDelims,@factorDefnContents contained
128 syn region factorPDefnDelims start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty contained
129 syn region factorPMethod start=/\v<M:>/ matchgroup=factorPMethodDelims end=/\v<;>/ contains=factorPMethodDelims,@factorDefnContents contained
130 syn region factorPMethodDelims start=/\v<M:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment skipempty keepend contained
131 syn region factorPLocalsMethod start=/\v<M::>/ matchgroup=factorPLocalsMethodDelims end=/\v<;>/ contains=factorPLocalsMethodDelims,@factorDefnContents contained
132 syn region factorPLocalsMethodDelims start=/\v<M::>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend contained
133 syn region factorPGeneric start=/\v<%(GENERIC|MATH|PRIMITIVE):>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty contained
134 syn region factorPGenericN matchgroup=factorPGenericN start=/\v<GENERIC\#:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend contained
136 syn region factorPrivate matchgroup=factorPrivate start=/\v<\<PRIVATE>/ end=/\v<PRIVATE\>>/ contains=@factorDefnContents,factorPDefn,factorPMethod,factorPLocalsMethod,factorPGeneric,factorPGenericN skipempty keepend
138 syn cluster factorClusterValue contains=factorBreakpoint,factorBoolean,factorFrySpecifier,factorChar,@factorString,@factorNumber,factorBackslash,factorMBackslash,factorLiteral,factorLiteralBlock,@factorStackEffect,@factorQuotation,@factorArray
140 syn keyword factorBoolean f t
141 syn keyword factorBreakpoint B
142 syn keyword factorFrySpecifier @ _ contained
143 syn keyword factorDeclaration delimiter deprecated final flushable foldable inline recursive
144 syn match factorCallQuotation /\v<call\V(\v/me=e-1 nextgroup=@factorStackEffect
145 syn match factorExecute /\v<execute\V(\v/me=e-1 nextgroup=@factorStackEffect
146 syn keyword factorCallNextMethod call-next-method
148 syn region factorChar start=/\v<CHAR:>/ end=/\v\S+>/
150 syn cluster factorString contains=factorString,factorTriString,factorPrefixedString
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 " Removed Factor syntax.
154 syn region factorTriString matchgroup=factorTriStringDelims start=/\v<"""/ skip=/\v\\"/ end=/\v"""/ contains=factorEscape
155 syn region factorPrefixedString matchgroup=factorPrefixedStringDelims start=/\v<[^[:blank:]"]+">/ skip=/\v\\"/ end=/\v"/ contains=factorEscape
157 " Vocabulary: multiline
158 " This vocabulary reads the ambient lexer without "parse-raw".
159 syn cluster factorString add=factorMultilineString,factorHereDocString,factorPrefixedMultilineString
160 syn region factorMultilineString matchgroup=factorMultilineStringDelims start=/\v<\[\z(\={0,6})\[>/ end=/\v\]\z1\]/
161 syn region factorHereDoc matchgroup=factorHereDocDelims start=/\v<STRING:\s+\S+>/ end=/\v^;$/
162 syn region factorHereDocString matchgroup=factorHereDocStringDelims start=/\v<HEREDOC:\s+\z(.*)>/ end=/\v^\z1$/
163 syn region factorPrefixedMultilineString matchgroup=factorPrefixedMultilineStringDelims start=/\v<[^[\][:blank:]]+\[\z(\={0,6})\[>/ end=/\v\]\z1\]/
164 " These comments are normal syntax words, so no lexer privilege for them.
165 " (Hence, no "syn cluster factorComment" membership.)
166 syn cluster factorMultilineComment contains=factorMultilineComment,factorMultilineCComment
167 syn region factorMultilineComment matchgroup=factorMultilineCommentDelims start=/\v<!\[\z(\={0,6})\[>/ end=/\v\]\z1\]/ contains=@factorCommentContents keepend
168 syn region factorMultilineCComment matchgroup=factorMultilineCCommentDelims start=/\v<\/\*>/ end=/\v\*\// contains=@factorCommentContents keepend
170 syn cluster factorReal contains=@factorInteger,@factorFloat,@factorRatio,@factorBin,@factorOct,@factorHex,factorNan
171 syn cluster factorNumber contains=@factorReal,factorComplex
172 syn cluster factorInteger contains=factorInteger
173 if !exists('g:factor_syn_no_error') " more general
174 syn cluster factorInteger add=factorIntegerError
175 " + "\d|," with contained "\d"
176 syn match factorIntegerError /\v<[+-]=%(\d|,){-}\d%(\d|,)*>/
178 " + "\d|," with leading "\d" and no trailing ","
179 syn match factorInteger /\v<[+-]=\d%(\d|,)*,@1<!>/
180 if !exists('g:factor_syn_no_error') " more general
181 syn cluster factorFloat add=factorFloatError
182 syn match factorFloatError /\v<[+-]=%(\S{-}\d&%(\d|,)*%([eE][+-]=%(\d|,)*|\.%(\d|,)*%([eE][+-]=%(\d|,)*)?)|\.%(\d|,)+%([eE][+-]=%(\d|,)*)?)>/
184 syn cluster factorFloat contains=factorFloat
185 " exponent is followed by valid integer of radix 10
189 " or {"." mantissa sep, ? "[eE]" exponent}}
190 " or {"." mantissa sep, ? "[eE]" exponent}
191 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<!>/
198 syn region factorComplex start=/\v<C\{>/ end=/\v<\}>/ contains=@factorReal
199 syn cluster factorBin contains=factorBin
200 if !exists('g:factor_syn_no_error')
201 syn cluster factorBin add=factorBinError
202 syn match factorBinError /\v<[+-]=0[bB]%(\S{-}\w&%(\w|,)*\.?%(\w|,)*%([pP][+-]=%(\w|,)*)?)>/
204 " basically a float, but with a radix and no integer case to not match
205 syn match factorBin /\v<[+-]=0[bB]%([01][01,]*,@1<!%(\.%([01][01,]*,@1<!)?)?|\.[01][01,]*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/
206 syn cluster factorOct contains=factorOct
207 if !exists('g:factor_syn_no_error')
208 syn cluster factorOct add=factorOctError
209 syn match factorOctError /\v<[+-]=0[oO]%(\S{-}\o&%(\w|,)*\.?(\w|,)*%([pP][+-]=%(\w|,)*)?)>/
211 syn match factorOct /\v<[+-]=0[oO]%(\o%(\o|,)*,@1<!%(\.%(\o%(\o|,)*,@1<!)?)?|\.\o%(\o|,)*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/
212 syn cluster factorHexNoRadix contains=factorHexNoRadix
213 syn cluster factorHex contains=factorHex
214 if !exists('g:factor_syn_no_error')
215 syn cluster factorHexNoRadix add=factorHexNoRadixError
216 syn cluster factorHex add=factorHexError
217 syn match factorHexNoRadixError /\v<[+-]=%(\S{-}\x&%(\w|,)*\.?(\w|,)*%([pP][+-]=%(\w|,)*)?)>/ contained
218 syn match factorHexError /\v<[+-]=0[xX]%(\S{-}\x&%(\x|,)*\.?(\x|,)*%([pP][+-]=%(\w|,)*)?)>/
220 syn match factorHexNoRadix /\v<[+-]=%(\x%(\x|,)*,@1<!%(\.%(\x%(\x|,)*,@1<!)?)?|\.\x%(\x|,)*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/ contained
221 syn match factorHex /\v<[+-]=0[xX]%(\x%(\x|,)*,@1<!%(\.%(\x%(\x|,)*,@1<!)?)?|\.\x%(\x|,)*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/
222 syn region factorNan matchgroup=factorNan start=/\v<NAN:>/ matchgroup=NONE skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment,@factorHexNoRadix keepend
224 syn region factorBackslash start=/\v<\\>/ end=/\v<\S+>/ contains=@factorComment
225 syn region factorMBackslash start=/\v<M\\>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
226 syn region factorLiteral start=/\v<\$>/ end=/\v<\S+>/ contains=@factorComment
227 syn region factorLiteralBlock start=/\v<\$\[>/ end=/\v<\]>/ contains=@factorComment
229 syn region factorIn start=/\v<IN:>/ end=/\v<\S+>/ contains=@factorComment
230 syn region factorUse start=/\v<USE:>/ end=/\v<\S+>/ contains=@factorComment
231 syn region factorUnuse start=/\v<UNUSE:>/ end=/\v<\S+>/ contains=@factorComment
233 syn region factorUsing start=/\v<USING:>/ end=/\v<;>/ contains=@factorComment
234 syn region factorQualified start=/\v<QUALIFIED:>/ end=/\v<\S+>/ contains=@factorComment
235 syn region factorQualifiedWith start=/\v<QUALIFIED-WITH:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
236 syn region factorExclude start=/\v<EXCLUDE:>/ end=/\v<;>/ contains=@factorComment
237 syn region factorFrom start=/\v<FROM:>/ end=/\v<;>/ contains=@factorComment
238 syn region factorRename start=/\v<RENAME:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+%(\_\s+%(!>.*)?)+\=\>%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
239 syn region factorSingletons start=/\v<SINGLETONS:>/ end=/\v<;>/ contains=@factorComment
240 syn region factorSymbol start=/\v<SYMBOL:>/ end=/\v<\S+>/ contains=@factorComment
241 syn region factorSymbols start=/\v<SYMBOLS:>/ end=/\v<;>/ contains=@factorComment
242 syn region factorConstructor2 start=/\v<CONSTRUCTOR:>/ end=/\v<;>/ contains=@factorComment,factorStackEffect
243 syn region factorIntersection start=/\v<INTERSECTION:>/ end=/\v<;>/ contains=@factorComment
244 syn cluster factorSlotAttr contains=factorSlotAttrInitial,factorSlotAttrReadOnly
245 syn cluster factorTupleSlotAttr contains=@factorSlotAttr
246 syn match factorTupleSlotName /\v<\S+>/ nextgroup=factorTupleSlotClassSkip skipempty contained
247 syn match factorTupleSlotNameSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorTupleSlotName transparent contained
248 syn match factorTupleSlotClass /\v<\S+>/ nextgroup=factorTupleSlotAttrSkip skipempty contained
249 " a class is optional, so let an attribute take priority if present
250 syn match factorTupleSlotClassSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorTupleSlotClass,@factorTupleSlotAttr transparent contained
251 syn region factorTupleSlot matchgroup=factorTupleSlotDelims start=/\v<\{>/ end=/\v<\}>/ contains=@factorComment,factorTupleSlotName,@factorTupleSlotAttr contained
252 syn region factorTuple matchgroup=factorTupleDelims start=/\v<%(TUPLE|BUILTIN):>/ end=/\v<;>/ contains=@factorComment,factorTupleSlotName,factorTupleSlot
253 syn region factorPredicate matchgroup=factorPredicateDelims start=/\v<%(PREDICATE):>/ end=/\v<;>/ contains=@factorComment,factorTupleSlotName
254 " Abnormally named because factor*Error is reserved for syntax errors.
255 syn region factorErrorSyn start=/\v<ERROR:>/ end=/\v<;>/ contains=@factorComment
256 syn region factorUnion start=/\v<UNION:>/ end=/\v<;>/ contains=@factorComment
257 syn cluster factorStructSlotAttr contains=@factorSlotAttr,factorStructSlotAttrBits
258 syn match factorStructSlotName /\v<\S+>/ nextgroup=factorStructSlotTypeSkip skipempty contained
259 syn match factorStructSlotNameSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStructSlotName contained transparent
260 syn match factorStructSlotType /\v<\S+>/ contained
261 syn match factorStructSlotTypeSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStructSlotType contained transparent
262 syn region factorStructSlot matchgroup=factorStructSlotDelims start=/\v<\{>/ end=/\v<\}>/ contains=@factorComment,factorStructSlotName,@factorStructSlotAttr contained
263 syn region factorStruct matchgroup=factorStructDelims start=/\v<%(UNION-STRUCT|STRUCT):>/ end=/\v<;>/ contains=@factorComment,factorStructSlot
265 syn match factorSlotAttrReadOnly /\v<read-only>/ contained
266 syn match factorSlotAttrInitial /\v<initial:>%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=factorWord,@factorClusterValue contained
267 syn match factorStructSlotAttrBits /\v<bits:>%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=factorWord,@factorReal contained
269 syn region factorConstant start=/\v<CONSTANT:>/ end=/\v<\S+>/ contains=@factorComment
270 syn region factorAlias start=/\v<ALIAS:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
271 syn region factorSingleton start=/\v<SINGLETON:>/ end=/\v<\S+>/ contains=@factorComment
272 syn region factorPostpone start=/\v<POSTPONE:>/ end=/\v<\S+>/ contains=@factorComment
273 syn region factorDefer start=/\v<DEFER:>/ end=/\v<\S+>/ contains=@factorComment
274 syn region factorForget start=/\v<FORGET:>/ end=/\v<\S+>/ contains=@factorComment
275 syn region factorMixin start=/\v<MIXIN:>/ end=/\v<\S+>/ contains=@factorComment
276 syn region factorInstance start=/\v<INSTANCE:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
277 syn region factorHook start=/\v<HOOK:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend
278 syn region factorMain start=/\v<MAIN:>/ end=/\v<\S+>/ contains=@factorComment
279 syn region factorConstructor start=/\v<C:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
280 syn region factorAlien matchgroup=factorAlien start=/\v<ALIEN:>/ matchgroup=NONE end=/\v<\S+>/ contains=@factorComment,@factorHexNoRadix
281 syn region factorSlot start=/\v<SLOT:>/ end=/\v<\S+>/ contains=@factorComment
283 syn cluster factorWordOps contains=factorConstant,factorAlias,factorSingleton,factorSingletons,factorSymbol,factorSymbols,factorPostpone,factorDefer,factorForget,factorMixin,factorInstance,factorHook,factorMain,factorConstructor
299 if !exists('g:factor_syn_no_error')
300 syn match factorStackEffectRequired /\v<\V(\@!\v\S+>/ contained
302 syn cluster factorStackEffectContents contains=@factorComment,factorStackEffectDelims,factorStackEffectVar,factorStackEffectType,factorStackEffectRowVar
303 syn cluster factorStackEffect contains=factorStackEffect
304 " Erroring on stack effects without a "--" separator would be nice.
305 " Unfortunately, that sort of vacuous detection is above Vim's pay-grade,
306 " especially when stack effects can be nested arbitrarily via types.
307 syn match factorStackEffectSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStackEffectRequired,@factorStackEffect transparent contained
308 syn region factorStackEffect matchgroup=factorStackEffectDelims start=/\v\V(\v>/ end=/\v<\V)\v>/ contains=@factorStackEffectContents
309 syn match factorStackEffectVar /\v<\S+>/ contained
310 " Note that ":!" parses to the "!" word and doesn't lex as a comment.
311 " Also, even though we take any value, the leading ":" breaking the word
312 " boundary means a lot of our nicer syntax patterns don't match on
313 " "factorStackEffectType".
314 " syn cluster factorStackEffectType contains=factorWord,@factorStackEffect
315 syn cluster factorStackEffectType contains=factorWord,@factorClusterValue
316 syn match factorStackEffectTypeSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=@factorStackEffectType transparent contained
317 syn match factorStackEffectVar /\v<\S+:>/ nextgroup=factorStackEffectTypeSkip skipempty contained
318 syn match factorStackEffectType /\v<:/ nextgroup=@factorStackEffectType contained
319 syn match factorStackEffectRowVar /\v<\.\.\S+>/ contained
320 syn match factorStackEffectRowVar /\v<\.\.\S+:>/ nextgroup=factorStackEffectTypeSkip skipempty contained
321 syn match factorStackEffectDelims /\v<-->/ contained
322 if !exists('g:factor_syn_no_error')
323 syn cluster factorStackEffectContents add=factorStackEffectError
324 syn keyword factorStackEffectError ( contained
327 " adapted from lisp.vim
328 if exists('g:factor_syn_no_rainbow')
329 syn cluster factorQuotation contains=factorQuotation
330 syn region factorQuotation matchgroup=factorDelimiter start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=ALL
332 syn cluster factorQuotation contains=factorQuotation0
333 syn region factorQuotation0 matchgroup=hlLevel0 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation1,factorArray1
334 syn region factorQuotation1 contained matchgroup=hlLevel1 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation2,factorArray2
335 syn region factorQuotation2 contained matchgroup=hlLevel2 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation3,factorArray3
336 syn region factorQuotation3 contained matchgroup=hlLevel3 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation4,factorArray4
337 syn region factorQuotation4 contained matchgroup=hlLevel4 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation5,factorArray5
338 syn region factorQuotation5 contained matchgroup=hlLevel5 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation6,factorArray6
339 syn region factorQuotation6 contained matchgroup=hlLevel6 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation7,factorArray7
340 syn region factorQuotation7 contained matchgroup=hlLevel7 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation8,factorArray8
341 syn region factorQuotation8 contained matchgroup=hlLevel8 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation9,factorArray9
342 syn region factorQuotation9 contained matchgroup=hlLevel9 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation0,factorArray0
345 if exists('g:factor_syn_no_rainbow')
346 syn cluster factorArray contains=factorArray
347 syn region factorArray matchgroup=factorDelimiter start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=ALL
349 syn cluster factorArray contains=factorArray0
350 syn region factorArray0 matchgroup=hlLevel0 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray1,factorQuotation1
351 syn region factorArray1 contained matchgroup=hlLevel1 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray2,factorQuotation2
352 syn region factorArray2 contained matchgroup=hlLevel2 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray3,factorQuotation3
353 syn region factorArray3 contained matchgroup=hlLevel3 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray4,factorQuotation4
354 syn region factorArray4 contained matchgroup=hlLevel4 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray5,factorQuotation5
355 syn region factorArray5 contained matchgroup=hlLevel5 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray6,factorQuotation6
356 syn region factorArray6 contained matchgroup=hlLevel6 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray7,factorQuotation7
357 syn region factorArray7 contained matchgroup=hlLevel7 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray8,factorQuotation8
358 syn region factorArray8 contained matchgroup=hlLevel8 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray9,factorQuotation9
359 syn region factorArray9 contained matchgroup=hlLevel9 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray0,factorQuotation0
362 if !exists('g:factor_syn_no_error')
363 syn match factorBracketError /\v<\]>/
364 syn match factorBracketError /\v<\}>/
367 function! FactorSynDefineComment() abort
368 syn match factorComment /\v<!>.*$/ contains=@factorCommentContents
369 syn match factorShebang /\v%^\#!.*$/ display
370 if !exists('g:factor_syn_no_error')
371 syn match factorShebangError /\v%^\#!\S+/
375 if !exists('g:factor_syn_no_comment')
376 call FactorSynDefineComment()
379 " Syntax that bypasses comment lexing.
380 function! FactorSynDefineAfterComment() abort
383 if !exists('g:factor_syn_no_after_comment')
384 call FactorSynDefineAfterComment()
389 if !exists('g:factor_syn_no_init')
390 command -nargs=+ -bar HiLink hi def link <args>
392 if !exists('g:factor_syn_no_error')
393 HiLink factorShebangError Error
394 HiLink factorBracketError Error
395 HiLink factorIntegerError Error
396 HiLink factorFloatError Error
397 HiLink factorRatioError Error
398 HiLink factorBinError Error
399 HiLink factorHexNoRadixError Error
400 HiLink factorHexError Error
401 HiLink factorOctError Error
402 HiLink factorStackEffectRequired Error
403 HiLink factorStackEffectError Error
406 HiLink factorComment Comment
407 HiLink factorMultilineComment factorComment
408 HiLink factorMultilineCommentDelims factorMultilineComment
409 HiLink factorMultilineCComment factorComment
410 HiLink factorMultilineCCommentDelims factorMultilineCComment
411 HiLink factorShebang PreProc
412 HiLink factorStackEffect Type
413 HiLink factorStackEffectDelims Delimiter
414 HiLink factorStackEffectVar Identifier
415 HiLink factorStackEffectRowVar factorStackEffectVar
416 HiLink factorStackEffectType Type
417 HiLink factorTodo Todo
418 HiLink factorInclude Include
419 HiLink factorWord Keyword
420 HiLink factorCallQuotation Keyword
421 HiLink factorExecute Keyword
422 HiLink factorCallNextMethod Keyword
423 HiLink factorOperator Operator
424 HiLink factorFrySpecifier Operator
425 HiLink factorBoolean Boolean
426 HiLink factorBreakpoint Debug
427 HiLink factorDefnDelims Typedef
428 HiLink factorMethodDelims Typedef
429 HiLink factorLocalsMethodDelims Typedef
430 HiLink factorGeneric Typedef
431 HiLink factorGenericN Typedef
432 HiLink factorConstructor Typedef
433 HiLink factorConstructor2 Typedef
434 HiLink factorPrivate Special
435 HiLink factorPDefnDelims Special
436 HiLink factorPMethodDelims Special
437 HiLink factorPLocalsMethodDelims Special
438 HiLink factorPGeneric Special
439 HiLink factorPGenericN Special
440 HiLink factorEscape SpecialChar
441 HiLink factorString String
442 HiLink factorStringDelims factorString
443 HiLink factorTriString factorString
444 HiLink factorTriStringDelims factorTriString
445 HiLink factorPrefixedString factorString
446 HiLink factorPrefixedStringDelims factorPrefixedString
447 HiLink factorMultilineString factorString
448 HiLink factorMultilineStringDelims Typedef
449 HiLink factorHereDoc factorMultilineString
450 HiLink factorHereDocDelims factorMultilineStringDelims
451 HiLink factorHereDocString factorMultilineString
452 HiLink factorHereDocStringDelims factorMultilineStringDelims
453 HiLink factorPrefixedMultilineString factorString
454 HiLink factorPrefixedMultilineStringDelims factorMultilineStringDelims
455 HiLink factorComplex Number
456 HiLink factorRatio Number
457 HiLink factorBin Number
458 HiLink factorHexNoRadix Number
459 HiLink factorHex Number
460 HiLink factorNan Number
461 HiLink factorOct Number
462 HiLink factorFloat Float
463 HiLink factorInteger Number
464 HiLink factorUsing Include
465 HiLink factorQualified Include
466 HiLink factorQualifiedWith Include
467 HiLink factorExclude Include
468 HiLink factorFrom Include
469 HiLink factorRename Include
470 HiLink factorUse Include
471 HiLink factorUnuse Include
472 HiLink factorIn Define
473 HiLink factorChar Character
474 HiLink factorDelimiter Delimiter
475 HiLink factorBackslash Special
476 HiLink factorMBackslash Special
477 HiLink factorLiteral Special
478 HiLink factorLiteralBlock Special
479 HiLink factorDeclaration Typedef
480 HiLink factorSymbol Define
481 HiLink factorSymbols Define
482 HiLink factorConstant Define
483 HiLink factorAlias Define
484 HiLink factorSingleton Typedef
485 HiLink factorSingletons Typedef
486 HiLink factorMixin Typedef
487 HiLink factorInstance Typedef
488 HiLink factorHook Typedef
489 HiLink factorMain Define
490 HiLink factorPostpone Define
491 HiLink factorDefer Define
492 HiLink factorForget Define
493 HiLink factorAlien Define
494 HiLink factorSlot Define
495 HiLink factorIntersection Typedef
496 HiLink factorSlot Typedef
497 HiLink factorSlotDelims factorSlot
498 HiLink factorSlotName Identifier
499 HiLink factorSlotClass Type
500 HiLink factorSlotType factorSlotClass
501 HiLink factorSlotAttr Special
502 HiLink factorSlotAttrInitial factorSlotAttr
503 HiLink factorSlotAttrReadOnly factorSlotAttr
504 HiLink factorStructSlotAttr factorSlotAttr
505 HiLink factorStructSlotAttrBits factorStructSlotAttr
506 HiLink factorPredicate Typedef
507 HiLink factorPredicateDelims factorTuple
508 HiLink factorTuple Typedef
509 HiLink factorTupleDelims factorTuple
510 HiLink factorTupleSlot factorSlot
511 HiLink factorTupleSlotDelims factorSlotDelims
512 HiLink factorTupleSlotName factorSlotName
513 HiLink factorTupleSlotClass factorSlotClass
514 HiLink factorErrorSyn Typedef
515 HiLink factorUnion Typedef
516 HiLink factorStruct Typedef
517 HiLink factorStructDelims factorStruct
518 HiLink factorStructSlot factorSlot
519 HiLink factorStructSlotDelims factorSlotDelims
520 HiLink factorStructSlotName factorSlotName
521 HiLink factorStructSlotType factorSlotType
524 hi hlLevel0 ctermfg=red guifg=red1
525 hi hlLevel1 ctermfg=yellow guifg=orange1
526 hi hlLevel2 ctermfg=green guifg=yellow1
527 hi hlLevel3 ctermfg=cyan guifg=greenyellow
528 hi hlLevel4 ctermfg=magenta guifg=green1
529 hi hlLevel5 ctermfg=red guifg=springgreen1
530 hi hlLevel6 ctermfg=yellow guifg=cyan1
531 hi hlLevel7 ctermfg=green guifg=slateblue1
532 hi hlLevel8 ctermfg=cyan guifg=magenta1
533 hi hlLevel9 ctermfg=magenta guifg=purple1
535 hi hlLevel0 ctermfg=red guifg=red3
536 hi hlLevel1 ctermfg=darkyellow guifg=orangered3
537 hi hlLevel2 ctermfg=darkgreen guifg=orange2
538 hi hlLevel3 ctermfg=blue guifg=yellow3
539 hi hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
540 hi hlLevel5 ctermfg=red guifg=green4
541 hi hlLevel6 ctermfg=darkyellow guifg=paleturquoise3
542 hi hlLevel7 ctermfg=darkgreen guifg=deepskyblue4
543 hi hlLevel8 ctermfg=blue guifg=darkslateblue
544 hi hlLevel9 ctermfg=darkmagenta guifg=darkviolet
549 let b:current_syntax = 'factor'
551 " vim: set ft=vim et sw=2 isk+=/,\\ :