3 " Maintainer: Alex Chapman <chapman.alex@gmail.com>
4 " Last Change: 2020 Jun 05
7 " Factor |syntax| file guide & conventions:
9 " Inside |:comment|s, words in |bars| contain |:help| keywords.
12 " Alignment columns should normally occur on multiples of 4.
13 " Align Vim syntax alternatives naturally. E.g.:
17 " Align |:syn-start|, |:syn-skip|, and |:syn-end| on their patterns.
18 " ":echo (col('.') - 1) % 4" is handy here.
20 " All syntax patterns (|:syn-pattern|) are "very magic" (|/\v|).
21 " Escape all literal [^0-9a-zA-Z_-!:;] characters in these patterns.
22 " (Not escaping [-!:;] characters risks forward-incompatibility,
23 " but fixes if an incompatibile Vim arises would be trivial,
24 " and Factor likes these characters.)
26 " Syntax groups ending in "Error" match errors via |:syn-priority|,
27 " and should normally |:hi-link| to "Error".
29 " Syntax groups named "{group-name}Trans" are |:syn-transparent|.
31 " |:syn-cluster|s named "{group-name}" mean to allow |:syn-contains| use of
32 " |:syn-priority|-based error-detection.
33 " This still applies to clusters named "{group-name}Trans".
35 " Syntax groups "{group-name}Skip" have the form:
36 " "syn match {group-name}Skip /\v%(\_\s+%(!>.*)?)*/ nextgroup={group-name} transparent contained"
37 " Specifying "nextgroup={group-name}Skip" 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 if exists('b:current_syntax')
50 " Factor is case sensitive.
53 " Make all of these characters part of a word (useful for skipping over words with w, e, and b)
54 let s:iskeyword = '!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255'
55 let s:set_iskeyword = has('patch-7.4.1142') ? 'syn iskeyword ' :
56 \ 'setlocal iskeyword='
57 execute s:set_iskeyword . s:iskeyword
59 syn match factorWord /\v<\S+>/ contains=@factorWord transparent display
60 syn cluster factorClusterNoComment contains=factorWord,@factorMultilineComment,@factorClusterValue,factorBoolean,factorBreakpoint,factorDeclaration,factorCallQuotation,factorExecute,factorCallNextMethod,@factorWordOps,factorAlien,factorSlot,factorTuple,factorErrorSyn,factorStruct
61 syn cluster factorCluster contains=@factorComment,@factorClusterNoComment
63 " A crash course on Factor's lexer:
65 " The "lexer" vocabulary parses lines (arrays of strings) into tokens.
66 " Tokens are non-space strings, effectively words.
67 " "[ f skip ] call( i seq -- n )" finds the next space, erroring on tabs.
68 " "t skip" finds the next non-space.
69 " The "lexer" class holds lex state.
70 " Lexer method "skip-word" advances to the next space (via "f skip"),
71 " while also counting leading double quotation marks as their own words.
72 " I.e., this advances to the end of the current token
73 " (if currently at a token, otherwise nothing changes).
74 " Method "skip-blank" advances to the next non-space (via "t skip"),
75 " while also skipping shebangs at the beginning of the first line.
76 " I.e., this advances to the start of the next token
77 " (if one is present, otherwise it advances to the line's end).
78 " "(parse-raw)" advances a lexer through an immediate token via "skip-word",
79 " and returns the (sub)token advanced through.
80 " Note that this will not advance a lexer at space,
81 " and an empty string will be returned.
82 " "next-line" advances a lexer to the start of the next line,
83 " adding an effectively empty line to the end (as an EOF state).
84 " "parse-raw" advances a lexer through the next token,
85 " first via alternating "skip-blank" & "next-line" if the line ended,
86 " then via "(parse-raw)",
87 " and returns it if found, otherwise (i.e. upon EOF) returning "f".
88 " Note that the lexer will be advanced to EOF if "f" is returned.
89 " Comments are (unprocessed) remainders of lines, after a "!" word.
90 " "parse-token" advances a lexer though the next token via "parse-raw",
91 " then returns it if found, otherwise returning "f".
92 " while also advancing through comments
93 " via mutual recursion with "skip-comment".
94 " "[ skip-comment ] call( lexer str -- str' )" tests if a token is "!",
95 " returning that token if so,
96 " otherwise first advancing a lexer to the next line via "next-line"
97 " (i.e. discarding the rest of the current line)
98 " and then advancing it via "parse-token" & returning that token,
99 " ensuring the return of "parse-token"'s desired non-comment token.
100 " The "lexer" dynamic variable holds the ambient lexer.
101 " "?scan-token" advances the ambient lexer through the next token
103 " and returns it if found, otherwise returning "f".
104 " "scan-token" advances the ambient lexer through the next token
106 " and returns it if found, otherwise throwing an exception.
107 " All other words in the "lexer" vocabulary read via "scan-token", if at all.
108 " So! To know when double quotes & exclamation marks aren't special,
109 " grep for "parse-raw". (Mostly. To be certain, grep for "lexer".)
111 syn cluster factorComment contains=factorComment
112 syn cluster factorCommentContents contains=factorTodo,@Spell
113 syn match factorTodo /\v(TODO|FIXME|XXX):=/ contained
115 syn cluster factorDefnContents contains=@factorCluster
117 syn region factorDefnDelims start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffect contained
118 syn region factorDefn start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ skip=/\v<!>/ matchgroup=factorDefnDelims end=/\v<;>/ contains=factorDefnDelims,@factorDefnContents
119 syn region factorMethod start=/\v<M::?>/ skip=/\v<!>/ matchgroup=factorDefnDelims end=/\v<;>/ contains=factorMethodDelims,@factorDefnContents
120 syn region factorMethodDelims start=/\v<M::?>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorStackEffect contained
121 syn region factorGeneric start=/\v<%(GENERIC|MATH|PRIMITIVE):>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffect
122 syn region factorGenericN start=/\v<GENERIC\#:>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/ contains=@factorComment nextgroup=factorStackEffect
124 syn region factorPDefn start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ skip=/\v<!>/ matchgroup=factorPDefnDelims end=/\v<;>/ contains=factorPDefnDelims,@factorDefnContents contained
125 syn region factorPDefnDelims start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffect contained
126 syn region factorPMethod start=/\v<M::?>/ skip=/\v<!>/ matchgroup=factorPDefnDelims end=/\v<;>/ contains=factorPMethodDelims,@factorDefnContents contained
127 syn region factorPMethodDelims start=/\v<M::?>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorStackEffect contained
128 syn region factorPGeneric start=/\v<%(GENERIC|MATH|PRIMITIVE):>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffect contained
129 syn region factorPGenericN start=/\v<GENERIC\#:>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/ contains=@factorComment nextgroup=factorStackEffect contained
131 syn region None matchgroup=factorPrivate start=/\v<\<PRIVATE>/ end=/\v<PRIVATE\>>/ contains=@factorDefnContents,factorPDefn,factorPMethod,factorPGeneric,factorPGenericN
133 syn cluster factorClusterValue contains=factorBreakpoint,factorBoolean,factorFrySpecifier,factorChar,@factorString,@factorNumber,factorBackslash,factorMBackslash,factorLiteral,factorLiteralBlock,@factorStackEffect,@factorQuotation,@factorArray
134 syn match factorClusterValueSkip /\v%(\_\s+%(!>.*)?)*/ nextgroup=@factorClusterValue transparent contained
136 syn keyword factorBoolean f t
137 syn keyword factorBreakpoint B
138 syn keyword factorFrySpecifier @ _ contained
139 syn keyword factorDeclaration delimiter deprecated final flushable foldable inline recursive
140 syn match factorCallQuotation /\vcall\V(\v/me=e-1 nextgroup=@factorStackEffect
141 syn match factorExecute /\vexecute\V(\v/me=e-1 nextgroup=@factorStackEffect
142 syn keyword factorCallNextMethod call-next-method
144 syn region factorChar start=/\v<CHAR:>/ end=/\v\S+>/
146 syn cluster factorString contains=factorString,factorTriString,factorPrefixedString
147 syn match factorEscape /\v\\([\\astnrbvf0e\"]|u\x{6}|u\{\S+}|x\x{2})/ contained display
148 syn region factorString matchgroup=factorStringDelims start=/\v<"/ skip=/\v\\"/ end=/\v"/ contains=factorEscape
149 syn region factorTriString matchgroup=factorTriStringDelims start=/\v<"""/ skip=/\v\\"/ end=/\v"""/ contains=factorEscape
150 syn region factorPrefixedString matchgroup=factorPrefixedStringDelims start=/\v<[^[:blank:]"]+">/ skip=/\v\\"/ end=/\v"/ contains=factorEscape
152 " Vocabulary: multiline
153 " This vocabulary reads the ambient lexer without "parse-raw".
154 syn cluster factorString add=factorMultilineString,factorHereDocString,factorPrefixedMultilineString
155 syn region factorMultilineString matchgroup=factorMultilineStringDelims start=/\v<\[\z(\={0,6})\[>/ end=/\v\]\z1\]/
156 syn region factorHereDoc matchgroup=factorMultilineStringDelims start=/\v<STRING:\s+\S+>/ end=/\v^;$/
157 syn region factorHereDocString matchgroup=factorMultilineStringDelims start=/\v<HEREDOC:\s+\z(.*)>/ end=/\v^\z1$/
158 syn region factorPrefixedMultilineString matchgroup=factorPrefixedMultilineStringDelims start=/\v<[^[\][:blank:]]+\[\z(\={0,6})\[>/ end=/\v\]\z1\]/
159 " These comments are normal syntax words, so no lexer privilege for them.
160 " (Hence, no "syn cluster factorComment" membership.)
161 syn cluster factorMultilineComment contains=factorMultilineComment,factorMultilineCComment
162 syn region factorMultilineComment matchgroup=factorMultilineCommentDelims start=/\v<!\[\z(\={0,6})\[>/ end=/\v\]\z1\]/ contains=@factorCommentContents keepend
163 syn region factorMultilineCComment matchgroup=factorMultilineCCommentDelims start=/\v<\/\*>/ end=/\v\*\// contains=@factorCommentContents keepend
165 syn cluster factorReal contains=factorInt,factorFloat,factorPosRatio,factorNegRatio,@factorBin,@factorHex,@factorOct,factorNan
166 syn cluster factorNumber contains=@factorReal,factorComplex
167 syn match factorInt /\v<[+-]=[0-9]%([0-9,]*[0-9])?%([eE]%([+-])?[0-9]+)?>/
168 syn match factorFloat /\v<[+-]=[0-9]%([0-9,]*[0-9])?%(\.%(%([0-9,]*[0-9]+)?%([eE]%([+-])?[0-9]%([0-9,]*[0-9])?)?)?)?>/
169 syn match factorPosRatio /\v<\+=[0-9]%([0-9,]*[0-9])?%(\+[0-9]%([0-9,]*[0-9]+)?)?\/-=[0-9]%([0-9,]*[0-9]+)?\.?>/
170 syn match factorNegRatio /\v<\-[0-9]%([0-9,]*[0-9])?%(\-[0-9]%([0-9,]*[0-9]+)?)?\/-=[0-9]%([0-9,]*[0-9]+)?\.?>/
171 syn region factorComplex start=/\v<C\{>/ end=/\v<\}>/ contains=@factorReal
172 syn cluster factorBin contains=factorBin
173 syn match factorBin /\v<[+-]=0b[01,]+>/
174 if !exists('g:factor_syn_no_error')
175 syn match factorBinError /\v<[+-]=0b[01,]*[^01 ]\S*>/
176 syn cluster factorBin add=factorBinError
178 syn cluster factorHexNoRadixTrans contains=factorHexNoRadixTrans
179 syn match factorHexNoRadixTrans /\v<[0-9a-fA-F]%([0-9a-fA-F,]*[0-9a-fA-F])?%(\.[0-9a-fA-F]%([0-9a-fA-F,]*[0-9a-fA-F])?)?%(p-=[0-9]%([0-9,]*[0-9])?)?>/ contained transparent
180 syn cluster factorHex contains=factorHex
181 syn match factorHex /\v<[+-]=0x[0-9a-fA-F]%([0-9a-fA-F,]*[0-9a-fA-F])?%(\.[0-9a-fA-F]%([0-9a-fA-F,]*[0-9a-fA-F])?)?%(p-=[0-9]%([0-9,]*[0-9])?)?>/
182 if !exists('g:factor_syn_no_error')
183 syn match factorHexNoRadixError /\v<%(,\S*|\S*,|[-0-9a-fA-Fp,]*[^-0-9a-fA-Fp, ]\S*)>/ contained
184 syn cluster factorHexNoRadixTrans add=factorHexNoRadixError
185 syn match factorHexError /\v<[+-]=0x%(,\S*|\S*,|[-0-9a-fA-Fp,]*[^-0-9a-fA-Fp, ]\S*)>/
186 syn cluster factorHex add=factorHexError
188 syn cluster factorOct contains=factorOct
189 syn match factorOct /\v<[+-]=0o[0-7,]+>/
190 if !exists('g:factor_syn_no_error')
191 syn match factorOctError /\v<[+-]=0o%(,\S*|\S*,|[0-7,]*[^0-7, ]\S*)>/
192 syn cluster factorOct add=factorOctError
194 syn match factorOct /\v<[+-]=0o[0-7,]+>/
195 syn region factorNan matchgroup=factorNan start=/\v<NAN:>/ matchgroup=NONE end=/\v<\S+>/ contains=@factorComment contains=@factorHexNoRadixTrans
197 syn region factorBackslash start=/\v<\\>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
198 syn region factorMBackslash start=/\v<M\\>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment
199 syn region factorLiteral start=/\v<\$>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
200 syn region factorLiteralBlock start=/\v<\$\[>/ end=/\v<\]>/ contains=@factorComment
202 syn region factorIn start=/\v<IN:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
203 syn region factorUse start=/\v<USE:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
204 syn region factorUnuse start=/\v<UNUSE:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
206 syn region factorUsing start=/\v<USING:>/ end=/\v<;>/ contains=@factorComment
207 syn region factorQualified start=/\v<QUALIFIED:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
208 syn region factorQualifiedWith start=/\v<QUALIFIED-WITH:>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment
209 syn region factorExclude start=/\v<EXCLUDE:>/ end=/\v<;>/ contains=@factorComment
210 syn region factorFrom start=/\v<FROM:>/ end=/\v<;>/ contains=@factorComment
211 syn region factorRename start=/\v<RENAME:>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+%(\_\s+%(!>.*)?)+\=\>%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment
212 syn region factorSingletons start=/\v<SINGLETONS:>/ end=/\v<;>/ contains=@factorComment
213 syn region factorSymbol start=/\v<SYMBOL:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
214 syn region factorSymbols start=/\v<SYMBOLS:>/ end=/\v<;>/ contains=@factorComment
215 syn region factorConstructor2 start=/\v<CONSTRUCTOR:?/ end=/\v<;>/ contains=@factorComment
216 syn region factorIntersection start=/\v<INTERSECTION:>/ end=/\v<;>/ contains=@factorComment
217 syn cluster factorSlotAttr contains=factorSlotAttrInitial contains=factorSlotAttrReadOnly
218 syn cluster factorTupleSlotAttr contains=@factorSlotAttr
219 syn match factorTupleSlotName /\v<\S+>/ nextgroup=factorTupleSlotClassSkip contained
220 syn match factorTupleSlotNameSkip /\v%(\_\s+%(!>.*)?)*/ nextgroup=factorTupleSlotName transparent contained
221 syn match factorTupleSlotClass /\v<\S+>/ contained
222 " a class is optional, so let an attribute take priority if present
223 syn match factorTupleSlotClassSkip /\v%(\_\s+%(!>.*)?)*/ nextgroup=factorTupleSlotClass,@factorTupleSlotAttr transparent contained
224 syn region factorTupleSlot matchgroup=factorTupleSlotDelims start=/\v<\{>/ end=/\v<\}>/ contains=@factorComment,factorTupleSlotName,@factorTupleSlotAttr contained
225 syn region factorTuple matchgroup=factorTupleDelims start=/\v<%(TUPLE|BUILTIN):>/ end=/\v<;>/ contains=@factorComment,factorTupleSlotName,factorTupleSlot
226 " Abnormally named because factor*Error is reserved for syntax errors.
227 syn region factorErrorSyn start=/\v<ERROR:>/ end=/\v<;>/ contains=@factorComment
228 syn region factorUnion start=/\v<UNION:>/ end=/\v<;>/ contains=@factorComment
229 syn cluster factorStructSlotAttr contains=@factorSlotAttr,factorStructSlotAttrBits
230 syn match factorStructSlotName /\v<\S+>/ nextgroup=factorStructSlotTypeSkip contained
231 syn match factorStructSlotNameSkip /\v%(\_\s+%(!>.*)?)*/ nextgroup=factorStructSlotName contained transparent
232 syn match factorStructSlotType /\v<\S+>/ contained
233 syn match factorStructSlotTypeSkip /\v%(\_\s+%(!>.*)?)*/ nextgroup=factorStructSlotType contained transparent
234 syn region factorStructSlot matchgroup=factorStructSlotDelims start=/\v<\{>/ end=/\v<\}>/ contains=@factorComment,factorStructSlotName,@factorStructSlotAttr contained
235 syn region factorStruct matchgroup=factorStructDelims start=/\v<%(UNION-STRUCT|STRUCT):>/ end=/\v<;>/ contains=@factorComment,factorStructSlot
237 syn match factorSlotAttrReadOnly /\v<read-only>/ contained
238 syn match factorSlotAttrInitial /\v<initial:>%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=factorWord,@factorClusterValue contained
239 syn match factorStructSlotAttrBits /\v<bits:>%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=factorWord,@factorReal contained
241 syn region factorConstant start=/\v<CONSTANT:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
242 syn region factorAlias start=/\v<ALIAS:>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment
243 syn region factorSingleton start=/\v<SINGLETON:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
244 syn region factorPostpone start=/\v<POSTPONE:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
245 syn region factorDefer start=/\v<DEFER:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
246 syn region factorForget start=/\v<FORGET:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
247 syn region factorMixin start=/\v<MIXIN:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
248 syn region factorInstance start=/\v<INSTANCE:>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment
249 syn region factorHook start=/\v<HOOK:>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorStackEffect
250 syn region factorMain start=/\v<MAIN:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
251 syn region factorConstructor start=/\v<C:>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment
252 syn region factorAlien matchgroup=factorAlien start=/\v<ALIEN:>/ matchgroup=NONE skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment,@factorHexNoRadixTrans
253 syn region factorSlot start=/\v<SLOT:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
255 syn cluster factorWordOps contains=factorConstant,factorAlias,factorSingleton,factorSingletons,factorSymbol,factorSymbols,factorPostpone,factorDefer,factorForget,factorMixin,factorInstance,factorHook,factorMain,factorConstructor
271 syn cluster factorStackEffectContents contains=@factorComment,factorStackEffectDelims,factorStackEffectVar,factorStackEffectType,factorStackEffectRowVar
272 syn cluster factorStackEffect contains=factorStackEffect
273 " Erroring on stack effects without a "--" separator would be nice.
274 " Unfortunately, that sort of vacuous detection is above Vim's pay-grade,
275 " especially when stack effects can be nested arbitrarily via types.
276 syn region factorStackEffect matchgroup=factorStackEffectDelims start=/\v\V(\v>/ end=/\v<\V)\v>/ contains=@factorStackEffectContents
277 syn match factorStackEffectVar /\v<\S+>/ contained
278 " Note that ":!" parses to the "!" word and doesn't lex as a comment.
279 " Also, even though we take any value, the leading ":" breaking the word
280 " boundary means a lot of our nicer syntax patterns don't match on
281 " "factorStackEffectType".
282 " syn cluster factorStackEffectType contains=factorWord,@factorStackEffect
283 syn cluster factorStackEffectType contains=@factorClusterValue
284 syn region factorStackEffectVar matchgroup=factorStackEffectVar start=/\v<\S+:>/ matchgroup=NONE end=/\v%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=@factorStackEffectType transparent contained
285 syn match factorStackEffectType /\v<:/ contained nextgroup=@factorStackEffectType
286 syn match factorStackEffectRowVar /\v<\.\.\S+>/ contained
287 syn region factorStackEffectRowVar matchgroup=factorStackEffectRowVar start=/\v<\.\.\S+:>/ matchgroup=NONE end=/\v%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=@factorStackEffectType transparent contained
288 syn match factorStackEffectDelims /\v<-->/ contained
289 if !exists('g:factor_syn_no_error')
290 syn cluster factorStackEffectContents add=factorStackEffectError
291 syn keyword factorStackEffectError ( contained
294 " adapted from lisp.vim
295 if exists('g:factor_syn_no_rainbow')
296 syn cluster factorQuotation contains=factorQuotation
297 syn region factorQuotation matchgroup=factorDelimiter start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=ALL
299 syn cluster factorQuotation contains=factorQuotation0
300 syn region factorQuotation0 matchgroup=hlLevel0 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation1,factorArray1
301 syn region factorQuotation1 contained matchgroup=hlLevel1 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation2,factorArray2
302 syn region factorQuotation2 contained matchgroup=hlLevel2 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation3,factorArray3
303 syn region factorQuotation3 contained matchgroup=hlLevel3 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation4,factorArray4
304 syn region factorQuotation4 contained matchgroup=hlLevel4 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation5,factorArray5
305 syn region factorQuotation5 contained matchgroup=hlLevel5 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation6,factorArray6
306 syn region factorQuotation6 contained matchgroup=hlLevel6 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation7,factorArray7
307 syn region factorQuotation7 contained matchgroup=hlLevel7 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation8,factorArray8
308 syn region factorQuotation8 contained matchgroup=hlLevel8 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation9,factorArray9
309 syn region factorQuotation9 contained matchgroup=hlLevel9 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation0,factorArray0
312 if exists('g:factor_syn_no_rainbow')
313 syn cluster factorArray contains=factorArray
314 syn region factorArray matchgroup=factorDelimiter start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=ALL
316 syn cluster factorArray contains=factorArray0
317 syn region factorArray0 matchgroup=hlLevel0 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray1,factorQuotation1
318 syn region factorArray1 contained matchgroup=hlLevel1 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray2,factorQuotation2
319 syn region factorArray2 contained matchgroup=hlLevel2 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray3,factorQuotation3
320 syn region factorArray3 contained matchgroup=hlLevel3 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray4,factorQuotation4
321 syn region factorArray4 contained matchgroup=hlLevel4 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray5,factorQuotation5
322 syn region factorArray5 contained matchgroup=hlLevel5 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray6,factorQuotation6
323 syn region factorArray6 contained matchgroup=hlLevel6 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray7,factorQuotation7
324 syn region factorArray7 contained matchgroup=hlLevel7 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray8,factorQuotation8
325 syn region factorArray8 contained matchgroup=hlLevel8 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray9,factorQuotation9
326 syn region factorArray9 contained matchgroup=hlLevel9 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray0,factorQuotation0
329 if !exists('g:factor_syn_no_error')
330 syn match factorBracketError /\v<\]>/
331 syn match factorBracketError /\v<\}>/
334 function! FactorSynDefineComment() abort
335 syn region factorComment start=/\v<!>/ end=/\v$/ keepend oneline contains=@factorCommentContents
336 syn match factorShebang /\v%^\#!.*$/ display
337 if !exists('g:factor_syn_no_error')
338 syn match factorShebangError /\v%^\#!\S+/
342 if !exists('g:factor_syn_no_comment')
343 call FactorSynDefineComment()
346 " Syntax that bypasses comment lexing.
347 function! FactorSynDefineAfterComment() abort
350 if !exists('g:factor_syn_no_after_comment')
351 call FactorSynDefineAfterComment()
356 if !exists('g:factor_syn_no_init')
357 command -nargs=+ -bar HiLink hi def link <args>
359 if !exists('g:factor_syn_no_error')
360 HiLink factorShebangError Error
361 HiLink factorBracketError Error
362 HiLink factorBinError Error
363 HiLink factorHexNoRadixError Error
364 HiLink factorHexError Error
365 HiLink factorOctError Error
366 HiLink factorStackEffectError Error
369 HiLink factorComment Comment
370 HiLink factorMultilineComment factorComment
371 HiLink factorMultilineCComment factorComment
372 HiLink factorShebang PreProc
373 HiLink factorStackEffect Type
374 HiLink factorStackEffectDelims Delimiter
375 HiLink factorStackEffectVar Identifier
376 HiLink factorStackEffectRowVar factorStackEffectVar
377 HiLink factorStackEffectType Type
378 HiLink factorTodo Todo
379 HiLink factorInclude Include
380 HiLink factorWord Keyword
381 HiLink factorCallQuotation Keyword
382 HiLink factorExecute Keyword
383 HiLink factorCallNextMethod Keyword
384 HiLink factorOperator Operator
385 HiLink factorFrySpecifier Operator
386 HiLink factorBoolean Boolean
387 HiLink factorBreakpoint Debug
388 HiLink factorDefnDelims Typedef
389 HiLink factorMethodDelims Typedef
390 HiLink factorGeneric Typedef
391 HiLink factorGenericN Typedef
392 HiLink factorConstructor Typedef
393 HiLink factorConstructor2 Typedef
394 HiLink factorPrivate Special
395 HiLink factorPDefnDelims Special
396 HiLink factorPMethodDelims Special
397 HiLink factorPGeneric Special
398 HiLink factorPGenericN Special
399 HiLink factorEscape SpecialChar
400 HiLink factorString String
401 HiLink factorStringDelims factorString
402 HiLink factorTriString factorString
403 HiLink factorTriStringDelims factorTriString
404 HiLink factorPrefixedString factorString
405 HiLink factorPrefixedStringDelims factorPrefixedString
406 HiLink factorMultilineString factorString
407 HiLink factorMultilineStringDelims Typedef
408 HiLink factorHereDocString factorMultilineString
409 HiLink factorHereDocStringDelims factorMultilineStringDelims
410 HiLink factorPrefixedMultilineString factorString
411 HiLink factorPrefixedMultilineStringDelims factorMultilineStringDelims
412 HiLink factorComplex Number
413 HiLink factorPosRatio Number
414 HiLink factorNegRatio Number
415 HiLink factorBin Number
416 HiLink factorHex Number
417 HiLink factorNan Number
418 HiLink factorOct Number
419 HiLink factorFloat Float
420 HiLink factorInt Number
421 HiLink factorUsing Include
422 HiLink factorQualified Include
423 HiLink factorQualifiedWith Include
424 HiLink factorExclude Include
425 HiLink factorFrom Include
426 HiLink factorRename Include
427 HiLink factorUse Include
428 HiLink factorUnuse Include
429 HiLink factorIn Define
430 HiLink factorChar Character
431 HiLink factorDelimiter Delimiter
432 HiLink factorBackslash Special
433 HiLink factorMBackslash Special
434 HiLink factorLiteral Special
435 HiLink factorLiteralBlock Special
436 HiLink factorDeclaration Typedef
437 HiLink factorSymbol Define
438 HiLink factorSymbols Define
439 HiLink factorConstant Define
440 HiLink factorAlias Define
441 HiLink factorSingleton Define
442 HiLink factorSingletons Define
443 HiLink factorMixin Typedef
444 HiLink factorInstance Typedef
445 HiLink factorHook Typedef
446 HiLink factorMain Define
447 HiLink factorPostpone Define
448 HiLink factorDefer Define
449 HiLink factorForget Define
450 HiLink factorAlien Define
451 HiLink factorSlot Define
452 HiLink factorIntersection Typedef
453 HiLink factorSlot Typedef
454 HiLink factorSlotDelims factorSlot
455 HiLink factorSlotName Identifier
456 HiLink factorSlotClass Type
457 HiLink factorSlotType factorSlotClass
458 HiLink factorSlotAttr Special
459 HiLink factorSlotAttrInitial factorSlotAttr
460 HiLink factorSlotAttrReadOnly factorSlotAttr
461 HiLink factorStructSlotAttr factorSlotAttr
462 HiLink factorStructSlotAttrBits factorStructSlotAttr
463 HiLink factorTuple Typedef
464 HiLink factorTupleDelims factorTuple
465 HiLink factorTupleSlot factorSlot
466 HiLink factorTupleSlotDelims factorSlotDelims
467 HiLink factorTupleSlotName factorSlotName
468 HiLink factorTupleSlotClass factorSlotClass
469 HiLink factorErrorSyn Typedef
470 HiLink factorUnion Typedef
471 HiLink factorStruct Typedef
472 HiLink factorStructDelims factorStruct
473 HiLink factorStructSlot factorSlot
474 HiLink factorStructSlotDelims factorSlotDelims
475 HiLink factorStructSlotName factorSlotName
476 HiLink factorStructSlotType factorSlotType
479 hi hlLevel0 ctermfg=red guifg=red1
480 hi hlLevel1 ctermfg=yellow guifg=orange1
481 hi hlLevel2 ctermfg=green guifg=yellow1
482 hi hlLevel3 ctermfg=cyan guifg=greenyellow
483 hi hlLevel4 ctermfg=magenta guifg=green1
484 hi hlLevel5 ctermfg=red guifg=springgreen1
485 hi hlLevel6 ctermfg=yellow guifg=cyan1
486 hi hlLevel7 ctermfg=green guifg=slateblue1
487 hi hlLevel8 ctermfg=cyan guifg=magenta1
488 hi hlLevel9 ctermfg=magenta guifg=purple1
490 hi hlLevel0 ctermfg=red guifg=red3
491 hi hlLevel1 ctermfg=darkyellow guifg=orangered3
492 hi hlLevel2 ctermfg=darkgreen guifg=orange2
493 hi hlLevel3 ctermfg=blue guifg=yellow3
494 hi hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
495 hi hlLevel5 ctermfg=red guifg=green4
496 hi hlLevel6 ctermfg=darkyellow guifg=paleturquoise3
497 hi hlLevel7 ctermfg=darkgreen guifg=deepskyblue4
498 hi hlLevel8 ctermfg=blue guifg=darkslateblue
499 hi hlLevel9 ctermfg=darkmagenta guifg=darkviolet
504 let b:current_syntax = 'factor'
506 " vim: set ft=vim et sw=2 isk+=/,\\ :