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