]> gitweb.factorcode.org Git - factor.git/blob - misc/vim/syntax/factor.vim
Update actions, because Node.js 16 actions are deprecated, to Node.js 20
[factor.git] / misc / vim / syntax / factor.vim
1 " Vim syntax file
2 " Language: Factor
3 " Maintainer: Alex Chapman <chapman.alex@gmail.com>
4 " Last Change: 2020 Sep 30
5 " Minimum Version: 600
6
7 " Factor |syntax| file guide & conventions:
8 "
9 " Inside |:comment|s, words in |bars| contain |:help| keywords.
10 "   |K| looks these up.
11 "
12 " Alignment columns should normally occur on multiples of 4.
13 " Align Vim syntax alternatives naturally. E.g.:
14 "   "syn match   ..."
15 "   "syn cluster ..."
16 "   "syn region  ..."
17 " Align |:syn-start|, |:syn-skip|, and |:syn-end| on their patterns.
18 " ":echo (col('.') - 1) % 4" is handy here.
19 "
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.)
25 "
26 " Syntax groups ending in "Error" match errors via |:syn-priority|,
27 "   and should normally |:hi-link| to "Error".
28 "
29 " Syntax groups named "{group-name}Trans" are |:syn-transparent|.
30 "
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".
34 "
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}".
41 "
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.
45 "
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<...>":
49 "     "hi": syntax group
50 "     "trans": transparent syntax group (if not applicable, same as "hi")
51 "     "lo": highlight group
52
53 if exists('b:current_syntax')
54   finish
55 endif
56
57 " Factor is case sensitive.
58 syn case match
59
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
63
64 " Almost any byte in Factor can be a part of a word
65 syn iskeyword 33-126,128-255
66
67 " A crash course on Factor's lexer:
68 "
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
104 "     via "parse-token",
105 "   and returns it if found, otherwise returning "f".
106 " "scan-token" advances the ambient lexer through the next token
107 "     via "?scan-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".)
112
113 syn match   factorShebang           /\v%^\#!.*$/ display
114
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
119
120 syn match   factorInit              /\v<%(STARTUP-HOOK|SHUTDOWN-HOOK):>/     display
121
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
125
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
136
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
147
148 syn region  factorPrivate           start=/\v<\<PRIVATE>/ end=/\v<PRIVATE\>>/ contains=@factorCluster,factorPDefn,factorPDeclDelims skipempty keepend
149
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
157
158 syn region  factorChar              start=/\v<CHAR:>/  end=/\v\S+>/
159 syn region  factorColor             start=/\v<COLOR:>/ end=/\v\S+>/
160
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\]/
167
168 syn region  factorNamedString       matchgroup=factorNamedStringDelims   start=/\v<STRING:\s+\S+$>/   end=/\v^<;>$/  contains=factorEscape
169
170 syn region  factorMultilineComment  start=/\v<\/\*>/              end=/\v\*\//       contains=@factorCommentContents keepend
171 syn region  factorMultilineComment  start=/\v<!\[\z(\=*)\[/       end=/\v\]\z1\]/    contains=@factorCommentContents keepend
172
173 syn region  factorRegexp            start=/\v<%(R\/\s)/  skip=/\v%(\\\/)/  end=/\v%(\/\S*)>/
174
175 syn cluster factorReal              contains=@factorInteger,@factorFloat,@factorRatio,@factorBin,@factorOct,@factorHex,factorNan
176 syn cluster factorNumber            contains=@factorReal,factorComplex
177
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|,|_)*>/
182 endif
183 syn match   factorInteger           /\v<[+-]=\d%(\d|,|_)*,@1<!>/
184
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|,|_)*)?)>/
189 endif
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<!)?)>/
191
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|,|_)*)?)>/
196 endif
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<!>/
198
199 syn region  factorComplex           start=/\v<C\{>/   skip=/\v<!>.*/ end=/\v<\}>/    contains=@factorComment,@factorReal
200
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|,|_)*)?)>/
205 endif
206 syn match   factorBin               /\v<[+-]=0[bB]%([01][01,_]*,@1<!%(\.%([01][01,_]*,@1<!)?)?|\.[01][01,_]*,@1<!)%([pP][+-]=\d%(\d|,|_)*,@1<!)?>/
207
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|,|_)*)?)>/
212 endif
213 syn match   factorOct               /\v<[+-]=0[oO]%(\o%(\o|,|_)*,@1<!%(\.%(\o%(\o|,|_)*,@1<!)?)?|\.\o%(\o|,|_)*,@1<!)%([pP][+-]=\d%(\d|,|_)*,@1<!)?>/
214
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
222 endif
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
225
226 syn region  factorNan matchgroup=factorNan    start=/\v<NAN:>/ matchgroup=NONE skip=/\v<!>.*/   end=/\v<\S+>/   contains=@factorComment,@factorHexNoRadix keepend
227
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
231
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
235
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
247
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
256
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
284
285 syn cluster factorWordOps   contains=factorConstant,factorAlias,factorSingleton,factorSingletons,factorSymbol,factorSymbols,factorPostpone,factorDefer,factorForget,factorMixin,factorInstance,factorHook,factorMain
286
287 " C-ENUM:
288 " FUNCTION:
289 " TYPEDEF:
290 " LIBRARY:
291
292 if !exists('g:factor_syn_no_error')
293   syn match   factorEffectRequired /\v<\V(\@!\v\S+>/    contained
294 endif
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
320 endif
321
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
326 else
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
338 endif
339
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
343 else
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
355 endif
356
357 syn region  factorSlotsSyntax   matchgroup=factorSlotsSyntaxDelims  start=/\v<%(get|set|set-slots|slots)\[>/    end=/\v<\]>/
358
359 if !exists('g:factor_syn_no_error')
360   syn match   factorBracketError    /\v<\]>/
361   syn match   factorBracketError    /\v<\}>/
362 endif
363
364 syn sync lines=100
365
366 if !exists('g:factor_syn_no_init')
367   command -nargs=+ -bar HiLink hi def link <args>
368
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
380   endif
381
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
486
487   if &bg == 'dark'
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
498   else
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
509   endif
510 endif
511 delcommand HiLink
512
513 let b:current_syntax = 'factor'
514
515 " vim: set ts=4 ft=vim et sw=2 isk+=/,\\ :