blob: 073dbf74187b619d29c195b67e5a4a66141f5310 [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 Moolenaar483c5d82010-10-20 18:45:33 +02005" Latest Revision: 2010-10-08
Bram Moolenaar071d4272004-06-13 20:20:40 +00006
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +02007if exists('b:current_syntax')
8 finish
Bram Moolenaar071d4272004-06-13 20:20:40 +00009endif
10
Bram Moolenaar42eeac32005-06-29 22:40:58 +000011let s:cpo_save = &cpo
12set cpo&vim
Bram Moolenaar071d4272004-06-13 20:20:40 +000013
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020014let 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
Bram Moolenaare37d50a2008-08-06 17:06:04 +000059syn keyword yamlTodo contained TODO FIXME XXX NOTE
Bram Moolenaar071d4272004-06-13 20:20:40 +000060
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020061syn region yamlComment display oneline start='\%\(^\|\s\)#' end='$'
62 \ contains=yamlTodo
Bram Moolenaar071d4272004-06-13 20:20:40 +000063
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020064execute 'syn region yamlDirective oneline start='.string('^\ze%'.s:ns_directive_name.'\s\+').' '.
65 \ 'end="$" '.
66 \ 'contains=yamlTAGDirective,'.
67 \ 'yamlYAMLDirective,'.
68 \ 'yamlReservedDirective '.
69 \ 'keepend'
Bram Moolenaar071d4272004-06-13 20:20:40 +000070
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020071syn 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)
Bram Moolenaar071d4272004-06-13 20:20:40 +000074
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020075syn match yamlYAMLDirective '%YAML\s\+' contained nextgroup=yamlYAMLVersion
76syn match yamlYAMLVersion '\d\+\.\d\+' contained nextgroup=yamlComment
Bram Moolenaar071d4272004-06-13 20:20:40 +000077
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020078execute 'syn match yamlReservedDirective contained nextgroup=yamlComment '.
79 \string('%\%(\%(TAG\|YAML\)\s\)\@!'.s:ns_directive_name)
Bram Moolenaar42eeac32005-06-29 22:40:58 +000080
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020081syn 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 "''"
Bram Moolenaar071d4272004-06-13 20:20:40 +000089
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020090syn match yamlBlockScalarHeader contained '\s\+\zs[|>]\%([+-]\=[1-9]\|[1-9]\=[+-]\)\='
Bram Moolenaar071d4272004-06-13 20:20:40 +000091
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020092syn 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
Bram Moolenaar071d4272004-06-13 20:20:40 +000099
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200100execute 'syn match yamlPlainScalar /'.s:ns_plain_out.'/'
101execute 'syn match yamlPlainScalar contained /'.s:ns_plain_in.'/'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000102
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200103syn match yamlMappingKeyStart '?\ze\s'
104syn match yamlMappingKeyStart '?' contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000105
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200106execute 'syn match yamlFlowMappingKey /'.s:ns_plain_in.'\ze\s*:/ contained '.
107 \'nextgroup=yamlKeyValueDelimiter'
108syn match yamlFlowMappingMerge /<<\ze\s*:/ contained nextgroup=yamlKeyValueDelimiter
Bram Moolenaar071d4272004-06-13 20:20:40 +0000109
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200110syn match yamlBlockCollectionItemStart '^\s*\zs-\%(\s\+-\)*\s' nextgroup=yamlBlockMappingKey,yamlBlockMappingMerge
Bram Moolenaar7cba6c02013-09-05 22:13:31 +0200111" 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\|$\)/ '.
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200113 \'nextgroup=yamlKeyValueDelimiter'
Bram Moolenaar7cba6c02013-09-05 22:13:31 +0200114execute 'syn match yamlBlockMappingKey /\%#=1\s*\zs'.s:ns_plain_out.'\ze\s*:\%(\s\|$\)/ contained '.
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200115 \'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
Bram Moolenaar483c5d82010-10-20 18:45:33 +0200128syn 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\)\@!/
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200129syn 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000180
181let b:current_syntax = "yaml"
182
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200183unlet 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
Bram Moolenaar42eeac32005-06-29 22:40:58 +0000185let &cpo = s:cpo_save
186unlet s:cpo_save
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200187