xref: /vim-8.2.3635/runtime/syntax/yaml.vim (revision e968e36a)
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
111" Use the old regexp engine, the NFA engine doesn't like all the \@ items.
112execute 'syn match yamlBlockMappingKey /\%#=1^\s*\zs'.s:ns_plain_out.'\ze\s*:\%(\s\|$\)/ '.
113            \'nextgroup=yamlKeyValueDelimiter'
114execute 'syn match yamlBlockMappingKey /\%#=1\s*\zs'.s:ns_plain_out.'\ze\s*:\%(\s\|$\)/ contained '.
115            \'nextgroup=yamlKeyValueDelimiter'
116syn match yamlBlockMappingMerge /^\s*\zs<<\ze:\%(\s\|$\)/ nextgroup=yamlKeyValueDelimiter
117syn match yamlBlockMappingMerge /<<\ze\s*:\%(\s\|$\)/ nextgroup=yamlKeyValueDelimiter contained
118
119syn match   yamlKeyValueDelimiter /\s*:/ contained
120syn match   yamlKeyValueDelimiter /\s*:/ contained
121
122syn keyword yamlConstant true True TRUE false False FALSE
123syn keyword yamlConstant null Null NULL
124syn match   yamlConstant '\<\~\>'
125
126syn 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\)\@!/
127
128syn 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\)\@!/
129syn 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\)\@!/
130
131execute 'syn match yamlNodeTag '.string(s:c_ns_tag_property)
132execute 'syn match yamlAnchor  '.string(s:c_ns_anchor_property)
133execute 'syn match yamlAlias   '.string(s:c_ns_alias_node)
134
135syn match yamlDocumentStart '^---\ze\%(\s\|$\)'
136syn match yamlDocumentEnd   '^\.\.\.\ze\%(\s\|$\)'
137
138hi def link yamlTodo                     Todo
139hi def link yamlComment                  Comment
140
141hi def link yamlDocumentStart            PreProc
142hi def link yamlDocumentEnd              PreProc
143
144hi def link yamlDirectiveName            Keyword
145
146hi def link yamlTAGDirective             yamlDirectiveName
147hi def link yamlTagHandle                String
148hi def link yamlTagPrefix                String
149
150hi def link yamlYAMLDirective            yamlDirectiveName
151hi def link yamlReservedDirective        Error
152hi def link yamlYAMLVersion              Number
153
154hi def link yamlString                   String
155hi def link yamlFlowString               yamlString
156hi def link yamlFlowStringDelimiter      yamlString
157hi def link yamlEscape                   SpecialChar
158hi def link yamlSingleEscape             SpecialChar
159
160hi def link yamlBlockCollectionItemStart Label
161hi def link yamlBlockMappingKey          Identifier
162hi def link yamlBlockMappingMerge        Special
163
164hi def link yamlFlowMappingKey           Identifier
165hi def link yamlFlowMappingMerge         Special
166
167hi def link yamlMappingKeyStart          Special
168hi def link yamlFlowIndicator            Special
169hi def link yamlKeyValueDelimiter        Special
170
171hi def link yamlConstant                 Constant
172
173hi def link yamlAnchor                   Type
174hi def link yamlAlias                    Type
175hi def link yamlNodeTag                  Type
176
177hi def link yamlInteger                  Number
178hi def link yamlFloat                    Float
179hi def link yamlTimestamp                Number
180
181let b:current_syntax = "yaml"
182
183unlet 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
184
185let &cpo = s:cpo_save
186unlet s:cpo_save
187
188