USING: accessors calendar calendar.format io io.encodings.utf8 io.files kernel multiline parser sequences sorting splitting vocabs ; IN: editors.vim.generate-syntax 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 " 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 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() ]=] 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 [ (generate-vim-syntax) ] with-file-writer ; MAIN: generate-vim-syntax