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