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" removed duplicate yamlKeyValueDelimiter (pull #4799) 7 8if exists('b:current_syntax') 9 finish 10endif 11 12let s:cpo_save = &cpo 13set cpo&vim 14 15" Choose the schema to use 16" TODO: Validate schema 17if !exists('b:yaml_schema') 18 if exists('g:yaml_schema') 19 let b:yaml_schema = g:yaml_schema 20 else 21 let b:yaml_schema = 'core' 22 endif 23endif 24 25let s:ns_char = '\%([\n\r\uFEFF \t]\@!\p\)' 26let s:ns_word_char = '[[:alnum:]_\-]' 27let s:ns_uri_char = '\%(%\x\x\|'.s:ns_word_char.'\|[#/;?:@&=+$,.!~*''()[\]]\)' 28let s:ns_tag_char = '\%(%\x\x\|'.s:ns_word_char.'\|[#/;?:@&=+$.~*''()]\)' 29let s:c_ns_anchor_char = '\%([\n\r\uFEFF \t,[\]{}]\@!\p\)' 30let s:c_indicator = '[\-?:,[\]{}#&*!|>''"%@`]' 31let s:c_flow_indicator = '[,[\]{}]' 32 33let s:ns_char_without_c_indicator = substitute(s:ns_char, '\v\C[\zs', '\=s:c_indicator[1:-2]', '') 34 35let s:_collection = '[^\@!\(\%(\\\.\|\[^\\\]]\)\+\)]' 36let s:_neg_collection = '[^\(\%(\\\.\|\[^\\\]]\)\+\)]' 37function s:SimplifyToAssumeAllPrintable(p) 38 return substitute(a:p, '\V\C\\%('.s:_collection.'\\@!\\p\\)', '[^\1]', '') 39endfunction 40let s:ns_char = s:SimplifyToAssumeAllPrintable(s:ns_char) 41let s:ns_char_without_c_indicator = s:SimplifyToAssumeAllPrintable(s:ns_char_without_c_indicator) 42let s:c_ns_anchor_char = s:SimplifyToAssumeAllPrintable(s:c_ns_anchor_char) 43 44function s:SimplifyAdjacentCollections(p) 45 return substitute(a:p, '\V\C'.s:_collection.'\\|'.s:_collection, '[\1\2]', 'g') 46endfunction 47let s:ns_uri_char = s:SimplifyAdjacentCollections(s:ns_uri_char) 48let s:ns_tag_char = s:SimplifyAdjacentCollections(s:ns_tag_char) 49 50let s:c_verbatim_tag = '!<'.s:ns_uri_char.'\+>' 51let s:c_named_tag_handle = '!'.s:ns_word_char.'\+!' 52let s:c_secondary_tag_handle = '!!' 53let s:c_primary_tag_handle = '!' 54let s:c_tag_handle = '\%('.s:c_named_tag_handle. 55 \ '\|'.s:c_secondary_tag_handle. 56 \ '\|'.s:c_primary_tag_handle.'\)' 57let s:c_ns_shorthand_tag = s:c_tag_handle . s:ns_tag_char.'\+' 58let s:c_non_specific_tag = '!' 59let s:c_ns_tag_property = s:c_verbatim_tag. 60 \ '\|'.s:c_ns_shorthand_tag. 61 \ '\|'.s:c_non_specific_tag 62 63let s:c_ns_anchor_name = s:c_ns_anchor_char.'\+' 64let s:c_ns_anchor_property = '&'.s:c_ns_anchor_name 65let s:c_ns_alias_node = '\*'.s:c_ns_anchor_name 66 67let s:ns_directive_name = s:ns_char.'\+' 68 69let s:ns_local_tag_prefix = '!'.s:ns_uri_char.'*' 70let s:ns_global_tag_prefix = s:ns_tag_char.s:ns_uri_char.'*' 71let s:ns_tag_prefix = s:ns_local_tag_prefix. 72 \ '\|'.s:ns_global_tag_prefix 73 74let s:ns_plain_safe_out = s:ns_char 75let s:ns_plain_safe_in = '\%('.s:c_flow_indicator.'\@!'.s:ns_char.'\)' 76 77let s:ns_plain_safe_in = substitute(s:ns_plain_safe_in, '\V\C\\%('.s:_collection.'\\@!'.s:_neg_collection.'\\)', '[^\1\2]', '') 78let s:ns_plain_safe_in_without_colhash = substitute(s:ns_plain_safe_in, '\V\C'.s:_neg_collection, '[^\1:#]', '') 79let s:ns_plain_safe_out_without_colhash = substitute(s:ns_plain_safe_out, '\V\C'.s:_neg_collection, '[^\1:#]', '') 80 81let s:ns_plain_first_in = '\%('.s:ns_char_without_c_indicator.'\|[?:\-]\%('.s:ns_plain_safe_in.'\)\@=\)' 82let s:ns_plain_first_out = '\%('.s:ns_char_without_c_indicator.'\|[?:\-]\%('.s:ns_plain_safe_out.'\)\@=\)' 83 84let s:ns_plain_char_in = '\%('.s:ns_char.'#\|:'.s:ns_plain_safe_in.'\|'.s:ns_plain_safe_in_without_colhash.'\)' 85let s:ns_plain_char_out = '\%('.s:ns_char.'#\|:'.s:ns_plain_safe_out.'\|'.s:ns_plain_safe_out_without_colhash.'\)' 86 87let s:ns_plain_out = s:ns_plain_first_out . s:ns_plain_char_out.'*' 88let s:ns_plain_in = s:ns_plain_first_in . s:ns_plain_char_in.'*' 89 90 91syn keyword yamlTodo contained TODO FIXME XXX NOTE 92 93syn region yamlComment display oneline start='\%\(^\|\s\)#' end='$' 94 \ contains=yamlTodo 95 96execute 'syn region yamlDirective oneline start='.string('^\ze%'.s:ns_directive_name.'\s\+').' '. 97 \ 'end="$" '. 98 \ 'contains=yamlTAGDirective,'. 99 \ 'yamlYAMLDirective,'. 100 \ 'yamlReservedDirective '. 101 \ 'keepend' 102 103syn match yamlTAGDirective '%TAG\s\+' contained nextgroup=yamlTagHandle 104execute 'syn match yamlTagHandle contained nextgroup=yamlTagPrefix '.string(s:c_tag_handle.'\s\+') 105execute 'syn match yamlTagPrefix contained nextgroup=yamlComment ' . string(s:ns_tag_prefix) 106 107syn match yamlYAMLDirective '%YAML\s\+' contained nextgroup=yamlYAMLVersion 108syn match yamlYAMLVersion '\d\+\.\d\+' contained nextgroup=yamlComment 109 110execute 'syn match yamlReservedDirective contained nextgroup=yamlComment '. 111 \string('%\%(\%(TAG\|YAML\)\s\)\@!'.s:ns_directive_name) 112 113syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start='"' skip='\\"' end='"' 114 \ contains=yamlEscape 115 \ nextgroup=yamlKeyValueDelimiter 116syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start="'" skip="''" end="'" 117 \ contains=yamlSingleEscape 118 \ nextgroup=yamlKeyValueDelimiter 119syn match yamlEscape contained '\\\%([\\"abefnrtv\^0_ NLP\n]\|x\x\x\|u\x\{4}\|U\x\{8}\)' 120syn match yamlSingleEscape contained "''" 121 122syn match yamlBlockScalarHeader contained '\s\+\zs[|>]\%([+-]\=[1-9]\|[1-9]\=[+-]\)\=' 123 124syn cluster yamlConstant contains=yamlBool,yamlNull 125 126syn cluster yamlFlow contains=yamlFlowString,yamlFlowMapping,yamlFlowCollection 127syn cluster yamlFlow add=yamlFlowMappingKey,yamlFlowMappingMerge 128syn cluster yamlFlow add=@yamlConstant,yamlPlainScalar,yamlFloat 129syn cluster yamlFlow add=yamlTimestamp,yamlInteger,yamlMappingKeyStart 130syn cluster yamlFlow add=yamlComment 131syn region yamlFlowMapping matchgroup=yamlFlowIndicator start='{' end='}' contains=@yamlFlow 132syn region yamlFlowCollection matchgroup=yamlFlowIndicator start='\[' end='\]' contains=@yamlFlow 133 134execute 'syn match yamlPlainScalar /'.s:ns_plain_out.'/' 135execute 'syn match yamlPlainScalar contained /'.s:ns_plain_in.'/' 136 137syn match yamlMappingKeyStart '?\ze\s' 138syn match yamlMappingKeyStart '?' contained 139 140execute 'syn match yamlFlowMappingKey /\%#=1'.s:ns_plain_in.'\%(\s\+'.s:ns_plain_in.'\)*\ze\s*:/ contained '. 141 \'nextgroup=yamlKeyValueDelimiter' 142syn match yamlFlowMappingMerge /<<\ze\s*:/ contained nextgroup=yamlKeyValueDelimiter 143 144syn match yamlBlockCollectionItemStart '^\s*\zs-\%(\s\+-\)*\s' nextgroup=yamlBlockMappingKey,yamlBlockMappingMerge 145" Use the old regexp engine, the NFA engine doesn't like all the \@ items. 146execute 'syn match yamlBlockMappingKey /\%#=1^\s*\zs'.s:ns_plain_out.'\%(\s\+'.s:ns_plain_out.'\)*\ze\s*:\%(\s\|$\)/ '. 147 \'nextgroup=yamlKeyValueDelimiter' 148execute 'syn match yamlBlockMappingKey /\%#=1\s*\zs'.s:ns_plain_out.'\%(\s\+'.s:ns_plain_out.'\)*\ze\s*:\%(\s\|$\)/ contained '. 149 \'nextgroup=yamlKeyValueDelimiter' 150syn match yamlBlockMappingMerge /^\s*\zs<<\ze:\%(\s\|$\)/ nextgroup=yamlKeyValueDelimiter 151syn match yamlBlockMappingMerge /<<\ze\s*:\%(\s\|$\)/ nextgroup=yamlKeyValueDelimiter contained 152 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