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