-<%
-USING: kernel io prettyprint vocabs sequences multiline ;
+USING: accessors
+ calendar calendar.format
+ io kernel multiline prettyprint sequences sorting
+ splitting tr vocabs ;
IN: factor.vim.fgen
+ALIAS: wr write
-: print-keywords ( vocab -- )
- words [
- "syn keyword factorKeyword " write
- [ bl ] [ pprint ] interleave nl
- ] when* ;
-
-%>
-" Vim syntax file
+[=[ " Vim syntax file
" Language: Factor
" Maintainer: Alex Chapman <chapman.alex@gmail.com>
-" Last Change: 2011 Mar 15
-" To run: USING: html.templates html.templates.fhtml ; "resource:misc/factor.vim.fgen" <fhtml> call-template
-
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
- syntax clear
-elseif exists("b:current_syntax")
- finish
-endif
-
-" factor is case sensitive.
-syn case match
-
-" make all of these characters part of a word (useful for skipping over words with w, e, and b)
-if version >= 600
- setlocal iskeyword=!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255
-else
- set iskeyword=!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255
+" Last Change: ]=] wr
+ now >gmt { YYYY " " MONTH " " DD } formatted [=[
+" Minimum Version: 600
+" To regenerate: ]=] wr {
+ [=[ USING: io.encodings.utf8 io.files parser ; ]=]
+ [=[ "resource:misc/vim/syntax/factor/generated.vim" utf8 ]=]
+ [=[ "resource:misc/factor.vim.fgen" parse-file ]=]
+ [=[ with-file-writer]=]
+} [ wr ] each [=[
+
+if exists('b:factorsyn_no_generated')
+ finish
endif
-
-syn cluster factorCluster contains=factorComment,factorFrySpecifier,factorKeyword,factorRepeat,factorConditional,factorBoolean,factorBreakpoint,factorDeclaration,factorCallQuotation,factorExecute,factorCallNextMethod,factorString,factorTriString,factorSbuf,@factorNumber,@factorNumErr,factorDelimiter,factorChar,factorBackslash,factorLiteral,factorLiteralBlock,@factorWordOps,factorAlien,factorSlot,factorTuple,factorStruct
-
-syn match factorTodo /\(TODO\|FIXME\|XXX\):\=/ contained
-syn match factorComment /\<#!\>\s.*/ contains=factorTodo
-syn match factorComment /\<!\>\s.*/ contains=factorTodo
-
-syn cluster factorDefnContents contains=@factorCluster,factorStackEffect,factorLiteralStackEffect,factorArray0,factorQuotation0
-
-syn region factorDefn matchgroup=factorDefnDelims start=/\<\(SYNTAX\|\(MACRO\|MEMO\)\?:\?\):\s\+\S\+\>/ end=/\<;\>/ contains=@factorDefnContents
-syn region factorMethod matchgroup=factorMethodDelims start=/\<M::\?\s\+\S\+\s\+\S\+\>/ end=/\<;\>/ contains=@factorDefnContents
-syn region factorGeneric matchgroup=factorGenericDelims start=/\<GENERIC:\s\+\S\+\>/ end=/$/ contains=factorStackEffect
-syn region factorGenericN matchgroup=factorGenericNDelims start=/\<GENERIC#\s\+\S\+\s\+\d\+\>/ end=/$/ contains=factorStackEffect
-
-syn region factorPrivateDefn matchgroup=factorPrivateDefnDelims start=/\<\(SYNTAX\|\(MACRO\|MEMO\)\?:\?\):\s\+\S\+\>/ end=/\<;\>/ contains=@factorDefnContents contained
-syn region factorPrivateMethod matchgroup=factorPrivateMethodDelims start=/\<M::\?\s\+\S\+\s\+\S\+\>/ end=/\<;\>/ contains=@factorDefnContents contained
-syn region factorPGeneric matchgroup=factorPGenericDelims start=/\<GENERIC:\s\+\S\+\>/ end=/$/ contains=factorStackEffect contained
-syn region factorPGenericN matchgroup=factorPGenericNDelims start=/\<GENERIC#\s\+\S\+\s\+\d\+\>/ end=/$/ contains=factorStackEffect
-
-syn region None matchgroup=factorPrivate start=/\<<PRIVATE\>/ end=/\<PRIVATE>\>/ contains=@factorDefnContents,factorPrivateDefn,factorPrivateMethod,factorPGeneric,factorPGenericN
-
-
-syn keyword factorBoolean f t
-syn keyword factorBreakpoint B
-syn keyword factorFrySpecifier @ _ contained
-syn keyword factorDeclaration delimiter deprecated final flushable foldable inline recursive
-syn match factorCallQuotation /\<call(\s.*\s--\s.*\s)\>/
-syn match factorExecute /\<execute(\s.*\s--\s.*\s)\>/
-syn keyword factorCallNextMethod call-next-method
-
-<%
-
-! uncomment this if you want all words from all vocabularies highlighted. Note
-! that this changes factor.vim from around 8k to around 100k (and is a bit
-! broken)
-
-! vocabs [ print-keywords ] each
-
- {
- "kernel" "assocs" "combinators" "math" "sequences"
- "namespaces" "arrays" "io" "strings" "vectors"
- "continuations"
- } [ print-keywords ] each
-%>
-
-syn cluster factorReal contains=factorInt,factorFloat,factorRatio,factorBinary,factorHex,factorOctal
-syn cluster factorNumber contains=@factorReal,factorComplex
-syn cluster factorNumErr contains=factorBinErr,factorHexErr,factorOctErr
-syn match factorInt /\<-\=[0-9]\([0-9,]*[0-9]\)\?\>/
-syn match factorFloat /\<-\=[0-9]\([0-9,]*[0-9]\)\?\.[0-9,]*[0-9]\+\>/
-syn match factorRatio /\<-\=[0-9]\([0-9,]*[0-9]\)\?\(+[0-9]\([0-9,]*[0-9]\+\)\?\)\?\/-\=[0-9]\([0-9,]*[0-9]\+\)\?\.\?\>/
-syn region factorComplex start=/\<C{\>/ end=/\<}\>/ contains=@factorReal
-syn match factorBinErr /\<BIN:\s\+-\=[01,]*[^01 ]\S*\>/
-syn match factorBinary /\<BIN:\s\+-\=[01,]\+\>/
-syn match factorHexErr /\<HEX:\s\+-\=\(,\S*\|\S*,\|[-0-9a-fA-Fp,]*[^-0-9a-fA-Fp, ]\S*\)\>/
-syn match factorHex /\<HEX:\s\+-\=[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]\)\?\)\?\>/
-syn match factorOctErr /\<OCT:\s\+-\=\(,\S*\|\S*,\|[0-7,]*[^0-7, ]\S*\)\>/
-syn match factorOctal /\<OCT:\s\+-\=[0-7,]\+\>/
-syn match factorNan /\<NAN:\s\+[0-9a-fA-F]\([0-9a-fA-F,]*[0-9a-fA-F]\)\?\>/
-
-syn match factorIn /\<IN:\s\+\S\+\>/
-syn match factorUse /\<USE:\s\+\S\+\>/
-syn match factorUnuse /\<UNUSE:\s\+\S\+\>/
-
-syn match factorChar /\<CHAR:\s\+\S\+\>/
-
-syn match factorBackslash /\<\\\>\s\+\S\+\>/
-syn match factorLiteral /\<\$\>\s\+\S\+\>/
-syn region factorLiteralBlock start=/\<\$\[\>/ end=/\<\]\>/
-
-syn region factorUsing start=/\<USING:\>/ end=/;/
-syn match factorQualified /\<QUALIFIED:\s\+\S\+\>/
-syn match factorQualifiedWith /\<QUALIFIED-WITH:\s\+\S\+\s\+\S\+\>/
-syn region factorExclude start=/\<EXCLUDE:\>/ end=/;/
-syn region factorFrom start=/\<FROM:\>/ end=/;/
-syn region factorRename start=/\<RENAME:\>/ end=/;/
-syn region factorSingletons start=/\<SINGLETONS:\>/ end=/;/
-syn match factorSymbol /\<SYMBOL:\s\+\S\+\>/
-syn region factorSymbols start=/\<SYMBOLS:\>/ end=/;/
-syn region factorConstructor2 start=/\<CONSTRUCTOR:\?/ end=/;/
-syn region factorIntersection start=/\<INTERSECTION:\>/ end=/\<;\>/
-syn region factorTuple start=/\<TUPLE:\>/ end=/\<;\>/
-syn region factorUnion start=/\<UNION:\>/ end=/\<;\>/
-syn region factorStruct start=/\<\(UNION-STRUCT:\|STRUCT:\)\>/ end=/\<;\>/
-
-syn match factorConstant /\<CONSTANT:\s\+\S\+\>/
-syn match factorAlias /\<ALIAS:\s\+\S\+\s\+\S\+\>/
-syn match factorSingleton /\<SINGLETON:\s\+\S\+\>/
-syn match factorPostpone /\<POSTPONE:\s\+\S\+\>/
-syn match factorDefer /\<DEFER:\s\+\S\+\>/
-syn match factorForget /\<FORGET:\s\+\S\+\>/
-syn match factorMixin /\<MIXIN:\s\+\S\+\>/
-syn match factorInstance /\<INSTANCE:\s\+\S\+\s\+\S\+\>/
-syn match factorHook /\<HOOK:\s\+\S\+\s\+\S\+\>/
-syn match factorMain /\<MAIN:\s\+\S\+\>/
-syn match factorConstructor /\<C:\s\+\S\+\s\+\S\+\>/
-syn match factorAlien /\<ALIEN:\s\+[0-9a-fA-F]\([0-9a-fA-F,]*[0-9a-fA-F]\)\?\>/
-syn match factorSlot /\<SLOT:\s\+\S\+\>/
-
-syn cluster factorWordOps contains=factorConstant,factorAlias,factorSingleton,factorSingletons,factorSymbol,factorSymbols,factorPostpone,factorDefer,factorForget,factorMixin,factorInstance,factorHook,factorMain,factorConstructor
-
-"TODO:
-"misc:
-" HELP:
-" ARTICLE:
-"literals:
-" PRIMITIVE:
-
-"C interface:
-" C-ENUM:
-" FUNCTION:
-" TYPEDEF:
-" LIBRARY:
-"#\ "
-
-syn region factorString start=/\<"/ skip=/\\"/ end=/"/
-syn region factorTriString start=/\<"""/ skip=/\\"/ end=/"""/
-syn region factorSbuf start=/\<[-a-zA-Z0-9]\+"\>/ skip=/\\"/ end=/"/
-
-syn region factorMultiString matchgroup=factorMultiStringDelims start=/\<STRING:\s\+\S\+\>/ end=/^;$/ contains=factorMultiStringContents
-syn match factorMultiStringContents /.*/ contained
-
-"syn match factorStackEffectErr /\<)\>/
-"syn region factorStackEffectErr start=/\<(\>/ end=/\<)\>/
-"syn region factorStackEffect start=/\<(\>/ end=/\<)\>/ contained
-syn match factorStackEffect /\<(\s.*\s--\s.*\s)\>/ contained
-syn match factorLiteralStackEffect /\<((\s.*\s--\s.*\s))\>/
-
-"adapted from lisp.vim
-if exists("g:factor_norainbow")
- syn region factorQuotation matchgroup=factorDelimiter start=/\<\(\(\('\|\$\|\)\[\)\|\[\(let\||\)\)\>/ matchgroup=factorDelimiter end=/\<\]\>/ contains=ALL
-else
- syn region factorQuotation0 matchgroup=hlLevel0 start=/\<\(\(\('\|\$\|\)\[\)\|\[\(let\||\)\)\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation1,factorArray1
- syn region factorQuotation1 contained matchgroup=hlLevel1 start=/\<\(\(\('\|\$\|\)\[\)\|\[\(let\||\)\)\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation2,factorArray2
- syn region factorQuotation2 contained matchgroup=hlLevel2 start=/\<\(\(\('\|\$\|\)\[\)\|\[\(let\||\)\)\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation3,factorArray3
- syn region factorQuotation3 contained matchgroup=hlLevel3 start=/\<\(\(\('\|\$\|\)\[\)\|\[\(let\||\)\)\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation4,factorArray4
- syn region factorQuotation4 contained matchgroup=hlLevel4 start=/\<\(\(\('\|\$\|\)\[\)\|\[\(let\||\)\)\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation5,factorArray5
- syn region factorQuotation5 contained matchgroup=hlLevel5 start=/\<\(\(\('\|\$\|\)\[\)\|\[\(let\||\)\)\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation6,factorArray6
- syn region factorQuotation6 contained matchgroup=hlLevel6 start=/\<\(\(\('\|\$\|\)\[\)\|\[\(let\||\)\)\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation7,factorArray7
- syn region factorQuotation7 contained matchgroup=hlLevel7 start=/\<\(\(\('\|\$\|\)\[\)\|\[\(let\||\)\)\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation8,factorArray8
- syn region factorQuotation8 contained matchgroup=hlLevel8 start=/\<\(\(\('\|\$\|\)\[\)\|\[\(let\||\)\)\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation9,factorArray9
- syn region factorQuotation9 contained matchgroup=hlLevel9 start=/\<\(\(\('\|\$\|\)\[\)\|\[\(let\||\)\)\>/ end=/\<\]\>/ contains=@factorCluster,factorQuotation0,factorArray0
-endif
-
-if exists("g:factor_norainbow")
- syn region factorArray matchgroup=factorDelimiter start=/\<\(\$\|[-a-zA-Z0-9]\+\)\?{\>/ matchgroup=factorDelimiter end=/\<}\>/ contains=ALL
-else
- syn region factorArray0 matchgroup=hlLevel0 start=/\<\(\$\|[-a-zA-Z0-9]\+\)\?{\>/ end=/\<}\>/ contains=@factorCluster,factorArray1,factorQuotation1
- syn region factorArray1 contained matchgroup=hlLevel1 start=/\<\(\$\|[-a-zA-Z0-9]\+\)\?{\>/ end=/\<}\>/ contains=@factorCluster,factorArray2,factorQuotation2
- syn region factorArray2 contained matchgroup=hlLevel2 start=/\<\(\$\|[-a-zA-Z0-9]\+\)\?{\>/ end=/\<}\>/ contains=@factorCluster,factorArray3,factorQuotation3
- syn region factorArray3 contained matchgroup=hlLevel3 start=/\<\(\$\|[-a-zA-Z0-9]\+\)\?{\>/ end=/\<}\>/ contains=@factorCluster,factorArray4,factorQuotation4
- syn region factorArray4 contained matchgroup=hlLevel4 start=/\<\(\$\|[-a-zA-Z0-9]\+\)\?{\>/ end=/\<}\>/ contains=@factorCluster,factorArray5,factorQuotation5
- syn region factorArray5 contained matchgroup=hlLevel5 start=/\<\(\$\|[-a-zA-Z0-9]\+\)\?{\>/ end=/\<}\>/ contains=@factorCluster,factorArray6,factorQuotation6
- syn region factorArray6 contained matchgroup=hlLevel6 start=/\<\(\$\|[-a-zA-Z0-9]\+\)\?{\>/ end=/\<}\>/ contains=@factorCluster,factorArray7,factorQuotation7
- syn region factorArray7 contained matchgroup=hlLevel7 start=/\<\(\$\|[-a-zA-Z0-9]\+\)\?{\>/ end=/\<}\>/ contains=@factorCluster,factorArray8,factorQuotation8
- syn region factorArray8 contained matchgroup=hlLevel8 start=/\<\(\$\|[-a-zA-Z0-9]\+\)\?{\>/ end=/\<}\>/ contains=@factorCluster,factorArray9,factorQuotation9
- syn region factorArray9 contained matchgroup=hlLevel9 start=/\<\(\$\|[-a-zA-Z0-9]\+\)\?{\>/ end=/\<}\>/ contains=@factorCluster,factorArray0,factorQuotation0
-endif
-
-syn match factorBracketErr /\<\]\>/
-syn match factorBracketErr /\<}\>/
-
-syn sync lines=100
-
-if version >= 508 || !exists("did_factor_syn_inits")
- if version <= 508
- let did_factor_syn_inits = 1
- command -nargs=+ HiLink hi link <args>
- else
- command -nargs=+ HiLink hi def link <args>
- endif
-
- HiLink factorComment Comment
- HiLink factorStackEffect Typedef
- HiLink factorLiteralStackEffect Typedef
- HiLink factorTodo Todo
- HiLink factorInclude Include
- HiLink factorRepeat Repeat
- HiLink factorConditional Conditional
- HiLink factorKeyword Keyword
- HiLink factorCallQuotation Keyword
- HiLink factorExecute Keyword
- HiLink factorCallNextMethod Keyword
- HiLink factorOperator Operator
- HiLink factorFrySpecifier Operator
- HiLink factorBoolean Boolean
- HiLink factorBreakpoint Debug
- HiLink factorDefnDelims Typedef
- HiLink factorMethodDelims Typedef
- HiLink factorGenericDelims Typedef
- HiLink factorGenericNDelims Typedef
- HiLink factorConstructor Typedef
- HiLink factorConstructor2 Typedef
- HiLink factorPrivate Special
- HiLink factorPrivateDefnDelims Special
- HiLink factorPrivateMethodDelims Special
- HiLink factorPGenericDelims Special
- HiLink factorPGenericNDelims Special
- HiLink factorString String
- HiLink factorTriString String
- HiLink factorSbuf String
- HiLink factorMultiStringContents String
- HiLink factorMultiStringDelims Typedef
- HiLink factorBracketErr Error
- HiLink factorComplex Number
- HiLink factorRatio Number
- HiLink factorBinary Number
- HiLink factorBinErr Error
- HiLink factorHex Number
- HiLink factorHexErr Error
- HiLink factorNan Number
- HiLink factorOctal Number
- HiLink factorOctErr Error
- HiLink factorFloat Float
- HiLink factorInt Number
- HiLink factorUsing Include
- HiLink factorQualified Include
- HiLink factorQualifiedWith Include
- HiLink factorExclude Include
- HiLink factorFrom Include
- HiLink factorRename Include
- HiLink factorUse Include
- HiLink factorUnuse Include
- HiLink factorIn Define
- HiLink factorChar Character
- HiLink factorDelimiter Delimiter
- HiLink factorBackslash Special
- HiLink factorLiteral Special
- HiLink factorLiteralBlock Special
- HiLink factorDeclaration Typedef
- HiLink factorSymbol Define
- HiLink factorSymbols Define
- HiLink factorConstant Define
- HiLink factorAlias Define
- HiLink factorSingleton Define
- HiLink factorSingletons Define
- HiLink factorMixin Typedef
- HiLink factorInstance Typedef
- HiLink factorHook Typedef
- HiLink factorMain Define
- HiLink factorPostpone Define
- HiLink factorDefer Define
- HiLink factorForget Define
- HiLink factorAlien Define
- HiLink factorSlot Define
- HiLink factorIntersection Typedef
- HiLink factorTuple Typedef
- HiLink factorUnion Typedef
- HiLink factorStruct Typedef
-
- if &bg == "dark"
- hi hlLevel0 ctermfg=red guifg=red1
- hi hlLevel1 ctermfg=yellow guifg=orange1
- hi hlLevel2 ctermfg=green guifg=yellow1
- hi hlLevel3 ctermfg=cyan guifg=greenyellow
- hi hlLevel4 ctermfg=magenta guifg=green1
- hi hlLevel5 ctermfg=red guifg=springgreen1
- hi hlLevel6 ctermfg=yellow guifg=cyan1
- hi hlLevel7 ctermfg=green guifg=slateblue1
- hi hlLevel8 ctermfg=cyan guifg=magenta1
- hi hlLevel9 ctermfg=magenta guifg=purple1
- else
- hi hlLevel0 ctermfg=red guifg=red3
- hi hlLevel1 ctermfg=darkyellow guifg=orangered3
- hi hlLevel2 ctermfg=darkgreen guifg=orange2
- hi hlLevel3 ctermfg=blue guifg=yellow3
- hi hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
- hi hlLevel5 ctermfg=red guifg=green4
- hi hlLevel6 ctermfg=darkyellow guifg=paleturquoise3
- hi hlLevel7 ctermfg=darkgreen guifg=deepskyblue4
- hi hlLevel8 ctermfg=blue guifg=darkslateblue
- hi hlLevel9 ctermfg=darkmagenta guifg=darkviolet
- endif
-
- delcommand HiLink
-endif
-
-let b:current_syntax = "factor"
-
-set sw=4
-set sts=4
-set expandtab
-set autoindent " annoying?
-
-" vim: syntax=vim
+]=] wr nl
+
+[=[ command -nargs=+ -bar HiLink hi def link <args>
+function s:syn_keyword_factor_word(group, ...)
+ execute 'HiLink' a:group 'factorWord'
+ execute 'syn' 'cluster' 'factorWord' 'add=' . a:group
+endfunction
+command -nargs=+ -bar SynKeywordFactorWord
+ \ call s:syn_keyword_factor_word(<f-args>)
+]=] wr nl
+: (vocab-name>syntax-group-name) ( string -- string )
+ "_" "___" "-" "__" "." "_" [ replace ] 2tri@ ;
+: vocab-name>syntax-group-name ( string -- string )
+ (vocab-name>syntax-group-name) "factorWord_" prepend ;
+: write-syn-keyword ( string seq seq -- )
+ "syn keyword " wr [ wr ] 2dip
+ [ bl [ bl ] [ wr ] interleave ] unless-empty
+ [ bl [ bl ] [ "|" "\\|" replace wr ] interleave ]
+ unless-empty ;
+: write-keywords ( vocab -- )
+ lookup-vocab
+ [ name>> ] [ vocab-words [ name>> ] map ] bi natural-sort [
+ [ vocab-name>syntax-group-name
+ [ "SynKeywordFactorWord " wr wr " | " wr ] keep
+ ] dip
+ { "contained" } write-syn-keyword nl
+ ] [ drop ] if* ;
+
+f
+! Uncomment to highlight all words from all vocabularies.
+! Note that factor/generated.vim grows from ~16k to ~100k.
+! drop t
+[ loaded-vocab-names ] [ {
+ "alien"
+ "arrays"
+ "assocs"
+ "byte-arrays"
+ "classes"
+ "classes.maybe"
+ "combinators"
+ "continuations"
+ "definitions"
+ "destructors"
+ "generic"
+ "growable"
+ "io"
+ "io.encodings"
+ "io.encodings.binary"
+ "io.encodings.utf8"
+ "io.files"
+ "kernel"
+ "layouts"
+ "make"
+ "math"
+ "math.order"
+ "memory"
+ "namespaces"
+ "sequences"
+ "sets"
+ "sorting"
+ "splitting"
+ "strings"
+ "strings.parser"
+ "syntax"
+ "vectors"
+} ] if [ write-keywords ] each nl
+[=[ delcommand HiLink
+delcommand SynKeywordFactorWord
+]=] wr nl
+
+[=[ let b:factor_syn_no_generated = 1
+]=] wr nl
+! Modeline is broken up to prevent detection here.
+[=[ " vim]=] wr [=[ :set ft=vim sw=2:]=] wr nl
+! vim:set ft=factor: