yaml.vim 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. " Vim syntax file
  2. " 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>
  5. " Latest Revision: 2015-03-28
  6. if exists('b:current_syntax')
  7. finish
  8. endif
  9. let s:cpo_save = &cpo
  10. set cpo&vim
  11. " Choose the schema to use
  12. " TODO: Validate schema
  13. if !exists('b:yaml_schema')
  14. if exists('g:yaml_schema')
  15. let b:yaml_schema = g:yaml_schema
  16. else
  17. let b:yaml_schema = 'core'
  18. endif
  19. endif
  20. let s:ns_char = '\%([\n\r\uFEFF \t]\@!\p\)'
  21. let s:ns_word_char = '[[:alnum:]_\-]'
  22. let s:ns_uri_char = '\%(%\x\x\|'.s:ns_word_char.'\|[#/;?:@&=+$,.!~*''()[\]]\)'
  23. let s:ns_tag_char = '\%(%\x\x\|'.s:ns_word_char.'\|[#/;?:@&=+$.~*''()]\)'
  24. let s:c_ns_anchor_char = '\%([\n\r\uFEFF \t,[\]{}]\@!\p\)'
  25. let s:c_indicator = '[\-?:,[\]{}#&*!|>''"%@`]'
  26. let s:c_flow_indicator = '[,[\]{}]'
  27. let s:ns_char_without_c_indicator = substitute(s:ns_char, '\v\C[\zs', '\=s:c_indicator[1:-2]', '')
  28. let s:_collection = '[^\@!\(\%(\\\.\|\[^\\\]]\)\+\)]'
  29. let s:_neg_collection = '[^\(\%(\\\.\|\[^\\\]]\)\+\)]'
  30. function s:SimplifyToAssumeAllPrintable(p)
  31. return substitute(a:p, '\V\C\\%('.s:_collection.'\\@!\\p\\)', '[^\1]', '')
  32. endfunction
  33. let s:ns_char = s:SimplifyToAssumeAllPrintable(s:ns_char)
  34. let s:ns_char_without_c_indicator = s:SimplifyToAssumeAllPrintable(s:ns_char_without_c_indicator)
  35. let s:c_ns_anchor_char = s:SimplifyToAssumeAllPrintable(s:c_ns_anchor_char)
  36. function s:SimplifyAdjacentCollections(p)
  37. return substitute(a:p, '\V\C'.s:_collection.'\\|'.s:_collection, '[\1\2]', 'g')
  38. endfunction
  39. let s:ns_uri_char = s:SimplifyAdjacentCollections(s:ns_uri_char)
  40. let s:ns_tag_char = s:SimplifyAdjacentCollections(s:ns_tag_char)
  41. let s:c_verbatim_tag = '!<'.s:ns_uri_char.'\+>'
  42. let s:c_named_tag_handle = '!'.s:ns_word_char.'\+!'
  43. let s:c_secondary_tag_handle = '!!'
  44. let s:c_primary_tag_handle = '!'
  45. let s:c_tag_handle = '\%('.s:c_named_tag_handle.
  46. \ '\|'.s:c_secondary_tag_handle.
  47. \ '\|'.s:c_primary_tag_handle.'\)'
  48. let s:c_ns_shorthand_tag = s:c_tag_handle . s:ns_tag_char.'\+'
  49. let s:c_non_specific_tag = '!'
  50. let s:c_ns_tag_property = s:c_verbatim_tag.
  51. \ '\|'.s:c_ns_shorthand_tag.
  52. \ '\|'.s:c_non_specific_tag
  53. let s:c_ns_anchor_name = s:c_ns_anchor_char.'\+'
  54. let s:c_ns_anchor_property = '&'.s:c_ns_anchor_name
  55. let s:c_ns_alias_node = '\*'.s:c_ns_anchor_name
  56. let s:ns_directive_name = s:ns_char.'\+'
  57. let s:ns_local_tag_prefix = '!'.s:ns_uri_char.'*'
  58. let s:ns_global_tag_prefix = s:ns_tag_char.s:ns_uri_char.'*'
  59. let s:ns_tag_prefix = s:ns_local_tag_prefix.
  60. \ '\|'.s:ns_global_tag_prefix
  61. let s:ns_plain_safe_out = s:ns_char
  62. let s:ns_plain_safe_in = '\%('.s:c_flow_indicator.'\@!'.s:ns_char.'\)'
  63. let s:ns_plain_safe_in = substitute(s:ns_plain_safe_in, '\V\C\\%('.s:_collection.'\\@!'.s:_neg_collection.'\\)', '[^\1\2]', '')
  64. let s:ns_plain_safe_in_without_colhash = substitute(s:ns_plain_safe_in, '\V\C'.s:_neg_collection, '[^\1:#]', '')
  65. let s:ns_plain_safe_out_without_colhash = substitute(s:ns_plain_safe_out, '\V\C'.s:_neg_collection, '[^\1:#]', '')
  66. let s:ns_plain_first_in = '\%('.s:ns_char_without_c_indicator.'\|[?:\-]\%('.s:ns_plain_safe_in.'\)\@=\)'
  67. let s:ns_plain_first_out = '\%('.s:ns_char_without_c_indicator.'\|[?:\-]\%('.s:ns_plain_safe_out.'\)\@=\)'
  68. let s:ns_plain_char_in = '\%('.s:ns_char.'#\|:'.s:ns_plain_safe_in.'\|'.s:ns_plain_safe_in_without_colhash.'\)'
  69. let s:ns_plain_char_out = '\%('.s:ns_char.'#\|:'.s:ns_plain_safe_out.'\|'.s:ns_plain_safe_out_without_colhash.'\)'
  70. let s:ns_plain_out = s:ns_plain_first_out . s:ns_plain_char_out.'*'
  71. let s:ns_plain_in = s:ns_plain_first_in . s:ns_plain_char_in.'*'
  72. syn keyword yamlTodo contained TODO FIXME XXX NOTE
  73. syn region yamlComment display oneline start='\%\(^\|\s\)#' end='$'
  74. \ contains=yamlTodo
  75. execute 'syn region yamlDirective oneline start='.string('^\ze%'.s:ns_directive_name.'\s\+').' '.
  76. \ 'end="$" '.
  77. \ 'contains=yamlTAGDirective,'.
  78. \ 'yamlYAMLDirective,'.
  79. \ 'yamlReservedDirective '.
  80. \ 'keepend'
  81. syn match yamlTAGDirective '%TAG\s\+' contained nextgroup=yamlTagHandle
  82. execute 'syn match yamlTagHandle contained nextgroup=yamlTagPrefix '.string(s:c_tag_handle.'\s\+')
  83. execute 'syn match yamlTagPrefix contained nextgroup=yamlComment ' . string(s:ns_tag_prefix)
  84. syn match yamlYAMLDirective '%YAML\s\+' contained nextgroup=yamlYAMLVersion
  85. syn match yamlYAMLVersion '\d\+\.\d\+' contained nextgroup=yamlComment
  86. execute 'syn match yamlReservedDirective contained nextgroup=yamlComment '.
  87. \string('%\%(\%(TAG\|YAML\)\s\)\@!'.s:ns_directive_name)
  88. syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start='"' skip='\\"' end='"'
  89. \ contains=yamlEscape
  90. \ nextgroup=yamlKeyValueDelimiter
  91. syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start="'" skip="''" end="'"
  92. \ contains=yamlSingleEscape
  93. \ nextgroup=yamlKeyValueDelimiter
  94. syn match yamlEscape contained '\\\%([\\"abefnrtv\^0_ NLP\n]\|x\x\x\|u\x\{4}\|U\x\{8}\)'
  95. syn match yamlSingleEscape contained "''"
  96. syn match yamlBlockScalarHeader contained '\s\+\zs[|>]\%([+-]\=[1-9]\|[1-9]\=[+-]\)\='
  97. syn cluster yamlConstant contains=yamlBool,yamlNull
  98. syn cluster yamlFlow contains=yamlFlowString,yamlFlowMapping,yamlFlowCollection
  99. syn cluster yamlFlow add=yamlFlowMappingKey,yamlFlowMappingMerge
  100. syn cluster yamlFlow add=@yamlConstant,yamlPlainScalar,yamlFloat
  101. syn cluster yamlFlow add=yamlTimestamp,yamlInteger,yamlMappingKeyStart
  102. syn cluster yamlFlow add=yamlComment
  103. syn region yamlFlowMapping matchgroup=yamlFlowIndicator start='{' end='}' contains=@yamlFlow
  104. syn region yamlFlowCollection matchgroup=yamlFlowIndicator start='\[' end='\]' contains=@yamlFlow
  105. execute 'syn match yamlPlainScalar /'.s:ns_plain_out.'/'
  106. execute 'syn match yamlPlainScalar contained /'.s:ns_plain_in.'/'
  107. syn match yamlMappingKeyStart '?\ze\s'
  108. syn match yamlMappingKeyStart '?' contained
  109. execute 'syn match yamlFlowMappingKey /\%#=1'.s:ns_plain_in.'\%(\s\+'.s:ns_plain_in.'\)*\ze\s*:/ contained '.
  110. \'nextgroup=yamlKeyValueDelimiter'
  111. syn match yamlFlowMappingMerge /<<\ze\s*:/ contained nextgroup=yamlKeyValueDelimiter
  112. syn match yamlBlockCollectionItemStart '^\s*\zs-\%(\s\+-\)*\s' nextgroup=yamlBlockMappingKey,yamlBlockMappingMerge
  113. " Use the old regexp engine, the NFA engine doesn't like all the \@ items.
  114. execute 'syn match yamlBlockMappingKey /\%#=1^\s*\zs'.s:ns_plain_out.'\%(\s\+'.s:ns_plain_out.'\)*\ze\s*:\%(\s\|$\)/ '.
  115. \'nextgroup=yamlKeyValueDelimiter'
  116. execute 'syn match yamlBlockMappingKey /\%#=1\s*\zs'.s:ns_plain_out.'\%(\s\+'.s:ns_plain_out.'\)*\ze\s*:\%(\s\|$\)/ contained '.
  117. \'nextgroup=yamlKeyValueDelimiter'
  118. syn match yamlBlockMappingMerge /^\s*\zs<<\ze:\%(\s\|$\)/ nextgroup=yamlKeyValueDelimiter
  119. syn match yamlBlockMappingMerge /<<\ze\s*:\%(\s\|$\)/ nextgroup=yamlKeyValueDelimiter contained
  120. syn match yamlKeyValueDelimiter /\s*:/ contained
  121. syn match yamlKeyValueDelimiter /\s*:/ contained
  122. syn cluster yamlScalarWithSpecials contains=yamlPlainScalar,yamlBlockMappingKey,yamlFlowMappingKey
  123. let s:_bounder = s:SimplifyToAssumeAllPrintable('\%([[\]{}, \t]\@!\p\)')
  124. if b:yaml_schema is# 'json'
  125. syn keyword yamlNull null contained containedin=@yamlScalarWithSpecials
  126. syn keyword yamlBool true false
  127. exe 'syn match yamlInteger /'.s:_bounder.'\@1<!\%(0\|-\=[1-9][0-9]*\)'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
  128. exe 'syn match yamlFloat /'.s:_bounder.'\@1<!\%(-\=[1-9][0-9]*\%(\.[0-9]*\)\=\(e[-+]\=[0-9]\+\)\=\|0\|-\=\.inf\|\.nan\)'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
  129. elseif b:yaml_schema is# 'core'
  130. syn keyword yamlNull null Null NULL contained containedin=@yamlScalarWithSpecials
  131. syn keyword yamlBool true True TRUE false False FALSE contained containedin=@yamlScalarWithSpecials
  132. exe 'syn match yamlNull /'.s:_bounder.'\@1<!\~'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
  133. 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'
  134. 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'
  135. elseif b:yaml_schema is# 'pyyaml'
  136. syn keyword yamlNull null Null NULL contained containedin=@yamlScalarWithSpecials
  137. syn keyword yamlBool true True TRUE false False FALSE yes Yes YES no No NO on On ON off Off OFF contained containedin=@yamlScalarWithSpecials
  138. exe 'syn match yamlNull /'.s:_bounder.'\@1<!\~'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
  139. 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'
  140. 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'
  141. 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'
  142. elseif b:yaml_schema is# 'failsafe'
  143. " Nothing
  144. endif
  145. unlet s:_bounder
  146. execute 'syn match yamlNodeTag '.string(s:c_ns_tag_property)
  147. execute 'syn match yamlAnchor '.string(s:c_ns_anchor_property)
  148. execute 'syn match yamlAlias '.string(s:c_ns_alias_node)
  149. syn match yamlDocumentStart '^---\ze\%(\s\|$\)'
  150. syn match yamlDocumentEnd '^\.\.\.\ze\%(\s\|$\)'
  151. hi def link yamlTodo Todo
  152. hi def link yamlComment Comment
  153. hi def link yamlDocumentStart PreProc
  154. hi def link yamlDocumentEnd PreProc
  155. hi def link yamlDirectiveName Keyword
  156. hi def link yamlTAGDirective yamlDirectiveName
  157. hi def link yamlTagHandle String
  158. hi def link yamlTagPrefix String
  159. hi def link yamlYAMLDirective yamlDirectiveName
  160. hi def link yamlReservedDirective Error
  161. hi def link yamlYAMLVersion Number
  162. hi def link yamlString String
  163. hi def link yamlFlowString yamlString
  164. hi def link yamlFlowStringDelimiter yamlString
  165. hi def link yamlEscape SpecialChar
  166. hi def link yamlSingleEscape SpecialChar
  167. hi def link yamlBlockCollectionItemStart Label
  168. hi def link yamlBlockMappingKey Identifier
  169. hi def link yamlBlockMappingMerge Special
  170. hi def link yamlFlowMappingKey Identifier
  171. hi def link yamlFlowMappingMerge Special
  172. hi def link yamlMappingKeyStart Special
  173. hi def link yamlFlowIndicator Special
  174. hi def link yamlKeyValueDelimiter Special
  175. hi def link yamlConstant Constant
  176. hi def link yamlNull yamlConstant
  177. hi def link yamlBool yamlConstant
  178. hi def link yamlAnchor Type
  179. hi def link yamlAlias Type
  180. hi def link yamlNodeTag Type
  181. hi def link yamlInteger Number
  182. hi def link yamlFloat Float
  183. hi def link yamlTimestamp Number
  184. let b:current_syntax = "yaml"
  185. unlet 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
  186. unlet s:_collection s:_neg_collection
  187. delfunction s:SimplifyAdjacentCollections
  188. delfunction s:SimplifyToAssumeAllPrintable
  189. let &cpo = s:cpo_save
  190. unlet s:cpo_save