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