]> gitweb.factorcode.org Git - factor.git/blob - 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
1 USING: accessors calendar calendar.format io io.encodings.utf8
2 io.files kernel multiline parser sequences sorting splitting
3 vocabs ;
4 IN: editors.vim.generate-syntax
5
6 <PRIVATE
7
8 CONSTANT: highlighted-vocabs {
9     "alien"
10     "arrays"
11     "assocs"
12     "byte-arrays"
13     "classes"
14     "classes.maybe"
15     "combinators"
16     "continuations"
17     "definitions"
18     "destructors"
19     "generic"
20     "growable"
21     "io"
22     "io.encodings"
23     "io.encodings.binary"
24     "io.encodings.utf8"
25     "io.files"
26     "kernel"
27     "layouts"
28     "make"
29     "math"
30     "math.order"
31     "memory"
32     "namespaces"
33     "sequences"
34     "sets"
35     "sorting"
36     "splitting"
37     "strings"
38     "strings.parser"
39     "syntax"
40     "vectors"
41 }
42
43 : (vocab-name>syntax-group-name) ( str -- str )
44     "_" "___" "-" "__" "." "_" [ replace ] 2tri@ ;
45
46 : vocab-name>syntax-group-name ( str -- str )
47     (vocab-name>syntax-group-name) "factorWord_" prepend ;
48
49 : write-syn-keyword ( str seq seq -- )
50     "syn keyword " write [ write ] 2dip
51     [ bl [ bl ] [ write ] interleave ] unless-empty
52     [ bl [ bl ] [ "|" "\\|" replace write ] interleave ]
53     unless-empty ;
54
55 : write-keywords ( vocab -- )
56     lookup-vocab
57     [ name>> ] [ vocab-words [ name>> ] map ] bi natural-sort [
58         [ vocab-name>syntax-group-name
59             [ "SynKeywordFactorWord " write write " | " write ] keep
60         ] dip
61         { "contained" } write-syn-keyword nl
62     ] [ drop ] if* ;
63
64 : (generate-vim-syntax) ( -- )
65     [=[ " Vim syntax file
66 " Language: Factor
67 " Maintainer: Alex Chapman <chapman.alex@gmail.com>
68 " Last Change: ]=] write
69     now >gmt { YYYY " " MONTH " " DD } formatted [=[
70 " Minimum Version: 600
71 " To regenerate: USE: editors.vim.generate-syntax generate-vim-syntax
72
73 if exists('b:factorsyn_no_generated')
74   finish
75 endif
76
77 command -nargs=+ -bar HiLink hi def link <args>
78 function s:syn_keyword_factor_word(group, ...)
79   execute 'HiLink' a:group 'factorWord'
80   execute 'syn' 'cluster' 'factorWord' 'add=' . a:group
81 endfunction
82 command -nargs=+ -bar SynKeywordFactorWord
83       \ call s:syn_keyword_factor_word(<f-args>)
84 ]=] print
85
86     highlighted-vocabs [ write-keywords ] each nl
87
88     [=[ delcommand HiLink
89 delcommand SynKeywordFactorWord
90
91 let b:factor_syn_no_generated = 1
92
93 " vim:set ft=vim sw=2:]=] print ;
94
95 PRIVATE>
96
97 : generate-vim-syntax ( -- )
98     "resource:misc/vim/syntax/factor/generated.vim"
99     utf8 [ (generate-vim-syntax) ] with-file-writer ;
100
101 MAIN: generate-vim-syntax