blob: 49f7d049a7db56d67a4576244a1fc9785bfdf174 [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 Moolenaar8fe10002019-09-11 22:56:44 +02006" removed duplicate yamlKeyValueDelimiter (pull #4799)
Bram Moolenaar071d4272004-06-13 20:20:40 +00007
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +02008if exists('b:current_syntax')
9 finish
Bram Moolenaar071d4272004-06-13 20:20:40 +000010endif
11
Bram Moolenaar42eeac32005-06-29 22:40:58 +000012let s:cpo_save = &cpo
13set cpo&vim
Bram Moolenaar071d4272004-06-13 20:20:40 +000014
Bram Moolenaar5a5f4592015-04-13 12:43:06 +020015" Choose the schema to use
16" TODO: Validate schema
17if !exists('b:yaml_schema')
18 if exists('g:yaml_schema')
19 let b:yaml_schema = g:yaml_schema
20 else
21 let b:yaml_schema = 'core'
22 endif
23endif
24
25let s:ns_char = '\%([\n\r\uFEFF \t]\@!\p\)'
26let s:ns_word_char = '[[:alnum:]_\-]'
27let s:ns_uri_char = '\%(%\x\x\|'.s:ns_word_char.'\|[#/;?:@&=+$,.!~*''()[\]]\)'
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020028let s:ns_tag_char = '\%(%\x\x\|'.s:ns_word_char.'\|[#/;?:@&=+$.~*''()]\)'
Bram Moolenaar5a5f4592015-04-13 12:43:06 +020029let s:c_ns_anchor_char = '\%([\n\r\uFEFF \t,[\]{}]\@!\p\)'
30let s:c_indicator = '[\-?:,[\]{}#&*!|>''"%@`]'
31let s:c_flow_indicator = '[,[\]{}]'
32
33let s:ns_char_without_c_indicator = substitute(s:ns_char, '\v\C[\zs', '\=s:c_indicator[1:-2]', '')
34
35let s:_collection = '[^\@!\(\%(\\\.\|\[^\\\]]\)\+\)]'
36let s:_neg_collection = '[^\(\%(\\\.\|\[^\\\]]\)\+\)]'
37function s:SimplifyToAssumeAllPrintable(p)
38 return substitute(a:p, '\V\C\\%('.s:_collection.'\\@!\\p\\)', '[^\1]', '')
39endfunction
40let s:ns_char = s:SimplifyToAssumeAllPrintable(s:ns_char)
41let s:ns_char_without_c_indicator = s:SimplifyToAssumeAllPrintable(s:ns_char_without_c_indicator)
42let s:c_ns_anchor_char = s:SimplifyToAssumeAllPrintable(s:c_ns_anchor_char)
43
44function s:SimplifyAdjacentCollections(p)
45 return substitute(a:p, '\V\C'.s:_collection.'\\|'.s:_collection, '[\1\2]', 'g')
46endfunction
47let s:ns_uri_char = s:SimplifyAdjacentCollections(s:ns_uri_char)
48let s:ns_tag_char = s:SimplifyAdjacentCollections(s:ns_tag_char)
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020049
50let s:c_verbatim_tag = '!<'.s:ns_uri_char.'\+>'
51let s:c_named_tag_handle = '!'.s:ns_word_char.'\+!'
52let s:c_secondary_tag_handle = '!!'
53let s:c_primary_tag_handle = '!'
54let s:c_tag_handle = '\%('.s:c_named_tag_handle.
55 \ '\|'.s:c_secondary_tag_handle.
56 \ '\|'.s:c_primary_tag_handle.'\)'
57let s:c_ns_shorthand_tag = s:c_tag_handle . s:ns_tag_char.'\+'
58let s:c_non_specific_tag = '!'
59let s:c_ns_tag_property = s:c_verbatim_tag.
60 \ '\|'.s:c_ns_shorthand_tag.
61 \ '\|'.s:c_non_specific_tag
62
63let s:c_ns_anchor_name = s:c_ns_anchor_char.'\+'
64let s:c_ns_anchor_property = '&'.s:c_ns_anchor_name
65let s:c_ns_alias_node = '\*'.s:c_ns_anchor_name
66
67let s:ns_directive_name = s:ns_char.'\+'
68
69let s:ns_local_tag_prefix = '!'.s:ns_uri_char.'*'
70let s:ns_global_tag_prefix = s:ns_tag_char.s:ns_uri_char.'*'
71let s:ns_tag_prefix = s:ns_local_tag_prefix.
72 \ '\|'.s:ns_global_tag_prefix
73
74let s:ns_plain_safe_out = s:ns_char
75let s:ns_plain_safe_in = '\%('.s:c_flow_indicator.'\@!'.s:ns_char.'\)'
76
Bram Moolenaar5a5f4592015-04-13 12:43:06 +020077let s:ns_plain_safe_in = substitute(s:ns_plain_safe_in, '\V\C\\%('.s:_collection.'\\@!'.s:_neg_collection.'\\)', '[^\1\2]', '')
78let s:ns_plain_safe_in_without_colhash = substitute(s:ns_plain_safe_in, '\V\C'.s:_neg_collection, '[^\1:#]', '')
79let 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 +020080
Bram Moolenaar5a5f4592015-04-13 12:43:06 +020081let s:ns_plain_first_in = '\%('.s:ns_char_without_c_indicator.'\|[?:\-]\%('.s:ns_plain_safe_in.'\)\@=\)'
82let s:ns_plain_first_out = '\%('.s:ns_char_without_c_indicator.'\|[?:\-]\%('.s:ns_plain_safe_out.'\)\@=\)'
83
84let s:ns_plain_char_in = '\%('.s:ns_char.'#\|:'.s:ns_plain_safe_in.'\|'.s:ns_plain_safe_in_without_colhash.'\)'
85let 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 +020086
87let s:ns_plain_out = s:ns_plain_first_out . s:ns_plain_char_out.'*'
88let s:ns_plain_in = s:ns_plain_first_in . s:ns_plain_char_in.'*'
89
90
Bram Moolenaare37d50a2008-08-06 17:06:04 +000091syn keyword yamlTodo contained TODO FIXME XXX NOTE
Bram Moolenaar071d4272004-06-13 20:20:40 +000092
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020093syn region yamlComment display oneline start='\%\(^\|\s\)#' end='$'
94 \ contains=yamlTodo
Bram Moolenaar071d4272004-06-13 20:20:40 +000095
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020096execute 'syn region yamlDirective oneline start='.string('^\ze%'.s:ns_directive_name.'\s\+').' '.
97 \ 'end="$" '.
98 \ 'contains=yamlTAGDirective,'.
99 \ 'yamlYAMLDirective,'.
100 \ 'yamlReservedDirective '.
101 \ 'keepend'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000102
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200103syn match yamlTAGDirective '%TAG\s\+' contained nextgroup=yamlTagHandle
104execute 'syn match yamlTagHandle contained nextgroup=yamlTagPrefix '.string(s:c_tag_handle.'\s\+')
105execute 'syn match yamlTagPrefix contained nextgroup=yamlComment ' . string(s:ns_tag_prefix)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000106
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200107syn match yamlYAMLDirective '%YAML\s\+' contained nextgroup=yamlYAMLVersion
108syn match yamlYAMLVersion '\d\+\.\d\+' contained nextgroup=yamlComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000109
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200110execute 'syn match yamlReservedDirective contained nextgroup=yamlComment '.
111 \string('%\%(\%(TAG\|YAML\)\s\)\@!'.s:ns_directive_name)
Bram Moolenaar42eeac32005-06-29 22:40:58 +0000112
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200113syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start='"' skip='\\"' end='"'
114 \ contains=yamlEscape
115 \ nextgroup=yamlKeyValueDelimiter
116syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start="'" skip="''" end="'"
117 \ contains=yamlSingleEscape
118 \ nextgroup=yamlKeyValueDelimiter
119syn match yamlEscape contained '\\\%([\\"abefnrtv\^0_ NLP\n]\|x\x\x\|u\x\{4}\|U\x\{8}\)'
120syn match yamlSingleEscape contained "''"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000121
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200122syn match yamlBlockScalarHeader contained '\s\+\zs[|>]\%([+-]\=[1-9]\|[1-9]\=[+-]\)\='
Bram Moolenaar071d4272004-06-13 20:20:40 +0000123
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200124syn cluster yamlConstant contains=yamlBool,yamlNull
125
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200126syn cluster yamlFlow contains=yamlFlowString,yamlFlowMapping,yamlFlowCollection
127syn cluster yamlFlow add=yamlFlowMappingKey,yamlFlowMappingMerge
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200128syn cluster yamlFlow add=@yamlConstant,yamlPlainScalar,yamlFloat
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200129syn cluster yamlFlow add=yamlTimestamp,yamlInteger,yamlMappingKeyStart
130syn cluster yamlFlow add=yamlComment
131syn region yamlFlowMapping matchgroup=yamlFlowIndicator start='{' end='}' contains=@yamlFlow
132syn region yamlFlowCollection matchgroup=yamlFlowIndicator start='\[' end='\]' contains=@yamlFlow
Bram Moolenaar071d4272004-06-13 20:20:40 +0000133
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200134execute 'syn match yamlPlainScalar /'.s:ns_plain_out.'/'
135execute 'syn match yamlPlainScalar contained /'.s:ns_plain_in.'/'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000136
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200137syn match yamlMappingKeyStart '?\ze\s'
138syn match yamlMappingKeyStart '?' contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000139
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200140execute 'syn match yamlFlowMappingKey /\%#=1'.s:ns_plain_in.'\%(\s\+'.s:ns_plain_in.'\)*\ze\s*:/ contained '.
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200141 \'nextgroup=yamlKeyValueDelimiter'
142syn match yamlFlowMappingMerge /<<\ze\s*:/ contained nextgroup=yamlKeyValueDelimiter
Bram Moolenaar071d4272004-06-13 20:20:40 +0000143
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200144syn match yamlBlockCollectionItemStart '^\s*\zs-\%(\s\+-\)*\s' nextgroup=yamlBlockMappingKey,yamlBlockMappingMerge
Bram Moolenaar7cba6c02013-09-05 22:13:31 +0200145" Use the old regexp engine, the NFA engine doesn't like all the \@ items.
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200146execute '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 +0200147 \'nextgroup=yamlKeyValueDelimiter'
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200148execute '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 +0200149 \'nextgroup=yamlKeyValueDelimiter'
150syn match yamlBlockMappingMerge /^\s*\zs<<\ze:\%(\s\|$\)/ nextgroup=yamlKeyValueDelimiter
151syn match yamlBlockMappingMerge /<<\ze\s*:\%(\s\|$\)/ nextgroup=yamlKeyValueDelimiter contained
152
153syn match yamlKeyValueDelimiter /\s*:/ contained
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200154
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