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