xref: /vim-8.2.3635/runtime/syntax/yaml.vim (revision dee2e315)
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:  2010-10-08
6
7if exists('b:current_syntax')
8    finish
9endif
10
11let s:cpo_save = &cpo
12set cpo&vim
13
14let s:ns_char = '\%(\%([\n\r\uFEFF \t]\)\@!\p\)'
15let s:ns_word_char = '\%(\w\|-\)'
16let s:ns_uri_char  = '\%(%\x\x\|'.s:ns_word_char.'\|[#/;?:@&=+$,.!~*''()\[\]]\)'
17let s:ns_tag_char  = '\%(%\x\x\|'.s:ns_word_char.'\|[#/;?:@&=+$.~*''()]\)'
18let s:c_ns_anchor_char = '\%(\%([\n\r\uFEFF \t,\[\]{}]\)\@!\p\)'
19let s:c_indicator      = '[\-?:,\[\]{}#&*!|>''"%@`]'
20let s:c_flow_indicator = '[,\[\]{}]'
21
22let s:c_verbatim_tag = '!<'.s:ns_uri_char.'\+>'
23let s:c_named_tag_handle     = '!'.s:ns_word_char.'\+!'
24let s:c_secondary_tag_handle = '!!'
25let s:c_primary_tag_handle   = '!'
26let s:c_tag_handle = '\%('.s:c_named_tag_handle.
27            \         '\|'.s:c_secondary_tag_handle.
28            \         '\|'.s:c_primary_tag_handle.'\)'
29let s:c_ns_shorthand_tag = s:c_tag_handle . s:ns_tag_char.'\+'
30let s:c_non_specific_tag = '!'
31let s:c_ns_tag_property = s:c_verbatim_tag.
32            \        '\|'.s:c_ns_shorthand_tag.
33            \        '\|'.s:c_non_specific_tag
34
35let s:c_ns_anchor_name = s:c_ns_anchor_char.'\+'
36let s:c_ns_anchor_property =  '&'.s:c_ns_anchor_name
37let s:c_ns_alias_node      = '\*'.s:c_ns_anchor_name
38
39let s:ns_directive_name = s:ns_char.'\+'
40
41let s:ns_local_tag_prefix  = '!'.s:ns_uri_char.'*'
42let s:ns_global_tag_prefix = s:ns_tag_char.s:ns_uri_char.'*'
43let s:ns_tag_prefix = s:ns_local_tag_prefix.
44            \    '\|'.s:ns_global_tag_prefix
45
46let s:ns_plain_safe_out = s:ns_char
47let s:ns_plain_safe_in  = '\%('.s:c_flow_indicator.'\@!'.s:ns_char.'\)'
48
49let s:ns_plain_first_in  = '\%('.s:c_indicator.'\@!'.s:ns_char.'\|[?:\-]\%('.s:ns_plain_safe_in.'\)\@=\)'
50let s:ns_plain_first_out = '\%('.s:c_indicator.'\@!'.s:ns_char.'\|[?:\-]\%('.s:ns_plain_safe_out.'\)\@=\)'
51
52let s:ns_plain_char_in  = '\%('.s:ns_char.'#\|:'.s:ns_plain_safe_in.'\|[:#]\@!'.s:ns_plain_safe_in.'\)'
53let s:ns_plain_char_out = '\%('.s:ns_char.'#\|:'.s:ns_plain_safe_out.'\|[:#]\@!'.s:ns_plain_safe_out.'\)'
54
55let s:ns_plain_out = s:ns_plain_first_out . s:ns_plain_char_out.'*'
56let s:ns_plain_in  = s:ns_plain_first_in  . s:ns_plain_char_in.'*'
57
58
59syn keyword yamlTodo            contained TODO FIXME XXX NOTE
60
61syn region  yamlComment         display oneline start='\%\(^\|\s\)#' end='$'
62            \                   contains=yamlTodo
63
64execute 'syn region yamlDirective oneline start='.string('^\ze%'.s:ns_directive_name.'\s\+').' '.
65            \                            'end="$" '.
66            \                            'contains=yamlTAGDirective,'.
67            \                                     'yamlYAMLDirective,'.
68            \                                     'yamlReservedDirective '.
69            \                            'keepend'
70
71syn match yamlTAGDirective '%TAG\s\+' contained nextgroup=yamlTagHandle
72execute 'syn match yamlTagHandle contained nextgroup=yamlTagPrefix '.string(s:c_tag_handle.'\s\+')
73execute 'syn match yamlTagPrefix contained nextgroup=yamlComment ' . string(s:ns_tag_prefix)
74
75syn match yamlYAMLDirective '%YAML\s\+'  contained nextgroup=yamlYAMLVersion
76syn match yamlYAMLVersion   '\d\+\.\d\+' contained nextgroup=yamlComment
77
78execute 'syn match yamlReservedDirective contained nextgroup=yamlComment '.
79            \string('%\%(\%(TAG\|YAML\)\s\)\@!'.s:ns_directive_name)
80
81syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start='"' skip='\\"' end='"'
82            \ contains=yamlEscape
83            \ nextgroup=yamlKeyValueDelimiter
84syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start="'" skip="''"  end="'"
85            \ contains=yamlSingleEscape
86            \ nextgroup=yamlKeyValueDelimiter
87syn match  yamlEscape contained '\\\%([\\"abefnrtv\^0_ NLP\n]\|x\x\x\|u\x\{4}\|U\x\{8}\)'
88syn match  yamlSingleEscape contained "''"
89
90syn match yamlBlockScalarHeader contained '\s\+\zs[|>]\%([+-]\=[1-9]\|[1-9]\=[+-]\)\='
91
92syn cluster yamlFlow contains=yamlFlowString,yamlFlowMapping,yamlFlowCollection
93syn cluster yamlFlow      add=yamlFlowMappingKey,yamlFlowMappingMerge
94syn cluster yamlFlow      add=yamlConstant,yamlPlainScalar,yamlFloat
95syn cluster yamlFlow      add=yamlTimestamp,yamlInteger,yamlMappingKeyStart
96syn cluster yamlFlow      add=yamlComment
97syn region yamlFlowMapping    matchgroup=yamlFlowIndicator start='{' end='}' contains=@yamlFlow
98syn region yamlFlowCollection matchgroup=yamlFlowIndicator start='\[' end='\]' contains=@yamlFlow
99
100execute 'syn match yamlPlainScalar /'.s:ns_plain_out.'/'
101execute 'syn match yamlPlainScalar contained /'.s:ns_plain_in.'/'
102
103syn match yamlMappingKeyStart '?\ze\s'
104syn match yamlMappingKeyStart '?' contained
105
106execute 'syn match yamlFlowMappingKey /'.s:ns_plain_in.'\ze\s*:/ contained '.
107            \'nextgroup=yamlKeyValueDelimiter'
108syn match yamlFlowMappingMerge /<<\ze\s*:/ contained nextgroup=yamlKeyValueDelimiter
109
110syn match yamlBlockCollectionItemStart '^\s*\zs-\%(\s\+-\)*\s' nextgroup=yamlBlockMappingKey,yamlBlockMappingMerge
111execute 'syn match yamlBlockMappingKey /^\s*\zs'.s:ns_plain_out.'\ze\s*:\%(\s\|$\)/ '.
112            \'nextgroup=yamlKeyValueDelimiter'
113execute 'syn match yamlBlockMappingKey /\s*\zs'.s:ns_plain_out.'\ze\s*:\%(\s\|$\)/ contained '.
114            \'nextgroup=yamlKeyValueDelimiter'
115syn match yamlBlockMappingMerge /^\s*\zs<<\ze:\%(\s\|$\)/ nextgroup=yamlKeyValueDelimiter
116syn match yamlBlockMappingMerge /<<\ze\s*:\%(\s\|$\)/ nextgroup=yamlKeyValueDelimiter contained
117
118syn match   yamlKeyValueDelimiter /\s*:/ contained
119syn match   yamlKeyValueDelimiter /\s*:/ contained
120
121syn keyword yamlConstant true True TRUE false False FALSE
122syn keyword yamlConstant null Null NULL
123syn match   yamlConstant '\<\~\>'
124
125syn match   yamlTimestamp /\%([\[\]{}, \t]\@!\p\)\@<!\%(\d\{4}-\d\d\=-\d\d\=\%(\%([Tt]\|\s\+\)\%(\d\d\=\):\%(\d\d\):\%(\d\d\)\%(\.\%(\d*\)\)\=\%(\s*\%(Z\|[+-]\d\d\=\%(:\d\d\)\=\)\)\=\)\=\)\%([\[\]{}, \t]\@!\p\)\@!/
126
127syn match   yamlInteger /\%([\[\]{}, \t]\@!\p\)\@<!\%([+-]\=\%(0\%(b[0-1_]\+\|[0-7_]\+\|x[0-9a-fA-F_]\+\)\=\|\%([1-9][0-9_]*\%(:[0-5]\=\d\)\+\)\)\|[1-9][0-9_]*\)\%([\[\]{}, \t]\@!\p\)\@!/
128syn match   yamlFloat   /\%([\[\]{}, \t]\@!\p\)\@<!\%([+-]\=\%(\%(\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\)\)\)\%([\[\]{}, \t]\@!\p\)\@!/
129
130execute 'syn match yamlNodeTag '.string(s:c_ns_tag_property)
131execute 'syn match yamlAnchor  '.string(s:c_ns_anchor_property)
132execute 'syn match yamlAlias   '.string(s:c_ns_alias_node)
133
134syn match yamlDocumentStart '^---\ze\%(\s\|$\)'
135syn match yamlDocumentEnd   '^\.\.\.\ze\%(\s\|$\)'
136
137hi def link yamlTodo                     Todo
138hi def link yamlComment                  Comment
139
140hi def link yamlDocumentStart            PreProc
141hi def link yamlDocumentEnd              PreProc
142
143hi def link yamlDirectiveName            Keyword
144
145hi def link yamlTAGDirective             yamlDirectiveName
146hi def link yamlTagHandle                String
147hi def link yamlTagPrefix                String
148
149hi def link yamlYAMLDirective            yamlDirectiveName
150hi def link yamlReservedDirective        Error
151hi def link yamlYAMLVersion              Number
152
153hi def link yamlString                   String
154hi def link yamlFlowString               yamlString
155hi def link yamlFlowStringDelimiter      yamlString
156hi def link yamlEscape                   SpecialChar
157hi def link yamlSingleEscape             SpecialChar
158
159hi def link yamlBlockCollectionItemStart Label
160hi def link yamlBlockMappingKey          Identifier
161hi def link yamlBlockMappingMerge        Special
162
163hi def link yamlFlowMappingKey           Identifier
164hi def link yamlFlowMappingMerge         Special
165
166hi def link yamlMappingKeyStart          Special
167hi def link yamlFlowIndicator            Special
168hi def link yamlKeyValueDelimiter        Special
169
170hi def link yamlConstant                 Constant
171
172hi def link yamlAnchor                   Type
173hi def link yamlAlias                    Type
174hi def link yamlNodeTag                  Type
175
176hi def link yamlInteger                  Number
177hi def link yamlFloat                    Float
178hi def link yamlTimestamp                Number
179
180let b:current_syntax = "yaml"
181
182unlet 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
183
184let &cpo = s:cpo_save
185unlet s:cpo_save
186
187