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=factorStackEffectSkip 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=factorStackEffectSkip contained
121 syn region factorGeneric start=/\v<%(GENERIC|MATH|PRIMITIVE):>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip
122 syn region factorGenericN start=/\v<GENERIC\#:>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/ contains=@factorComment nextgroup=factorStackEffectSkip
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=factorStackEffectSkip 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=factorStackEffectSkip contained
128 syn region factorPGeneric start=/\v<%(GENERIC|MATH|PRIMITIVE):>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip contained
129 syn region factorPGenericN start=/\v<GENERIC\#:>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/ contains=@factorComment nextgroup=factorStackEffectSkip 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,@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,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=factorStackEffectSkip
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 if !exists('g:factor_syn_no_error')
272 syn match factorStackEffectRequired /\v<\V(\@!\v\S+>/ contained
274 syn cluster factorStackEffectContents contains=@factorComment,factorStackEffectDelims,factorStackEffectVar,factorStackEffectType,factorStackEffectRowVar
275 syn cluster factorStackEffect contains=factorStackEffect
276 " Erroring on stack effects without a "--" separator would be nice.
277 " Unfortunately, that sort of vacuous detection is above Vim's pay-grade,
278 " especially when stack effects can be nested arbitrarily via types.
279 syn match factorStackEffectSkip /\v%(\_\s+%(!>.*)?)*/ nextgroup=factorStackEffectRequired,@factorStackEffect transparent contained
280 syn region factorStackEffect matchgroup=factorStackEffectDelims start=/\v\V(\v>/ end=/\v<\V)\v>/ contains=@factorStackEffectContents
281 syn match factorStackEffectVar /\v<\S+>/ contained
282 " Note that ":!" parses to the "!" word and doesn't lex as a comment.
283 " Also, even though we take any value, the leading ":" breaking the word
284 " boundary means a lot of our nicer syntax patterns don't match on
285 " "factorStackEffectType".
286 " syn cluster factorStackEffectType contains=factorWord,@factorStackEffect
287 syn cluster factorStackEffectType contains=@factorClusterValue
288 syn region factorStackEffectVar matchgroup=factorStackEffectVar start=/\v<\S+:>/ matchgroup=NONE end=/\v%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=@factorStackEffectType transparent contained
289 syn match factorStackEffectType /\v<:/ contained nextgroup=@factorStackEffectType
290 syn match factorStackEffectRowVar /\v<\.\.\S+>/ contained
291 syn region factorStackEffectRowVar matchgroup=factorStackEffectRowVar start=/\v<\.\.\S+:>/ matchgroup=NONE end=/\v%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=@factorStackEffectType transparent contained
292 syn match factorStackEffectDelims /\v<-->/ contained
293 if !exists('g:factor_syn_no_error')
294 syn cluster factorStackEffectContents add=factorStackEffectError
295 syn keyword factorStackEffectError ( contained
298 " adapted from lisp.vim
299 if exists('g:factor_syn_no_rainbow')
300 syn cluster factorQuotation contains=factorQuotation
301 syn region factorQuotation matchgroup=factorDelimiter start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=ALL
303 syn cluster factorQuotation contains=factorQuotation0
304 syn region factorQuotation0 matchgroup=hlLevel0 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation1,factorArray1
305 syn region factorQuotation1 contained matchgroup=hlLevel1 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation2,factorArray2
306 syn region factorQuotation2 contained matchgroup=hlLevel2 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation3,factorArray3
307 syn region factorQuotation3 contained matchgroup=hlLevel3 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation4,factorArray4
308 syn region factorQuotation4 contained matchgroup=hlLevel4 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation5,factorArray5
309 syn region factorQuotation5 contained matchgroup=hlLevel5 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation6,factorArray6
310 syn region factorQuotation6 contained matchgroup=hlLevel6 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation7,factorArray7
311 syn region factorQuotation7 contained matchgroup=hlLevel7 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation8,factorArray8
312 syn region factorQuotation8 contained matchgroup=hlLevel8 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation9,factorArray9
313 syn region factorQuotation9 contained matchgroup=hlLevel9 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation0,factorArray0
316 if exists('g:factor_syn_no_rainbow')
317 syn cluster factorArray contains=factorArray
318 syn region factorArray matchgroup=factorDelimiter start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=ALL
320 syn cluster factorArray contains=factorArray0
321 syn region factorArray0 matchgroup=hlLevel0 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray1,factorQuotation1
322 syn region factorArray1 contained matchgroup=hlLevel1 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray2,factorQuotation2
323 syn region factorArray2 contained matchgroup=hlLevel2 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray3,factorQuotation3
324 syn region factorArray3 contained matchgroup=hlLevel3 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray4,factorQuotation4
325 syn region factorArray4 contained matchgroup=hlLevel4 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray5,factorQuotation5
326 syn region factorArray5 contained matchgroup=hlLevel5 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray6,factorQuotation6
327 syn region factorArray6 contained matchgroup=hlLevel6 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray7,factorQuotation7
328 syn region factorArray7 contained matchgroup=hlLevel7 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray8,factorQuotation8
329 syn region factorArray8 contained matchgroup=hlLevel8 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray9,factorQuotation9
330 syn region factorArray9 contained matchgroup=hlLevel9 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray0,factorQuotation0
333 if !exists('g:factor_syn_no_error')
334 syn match factorBracketError /\v<\]>/
335 syn match factorBracketError /\v<\}>/
338 function! FactorSynDefineComment() abort
339 syn region factorComment start=/\v<!>/ end=/\v$/ keepend oneline contains=@factorCommentContents
340 syn match factorShebang /\v%^\#!.*$/ display
341 if !exists('g:factor_syn_no_error')
342 syn match factorShebangError /\v%^\#!\S+/
346 if !exists('g:factor_syn_no_comment')
347 call FactorSynDefineComment()
350 " Syntax that bypasses comment lexing.
351 function! FactorSynDefineAfterComment() abort
354 if !exists('g:factor_syn_no_after_comment')
355 call FactorSynDefineAfterComment()
360 if !exists('g:factor_syn_no_init')
361 command -nargs=+ -bar HiLink hi def link <args>
363 if !exists('g:factor_syn_no_error')
364 HiLink factorShebangError Error
365 HiLink factorBracketError Error
366 HiLink factorBinError Error
367 HiLink factorHexNoRadixError Error
368 HiLink factorHexError Error
369 HiLink factorOctError Error
370 HiLink factorStackEffectRequired Error
371 HiLink factorStackEffectError Error
374 HiLink factorComment Comment
375 HiLink factorMultilineComment factorComment
376 HiLink factorMultilineCComment factorComment
377 HiLink factorShebang PreProc
378 HiLink factorStackEffect Type
379 HiLink factorStackEffectDelims Delimiter
380 HiLink factorStackEffectVar Identifier
381 HiLink factorStackEffectRowVar factorStackEffectVar
382 HiLink factorStackEffectType Type
383 HiLink factorTodo Todo
384 HiLink factorInclude Include
385 HiLink factorWord Keyword
386 HiLink factorCallQuotation Keyword
387 HiLink factorExecute Keyword
388 HiLink factorCallNextMethod Keyword
389 HiLink factorOperator Operator
390 HiLink factorFrySpecifier Operator
391 HiLink factorBoolean Boolean
392 HiLink factorBreakpoint Debug
393 HiLink factorDefnDelims Typedef
394 HiLink factorMethodDelims Typedef
395 HiLink factorGeneric Typedef
396 HiLink factorGenericN Typedef
397 HiLink factorConstructor Typedef
398 HiLink factorConstructor2 Typedef
399 HiLink factorPrivate Special
400 HiLink factorPDefnDelims Special
401 HiLink factorPMethodDelims Special
402 HiLink factorPGenericDelims Special
403 HiLink factorPGenericNDelims Special
404 HiLink factorEscape SpecialChar
405 HiLink factorString String
406 HiLink factorStringDelims factorString
407 HiLink factorTriString factorString
408 HiLink factorTriStringDelims factorTriString
409 HiLink factorPrefixedString factorString
410 HiLink factorPrefixedStringDelims factorPrefixedString
411 HiLink factorMultilineString factorString
412 HiLink factorMultilineStringDelims Typedef
413 HiLink factorHereDocString factorMultilineString
414 HiLink factorHereDocStringDelims factorMultilineStringDelims
415 HiLink factorPrefixedMultilineString factorString
416 HiLink factorPrefixedMultilineStringDelims factorMultilineStringDelims
417 HiLink factorComplex Number
418 HiLink factorPosRatio Number
419 HiLink factorNegRatio Number
420 HiLink factorBin Number
421 HiLink factorHex Number
422 HiLink factorNan Number
423 HiLink factorOct Number
424 HiLink factorFloat Float
425 HiLink factorInt Number
426 HiLink factorUsing Include
427 HiLink factorQualified Include
428 HiLink factorQualifiedWith Include
429 HiLink factorExclude Include
430 HiLink factorFrom Include
431 HiLink factorRename Include
432 HiLink factorUse Include
433 HiLink factorUnuse Include
434 HiLink factorIn Define
435 HiLink factorChar Character
436 HiLink factorDelimiter Delimiter
437 HiLink factorBackslash Special
438 HiLink factorMBackslash Special
439 HiLink factorLiteral Special
440 HiLink factorLiteralBlock Special
441 HiLink factorDeclaration Typedef
442 HiLink factorSymbol Define
443 HiLink factorSymbols Define
444 HiLink factorConstant Define
445 HiLink factorAlias Define
446 HiLink factorSingleton Define
447 HiLink factorSingletons Define
448 HiLink factorMixin Typedef
449 HiLink factorInstance Typedef
450 HiLink factorHook Typedef
451 HiLink factorMain Define
452 HiLink factorPostpone Define
453 HiLink factorDefer Define
454 HiLink factorForget Define
455 HiLink factorAlien Define
456 HiLink factorSlot Define
457 HiLink factorIntersection Typedef
458 HiLink factorSlot Typedef
459 HiLink factorSlotDelims factorSlot
460 HiLink factorSlotName Identifier
461 HiLink factorSlotClass Type
462 HiLink factorSlotType factorSlotClass
463 HiLink factorSlotAttr Special
464 HiLink factorSlotAttrInitial factorSlotAttr
465 HiLink factorSlotAttrReadOnly factorSlotAttr
466 HiLink factorStructSlotAttr factorSlotAttr
467 HiLink factorStructSlotAttrBits factorStructSlotAttr
468 HiLink factorTuple Typedef
469 HiLink factorTupleDelims factorTuple
470 HiLink factorTupleSlot factorSlot
471 HiLink factorTupleSlotDelims factorSlotDelims
472 HiLink factorTupleSlotName factorSlotName
473 HiLink factorTupleSlotClass factorSlotClass
474 HiLink factorErrorSyn Typedef
475 HiLink factorUnion Typedef
476 HiLink factorStruct Typedef
477 HiLink factorStructDelims factorStruct
478 HiLink factorStructSlot factorSlot
479 HiLink factorStructSlotDelims factorSlotDelims
480 HiLink factorStructSlotName factorSlotName
481 HiLink factorStructSlotType factorSlotType
484 hi hlLevel0 ctermfg=red guifg=red1
485 hi hlLevel1 ctermfg=yellow guifg=orange1
486 hi hlLevel2 ctermfg=green guifg=yellow1
487 hi hlLevel3 ctermfg=cyan guifg=greenyellow
488 hi hlLevel4 ctermfg=magenta guifg=green1
489 hi hlLevel5 ctermfg=red guifg=springgreen1
490 hi hlLevel6 ctermfg=yellow guifg=cyan1
491 hi hlLevel7 ctermfg=green guifg=slateblue1
492 hi hlLevel8 ctermfg=cyan guifg=magenta1
493 hi hlLevel9 ctermfg=magenta guifg=purple1
495 hi hlLevel0 ctermfg=red guifg=red3
496 hi hlLevel1 ctermfg=darkyellow guifg=orangered3
497 hi hlLevel2 ctermfg=darkgreen guifg=orange2
498 hi hlLevel3 ctermfg=blue guifg=yellow3
499 hi hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
500 hi hlLevel5 ctermfg=red guifg=green4
501 hi hlLevel6 ctermfg=darkyellow guifg=paleturquoise3
502 hi hlLevel7 ctermfg=darkgreen guifg=deepskyblue4
503 hi hlLevel8 ctermfg=blue guifg=darkslateblue
504 hi hlLevel9 ctermfg=darkmagenta guifg=darkviolet
509 let b:current_syntax = 'factor'
511 " vim: set ft=vim et sw=2 isk+=/,\\ :