1" Vim syntax file
2" Language:         YAML (YAML Ain't Markup Language)
3" Maintainer:       Nikolai Weibull <now@bitwi.se>
4" Latest Revision:  2010-08-12
5
6if exists("b:current_syntax")
7  finish
8endif
9
10let s:cpo_save = &cpo
11set cpo&vim
12
13syn keyword yamlTodo            contained TODO FIXME XXX NOTE
14
15syn region  yamlComment         display oneline start='\%(^\|\s\)#' end='$'
16                                \ contains=yamlTodo,@Spell
17
18syn match   yamlNodeProperty    '!\%(![^\\^%     ]\+\|[^!][^:/   ]*\)'
19
20syn match   yamlAnchor          '&.\+'
21
22syn match   yamlAlias           '\*.\+'
23
24syn match   yamlDelimiter       '[-,:]'
25syn match   yamlBlock           '[\[\]{}>|]'
26syn match   yamlOperator        '[?+-]'
27syn match   yamlKey             '\w\+\(\s\+\w\+\)*\ze\s*:'
28
29syn region  yamlString          matchgroup=yamlStringDelimiter
30                                \ start=+"+ skip=+\\"+ end=+"+
31                                \ contains=yamlEscape
32syn region  yamlString          matchgroup=yamlStringDelimiter
33                                \ start=+'+ skip=+''+ end=+'+
34                                \ contains=yamlSingleEscape
35syn match   yamlEscape          contained display +\\[\\"abefnrtv^0_ NLP]+
36syn match   yamlEscape          contained display '\\x\x\{2}'
37syn match   yamlEscape          contained display '\\u\x\{4}'
38syn match   yamlEscape          contained display '\\U\x\{8}'
39" TODO: how do we get 0x85, 0x2028, and 0x2029 into this?
40syn match   yamlEscape          display '\\\%(\r\n\|[\r\n]\)'
41syn match   yamlSingleEscape    contained +''+
42
43" TODO: sexagecimal and fixed (20:30.15 and 1,230.15)
44syn match   yamlNumber          display
45                                \ '\<[+-]\=\d\+\%(\.\d\+\%([eE][+-]\=\d\+\)\=\)\='
46syn match   yamlNumber          display '0\o\+'
47syn match   yamlNumber          display '0x\x\+'
48syn match   yamlNumber          display '([+-]\=[iI]nf)'
49syn match   yamlNumber          display '(NaN)'
50
51syn match   yamlConstant        '\<[~yn]\>'
52syn keyword yamlConstant        true True TRUE false False FALSE
53syn keyword yamlConstant        yes Yes on ON no No off OFF
54syn keyword yamlConstant        null Null NULL nil Nil NIL
55
56syn match   yamlTimestamp       '\d\d\d\d-\%(1[0-2]\|\d\)-\%(3[0-2]\|2\d\|1\d\|\d\)\%( \%([01]\d\|2[0-3]\):[0-5]\d:[0-5]\d.\d\d [+-]\%([01]\d\|2[0-3]\):[0-5]\d\|t\%([01]\d\|2[0-3]\):[0-5]\d:[0-5]\d.\d\d[+-]\%([01]\d\|2[0-3]\):[0-5]\d\|T\%([01]\d\|2[0-3]\):[0-5]\d:[0-5]\d.\dZ\)\='
57
58syn region  yamlDocumentHeader  start='---' end='$' contains=yamlDirective
59syn match   yamlDocumentEnd     '\.\.\.'
60
61syn match   yamlDirective       contained '%[^:]\+:.\+'
62
63hi def link yamlTodo            Todo
64hi def link yamlComment         Comment
65hi def link yamlDocumentHeader  PreProc
66hi def link yamlDocumentEnd     PreProc
67hi def link yamlDirective       Keyword
68hi def link yamlNodeProperty    Type
69hi def link yamlAnchor          Type
70hi def link yamlAlias           Type
71hi def link yamlDelimiter       Delimiter
72hi def link yamlBlock           Operator
73hi def link yamlOperator        Operator
74hi def link yamlKey             Identifier
75hi def link yamlString          String
76hi def link yamlStringDelimiter yamlString
77hi def link yamlEscape          SpecialChar
78hi def link yamlSingleEscape    SpecialChar
79hi def link yamlNumber          Number
80hi def link yamlConstant        Constant
81hi def link yamlTimestamp       Number
82
83let b:current_syntax = "yaml"
84
85let &cpo = s:cpo_save
86unlet s:cpo_save
87