]> gitweb.factorcode.org Git - factor.git/blobdiff - basis/editors/vim/generate-syntax/generate-syntax.factor
editors.vim.generate-syntax: merge in factor.vim.fgen.
[factor.git] / basis / editors / vim / generate-syntax / generate-syntax.factor
index 3df11f3fda5a91bcb785726cad92e9bd544d45e7..bbbc6c3a3184a27ba008100e5e7f354f697b08ed 100644 (file)
-! 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