xref: /vim-8.2.3635/runtime/syntax/yaml.vim (revision 8fe1000e)
1" Vim syntax file
2" Language:         YAML (YAML Ain't Markup Language) 1.2
3" Maintainer:       Nikolai Pavlov <[email protected]>
4" First author:     Nikolai Weibull <[email protected]>
5" Latest Revision:  2015-03-28
6" 		    removed duplicate yamlKeyValueDelimiter (pull #4799)
7
8if exists('b:current_syntax')
9    finish
10endif
11
12let s:cpo_save = &cpo
13set cpo&vim
14
15" 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.'\|[#/;?:@&=+$,.!~*''()[\]]\)'
28let s:ns_tag_char  = '\%(%\x\x\|'.s:ns_word_char.'\|[#/;?:@&=+$.~*''()]\)'
29let 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)
49
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
77let 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:#]', '')
80
81let 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.'\)'
86
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
91syn keyword yamlTodo            contained TODO FIXME XXX NOTE
92
93syn region  yamlComment         display oneline start='\%\(^\|\s\)#' end='$'
94            \                   contains=yamlTodo
95
96execute 'syn region yamlDirective oneline start='.string('^\ze%'.s:ns_directive_name.'\s\+').' '.
97            \                            'end="$" '.
98            \                            'contains=yamlTAGDirective,'.
99            \                                     'yamlYAMLDirective,'.
100            \                                     'yamlReservedDirective '.
101            \                            'keepend'
102
103syn 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)
106
107syn match yamlYAMLDirective '%YAML\s\+'  contained nextgroup=yamlYAMLVersion
108syn match yamlYAMLVersion   '\d\+\.\d\+' contained nextgroup=yamlComment
109
110execute 'syn match yamlReservedDirective contained nextgroup=yamlComment '.
111            \string('%\%(\%(TAG\|YAML\)\s\)\@!'.s:ns_directive_name)
112
113syn 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 "''"
121
122syn match yamlBlockScalarHeader contained '\s\+\zs[|>]\%([+-]\=[1-9]\|[1-9]\=[+-]\)\='
123
124syn cluster yamlConstant contains=yamlBool,yamlNull
125
126syn cluster yamlFlow contains=yamlFlowString,yamlFlowMapping,yamlFlowCollection
127syn cluster yamlFlow      add=yamlFlowMappingKey,yamlFlowMappingMerge
128syn cluster yamlFlow      add=@yamlConstant,yamlPlainScalar,yamlFloat
129syn 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
133
134execute 'syn match yamlPlainScalar /'.s:ns_plain_out.'/'
135execute 'syn match yamlPlainScalar contained /'.s:ns_plain_in.'/'
136
137syn match yamlMappingKeyStart '?\ze\s'
138syn match yamlMappingKeyStart '?' contained
139
140execute 'syn match yamlFlowMappingKey /\%#=1'.s:ns_plain_in.'\%(\s\+'.s:ns_plain_in.'\)*\ze\s*:/ contained '.
141            \'nextgroup=yamlKeyValueDelimiter'
142syn match yamlFlowMappingMerge /<<\ze\s*:/ contained nextgroup=yamlKeyValueDelimiter
143
144syn match yamlBlockCollectionItemStart '^\s*\zs-\%(\s\+-\)*\s' nextgroup=yamlBlockMappingKey,yamlBlockMappingMerge
145" Use the old regexp engine, the NFA engine doesn't like all the \@ items.
146execute 'syn match yamlBlockMappingKey /\%#=1^\s*\zs'.s:ns_plain_out.'\%(\s\+'.s:ns_plain_out.'\)*\ze\s*:\%(\s\|$\)/ '.
147            \'nextgroup=yamlKeyValueDelimiter'
148execute 'syn match yamlBlockMappingKey /\%#=1\s*\zs'.s:ns_plain_out.'\%(\s\+'.s:ns_plain_out.'\)*\ze\s*:\%(\s\|$\)/ contained '.
149            \'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
154
155syn cluster yamlScalarWithSpecials contains=yamlPlainScalar,yamlBlockMappingKey,yamlFlowMappingKey
156
157let 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
180
181
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
224hi def link yamlNull                     yamlConstant
225hi def link yamlBool                     yamlConstant
226
227hi 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
234
235let b:current_syntax = "yaml"
236
237unlet 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
241
242let &cpo = s:cpo_save
243unlet s:cpo_save
244