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