2 " Language: reStructuredText documentation format
3 " Maintainer: Nikolai Weibull <now@bitwi.se>
4 " Latest Revision: 2006-07-04
6 if exists("b:current_syntax")
15 " FIXME: The problem with these two is that Vim doesn’t seem to like
16 " matching across line boundaries.
18 " syn match rstSections /^.*\n[=`:.'"~^_*+#-]\+$/
20 " syn match rstTransition /^\s*[=`:.'"~^_*+#-]\{4,}\s*$/
22 syn cluster rstCruft contains=rstEmphasis,rstStrongEmphasis,
23 \ rstInterpretedText,rstInlineLiteral,rstSubstitutionReference,
24 \ rstInlineInternalTargets,rstFootnoteReference,rstHyperlinkReference
26 syn region rstLiteralBlock matchgroup=rstDelimiter
27 \ start='::\_s*\n\ze\z(\s\+\)' skip='^$' end='^\z1\@!'
30 syn region rstQuotedLiteralBlock matchgroup=rstDelimiter
31 \ start="::\_s*\n\ze\z([!\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]\)"
32 \ end='^\z1\@!' contains=@NoSpell
34 syn region rstDoctestBlock oneline display matchgroup=rstDelimiter
35 \ start='^>>>\s' end='^$'
37 syn region rstTable transparent start='^\n\s*+[-=+]\+' end='^$'
38 \ contains=rstTableLines,@rstCruft
39 syn match rstTableLines contained display '|\|+\%(=\+\|-\+\)\='
41 syn region rstSimpleTable transparent
42 \ start='^\n\%(\s*\)\@>\%(\%(=\+\)\@>\%(\s\+\)\@>\)\%(\%(\%(=\+\)\@>\%(\s*\)\@>\)\+\)\@>$'
44 \ contains=rstSimpleTableLines,@rstCruft
45 syn match rstSimpleTableLines contained display
46 \ '^\%(\s*\)\@>\%(\%(=\+\)\@>\%(\s\+\)\@>\)\%(\%(\%(=\+\)\@>\%(\s*\)\@>\)\+\)\@>$'
47 syn match rstSimpleTableLines contained display
48 \ '^\%(\s*\)\@>\%(\%(-\+\)\@>\%(\s\+\)\@>\)\%(\%(\%(-\+\)\@>\%(\s*\)\@>\)\+\)\@>$'
50 syn cluster rstDirectives contains=rstFootnote,rstCitation,
51 \ rstHyperlinkTarget,rstExDirective
53 syn match rstExplicitMarkup '^\.\.\_s'
54 \ nextgroup=@rstDirectives,rstComment,rstSubstitutionDefinition
56 let s:ReferenceName = '[[:alnum:]]\+\%([_.-][[:alnum:]]\+\)*'
58 syn keyword rstTodo contained FIXME TODO XXX NOTE
60 execute 'syn region rstComment contained' .
62 \ ' end=/^\s\@!/ contains=rstTodo'
64 execute 'syn region rstFootnote contained matchgroup=rstDirective' .
65 \ ' start=+\[\%(\d\+\|#\%(' . s:ReferenceName . '\)\=\|\*\)\]\_s+' .
67 \ ' end=+^\s\@!+ contains=@rstCruft,@NoSpell'
69 execute 'syn region rstCitation contained matchgroup=rstDirective' .
70 \ ' start=+\[' . s:ReferenceName . '\]\_s+' .
72 \ ' end=+^\s\@!+ contains=@rstCruft,@NoSpell'
74 syn region rstHyperlinkTarget contained matchgroup=rstDirective
75 \ start='_\%(_\|[^:\\]*\%(\\.[^:\\]*\)*\):\_s' skip=+^$+ end=+^\s\@!+
77 syn region rstHyperlinkTarget contained matchgroup=rstDirective
78 \ start='_`[^`\\]*\%(\\.[^`\\]*\)*`:\_s' skip=+^$+ end=+^\s\@!+
80 syn region rstHyperlinkTarget matchgroup=rstDirective
81 \ start=+^__\_s+ skip=+^$+ end=+^\s\@!+
83 execute 'syn region rstExDirective contained matchgroup=rstDirective' .
84 \ ' start=+' . s:ReferenceName . '::\_s+' .
86 \ ' end=+^\s\@!+ contains=@rstCruft'
88 execute 'syn match rstSubstitutionDefinition contained' .
89 \ ' /|' . s:ReferenceName . '|\_s\+/ nextgroup=@rstDirectives'
91 function! s:DefineOneInlineMarkup(name, start, middle, end, char_left, char_right)
92 execute 'syn region rst' . a:name .
93 \ ' start=+' . a:char_left . '\zs' . a:start .
94 \ '\ze[^[:space:]' . a:char_right . a:start[strlen(a:start) - 1] . ']+' .
96 \ ' end=+\S' . a:end . '\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
99 function! s:DefineInlineMarkup(name, start, middle, end)
100 let middle = a:middle != "" ?
101 \ (' skip=+\\\\\|\\' . a:middle . '+') :
104 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, "'", "'")
105 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '"', '"')
106 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '(', ')')
107 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '\[', '\]')
108 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '{', '}')
109 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '<', '>')
111 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '\%(^\|\s\|[/:]\)', '')
113 execute 'syn match rst' . a:name .
114 \ ' +\%(^\|\s\|[''"([{</:]\)\zs' . a:start .
115 \ '[^[:space:]' . a:start[strlen(a:start) - 1] . ']'
116 \ a:end . '\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
118 execute 'hi def link rst' . a:name . 'Delimiter' . ' rst' . a:name
121 call s:DefineInlineMarkup('Emphasis', '\*', '\*', '\*')
122 call s:DefineInlineMarkup('StrongEmphasis', '\*\*', '\*', '\*\*')
123 call s:DefineInlineMarkup('InterpretedTextOrHyperlinkReference', '`', '`', '`_\{0,2}')
124 call s:DefineInlineMarkup('InlineLiteral', '``', "", '``')
125 call s:DefineInlineMarkup('SubstitutionReference', '|', '|', '|_\{0,2}')
126 call s:DefineInlineMarkup('InlineInternalTargets', '_`', '`', '`')
128 " TODO: Can’t remember why these two can’t be defined like the ones above.
129 execute 'syn match rstFootnoteReference contains=@NoSpell' .
130 \ ' +\[\%(\d\+\|#\%(' . s:ReferenceName . '\)\=\|\*\)\]_+'
132 execute 'syn match rstCitationReference contains=@NoSpell' .
133 \ ' +\[' . s:ReferenceName . '\]_\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
135 execute 'syn match rstHyperlinkReference' .
136 \ ' /\<' . s:ReferenceName . '__\=\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)/'
138 syn match rstStandaloneHyperlink contains=@NoSpell
139 \ "\<\%(\%(\%(https\=\|file\|ftp\|gopher\)://\|\%(mailto\|news\):\)[^[:space:]'\"<>]\+\|www[[:alnum:]_-]*\.[[:alnum:]_-]\+\.[^[:space:]'\"<>]\+\)[[:alnum:]/]"
141 " TODO: Use better syncing. I don’t know the specifics of syncing well enough,
145 hi def link rstTodo Todo
146 hi def link rstComment Comment
147 "hi def link rstSections Type
148 "hi def link rstTransition Type
149 hi def link rstLiteralBlock String
150 hi def link rstQuotedLiteralBlock String
151 hi def link rstDoctestBlock PreProc
152 hi def link rstTableLines rstDelimiter
153 hi def link rstSimpleTableLines rstTableLines
154 hi def link rstExplicitMarkup rstDirective
155 hi def link rstDirective Keyword
156 hi def link rstFootnote String
157 hi def link rstCitation String
158 hi def link rstHyperlinkTarget String
159 hi def link rstExDirective String
160 hi def link rstSubstitutionDefinition rstDirective
161 hi def link rstDelimiter Delimiter
163 hi def rstEmphasis term=italic cterm=italic gui=italic
164 hi def link rstStrongEmphasis Special
165 "term=bold cterm=bold gui=bold
166 hi def link rstInterpretedTextOrHyperlinkReference Identifier
167 hi def link rstInlineLiteral String
168 hi def link rstSubstitutionReference PreProc
169 hi def link rstInlineInternalTargets Identifier
170 hi def link rstFootnoteReference Identifier
171 hi def link rstCitationReference Identifier
172 hi def link rstHyperLinkReference Identifier
173 hi def link rstStandaloneHyperlink Identifier
175 let b:current_syntax = "rst"
177 let &cpo = s:cpo_save