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,factorChar,factorString,@factorNumber,factorBackslash,factorMBackslash,factorLiteral,@factorStackEffect,@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 start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ matchgroup=factorDefnDelims end=/\v<;>/ contains=factorDefnDelims,@factorCluster
118 syn region factorDefnDelims start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty contained
119 syn region factorMethod start=/\v<M:>/ matchgroup=factorMethodDelims end=/\v<;>/ contains=factorMethodDelims,@factorCluster
120 syn region factorMethodDelims start=/\v<M:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment skipempty keepend contained
121 syn region factorLocalsMethod start=/\v<M::>/ matchgroup=factorLocalsMethodDelims end=/\v<;>/ contains=factorLocalsMethodDelims,@factorCluster
122 syn region factorLocalsMethodDelims start=/\v<M::>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend contained
123 syn region factorGeneric start=/\v<%(GENERIC|MATH|PRIMITIVE):>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty
124 syn region factorGenericN start=/\v<GENERIC\#:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend
125 syn region factorHook start=/\v<HOOK:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend
127 syn region factorPDefn start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ skip=/\v<!>.*/ matchgroup=factorPDefnDelims end=/\v<;>/ contains=factorPDefnDelims,@factorCluster 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,@factorCluster 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,@factorCluster 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):>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty contained
134 syn region factorPGenericN start=/\v<GENERIC\#:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend contained
135 syn region factorPHook start=/\v<HOOK:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend contained
137 syn region factorPrivate start=/\v<\<PRIVATE>/ end=/\v<PRIVATE\>>/ contains=@factorCluster,factorPDefn,factorPMethod,factorPLocalsMethod,factorPGeneric,factorPGenericN,factorPHook skipempty keepend
139 syn keyword factorBoolean f t
140 syn keyword factorBreakpoint B
141 syn keyword factorFrySpecifier @ _ contained
142 syn keyword factorDeclaration delimiter deprecated final flushable foldable inline recursive
143 syn region factorCall matchgroup=factorCallDelims start=/\v<%(call|execute)\V(\v>/ end=/\v<\V)\v>/ contains=@factorStackEffectContents
144 syn keyword factorCallNextMethod call-next-method
146 syn region factorChar start=/\v<CHAR:>/ end=/\v\S+>/
147 syn region factorColor start=/\v<COLOR:>/ end=/\v\S+>/
149 syn match factorEscape /\v\\([\\astnrbvf0e\"]|u\x{6}|u\{\S+}|x\x{2})/ contained display
150 syn region factorString matchgroup=factorStringDelims start=/\v<"/ skip=/\v\\"/ end=/\v"/ contains=factorEscape
151 syn region factorString matchgroup=factorStringDelims start=/\v<"""/ skip=/\v\\"/ end=/\v"""/ contains=factorEscape
152 syn region factorString matchgroup=factorStringDelims start=/\v<[^[:blank:]"]+"/ skip=/\v\\"/ end=/\v"/ contains=factorEscape
153 syn region factorString matchgroup=factorStringDelims start=/\v\[\z(\=*)\[/ end=/\]\z1\]/ contains=factorEscape
154 syn region factorString matchgroup=factorStringDelims start=/\v<HEREDOC:\s+\z(.*)$>/ end=/\v^\z1$>/
155 syn region factorString matchgroup=factorStringDelims start=/\v<[^[\][:blank:]]+\[\z(\=*)\[>/ end=/\v\]\z1\]/
157 syn region factorNamedString matchgroup=factorNamedStringDelims start=/\v<STRING:\s+\S+$>/ end=/\v^<;>$/ contains=factorEscape
159 syn region factorMultilineComment start=/\v<\/\*>/ end=/\v\*\// contains=@factorCommentContents keepend
160 syn region factorMultilineComment start=/\v<!\[\z(\=*)\[/ end=/\v\]\z1\]/ contains=@factorCommentContents keepend
162 syn region factorRegexp start=/\v<%(R\/\s)/ skip=/\v%(\\\/)/ end=/\v%(\/\S*)>/
164 syn cluster factorReal contains=@factorInteger,@factorFloat,@factorRatio,@factorBin,@factorOct,@factorHex,factorNan
165 syn cluster factorNumber contains=@factorReal,factorComplex
167 syn cluster factorInteger contains=factorInteger
168 if !exists('g:factor_syn_no_error') " more general
169 syn cluster factorInteger add=factorIntegerError
170 syn match factorIntegerError /\v<[+-]=%(\d|,){-}\d%(\d|,)*>/
172 syn match factorInteger /\v<[+-]=\d%(\d|,)*,@1<!>/
174 syn cluster factorFloat contains=factorFloat
175 if !exists('g:factor_syn_no_error') " more general
176 syn cluster factorFloat add=factorFloatError
177 syn match factorFloatError /\v<[+-]=%(\S{-}\d&%(\d|,)*%([eE][+-]=%(\d|,)*|\.%(\d|,)*%([eE][+-]=%(\d|,)*)?)|\.%(\d|,)+%([eE][+-]=%(\d|,)*)?)>/
179 syn match factorFloat /\v<[+-]=%(\d%(\d|,)*,@1<!%([eE][+-]=\d%(\d|,)*,@1<!|\.%(\d%(\d|,)*,@1<!)?%([eE][+-]=\d%(\d|,)*,@1<!)?)|\.\d%(\d|,)*,@1<!%([eE][+-]=\d%(\d|,)*,@1<!)?)>/
181 syn cluster factorRatio contains=factorRatio
182 if !exists('g:factor_syn_no_error') " more general
183 syn cluster factorRatio add=factorRatioError
184 syn match factorRatioError /\v<[+-]=%(\S{-}\d.{-}\/&%(\d|,)*\.?%(\d|,)*%([+-]%(\d|,)*)?)\/[+-]=%(\S{-}\d&%(\d|,)*\.?%(\d|,)*%([eE][+-]=%(\d|,)*)?)>/
186 syn match factorRatio /\v<([+-]=)\d%(\d|,)*,@1<!%(\1@=[+-](\d%(\d|,)*,@1<!)\/\2@!\d%(\d|,)*,@1<!|\/%(\d%(\d|,)*,@1<!%(\.%(\d%(\d|,)*,@1<!)?)?|\.\d%(\d|,)*,@1<!)%([eE][+-]=\d%(\d|,)*,@1<!)?)%(\/0)@2<!>/
188 syn region factorComplex start=/\v<C\{>/ skip=/\v<!>.*/ end=/\v<\}>/ contains=@factorComment,@factorReal
190 syn cluster factorBin contains=factorBin
191 if !exists('g:factor_syn_no_error')
192 syn cluster factorBin add=factorBinError
193 syn match factorBinError /\v<[+-]=0[bB]%(\S{-}\w&%(\w|,)*\.?%(\w|,)*%([pP][+-]=%(\w|,)*)?)>/
195 syn match factorBin /\v<[+-]=0[bB]%([01][01,]*,@1<!%(\.%([01][01,]*,@1<!)?)?|\.[01][01,]*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/
197 syn cluster factorOct contains=factorOct
198 if !exists('g:factor_syn_no_error')
199 syn cluster factorOct add=factorOctError
200 syn match factorOctError /\v<[+-]=0[oO]%(\S{-}\o&%(\w|,)*\.?(\w|,)*%([pP][+-]=%(\w|,)*)?)>/
202 syn match factorOct /\v<[+-]=0[oO]%(\o%(\o|,)*,@1<!%(\.%(\o%(\o|,)*,@1<!)?)?|\.\o%(\o|,)*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/
204 syn cluster factorHex contains=factorHex
205 syn cluster factorHexNoRadix contains=factorHexNoRadix
206 if !exists('g:factor_syn_no_error')
207 syn cluster factorHex add=factorHexError
208 syn match factorHexError /\v<[+-]=0[xX]%(\S{-}\x&%(\x|,)*\.?(\x|,)*%([pP][+-]=%(\w|,)*)?)>/
209 syn cluster factorHexNoRadix add=factorHexNoRadixError
210 syn match factorHexNoRadixError /\v<[+-]=%(\S{-}\x&%(\w|,)*\.?(\w|,)*%([pP][+-]=%(\w|,)*)?)>/ contained
212 syn match factorHex /\v<[+-]=0[xX]%(\x%(\x|,)*,@1<!%(\.%(\x%(\x|,)*,@1<!)?)?|\.\x%(\x|,)*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/
213 syn match factorHexNoRadix /\v<[+-]=%(\x%(\x|,)*,@1<!%(\.%(\x%(\x|,)*,@1<!)?)?|\.\x%(\x|,)*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/ contained
215 syn region factorNan matchgroup=factorNan start=/\v<NAN:>/ matchgroup=NONE skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment,@factorHexNoRadix keepend
217 syn region factorBackslash start=/\v<\\>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
218 syn region factorMBackslash start=/\v<M\\>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
219 syn region factorLiteral start=/\v<\$>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
221 syn match factorSlotAttrReadOnly /\v<read-only>/ contained
222 syn match factorSlotAttrInitial /\v<initial:>%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=factorWord,@factorClusterValue contained
223 syn cluster factorSlotAttr contains=factorSlotAttrInitial,factorSlotAttrReadOnly
225 syn cluster factorTupleSlotAttr contains=@factorSlotAttr
226 syn match factorTupleSlotAttrSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=@factorTupleSlotAttr contained transparent
227 syn match factorTupleSlotName /\v<\S+>/ nextgroup=factorTupleSlotClassSkip skipempty contained
228 syn match factorTupleSlotNameSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorTupleSlotName transparent contained
229 syn match factorTupleSlotClass /\v<\S+>/ nextgroup=factorTupleSlotAttrSkip skipempty contained
230 syn match factorTupleSlotClassSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=@factorTupleSlotAttr,factorTupleSlotClass transparent contained
231 syn region factorTupleSlot matchgroup=factorTupleSlotDelims start=/\v<\{>/ end=/\v<\}>/ contains=@factorComment,factorTupleSlotName,@factorTupleSlotAttr contained
232 "syn match factorTupleClass /\v<\S+>/ nextgroup=factorTupleSuperClass,factorTupleSlot contained
233 "syn region factorTupleSuperClass matchgroup=NONE start=/\v%(\s+\<\s+)/ matchgroup=Identifier end=/\v<\S+>/ contains=@factorComment contained nextgroup=factorTupleSlot
234 syn region factorTuple matchgroup=factorTupleDelims start=/\v<%(TUPLE|BUILTIN|ERROR):>/ end=/\v<;>/ contains=@factorComment,factorTupleSlot
235 syn region factorPredicate matchgroup=factorPredicateDelims start=/\v<%(PREDICATE):>/ end=/\v<;>/ contains=@factorComment,factorTupleSlot
237 syn match factorStructSlotAttrBits /\v<bits:>%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=factorWord,@factorReal contained
238 syn cluster factorStructSlotAttr contains=@factorSlotAttr,factorStructSlotAttrBits
239 syn match factorStructSlotName /\v<\S+>/ nextgroup=factorStructSlotTypeSkip skipempty contained
240 syn match factorStructSlotNameSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStructSlotName contained transparent
241 syn match factorStructSlotType /\v<\S+>/ contained
242 syn match factorStructSlotTypeSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStructSlotType contained transparent
243 syn region factorStructSlot matchgroup=factorStructSlotDelims start=/\v<\{>/ skip=/\v<!>.*/ end=/\v<\}>/ contains=@factorComment,factorStructSlotName,@factorStructSlotAttr contained
244 syn region factorStruct matchgroup=factorStructDelims start=/\v<%(%(UNION-)?STRUCT):>/ skip=/\v<!>.*/ end=/\v<;>/ contains=@factorComment,factorStructSlot
246 syn region factorAlias start=/\v<ALIAS:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
247 syn region factorAlien start=/\v<ALIEN:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment,@factorHexNoRadix
248 syn region factorConstant start=/\v<CONSTANT:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
249 syn region factorConstructor start=/\v<C:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
250 syn region factorConstructor2 start=/\v<CONSTRUCTOR:>/ skip=/\v<!>.*/ end=/\v<;>/ contains=@factorComment,@factorStackEffect
251 syn region factorDefer start=/\v<DEFER:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
252 syn region factorExclude start=/\v<EXCLUDE:>/ skip=/\v<!>.*/ end=/\v<;>/ contains=@factorComment
253 syn region factorForget start=/\v<FORGET:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
254 syn region factorFrom start=/\v<FROM:>/ skip=/\v<!>.*/ end=/\v<;>/ contains=@factorComment
255 syn region factorIn start=/\v<IN:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
256 syn region factorInstance start=/\v<INSTANCE:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
257 syn region factorIntersection start=/\v<INTERSECTION:>/ skip=/\v<!>.*/ end=/\v<;>/ contains=@factorComment
258 syn region factorMain start=/\v<MAIN:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
259 syn region factorMixin start=/\v<MIXIN:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
260 syn region factorPostpone start=/\v<POSTPONE:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
261 syn region factorQualified start=/\v<QUALIFIED:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
262 syn region factorQualifiedWith start=/\v<QUALIFIED-WITH:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
263 syn region factorRename start=/\v<RENAME:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+%(\_\s+%(!>.*)?)+\=\>%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
264 syn region factorSingleton start=/\v<SINGLETON:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
265 syn region factorSingletons start=/\v<SINGLETONS:>/ skip=/\v<!>.*/ end=/\v<;>/ contains=@factorComment
266 syn region factorSlot start=/\v<SLOT:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
267 syn region factorSymbol start=/\v<SYMBOL:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
268 syn region factorSymbols start=/\v<SYMBOLS:>/ skip=/\v<!>.*/ end=/\v<;>/ contains=@factorComment
269 syn region factorUnion start=/\v<UNION:>/ skip=/\v<!>.*/ end=/\v<;>/ contains=@factorComment
270 syn region factorUnuse start=/\v<UNUSE:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
271 syn region factorUse start=/\v<USE:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
272 syn region factorUsing start=/\v<USING:>/ skip=/\v<!>.*/ end=/\v<;>/ contains=@factorComment
274 syn cluster factorWordOps contains=factorConstant,factorAlias,factorSingleton,factorSingletons,factorSymbol,factorSymbols,factorPostpone,factorDefer,factorForget,factorMixin,factorInstance,factorHook,factorMain,factorConstructor
283 if !exists('g:factor_syn_no_error')
284 syn match factorStackEffectRequired /\v<\V(\@!\v\S+>/ contained
286 syn cluster factorStackEffectContents contains=@factorComment,factorStackEffectDelims,factorStackEffectVar,factorStackEffectType,factorStackEffectRowVar
287 syn cluster factorStackEffect contains=factorStackEffect
288 " Erroring on stack effects without a "--" separator would be nice.
289 " Unfortunately, that sort of vacuous detection is above Vim's pay-grade,
290 " especially when stack effects can be nested arbitrarily via types.
291 syn match factorStackEffectSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStackEffectRequired,@factorStackEffect transparent contained
292 syn region factorStackEffect matchgroup=factorStackEffectDelims start=/\v\V(\v>/ end=/\v<\V)\v>/ contains=@factorStackEffectContents
293 syn match factorStackEffectVar /\v<\S+>/ contained
294 " Note that ":!" parses to the "!" word and doesn't lex as a comment.
295 " Also, even though we take any value, the leading ":" breaking the word
296 " boundary means a lot of our nicer syntax patterns don't match on
297 " "factorStackEffectType".
298 " syn cluster factorStackEffectType contains=factorWord,@factorStackEffect
299 syn cluster factorStackEffectType contains=factorWord,@factorClusterValue
300 syn match factorStackEffectTypeSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=@factorStackEffectType transparent contained
301 syn match factorStackEffectVar /\v<\S+:>/ nextgroup=factorStackEffectTypeSkip skipempty contained
302 syn match factorStackEffectType /\v<:/ nextgroup=@factorStackEffectType contained
303 syn match factorStackEffectRowVar /\v<\.\.\S+>/ contained
304 syn match factorStackEffectRowVar /\v<\.\.\S+:>/ nextgroup=factorStackEffectTypeSkip skipempty contained
305 syn match factorStackEffectDelims /\v<-->/ contained
306 if !exists('g:factor_syn_no_error')
307 syn cluster factorStackEffectContents add=factorStackEffectError
308 syn keyword factorStackEffectError ( contained
311 " adapted from lisp.vim
312 if exists('g:factor_syn_no_rainbow')
313 syn cluster factorQuotation contains=factorQuotation
314 syn region factorQuotation matchgroup=factorDelimiter start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=ALL
316 syn cluster factorQuotation contains=factorQuotation0
317 syn region factorQuotation0 matchgroup=hlLevel0 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation1,factorArray1
318 syn region factorQuotation1 contained matchgroup=hlLevel1 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation2,factorArray2
319 syn region factorQuotation2 contained matchgroup=hlLevel2 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation3,factorArray3
320 syn region factorQuotation3 contained matchgroup=hlLevel3 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation4,factorArray4
321 syn region factorQuotation4 contained matchgroup=hlLevel4 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation5,factorArray5
322 syn region factorQuotation5 contained matchgroup=hlLevel5 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation6,factorArray6
323 syn region factorQuotation6 contained matchgroup=hlLevel6 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation7,factorArray7
324 syn region factorQuotation7 contained matchgroup=hlLevel7 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation8,factorArray8
325 syn region factorQuotation8 contained matchgroup=hlLevel8 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation9,factorArray9
326 syn region factorQuotation9 contained matchgroup=hlLevel9 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation0,factorArray0
329 if exists('g:factor_syn_no_rainbow')
330 syn cluster factorArray contains=factorArray
331 syn region factorArray matchgroup=factorDelimiter start=/\v<\S*\{>/ end=/\v<\}>/ contains=ALL
333 syn cluster factorArray contains=factorArray0
334 syn region factorArray0 matchgroup=hlLevel0 start=/\v<\S*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray1,factorQuotation1
335 syn region factorArray1 contained matchgroup=hlLevel1 start=/\v<\S*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray2,factorQuotation2
336 syn region factorArray2 contained matchgroup=hlLevel2 start=/\v<\S*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray3,factorQuotation3
337 syn region factorArray3 contained matchgroup=hlLevel3 start=/\v<\S*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray4,factorQuotation4
338 syn region factorArray4 contained matchgroup=hlLevel4 start=/\v<\S*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray5,factorQuotation5
339 syn region factorArray5 contained matchgroup=hlLevel5 start=/\v<\S*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray6,factorQuotation6
340 syn region factorArray6 contained matchgroup=hlLevel6 start=/\v<\S*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray7,factorQuotation7
341 syn region factorArray7 contained matchgroup=hlLevel7 start=/\v<\S*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray8,factorQuotation8
342 syn region factorArray8 contained matchgroup=hlLevel8 start=/\v<\S*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray9,factorQuotation9
343 syn region factorArray9 contained matchgroup=hlLevel9 start=/\v<\S*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray0,factorQuotation0
346 if !exists('g:factor_syn_no_error')
347 syn match factorBracketError /\v<\]>/
348 syn match factorBracketError /\v<\}>/
353 if !exists('g:factor_syn_no_init')
354 command -nargs=+ -bar HiLink hi def link <args>
356 if !exists('g:factor_syn_no_error')
357 HiLink factorBracketError Error
358 HiLink factorIntegerError Error
359 HiLink factorFloatError Error
360 HiLink factorRatioError Error
361 HiLink factorBinError Error
362 HiLink factorHexNoRadixError Error
363 HiLink factorHexError Error
364 HiLink factorOctError Error
365 HiLink factorStackEffectRequired Error
366 HiLink factorStackEffectError Error
369 HiLink factorError Error
370 HiLink factorShebang PreProc
371 HiLink factorComment Comment
372 HiLink factorMultilineComment Comment
373 HiLink factorTodo Todo
374 HiLink factorStackEffect Type
375 HiLink factorStackEffectDelims Delimiter
376 HiLink factorStackEffectVar Identifier
377 HiLink factorStackEffectRowVar factorStackEffectVar
378 HiLink factorStackEffectType Type
379 HiLink factorInclude Include
380 HiLink factorWord Keyword
381 HiLink factorCall Keyword
382 HiLink factorCallDelims Keyword
383 HiLink factorCallNextMethod Keyword
384 HiLink factorOperator Operator
385 HiLink factorFrySpecifier Operator
386 HiLink factorBoolean Boolean
387 HiLink factorBreakpoint Debug
388 HiLink factorDefn Typedef
389 HiLink factorDefnDelims Typedef
390 HiLink factorMethod Typedef
391 HiLink factorMethodDelims Typedef
392 HiLink factorLocalsMethodDelims Typedef
393 HiLink factorGeneric Typedef
394 HiLink factorGenericN Typedef
395 HiLink factorConstructor Typedef
396 HiLink factorConstructor2 Typedef
397 HiLink factorPrivate Special
398 HiLink factorPDefnDelims Special
399 HiLink factorPMethodDelims Special
400 HiLink factorPLocalsMethodDelims Special
401 HiLink factorPGeneric Special
402 HiLink factorPGenericN Special
403 HiLink factorPHook Special
404 HiLink factorEscape SpecialChar
405 HiLink factorString String
406 HiLink factorStringDelims factorString
407 HiLink factorNamedString String
408 HiLink factorNamedStringDelims Typedef
409 HiLink factorComplex Number
410 HiLink factorRatio Number
411 HiLink factorBin Number
412 HiLink factorHexNoRadix Number
413 HiLink factorHex Number
414 HiLink factorNan Number
415 HiLink factorOct Number
416 HiLink factorFloat Float
417 HiLink factorInteger Number
418 HiLink factorUsing Include
419 HiLink factorQualified Include
420 HiLink factorQualifiedWith Include
421 HiLink factorExclude Include
422 HiLink factorFrom Include
423 HiLink factorRename Include
424 HiLink factorUse Include
425 HiLink factorUnuse Include
426 HiLink factorIn Define
427 HiLink factorChar Character
428 HiLink factorColor Constant
429 HiLink factorDelimiter Delimiter
430 HiLink factorBackslash Special
431 HiLink factorMBackslash Special
432 HiLink factorLiteral Special
433 HiLink factorDeclaration Typedef
434 HiLink factorSymbol Define
435 HiLink factorSymbols Define
436 HiLink factorConstant Define
437 HiLink factorAlias Define
438 HiLink factorSingleton Typedef
439 HiLink factorSingletons Typedef
440 HiLink factorMixin Typedef
441 HiLink factorInstance Typedef
442 HiLink factorHook Typedef
443 HiLink factorMain Define
444 HiLink factorPostpone Define
445 HiLink factorDefer Define
446 HiLink factorForget Define
447 HiLink factorAlien Define
448 HiLink factorSlot Define
449 HiLink factorIntersection Typedef
450 HiLink factorRegexp Constant
451 HiLink factorSlot Typedef
452 HiLink factorSlotDelims factorSlot
453 HiLink factorSlotName Identifier
454 HiLink factorSlotClass Type
455 HiLink factorSlotType factorSlotClass
456 HiLink factorSlotAttr Special
457 HiLink factorSlotAttrInitial factorSlotAttr
458 HiLink factorSlotAttrReadOnly factorSlotAttr
459 HiLink factorStructSlotAttr factorSlotAttr
460 HiLink factorStructSlotAttrBits factorStructSlotAttr
461 HiLink factorPredicate Typedef
462 HiLink factorPredicateDelims factorTuple
463 HiLink factorTuple Typedef
464 HiLink factorTupleDelims factorTuple
465 HiLink factorTupleSlot factorSlot
466 HiLink factorTupleClass Identifier
467 HiLink factorTupleSlotDelims factorSlotDelims
468 HiLink factorTupleSlotName factorSlotName
469 HiLink factorTupleSlotClass factorSlotClass
470 HiLink factorUnion Typedef
471 HiLink factorStruct Typedef
472 HiLink factorStructDelims factorStruct
473 HiLink factorStructSlot factorSlot
474 HiLink factorStructSlotDelims factorSlotDelims
475 HiLink factorStructSlotName factorSlotName
476 HiLink factorStructSlotType factorSlotType
479 hi hlLevel0 ctermfg=red guifg=red1
480 hi hlLevel1 ctermfg=yellow guifg=orange1
481 hi hlLevel2 ctermfg=green guifg=yellow1
482 hi hlLevel3 ctermfg=cyan guifg=greenyellow
483 hi hlLevel4 ctermfg=magenta guifg=green1
484 hi hlLevel5 ctermfg=red guifg=springgreen1
485 hi hlLevel6 ctermfg=yellow guifg=cyan1
486 hi hlLevel7 ctermfg=green guifg=slateblue1
487 hi hlLevel8 ctermfg=cyan guifg=magenta1
488 hi hlLevel9 ctermfg=magenta guifg=purple1
490 hi hlLevel0 ctermfg=red guifg=red3
491 hi hlLevel1 ctermfg=darkyellow guifg=orangered3
492 hi hlLevel2 ctermfg=darkgreen guifg=orange2
493 hi hlLevel3 ctermfg=blue guifg=yellow3
494 hi hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
495 hi hlLevel5 ctermfg=red guifg=green4
496 hi hlLevel6 ctermfg=darkyellow guifg=paleturquoise3
497 hi hlLevel7 ctermfg=darkgreen guifg=deepskyblue4
498 hi hlLevel8 ctermfg=blue guifg=darkslateblue
499 hi hlLevel9 ctermfg=darkmagenta guifg=darkviolet
504 let b:current_syntax = 'factor'
506 " vim: set ft=vim et sw=2 isk+=/,\\ :