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,factorSlotsSyntax
62 syn cluster factorClusterValue contains=factorBreakpoint,factorBoolean,factorFrySpecifier,factorLocalsSpecifier,factorChar,factorString,@factorNumber,factorBackslash,factorMBackslash,factorLiteral,@factorEffect,@factorEffectComment,@factorQuotation,@factorArray,factorRegexp
64 " Almost any byte in Factor can be a part of a word
65 syn iskeyword 33-126,128-255
67 " A crash course on Factor's lexer:
69 " The "lexer" vocabulary parses lines (arrays of strings) into tokens.
70 " Tokens are non-space strings, effectively words.
71 " The "lexer" class holds lex state.
72 " Lexer method "skip-word" advances to the next space
73 " while also counting leading double quotation marks as their own words.
74 " I.e., this advances to the end of the current token
75 " (if currently at a token, otherwise nothing changes).
76 " Method "skip-blank" advances to the next non-space
77 " while also skipping shebangs at the beginning of the first line.
78 " I.e., this advances to the start of the next token
79 " (if one is present, otherwise it advances to the line's end).
80 " "(parse-raw)" advances a lexer through an immediate token via "skip-word",
81 " and returns the (sub)token advanced through.
82 " Note that this will not advance a lexer at space,
83 " and an empty string will be returned.
84 " "next-line" advances a lexer to the start of the next line,
85 " adding an effectively empty line to the end (as an EOF state).
86 " "parse-raw" advances a lexer through the next token,
87 " first via alternating "skip-blank" & "next-line" if the line ended,
88 " then via "(parse-raw)",
89 " and returns it if found, otherwise (i.e. upon EOF) returning "f".
90 " Note that the lexer will be advanced to EOF if "f" is returned.
91 " Comments are (unprocessed) remainders of lines, after a "!" word.
92 " "parse-token" advances a lexer though the next token via "parse-raw",
93 " then returns it if found, otherwise returning "f".
94 " while also advancing through comments
95 " via mutual recursion with "skip-comment".
96 " "[ skip-comment ] call( lexer str -- str' )" tests if a token is "!",
97 " returning that token if so,
98 " otherwise first advancing a lexer to the next line via "next-line"
99 " (i.e. discarding the rest of the current line)
100 " and then advancing it via "parse-token" & returning that token,
101 " ensuring the return of "parse-token"'s desired non-comment token.
102 " The "lexer" dynamic variable holds the ambient lexer.
103 " "?scan-token" advances the ambient lexer through the next token
105 " and returns it if found, otherwise returning "f".
106 " "scan-token" advances the ambient lexer through the next token
108 " and returns it if found, otherwise throwing an exception.
109 " All other words in the "lexer" vocabulary read via "scan-token", if at all.
110 " So! To know when double quotes & exclamation marks aren't special,
111 " grep for "parse-raw". (Mostly. To be certain, grep for "lexer".)
113 syn match factorShebang /\v%^\#!.*$/ display
115 syn cluster factorComment contains=factorComment
116 syn match factorComment /\v<!>.*$/ contains=@factorCommentContents
117 syn cluster factorCommentContents contains=factorTodo,@Spell
118 syn match factorTodo /\v(TODO|FIXME|XXX):=/ contained
120 syn match factorInit /\v<%(STARTUP-HOOK|SHUTDOWN-HOOK):>/ display
122 syn cluster factorHelp contains=factorHelp
123 syn region factorHelp start=/\v<HELP:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
124 syn match factorHelp /\v<%(ARTICLE|ABOUT):>/ display
126 syn region factorDefn matchgroup=NONE start=/\v<%(SYNTAX|CONSTRUCTOR|%(M|MACRO|MEMO|TYPED)?:?):>/ skip=/\v<(!|CHAR:)>.*/ matchgroup=factorDefnDelims end=/\v<;>/ contains=factorDefnDelims,@factorCluster keepend transparent
127 syn region factorDefnDelims start=/\v<SYNTAX:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment skipempty keepend contained
128 syn region factorDefnDelims start=/\v<%(MACRO|MEMO|TYPED)?:?:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorEffectSkip skipempty keepend contained
129 syn region factorDefnDelims start=/\v<M:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment skipempty keepend contained
130 syn region factorDefnDelims start=/\v<M::>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorEffectSkip skipempty keepend contained
131 syn region factorDefnDelims start=/\v<CONSTRUCTOR:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorEffectSkip skipempty keepend contained
132 syn region factorDeclDelims start=/\v<%(GENERIC|MATH|PRIMITIVE):>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorEffectSkip skipempty keepend
133 syn region factorDeclDelims start=/\v<GENERIC\#:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/ contains=@factorComment nextgroup=factorEffectSkip skipempty keepend
134 syn region factorDeclDelims start=/\v<HOOK:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorEffectSkip skipempty keepend
135 syn region factorDeclDelims start=/\v<C:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment skipempty keepend
137 syn region factorPDefn matchgroup=NONE start=/\v<%(SYNTAX|CONSTRUCTOR|%(M|MACRO|MEMO|TYPED)?:?):>/ skip=/\v<!>.*/ matchgroup=factorPDefnDelims end=/\v<;>/ contains=factorPDefnDelims,@factorCluster keepend contained
138 syn region factorPDefnDelims start=/\v<SYNTAX:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment skipempty keepend contained
139 syn region factorPDefnDelims start=/\v<%(MACRO|MEMO|TYPED)?:?:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorEffectSkip skipempty keepend contained
140 syn region factorPDefnDelims start=/\v<M:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment skipempty keepend contained
141 syn region factorPDefnDelims start=/\v<M::>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorEffectSkip skipempty keepend contained
142 syn region factorPDefnDelims start=/\v<CONSTRUCTOR:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorEffectSkip skipempty keepend contained
143 syn region factorPDeclDelims start=/\v<%(GENERIC|MATH|PRIMITIVE):>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorEffectSkip skipempty keepend contained
144 syn region factorPDeclDelims start=/\v<GENERIC\#:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/ contains=@factorComment nextgroup=factorEffectSkip skipempty keepend contained
145 syn region factorPDeclDelims start=/\v<HOOK:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorEffectSkip skipempty keepend contained
146 syn region factorPDeclDelims start=/\v<C:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment skipempty keepend contained
148 syn region factorPrivate start=/\v<\<PRIVATE>/ end=/\v<PRIVATE\>>/ contains=@factorCluster,factorPDefn,factorPDeclDelims skipempty keepend
150 syn keyword factorBoolean f t
151 syn keyword factorBreakpoint B
152 syn keyword factorFrySpecifier @ _ contained
153 syn keyword factorLocalsSpecifier :> contained
154 syn keyword factorDeclaration delimiter deprecated final flushable foldable inline recursive
155 syn region factorCall matchgroup=factorCallDelims start=/\v<%(call|execute)\V(\v>/ end=/\v<\V)\v>/ contains=@factorEffectContents
156 syn keyword factorCallNextMethod call-next-method
158 syn region factorChar start=/\v<CHAR:>/ end=/\v\S+>/
159 syn region factorColor start=/\v<COLOR:>/ end=/\v\S+>/
161 syn match factorEscape /\v\\([\\astnrbvfe\"]|u\x{6}|u\{\S+}|x\x{2}|\o{1,3})/ contained display
162 syn region factorString matchgroup=factorStringDelims start=/\v<"/ skip=/\v\\"/ end=/\v"/ contains=factorEscape
163 syn region factorString matchgroup=factorStringDelims start=/\v<"""/ skip=/\v\\"/ end=/\v"""/ contains=factorEscape
164 syn region factorString matchgroup=factorStringDelims start=/\v<[^[:blank:]"]+"/ skip=/\v\\"/ end=/\v"/ contains=factorEscape
165 syn region factorString matchgroup=factorStringDelims start=/\v\[\z(\=*)\[/ end=/\]\z1\]/ contains=factorEscape
166 syn region factorString matchgroup=factorStringDelims start=/\v<[^[\][:blank:]]+\[\z(\=*)\[>/ end=/\v\]\z1\]/
168 syn region factorNamedString matchgroup=factorNamedStringDelims start=/\v<STRING:\s+\S+$>/ end=/\v^<;>$/ contains=factorEscape
170 syn region factorMultilineComment start=/\v<\/\*>/ end=/\v\*\// contains=@factorCommentContents keepend
171 syn region factorMultilineComment start=/\v<!\[\z(\=*)\[/ end=/\v\]\z1\]/ contains=@factorCommentContents keepend
173 syn region factorRegexp start=/\v<%(R\/\s)/ skip=/\v%(\\\/)/ end=/\v%(\/\S*)>/
175 syn cluster factorReal contains=@factorInteger,@factorFloat,@factorRatio,@factorBin,@factorOct,@factorHex,factorNan
176 syn cluster factorNumber contains=@factorReal,factorComplex
178 syn cluster factorInteger contains=factorInteger
179 if !exists('g:factor_syn_no_error') " more general
180 syn cluster factorInteger add=factorIntegerError
181 syn match factorIntegerError /\v<[+-]=%(\d|,|_){-}\d%(\d|,|_)*>/
183 syn match factorInteger /\v<[+-]=\d%(\d|,|_)*,@1<!>/
185 syn cluster factorFloat contains=factorFloat
186 if !exists('g:factor_syn_no_error') " more general
187 syn cluster factorFloat add=factorFloatError
188 syn match factorFloatError /\v<[+-]=%(\S{-}\d&%(\d|,|_)*%([eE][+-]=%(\d|,|_)*|\.%(\d|,|_)*%([eE][+-]=%(\d|,|_)*)?)|\.%(\d|,|_)+%([eE][+-]=%(\d|,|_)*)?)>/
190 syn match factorFloat /\v<[+-]=%(\d%(\d|,|_)*,@1<!%([eE][+-]=\d%(\d|,|_)*,@1<!|\.%(\d%(\d|,|_)*,@1<!)?%([eE][+-]=\d%(\d|,|_)*,@1<!)?)|\.\d%(\d|,|_)*,@1<!%([eE][+-]=\d%(\d|,|_)*,@1<!)?)>/
192 syn cluster factorRatio contains=factorRatio
193 if !exists('g:factor_syn_no_error') " more general
194 syn cluster factorRatio add=factorRatioError
195 syn match factorRatioError /\v<[+-]=%(\S{-}\d.{-}\/&%(\d|,|_)*\.?%(\d|,|_)*%([+-]%(\d|,|_)*)?)\/[+-]=%(\S{-}\d&%(\d|,|_)*\.?%(\d|,|_)*%([eE][+-]=%(\d|,|_)*)?)>/
197 syn match factorRatio /\v<([+-]=)\d%(\d|,|_)*,@1<!%(\1@=[+-](\d%(\d|,|_)*,@1<!)\/\2@!\d%(\d|,|_)*,@1<!|\/%(\d%(\d|,|_)*,@1<!%(\.%(\d%(\d|,|_)*,@1<!)?)?|\.\d%(\d|,|_)*,@1<!)%([eE][+-]=\d%(\d|,|_)*,@1<!)?)%(\/0)@2<!>/
199 syn region factorComplex start=/\v<C\{>/ skip=/\v<!>.*/ end=/\v<\}>/ contains=@factorComment,@factorReal
201 syn cluster factorBin contains=factorBin
202 if !exists('g:factor_syn_no_error')
203 syn cluster factorBin add=factorBinError
204 syn match factorBinError /\v<[+-]=0[bB]%(\S{-}\w&%(\w|,|_)*\.?%(\w|,|_)*%([pP][+-]=%(\w|,|_)*)?)>/
206 syn match factorBin /\v<[+-]=0[bB]%([01][01,_]*,@1<!%(\.%([01][01,_]*,@1<!)?)?|\.[01][01,_]*,@1<!)%([pP][+-]=\d%(\d|,|_)*,@1<!)?>/
208 syn cluster factorOct contains=factorOct
209 if !exists('g:factor_syn_no_error')
210 syn cluster factorOct add=factorOctError
211 syn match factorOctError /\v<[+-]=0[oO]%(\S{-}\o&%(\w|,|_)*\.?(\w|,|_)*%([pP][+-]=%(\w|,|_)*)?)>/
213 syn match factorOct /\v<[+-]=0[oO]%(\o%(\o|,|_)*,@1<!%(\.%(\o%(\o|,|_)*,@1<!)?)?|\.\o%(\o|,|_)*,@1<!)%([pP][+-]=\d%(\d|,|_)*,@1<!)?>/
215 syn cluster factorHex contains=factorHex
216 syn cluster factorHexNoRadix contains=factorHexNoRadix
217 if !exists('g:factor_syn_no_error')
218 syn cluster factorHex add=factorHexError
219 syn match factorHexError /\v<[+-]=0[xX]%(\S{-}\x&%(\x|,|_)*\.?(\x|,|_)*%([pP][+-]=%(\w|,|_)*)?)>/
220 syn cluster factorHexNoRadix add=factorHexNoRadixError
221 syn match factorHexNoRadixError /\v<[+-]=%(\S{-}\x&%(\w|,|_)*\.?(\w|,|_)*%([pP][+-]=%(\w|,|_)*)?)>/ contained
223 syn match factorHex /\v<[+-]=0[xX]%(\x%(\x|,|_)*,@1<!%(\.%(\x%(\x|,|_)*,@1<!)?)?|\.\x%(\x|,|_)*,@1<!)%([pP][+-]=\d%(\d|,|_)*,@1<!)?>/
224 syn match factorHexNoRadix /\v<[+-]=%(\x%(\x|,|_)*,@1<!%(\.%(\x%(\x|,|_)*,@1<!)?)?|\.\x%(\x|,|_)*,@1<!)%([pP][+-]=\d%(\d|,|_)*,@1<!)?>/ contained
226 syn region factorNan matchgroup=factorNan start=/\v<NAN:>/ matchgroup=NONE skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment,@factorHexNoRadix keepend
228 syn region factorBackslash start=/\v<\\>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
229 syn region factorMBackslash start=/\v<M\\>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
230 syn region factorLiteral start=/\v<\$>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
232 syn match factorSlotAttrReadOnly /\v<read-only>/ contained
233 syn match factorSlotAttrInitial /\v<initial:>%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=factorWord,@factorClusterValue contained
234 syn cluster factorSlotAttr contains=factorSlotAttrInitial,factorSlotAttrReadOnly,@factorArray
236 syn cluster factorTupleSlotAttr contains=@factorSlotAttr
237 syn match factorTupleSlotAttrSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=@factorTupleSlotAttr contained transparent
238 syn match factorTupleSlotName /\v<\S+>/ nextgroup=factorTupleSlotClassSkip skipempty contained
239 syn match factorTupleSlotNameSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorTupleSlotName transparent contained
240 syn match factorTupleSlotClass /\v<\S+>/ nextgroup=factorTupleSlotAttrSkip skipempty contained
241 syn match factorTupleSlotClassSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=@factorTupleSlotAttr,factorTupleSlotClass transparent contained
242 syn region factorTupleSlot matchgroup=factorTupleSlotDelims start=/\v<\{>/ end=/\v<\}>/ contains=@factorComment,factorTupleSlotName,@factorTupleSlotAttr contained
243 "syn match factorTupleClass /\v<\S+>/ nextgroup=factorTupleSuperClass,factorTupleSlot contained
244 "syn region factorTupleSuperClass matchgroup=NONE start=/\v%(\s+\<\s+)/ matchgroup=Identifier end=/\v<\S+>/ contains=@factorComment contained nextgroup=factorTupleSlot
245 syn region factorTuple matchgroup=factorTupleDelims start=/\v<%(TUPLE|BUILTIN|ERROR):>/ end=/\v<;>/ contains=@factorComment,factorTupleSlot
246 syn region factorPredicate matchgroup=factorPredicateDelims start=/\v<%(PREDICATE):>/ end=/\v<;>/ contains=@factorComment,factorTupleSlot
248 syn match factorStructSlotAttrBits /\v<bits:>%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=factorWord,@factorReal contained
249 syn cluster factorStructSlotAttr contains=@factorSlotAttr,factorStructSlotAttrBits
250 syn match factorStructSlotName /\v<\S+>/ nextgroup=factorStructSlotTypeSkip skipempty contained
251 syn match factorStructSlotNameSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStructSlotName contained transparent
252 syn match factorStructSlotType /\v<\S+>/ contained
253 syn match factorStructSlotTypeSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStructSlotType contained transparent
254 syn region factorStructSlot matchgroup=factorStructSlotDelims start=/\v<\{>/ skip=/\v<!>.*/ end=/\v<\}>/ contains=@factorComment,factorStructSlotName,@factorStructSlotAttr contained
255 syn region factorStruct matchgroup=factorStructDelims start=/\v<%(%(UNION-)?STRUCT):>/ skip=/\v<!>.*/ end=/\v<;>/ contains=@factorComment,factorStructSlot
257 syn region factorAlias start=/\v<ALIAS:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
258 syn region factorAlien start=/\v<ALIEN:>/ skip=/\v<!>.*/ end=/\v>/ contains=@factorComment,@factorHexNoRadix
259 syn region factorConstant start=/\v<CONSTANT:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
260 syn region factorDefer start=/\v<DEFER:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
261 syn region factorEbnf start=/\v<EBNF:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
262 syn region factorEditor start=/\v<EDITOR:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
263 syn region factorExclude start=/\v<EXCLUDE:>/ skip=/\v<!>.*/ end=/\v<;>/ contains=@factorComment
264 syn region factorForget start=/\v<FORGET:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
265 syn region factorFrom start=/\v<FROM:>/ skip=/\v<!>.*/ end=/\v<;>/ contains=@factorComment
266 syn region factorIn start=/\v<IN:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
267 syn region factorInstance start=/\v<INSTANCE:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
268 syn region factorIntersection start=/\v<INTERSECTION:>/ skip=/\v<!>.*/ end=/\v<;>/ contains=@factorComment
269 syn region factorMain start=/\v<MAIN:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
270 syn region factorMixin start=/\v<MIXIN:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
271 syn region factorPostpone start=/\v<POSTPONE:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
272 syn region factorQualified start=/\v<QUALIFIED:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
273 syn region factorQualifiedWith start=/\v<QUALIFIED-WITH:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
274 syn region factorRename start=/\v<RENAME:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+%(\_\s+%(!>.*)?)+\=\>%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
275 syn region factorSingleton start=/\v<SINGLETON:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
276 syn region factorSingletons start=/\v<SINGLETONS:>/ skip=/\v<!>.*/ end=/\v<;>/ contains=@factorComment
277 syn region factorSlot start=/\v<SLOT:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
278 syn region factorSymbol start=/\v<SYMBOL:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
279 syn region factorSymbols start=/\v<SYMBOLS:>/ skip=/\v<!>.*/ end=/\v<;>/ contains=@factorComment
280 syn region factorUnion start=/\v<UNION:>/ skip=/\v<!>.*/ end=/\v<;>/ contains=@factorComment
281 syn region factorUnuse start=/\v<UNUSE:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
282 syn region factorUse start=/\v<USE:>/ skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment
283 syn region factorUsing start=/\v<USING:>/ skip=/\v<!>.*/ end=/\v<;>/ contains=@factorComment
285 syn cluster factorWordOps contains=factorConstant,factorAlias,factorSingleton,factorSingletons,factorSymbol,factorSymbols,factorPostpone,factorDefer,factorForget,factorMixin,factorInstance,factorHook,factorMain
292 if !exists('g:factor_syn_no_error')
293 syn match factorEffectRequired /\v<\V(\@!\v\S+>/ contained
295 syn cluster factorEffectContents contains=@factorComment,factorEffectDelims,factorEffectVar,factorEffectType,factorEffectRowVar
296 syn cluster factorEffect contains=factorEffect
297 syn cluster factorEffectComment contains=factorEffectComment
298 " Erroring on stack effects without a "--" separator would be nice.
299 " Unfortunately, that sort of vacuous detection is above Vim's pay-grade,
300 " especially when stack effects can be nested arbitrarily via types.
301 syn match factorEffectSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorEffectRequired,@factorEffect transparent contained
302 syn region factorEffect matchgroup=factorEffectDelims start=/\v\V(\v>/ end=/\v<\V)\v>/ contains=@factorEffectContents
303 syn region factorEffectComment matchgroup=factorEffectCommentDelims start=/\v\V((\v>/ end=/\v<\V))\v>/ contains=@factorEffectContents
304 syn match factorEffectVar /\v<\S+>/ contained
305 " Note that ":!" parses to the "!" word and doesn't lex as a comment.
306 " Also, even though we take any value, the leading ":" breaking the word
307 " boundary means a lot of our nicer syntax patterns don't match on
308 " "factorEffectType".
309 " syn cluster factorEffectType contains=factorWord,@factorEffect
310 syn cluster factorEffectType contains=factorWord,@factorClusterValue
311 syn match factorEffectTypeSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=@factorEffectType transparent contained
312 syn match factorEffectVar /\v<\S+:>/ nextgroup=factorEffectTypeSkip skipempty contained
313 syn match factorEffectType /\v<:/ nextgroup=@factorEffectType contained
314 syn match factorEffectRowVar /\v<\.\.\S+>/ contained
315 syn match factorEffectRowVar /\v<\.\.\S+:>/ nextgroup=factorEffectTypeSkip skipempty contained
316 syn match factorEffectDelims /\v<-->/ contained
317 if !exists('g:factor_syn_no_error')
318 syn cluster factorEffectContents add=factorEffectError
319 syn keyword factorEffectError ( contained
322 " adapted from lisp.vim
323 if exists('g:factor_syn_no_rainbow')
324 syn cluster factorQuotation contains=factorQuotation
325 syn region factorQuotation matchgroup=factorDelimiter start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=ALL
327 syn cluster factorQuotation contains=factorQuotation0
328 syn region factorQuotation0 matchgroup=hlLevel0 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation1,factorArray1
329 syn region factorQuotation1 contained matchgroup=hlLevel1 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation2,factorArray2
330 syn region factorQuotation2 contained matchgroup=hlLevel2 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation3,factorArray3
331 syn region factorQuotation3 contained matchgroup=hlLevel3 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation4,factorArray4
332 syn region factorQuotation4 contained matchgroup=hlLevel4 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation5,factorArray5
333 syn region factorQuotation5 contained matchgroup=hlLevel5 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation6,factorArray6
334 syn region factorQuotation6 contained matchgroup=hlLevel6 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation7,factorArray7
335 syn region factorQuotation7 contained matchgroup=hlLevel7 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation8,factorArray8
336 syn region factorQuotation8 contained matchgroup=hlLevel8 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation9,factorArray9
337 syn region factorQuotation9 contained matchgroup=hlLevel9 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation0,factorArray0
340 if exists('g:factor_syn_no_rainbow')
341 syn cluster factorArray contains=factorArray
342 syn region factorArray matchgroup=factorDelimiter start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=ALL
344 syn cluster factorArray contains=factorArray0
345 syn region factorArray0 matchgroup=hlLevel0 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray1,factorQuotation1
346 syn region factorArray1 contained matchgroup=hlLevel1 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray2,factorQuotation2
347 syn region factorArray2 contained matchgroup=hlLevel2 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray3,factorQuotation3
348 syn region factorArray3 contained matchgroup=hlLevel3 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray4,factorQuotation4
349 syn region factorArray4 contained matchgroup=hlLevel4 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray5,factorQuotation5
350 syn region factorArray5 contained matchgroup=hlLevel5 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray6,factorQuotation6
351 syn region factorArray6 contained matchgroup=hlLevel6 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray7,factorQuotation7
352 syn region factorArray7 contained matchgroup=hlLevel7 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray8,factorQuotation8
353 syn region factorArray8 contained matchgroup=hlLevel8 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray9,factorQuotation9
354 syn region factorArray9 contained matchgroup=hlLevel9 start=/\v<[^ \"\[]*\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray0,factorQuotation0
357 syn region factorSlotsSyntax matchgroup=factorSlotsSyntaxDelims start=/\v<%(get|set|set-slots|slots)\[>/ end=/\v<\]>/
359 if !exists('g:factor_syn_no_error')
360 syn match factorBracketError /\v<\]>/
361 syn match factorBracketError /\v<\}>/
366 if !exists('g:factor_syn_no_init')
367 command -nargs=+ -bar HiLink hi def link <args>
369 if !exists('g:factor_syn_no_error')
370 HiLink factorBracketError Error
371 HiLink factorIntegerError Error
372 HiLink factorFloatError Error
373 HiLink factorRatioError Error
374 HiLink factorBinError Error
375 HiLink factorHexNoRadixError Error
376 HiLink factorHexError Error
377 HiLink factorOctError Error
378 HiLink factorEffectRequired Error
379 HiLink factorEffectError Error
382 HiLink factorError Error
383 HiLink factorShebang PreProc
384 HiLink factorComment Comment
385 HiLink factorMultilineComment Comment
386 HiLink factorTodo Todo
387 HiLink factorEffect Type
388 HiLink factorEffectComment Type
389 HiLink factorEffectCommentDelims Comment
390 HiLink factorEffectDelims Delimiter
391 HiLink factorEffectVar Identifier
392 HiLink factorEffectRowVar factorEffectVar
393 HiLink factorEffectType Type
394 HiLink factorInclude Include
395 HiLink factorWord Keyword
396 HiLink factorCallDelims Keyword
397 HiLink factorCallNextMethod Keyword
398 HiLink factorOperator Operator
399 HiLink factorFrySpecifier Operator
400 HiLink factorLocalsSpecifier Operator
401 HiLink factorBoolean Boolean
402 HiLink factorBreakpoint Debug
403 HiLink factorInit Typedef
404 HiLink factorDefnDelims Typedef
405 HiLink factorDeclDelims Typedef
406 HiLink factorPrivate Special
407 HiLink factorPDefnDelims Special
408 HiLink factorPDeclDelims Special
409 HiLink factorEscape SpecialChar
410 HiLink factorString String
411 HiLink factorStringDelims factorString
412 HiLink factorNamedString String
413 HiLink factorNamedStringDelims Typedef
414 HiLink factorComplex Number
415 HiLink factorRatio Number
416 HiLink factorBin Number
417 HiLink factorHexNoRadix Number
418 HiLink factorHex Number
419 HiLink factorNan Number
420 HiLink factorOct Number
421 HiLink factorFloat Float
422 HiLink factorInteger Number
423 HiLink factorUsing Include
424 HiLink factorQualified Include
425 HiLink factorQualifiedWith Include
426 HiLink factorExclude Include
427 HiLink factorFrom Include
428 HiLink factorRename Include
429 HiLink factorUse Include
430 HiLink factorUnuse Include
431 HiLink factorIn Define
432 HiLink factorChar Character
433 HiLink factorColor Constant
434 HiLink factorDelimiter Delimiter
435 HiLink factorBackslash Special
436 HiLink factorMBackslash Special
437 HiLink factorLiteral Special
438 HiLink factorDeclaration Typedef
439 HiLink factorSymbol Define
440 HiLink factorSymbols Define
441 HiLink factorConstant Define
442 HiLink factorAlias Define
443 HiLink factorSingleton Typedef
444 HiLink factorSingletons Typedef
445 HiLink factorMixin Typedef
446 HiLink factorInstance Typedef
447 HiLink factorHook Typedef
448 HiLink factorMain Define
449 HiLink factorPostpone Define
450 HiLink factorHelp Define
451 HiLink factorDefer Define
452 HiLink factorEbnf Typedef
453 HiLink factorEditor Typedef
454 HiLink factorForget Define
455 HiLink factorAlien Define
456 HiLink factorSlot Define
457 HiLink factorIntersection Typedef
458 HiLink factorRegexp Constant
459 HiLink factorSlot Typedef
460 HiLink factorSlotDelims factorSlot
461 HiLink factorSlotName Identifier
462 HiLink factorSlotClass Type
463 HiLink factorSlotType factorSlotClass
464 HiLink factorSlotAttr Special
465 HiLink factorSlotAttrInitial factorSlotAttr
466 HiLink factorSlotAttrReadOnly factorSlotAttr
467 HiLink factorSlotsSyntaxDelims Keyword
468 HiLink factorStructSlotAttr factorSlotAttr
469 HiLink factorStructSlotAttrBits factorStructSlotAttr
470 HiLink factorPredicate Typedef
471 HiLink factorPredicateDelims factorTuple
472 HiLink factorTuple Typedef
473 HiLink factorTupleDelims factorTuple
474 HiLink factorTupleSlot factorSlot
475 HiLink factorTupleClass Identifier
476 HiLink factorTupleSlotDelims factorSlotDelims
477 HiLink factorTupleSlotName factorSlotName
478 HiLink factorTupleSlotClass factorSlotClass
479 HiLink factorUnion Typedef
480 HiLink factorStruct Typedef
481 HiLink factorStructDelims factorStruct
482 HiLink factorStructSlot factorSlot
483 HiLink factorStructSlotDelims factorSlotDelims
484 HiLink factorStructSlotName factorSlotName
485 HiLink factorStructSlotType factorSlotType
488 hi hlLevel0 ctermfg=red guifg=red1
489 hi hlLevel1 ctermfg=yellow guifg=orange1
490 hi hlLevel2 ctermfg=green guifg=yellow1
491 hi hlLevel3 ctermfg=cyan guifg=greenyellow
492 hi hlLevel4 ctermfg=magenta guifg=green1
493 hi hlLevel5 ctermfg=red guifg=springgreen1
494 hi hlLevel6 ctermfg=yellow guifg=cyan1
495 hi hlLevel7 ctermfg=green guifg=slateblue1
496 hi hlLevel8 ctermfg=cyan guifg=magenta1
497 hi hlLevel9 ctermfg=magenta guifg=purple1
499 hi hlLevel0 ctermfg=red guifg=red3
500 hi hlLevel1 ctermfg=darkyellow guifg=orangered3
501 hi hlLevel2 ctermfg=darkgreen guifg=orange2
502 hi hlLevel3 ctermfg=blue guifg=yellow3
503 hi hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
504 hi hlLevel5 ctermfg=red guifg=green4
505 hi hlLevel6 ctermfg=darkyellow guifg=paleturquoise3
506 hi hlLevel7 ctermfg=darkgreen guifg=deepskyblue4
507 hi hlLevel8 ctermfg=blue guifg=darkslateblue
508 hi hlLevel9 ctermfg=darkmagenta guifg=darkviolet
513 let b:current_syntax = 'factor'
515 " vim: set ts=4 ft=vim et sw=2 isk+=/,\\ :