blob: 626dc8a77f41627cb864a2764aaa81888cab2691 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +02002" Language: YAML (YAML Ain't Markup Language) 1.2
3" Maintainer: Nikolai Pavlov <zyx.vim@gmail.com>
4" First author: Nikolai Weibull <now@bitwi.se>
Bram Moolenaar5a5f4592015-04-13 12:43:06 +02005" Latest Revision: 2015-03-28
Bram Moolenaar071d4272004-06-13 20:20:40 +00006
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +02007if exists('b:current_syntax')
8 finish
Bram Moolenaar071d4272004-06-13 20:20:40 +00009endif
10
Bram Moolenaar42eeac32005-06-29 22:40:58 +000011let s:cpo_save = &cpo
12set cpo&vim
Bram Moolenaar071d4272004-06-13 20:20:40 +000013
Bram Moolenaar5a5f4592015-04-13 12:43:06 +020014" Choose the schema to use
15" TODO: Validate schema
16if !exists('b:yaml_schema')
17 if exists('g:yaml_schema')
18 let b:yaml_schema = g:yaml_schema
19 else
20 let b:yaml_schema = 'core'
21 endif
22endif
23
24let s:ns_char = '\%([\n\r\uFEFF \t]\@!\p\)'
25let s:ns_word_char = '[[:alnum:]_\-]'
26let s:ns_uri_char = '\%(%\x\x\|'.s:ns_word_char.'\|[#/;?:@&=+$,.!~*''()[\]]\)'
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020027let s:ns_tag_char = '\%(%\x\x\|'.s:ns_word_char.'\|[#/;?:@&=+$.~*''()]\)'
Bram Moolenaar5a5f4592015-04-13 12:43:06 +020028let s:c_ns_anchor_char = '\%([\n\r\uFEFF \t,[\]{}]\@!\p\)'
29let s:c_indicator = '[\-?:,[\]{}#&*!|>''"%@`]'
30let s:c_flow_indicator = '[,[\]{}]'
31
32let s:ns_char_without_c_indicator = substitute(s:ns_char, '\v\C[\zs', '\=s:c_indicator[1:-2]', '')
33
34let s:_collection = '[^\@!\(\%(\\\.\|\[^\\\]]\)\+\)]'
35let s:_neg_collection = '[^\(\%(\\\.\|\[^\\\]]\)\+\)]'
36function s:SimplifyToAssumeAllPrintable(p)
37 return substitute(a:p, '\V\C\\%('.s:_collection.'\\@!\\p\\)', '[^\1]', '')
38endfunction
39let s:ns_char = s:SimplifyToAssumeAllPrintable(s:ns_char)
40let s:ns_char_without_c_indicator = s:SimplifyToAssumeAllPrintable(s:ns_char_without_c_indicator)
41let s:c_ns_anchor_char = s:SimplifyToAssumeAllPrintable(s:c_ns_anchor_char)
42
43function s:SimplifyAdjacentCollections(p)
44 return substitute(a:p, '\V\C'.s:_collection.'\\|'.s:_collection, '[\1\2]', 'g')
45endfunction
46let s:ns_uri_char = s:SimplifyAdjacentCollections(s:ns_uri_char)
47let s:ns_tag_char = s:SimplifyAdjacentCollections(s:ns_tag_char)
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020048
49let s:c_verbatim_tag = '!<'.s:ns_uri_char.'\+>'
50let s:c_named_tag_handle = '!'.s:ns_word_char.'\+!'
51let s:c_secondary_tag_handle = '!!'
52let s:c_primary_tag_handle = '!'
53let s:c_tag_handle = '\%('.s:c_named_tag_handle.
54 \ '\|'.s:c_secondary_tag_handle.
55 \ '\|'.s:c_primary_tag_handle.'\)'
56let s:c_ns_shorthand_tag = s:c_tag_handle . s:ns_tag_char.'\+'
57let s:c_non_specific_tag = '!'
58let s:c_ns_tag_property = s:c_verbatim_tag.
59 \ '\|'.s:c_ns_shorthand_tag.
60 \ '\|'.s:c_non_specific_tag
61
62let s:c_ns_anchor_name = s:c_ns_anchor_char.'\+'
63let s:c_ns_anchor_property = '&'.s:c_ns_anchor_name
64let s:c_ns_alias_node = '\*'.s:c_ns_anchor_name
65
66let s:ns_directive_name = s:ns_char.'\+'
67
68let s:ns_local_tag_prefix = '!'.s:ns_uri_char.'*'
69let s:ns_global_tag_prefix = s:ns_tag_char.s:ns_uri_char.'*'
70let s:ns_tag_prefix = s:ns_local_tag_prefix.
71 \ '\|'.s:ns_global_tag_prefix
72
73let s:ns_plain_safe_out = s:ns_char
74let s:ns_plain_safe_in = '\%('.s:c_flow_indicator.'\@!'.s:ns_char.'\)'
75
Bram Moolenaar5a5f4592015-04-13 12:43:06 +020076let s:ns_plain_safe_in = substitute(s:ns_plain_safe_in, '\V\C\\%('.s:_collection.'\\@!'.s:_neg_collection.'\\)', '[^\1\2]', '')
77let s:ns_plain_safe_in_without_colhash = substitute(s:ns_plain_safe_in, '\V\C'.s:_neg_collection, '[^\1:#]', '')
78let s:ns_plain_safe_out_without_colhash = substitute(s:ns_plain_safe_out, '\V\C'.s:_neg_collection, '[^\1:#]', '')
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020079
Bram Moolenaar5a5f4592015-04-13 12:43:06 +020080let s:ns_plain_first_in = '\%('.s:ns_char_without_c_indicator.'\|[?:\-]\%('.s:ns_plain_safe_in.'\)\@=\)'
81let s:ns_plain_first_out = '\%('.s:ns_char_without_c_indicator.'\|[?:\-]\%('.s:ns_plain_safe_out.'\)\@=\)'
82
83let s:ns_plain_char_in = '\%('.s:ns_char.'#\|:'.s:ns_plain_safe_in.'\|'.s:ns_plain_safe_in_without_colhash.'\)'
84let s:ns_plain_char_out = '\%('.s:ns_char.'#\|:'.s:ns_plain_safe_out.'\|'.s:ns_plain_safe_out_without_colhash.'\)'
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020085
86let s:ns_plain_out = s:ns_plain_first_out . s:ns_plain_char_out.'*'
87let s:ns_plain_in = s:ns_plain_first_in . s:ns_plain_char_in.'*'
88
89
Bram Moolenaare37d50a2008-08-06 17:06:04 +000090syn keyword yamlTodo contained TODO FIXME XXX NOTE
Bram Moolenaar071d4272004-06-13 20:20:40 +000091
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020092syn region yamlComment display oneline start='\%\(^\|\s\)#' end='$'
93 \ contains=yamlTodo
Bram Moolenaar071d4272004-06-13 20:20:40 +000094
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020095execute 'syn region yamlDirective oneline start='.string('^\ze%'.s:ns_directive_name.'\s\+').' '.
96 \ 'end="$" '.
97 \ 'contains=yamlTAGDirective,'.
98 \ 'yamlYAMLDirective,'.
99 \ 'yamlReservedDirective '.
100 \ 'keepend'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000101
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200102syn match yamlTAGDirective '%TAG\s\+' contained nextgroup=yamlTagHandle
103execute 'syn match yamlTagHandle contained nextgroup=yamlTagPrefix '.string(s:c_tag_handle.'\s\+')
104execute 'syn match yamlTagPrefix contained nextgroup=yamlComment ' . string(s:ns_tag_prefix)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000105
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200106syn match yamlYAMLDirective '%YAML\s\+' contained nextgroup=yamlYAMLVersion
107syn match yamlYAMLVersion '\d\+\.\d\+' contained nextgroup=yamlComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000108
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200109execute 'syn match yamlReservedDirective contained nextgroup=yamlComment '.
110 \string('%\%(\%(TAG\|YAML\)\s\)\@!'.s:ns_directive_name)
Bram Moolenaar42eeac32005-06-29 22:40:58 +0000111
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200112syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start='"' skip='\\"' end='"'
113 \ contains=yamlEscape
114 \ nextgroup=yamlKeyValueDelimiter
115syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start="'" skip="''" end="'"
116 \ contains=yamlSingleEscape
117 \ nextgroup=yamlKeyValueDelimiter
118syn match yamlEscape contained '\\\%([\\"abefnrtv\^0_ NLP\n]\|x\x\x\|u\x\{4}\|U\x\{8}\)'
119syn match yamlSingleEscape contained "''"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000120
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200121syn match yamlBlockScalarHeader contained '\s\+\zs[|>]\%([+-]\=[1-9]\|[1-9]\=[+-]\)\='
Bram Moolenaar071d4272004-06-13 20:20:40 +0000122
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200123syn cluster yamlConstant contains=yamlBool,yamlNull
124
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200125syn cluster yamlFlow contains=yamlFlowString,yamlFlowMapping,yamlFlowCollection
126syn cluster yamlFlow add=yamlFlowMappingKey,yamlFlowMappingMerge
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200127syn cluster yamlFlow add=@yamlConstant,yamlPlainScalar,yamlFloat
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200128syn cluster yamlFlow add=yamlTimestamp,yamlInteger,yamlMappingKeyStart
129syn cluster yamlFlow add=yamlComment
130syn region yamlFlowMapping matchgroup=yamlFlowIndicator start='{' end='}' contains=@yamlFlow
131syn region yamlFlowCollection matchgroup=yamlFlowIndicator start='\[' end='\]' contains=@yamlFlow
Bram Moolenaar071d4272004-06-13 20:20:40 +0000132
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200133execute 'syn match yamlPlainScalar /'.s:ns_plain_out.'/'
134execute 'syn match yamlPlainScalar contained /'.s:ns_plain_in.'/'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000135
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200136syn match yamlMappingKeyStart '?\ze\s'
137syn match yamlMappingKeyStart '?' contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000138
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200139execute 'syn match yamlFlowMappingKey /\%#=1'.s:ns_plain_in.'\%(\s\+'.s:ns_plain_in.'\)*\ze\s*:/ contained '.
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200140 \'nextgroup=yamlKeyValueDelimiter'
141syn match yamlFlowMappingMerge /<<\ze\s*:/ contained nextgroup=yamlKeyValueDelimiter
Bram Moolenaar071d4272004-06-13 20:20:40 +0000142
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200143syn match yamlBlockCollectionItemStart '^\s*\zs-\%(\s\+-\)*\s' nextgroup=yamlBlockMappingKey,yamlBlockMappingMerge
Bram Moolenaar7cba6c02013-09-05 22:13:31 +0200144" Use the old regexp engine, the NFA engine doesn't like all the \@ items.
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200145execute 'syn match yamlBlockMappingKey /\%#=1^\s*\zs'.s:ns_plain_out.'\%(\s\+'.s:ns_plain_out.'\)*\ze\s*:\%(\s\|$\)/ '.
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200146 \'nextgroup=yamlKeyValueDelimiter'
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200147execute 'syn match yamlBlockMappingKey /\%#=1\s*\zs'.s:ns_plain_out.'\%(\s\+'.s:ns_plain_out.'\)*\ze\s*:\%(\s\|$\)/ contained '.
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200148 \'nextgroup=yamlKeyValueDelimiter'
149syn match yamlBlockMappingMerge /^\s*\zs<<\ze:\%(\s\|$\)/ nextgroup=yamlKeyValueDelimiter
150syn match yamlBlockMappingMerge /<<\ze\s*:\%(\s\|$\)/ nextgroup=yamlKeyValueDelimiter contained
151
152syn match yamlKeyValueDelimiter /\s*:/ contained
153syn match yamlKeyValueDelimiter /\s*:/ contained
154
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200155syn cluster yamlScalarWithSpecials contains=yamlPlainScalar,yamlBlockMappingKey,yamlFlowMappingKey
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200156
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200157let s:_bounder = s:SimplifyToAssumeAllPrintable('\%([[\]{}, \t]\@!\p\)')
158if b:yaml_schema is# 'json'
159 syn keyword yamlNull null contained containedin=@yamlScalarWithSpecials
160 syn keyword yamlBool true false
161 exe 'syn match yamlInteger /'.s:_bounder.'\@1<!\%(0\|-\=[1-9][0-9]*\)'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
162 exe 'syn match yamlFloat /'.s:_bounder.'\@1<!\%(-\=[1-9][0-9]*\%(\.[0-9]*\)\=\(e[-+]\=[0-9]\+\)\=\|0\|-\=\.inf\|\.nan\)'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
163elseif b:yaml_schema is# 'core'
164 syn keyword yamlNull null Null NULL contained containedin=@yamlScalarWithSpecials
165 syn keyword yamlBool true True TRUE false False FALSE contained containedin=@yamlScalarWithSpecials
166 exe 'syn match yamlNull /'.s:_bounder.'\@1<!\~'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
167 exe 'syn match yamlInteger /'.s:_bounder.'\@1<!\%([+-]\=\%(0\%(b[0-1_]\+\|[0-7_]\+\|x[0-9a-fA-F_]\+\)\=\|\%([1-9][0-9_]*\%(:[0-5]\=\d\)\+\)\)\|[1-9][0-9_]*\)'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
168 exe 'syn match yamlFloat /'.s:_bounder.'\@1<!\%([+-]\=\%(\%(\d[0-9_]*\)\.[0-9_]*\%([eE][+-]\=\d\+\)\=\|\.[0-9_]\+\%([eE][-+]\=[0-9]\+\)\=\|\d[0-9_]*\%(:[0-5]\=\d\)\+\.[0-9_]*\|\.\%(inf\|Inf\|INF\)\)\|\%(\.\%(nan\|NaN\|NAN\)\)\)'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
169elseif b:yaml_schema is# 'pyyaml'
170 syn keyword yamlNull null Null NULL contained containedin=@yamlScalarWithSpecials
171 syn keyword yamlBool true True TRUE false False FALSE yes Yes YES no No NO on On ON off Off OFF contained containedin=@yamlScalarWithSpecials
172 exe 'syn match yamlNull /'.s:_bounder.'\@1<!\~'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
173 exe 'syn match yamlFloat /'.s:_bounder.'\@1<!\%(\v[-+]?%(\d[0-9_]*)\.[0-9_]*%([eE][-+]\d+)?|\.[0-9_]+%([eE][-+]\d+)?|[-+]?\d[0-9_]*%(\:[0-5]?\d)+\.[0-9_]*|[-+]?\.%(inf|Inf|INF)|\.%(nan|NaN|NAN)\m\)'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
174 exe 'syn match yamlInteger /'.s:_bounder.'\@1<!\%(\v[-+]?0b[0-1_]+|[-+]?0[0-7_]+|[-+]?%(0|[1-9][0-9_]*)|[-+]?0x[0-9a-fA-F_]+|[-+]?[1-9][0-9_]*%(:[0-5]?\d)+\m\)'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
175 exe 'syn match yamlTimestamp /'.s:_bounder.'\@1<!\%(\v\d\d\d\d\-\d\d\-\d\d|\d\d\d\d \-\d\d? \-\d\d?%([Tt]|[ \t]+)\d\d?\:\d\d \:\d\d %(\.\d*)?%([ \t]*%(Z|[-+]\d\d?%(\:\d\d)?))?\m\)'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
176elseif b:yaml_schema is# 'failsafe'
177 " Nothing
178endif
179unlet s:_bounder
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200180
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200181
182execute 'syn match yamlNodeTag '.string(s:c_ns_tag_property)
183execute 'syn match yamlAnchor '.string(s:c_ns_anchor_property)
184execute 'syn match yamlAlias '.string(s:c_ns_alias_node)
185
186syn match yamlDocumentStart '^---\ze\%(\s\|$\)'
187syn match yamlDocumentEnd '^\.\.\.\ze\%(\s\|$\)'
188
189hi def link yamlTodo Todo
190hi def link yamlComment Comment
191
192hi def link yamlDocumentStart PreProc
193hi def link yamlDocumentEnd PreProc
194
195hi def link yamlDirectiveName Keyword
196
197hi def link yamlTAGDirective yamlDirectiveName
198hi def link yamlTagHandle String
199hi def link yamlTagPrefix String
200
201hi def link yamlYAMLDirective yamlDirectiveName
202hi def link yamlReservedDirective Error
203hi def link yamlYAMLVersion Number
204
205hi def link yamlString String
206hi def link yamlFlowString yamlString
207hi def link yamlFlowStringDelimiter yamlString
208hi def link yamlEscape SpecialChar
209hi def link yamlSingleEscape SpecialChar
210
211hi def link yamlBlockCollectionItemStart Label
212hi def link yamlBlockMappingKey Identifier
213hi def link yamlBlockMappingMerge Special
214
215hi def link yamlFlowMappingKey Identifier
216hi def link yamlFlowMappingMerge Special
217
218hi def link yamlMappingKeyStart Special
219hi def link yamlFlowIndicator Special
220hi def link yamlKeyValueDelimiter Special
221
222hi def link yamlConstant Constant
223
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200224hi def link yamlNull yamlConstant
225hi def link yamlBool yamlConstant
226
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200227hi def link yamlAnchor Type
228hi def link yamlAlias Type
229hi def link yamlNodeTag Type
230
231hi def link yamlInteger Number
232hi def link yamlFloat Float
233hi def link yamlTimestamp Number
Bram Moolenaar071d4272004-06-13 20:20:40 +0000234
235let b:current_syntax = "yaml"
236
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200237unlet s:ns_word_char s:ns_uri_char s:c_verbatim_tag s:c_named_tag_handle s:c_secondary_tag_handle s:c_primary_tag_handle s:c_tag_handle s:ns_tag_char s:c_ns_shorthand_tag s:c_non_specific_tag s:c_ns_tag_property s:c_ns_anchor_char s:c_ns_anchor_name s:c_ns_anchor_property s:c_ns_alias_node s:ns_char s:ns_directive_name s:ns_local_tag_prefix s:ns_global_tag_prefix s:ns_tag_prefix s:c_indicator s:ns_plain_safe_out s:c_flow_indicator s:ns_plain_safe_in s:ns_plain_first_in s:ns_plain_first_out s:ns_plain_char_in s:ns_plain_char_out s:ns_plain_out s:ns_plain_in s:ns_char_without_c_indicator s:ns_plain_safe_in_without_colhash s:ns_plain_safe_out_without_colhash
238unlet s:_collection s:_neg_collection
239delfunction s:SimplifyAdjacentCollections
240delfunction s:SimplifyToAssumeAllPrintable
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200241
Bram Moolenaar42eeac32005-06-29 22:40:58 +0000242let &cpo = s:cpo_save
243unlet s:cpo_save