-! Generate a new factor.vim file for syntax highlighting
-USING: io.encodings.utf8 io.files parser ;
+USING: accessors calendar calendar.format io io.encodings.utf8
+io.files kernel multiline parser sequences sorting splitting
+vocabs ;
IN: editors.vim.generate-syntax
+<PRIVATE
+
+CONSTANT: highlighted-vocabs {
+ "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"
+}
+
+: (vocab-name>syntax-group-name) ( str -- str )
+ "_" "___" "-" "__" "." "_" [ replace ] 2tri@ ;
+
+: vocab-name>syntax-group-name ( str -- str )
+ (vocab-name>syntax-group-name) "factorWord_" prepend ;
+
+: write-syn-keyword ( str seq seq -- )
+ "syn keyword " write [ write ] 2dip
+ [ bl [ bl ] [ write ] interleave ] unless-empty
+ [ bl [ bl ] [ "|" "\\|" replace write ] interleave ]
+ unless-empty ;
+
+: write-keywords ( vocab -- )
+ lookup-vocab
+ [ name>> ] [ vocab-words [ name>> ] map ] bi natural-sort [
+ [ vocab-name>syntax-group-name
+ [ "SynKeywordFactorWord " write write " | " write ] keep
+ ] dip
+ { "contained" } write-syn-keyword nl
+ ] [ drop ] if* ;
+
+: (generate-vim-syntax) ( -- )
+ [=[ " Vim syntax file
+" Language: Factor
+" Maintainer: Alex Chapman <chapman.alex@gmail.com>
+" Last Change: ]=] write
+ now >gmt { YYYY " " MONTH " " DD } formatted [=[
+" Minimum Version: 600
+" To regenerate: USE: editors.vim.generate-syntax generate-vim-syntax
+
+if exists('b:factorsyn_no_generated')
+ finish
+endif
+
+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>)
+]=] print
+
+ highlighted-vocabs [ write-keywords ] each nl
+
+ [=[ delcommand HiLink
+delcommand SynKeywordFactorWord
+
+let b:factor_syn_no_generated = 1
+
+" vim:set ft=vim sw=2:]=] print ;
+
+PRIVATE>
+
: generate-vim-syntax ( -- )
"resource:misc/vim/syntax/factor/generated.vim"
- utf8 "resource:misc/factor.vim.fgen" parse-file
- with-file-writer ;
+ utf8 [ (generate-vim-syntax) ] with-file-writer ;
MAIN: generate-vim-syntax
+++ /dev/null
-USING: accessors
- calendar calendar.format
- io kernel multiline prettyprint sequences sorting
- splitting tr vocabs ;
-IN: factor.vim.fgen
-ALIAS: wr write
-
-[=[ " Vim syntax file
-" Language: Factor
-" Maintainer: Alex Chapman <chapman.alex@gmail.com>
-" 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
-]=] 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:
" Vim syntax file
" Language: Factor
" Maintainer: Alex Chapman <chapman.alex@gmail.com>
-" Last Change: 2020 Jun 05
+" Last Change: 2020 Jun 08
" Minimum Version: 600
-" To regenerate: 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
+" To regenerate: USE: editors.vim.generate-syntax generate-vim-syntax
if exists('b:factorsyn_no_generated')
finish