xref: /vim-8.2.3635/runtime/syntax/yaml.vim (revision cb03397a)
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
7if exists('b:current_syntax')
8    finish
9endif
10
11let s:cpo_save = &cpo
12set cpo&vim
13
14" 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.'\|[#/;?:@&=+$,.!~*''()[\]]\)'
27let s:ns_tag_char  = '\%(%\x\x\|'.s:ns_word_char.'\|[#/;?:@&=+$.~*''()]\)'
28let 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)
48
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
76let 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:#]', '')
79
80let 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.'\)'
85
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
90syn keyword yamlTodo            contained TODO FIXME XXX NOTE
91
92syn region  yamlComment         display oneline start='\%\(^\|\s\)#' end='$'
93            \                   contains=yamlTodo
94
95execute 'syn region yamlDirective oneline start='.string('^\ze%'.s:ns_directive_name.'\s\+').' '.
96            \                            'end="$" '.
97            \                            'contains=yamlTAGDirective,'.
98            \                                     'yamlYAMLDirective,'.
99            \                                     'yamlReservedDirective '.
100            \                            'keepend'
101
102syn 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)
105
106syn match yamlYAMLDirective '%YAML\s\+'  contained nextgroup=yamlYAMLVersion
107syn match yamlYAMLVersion   '\d\+\.\d\+' contained nextgroup=yamlComment
108
109execute 'syn match yamlReservedDirective contained nextgroup=yamlComment '.
110            \string('%\%(\%(TAG\|YAML\)\s\)\@!'.s:ns_directive_name)
111
112syn 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 "''"
120
121syn match yamlBlockScalarHeader contained '\s\+\zs[|>]\%([+-]\=[1-9]\|[1-9]\=[+-]\)\='
122
123syn cluster yamlConstant contains=yamlBool,yamlNull
124
125syn cluster yamlFlow contains=yamlFlowString,yamlFlowMapping,yamlFlowCollection
126syn cluster yamlFlow      add=yamlFlowMappingKey,yamlFlowMappingMerge
127syn cluster yamlFlow      add=@yamlConstant,yamlPlainScalar,yamlFloat
128syn 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
132
133execute 'syn match yamlPlainScalar /'.s:ns_plain_out.'/'
134execute 'syn match yamlPlainScalar contained /'.s:ns_plain_in.'/'
135
136syn match yamlMappingKeyStart '?\ze\s'
137syn match yamlMappingKeyStart '?' contained
138
139execute 'syn match yamlFlowMappingKey /\%#=1'.s:ns_plain_in.'\%(\s\+'.s:ns_plain_in.'\)*\ze\s*:/ contained '.
140            \'nextgroup=yamlKeyValueDelimiter'
141syn match yamlFlowMappingMerge /<<\ze\s*:/ contained nextgroup=yamlKeyValueDelimiter
142
143syn match yamlBlockCollectionItemStart '^\s*\zs-\%(\s\+-\)*\s' nextgroup=yamlBlockMappingKey,yamlBlockMappingMerge
144" Use the old regexp engine, the NFA engine doesn't like all the \@ items.
145execute 'syn match yamlBlockMappingKey /\%#=1^\s*\zs'.s:ns_plain_out.'\%(\s\+'.s:ns_plain_out.'\)*\ze\s*:\%(\s\|$\)/ '.
146            \'nextgroup=yamlKeyValueDelimiter'
147execute 'syn match yamlBlockMappingKey /\%#=1\s*\zs'.s:ns_plain_out.'\%(\s\+'.s:ns_plain_out.'\)*\ze\s*:\%(\s\|$\)/ contained '.
148            \'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
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