blob: fce9e5dd3e8cea3756d41f342c45eec7c12d16d4 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
Bram Moolenaar42eeac32005-06-29 22:40:58 +00002" Language: reStructuredText documentation format
Bram Moolenaar7b61a542014-08-23 15:31:19 +02003" Maintainer: Marshall Ward <marshall.ward@gmail.com>
4" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
5" Latest Revision: 2014-08-23
Bram Moolenaar071d4272004-06-13 20:20:40 +00006
Bram Moolenaar42eeac32005-06-29 22:40:58 +00007if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +00008 finish
9endif
10
Bram Moolenaar42eeac32005-06-29 22:40:58 +000011let s:cpo_save = &cpo
12set cpo&vim
13
Bram Moolenaar071d4272004-06-13 20:20:40 +000014syn case ignore
15
Bram Moolenaar5c736222010-01-06 20:54:52 +010016syn match rstSections "^\%(\([=`:.'"~^_*+#-]\)\1\+\n\)\=.\+\n\([=`:.'"~^_*+#-]\)\2\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +000017
Bram Moolenaar5c736222010-01-06 20:54:52 +010018syn match rstTransition /^[=`:.'"~^_*+#-]\{4,}\s*$/
Bram Moolenaar071d4272004-06-13 20:20:40 +000019
Bram Moolenaar779b74b2006-04-10 14:55:34 +000020syn cluster rstCruft contains=rstEmphasis,rstStrongEmphasis,
21 \ rstInterpretedText,rstInlineLiteral,rstSubstitutionReference,
22 \ rstInlineInternalTargets,rstFootnoteReference,rstHyperlinkReference
Bram Moolenaar071d4272004-06-13 20:20:40 +000023
Bram Moolenaar779b74b2006-04-10 14:55:34 +000024syn region rstLiteralBlock matchgroup=rstDelimiter
25 \ start='::\_s*\n\ze\z(\s\+\)' skip='^$' end='^\z1\@!'
26 \ contains=@NoSpell
Bram Moolenaar071d4272004-06-13 20:20:40 +000027
Bram Moolenaar779b74b2006-04-10 14:55:34 +000028syn region rstQuotedLiteralBlock matchgroup=rstDelimiter
29 \ start="::\_s*\n\ze\z([!\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]\)"
30 \ end='^\z1\@!' contains=@NoSpell
Bram Moolenaar071d4272004-06-13 20:20:40 +000031
Bram Moolenaar779b74b2006-04-10 14:55:34 +000032syn region rstDoctestBlock oneline display matchgroup=rstDelimiter
33 \ start='^>>>\s' end='^$'
Bram Moolenaar071d4272004-06-13 20:20:40 +000034
Bram Moolenaar779b74b2006-04-10 14:55:34 +000035syn region rstTable transparent start='^\n\s*+[-=+]\+' end='^$'
36 \ contains=rstTableLines,@rstCruft
37syn match rstTableLines contained display '|\|+\%(=\+\|-\+\)\='
Bram Moolenaar071d4272004-06-13 20:20:40 +000038
Bram Moolenaar779b74b2006-04-10 14:55:34 +000039syn region rstSimpleTable transparent
40 \ start='^\n\%(\s*\)\@>\%(\%(=\+\)\@>\%(\s\+\)\@>\)\%(\%(\%(=\+\)\@>\%(\s*\)\@>\)\+\)\@>$'
41 \ end='^$'
42 \ contains=rstSimpleTableLines,@rstCruft
43syn match rstSimpleTableLines contained display
44 \ '^\%(\s*\)\@>\%(\%(=\+\)\@>\%(\s\+\)\@>\)\%(\%(\%(=\+\)\@>\%(\s*\)\@>\)\+\)\@>$'
45syn match rstSimpleTableLines contained display
46 \ '^\%(\s*\)\@>\%(\%(-\+\)\@>\%(\s\+\)\@>\)\%(\%(\%(-\+\)\@>\%(\s*\)\@>\)\+\)\@>$'
Bram Moolenaar071d4272004-06-13 20:20:40 +000047
Bram Moolenaar779b74b2006-04-10 14:55:34 +000048syn cluster rstDirectives contains=rstFootnote,rstCitation,
49 \ rstHyperlinkTarget,rstExDirective
Bram Moolenaar071d4272004-06-13 20:20:40 +000050
Bram Moolenaar7b61a542014-08-23 15:31:19 +020051syn match rstExplicitMarkup '^\s*\.\.\_s'
Bram Moolenaar779b74b2006-04-10 14:55:34 +000052 \ nextgroup=@rstDirectives,rstComment,rstSubstitutionDefinition
Bram Moolenaar071d4272004-06-13 20:20:40 +000053
Bram Moolenaar779b74b2006-04-10 14:55:34 +000054let s:ReferenceName = '[[:alnum:]]\+\%([_.-][[:alnum:]]\+\)*'
Bram Moolenaar071d4272004-06-13 20:20:40 +000055
Bram Moolenaar779b74b2006-04-10 14:55:34 +000056syn keyword rstTodo contained FIXME TODO XXX NOTE
Bram Moolenaar071d4272004-06-13 20:20:40 +000057
Bram Moolenaar779b74b2006-04-10 14:55:34 +000058execute 'syn region rstComment contained' .
59 \ ' start=/.*/'
60 \ ' end=/^\s\@!/ contains=rstTodo'
Bram Moolenaar071d4272004-06-13 20:20:40 +000061
Bram Moolenaar779b74b2006-04-10 14:55:34 +000062execute 'syn region rstFootnote contained matchgroup=rstDirective' .
63 \ ' start=+\[\%(\d\+\|#\%(' . s:ReferenceName . '\)\=\|\*\)\]\_s+' .
64 \ ' skip=+^$+' .
65 \ ' end=+^\s\@!+ contains=@rstCruft,@NoSpell'
66
67execute 'syn region rstCitation contained matchgroup=rstDirective' .
68 \ ' start=+\[' . s:ReferenceName . '\]\_s+' .
69 \ ' skip=+^$+' .
70 \ ' end=+^\s\@!+ contains=@rstCruft,@NoSpell'
71
72syn region rstHyperlinkTarget contained matchgroup=rstDirective
73 \ start='_\%(_\|[^:\\]*\%(\\.[^:\\]*\)*\):\_s' skip=+^$+ end=+^\s\@!+
74
75syn region rstHyperlinkTarget contained matchgroup=rstDirective
76 \ start='_`[^`\\]*\%(\\.[^`\\]*\)*`:\_s' skip=+^$+ end=+^\s\@!+
77
78syn region rstHyperlinkTarget matchgroup=rstDirective
79 \ start=+^__\_s+ skip=+^$+ end=+^\s\@!+
80
81execute 'syn region rstExDirective contained matchgroup=rstDirective' .
82 \ ' start=+' . s:ReferenceName . '::\_s+' .
83 \ ' skip=+^$+' .
84 \ ' end=+^\s\@!+ contains=@rstCruft'
85
86execute 'syn match rstSubstitutionDefinition contained' .
87 \ ' /|' . s:ReferenceName . '|\_s\+/ nextgroup=@rstDirectives'
88
89function! s:DefineOneInlineMarkup(name, start, middle, end, char_left, char_right)
90 execute 'syn region rst' . a:name .
91 \ ' start=+' . a:char_left . '\zs' . a:start .
Bram Moolenaar25394022007-05-10 19:06:20 +000092 \ '\ze[^[:space:]' . a:char_right . a:start[strlen(a:start) - 1] . ']+' .
Bram Moolenaar779b74b2006-04-10 14:55:34 +000093 \ a:middle .
94 \ ' end=+\S' . a:end . '\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
95endfunction
96
97function! s:DefineInlineMarkup(name, start, middle, end)
98 let middle = a:middle != "" ?
99 \ (' skip=+\\\\\|\\' . a:middle . '+') :
100 \ ""
101
102 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, "'", "'")
Bram Moolenaar7b61a542014-08-23 15:31:19 +0200103 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '"', '"')
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, '<', '>')
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000108
109 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '\%(^\|\s\|[/:]\)', '')
110
111 execute 'syn match rst' . a:name .
112 \ ' +\%(^\|\s\|[''"([{</:]\)\zs' . a:start .
113 \ '[^[:space:]' . a:start[strlen(a:start) - 1] . ']'
114 \ a:end . '\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
115
116 execute 'hi def link rst' . a:name . 'Delimiter' . ' rst' . a:name
117endfunction
118
119call s:DefineInlineMarkup('Emphasis', '\*', '\*', '\*')
120call s:DefineInlineMarkup('StrongEmphasis', '\*\*', '\*', '\*\*')
121call s:DefineInlineMarkup('InterpretedTextOrHyperlinkReference', '`', '`', '`_\{0,2}')
122call s:DefineInlineMarkup('InlineLiteral', '``', "", '``')
123call s:DefineInlineMarkup('SubstitutionReference', '|', '|', '|_\{0,2}')
124call s:DefineInlineMarkup('InlineInternalTargets', '_`', '`', '`')
125
126" TODO: Can’t remember why these two can’t be defined like the ones above.
127execute 'syn match rstFootnoteReference contains=@NoSpell' .
128 \ ' +\[\%(\d\+\|#\%(' . s:ReferenceName . '\)\=\|\*\)\]_+'
129
130execute 'syn match rstCitationReference contains=@NoSpell' .
Bram Moolenaar25394022007-05-10 19:06:20 +0000131 \ ' +\[' . s:ReferenceName . '\]_\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000132
133execute 'syn match rstHyperlinkReference' .
Bram Moolenaar25394022007-05-10 19:06:20 +0000134 \ ' /\<' . s:ReferenceName . '__\=\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)/'
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000135
136syn match rstStandaloneHyperlink contains=@NoSpell
137 \ "\<\%(\%(\%(https\=\|file\|ftp\|gopher\)://\|\%(mailto\|news\):\)[^[:space:]'\"<>]\+\|www[[:alnum:]_-]*\.[[:alnum:]_-]\+\.[^[:space:]'\"<>]\+\)[[:alnum:]/]"
138
Bram Moolenaar97d62492012-11-15 21:28:22 +0100139syn region rstCodeBlock contained matchgroup=rstDirective
Bram Moolenaar7b61a542014-08-23 15:31:19 +0200140 \ start=+\%(sourcecode\|code\%(-block\)\=\)::\_s*\n\ze\z(\s\+\)+
Bram Moolenaar97d62492012-11-15 21:28:22 +0100141 \ skip=+^$+
Bram Moolenaar7b61a542014-08-23 15:31:19 +0200142 \ end=+^\z1\@!+
Bram Moolenaar97d62492012-11-15 21:28:22 +0100143 \ contains=@NoSpell
144syn cluster rstDirectives add=rstCodeBlock
145
146if !exists('g:rst_syntax_code_list')
Bram Moolenaar7b61a542014-08-23 15:31:19 +0200147 let g:rst_syntax_code_list = ['vim', 'java', 'cpp', 'lisp', 'php',
148 \ 'python', 'perl', 'sh']
Bram Moolenaar97d62492012-11-15 21:28:22 +0100149endif
150
151for code in g:rst_syntax_code_list
152 unlet! b:current_syntax
153 exe 'syn include @rst'.code.' syntax/'.code.'.vim'
154 exe 'syn region rstDirective'.code.' matchgroup=rstDirective fold '
Bram Moolenaar7b61a542014-08-23 15:31:19 +0200155 \.'start=#\%(sourcecode\|code\%(-block\)\=\)::\s\+'.code.'\_s*\n\ze\z(\s\+\)# '
Bram Moolenaar97d62492012-11-15 21:28:22 +0100156 \.'skip=#^$# '
Bram Moolenaar7b61a542014-08-23 15:31:19 +0200157 \.'end=#^\z1\@!# contains=@NoSpell,@rst'.code
Bram Moolenaar97d62492012-11-15 21:28:22 +0100158 exe 'syn cluster rstDirectives add=rstDirective'.code
159endfor
160
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200161" TODO: Use better syncing.
162syn sync minlines=50 linebreaks=2
163
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000164hi def link rstTodo Todo
165hi def link rstComment Comment
Bram Moolenaar9b451252012-08-15 17:43:31 +0200166hi def link rstSections Title
167hi def link rstTransition rstSections
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000168hi def link rstLiteralBlock String
169hi def link rstQuotedLiteralBlock String
170hi def link rstDoctestBlock PreProc
171hi def link rstTableLines rstDelimiter
172hi def link rstSimpleTableLines rstTableLines
173hi def link rstExplicitMarkup rstDirective
174hi def link rstDirective Keyword
175hi def link rstFootnote String
176hi def link rstCitation String
177hi def link rstHyperlinkTarget String
178hi def link rstExDirective String
179hi def link rstSubstitutionDefinition rstDirective
180hi def link rstDelimiter Delimiter
181" TODO: I dunno...
182hi def rstEmphasis term=italic cterm=italic gui=italic
183hi def link rstStrongEmphasis Special
184"term=bold cterm=bold gui=bold
185hi def link rstInterpretedTextOrHyperlinkReference Identifier
186hi def link rstInlineLiteral String
187hi def link rstSubstitutionReference PreProc
188hi def link rstInlineInternalTargets Identifier
189hi def link rstFootnoteReference Identifier
190hi def link rstCitationReference Identifier
191hi def link rstHyperLinkReference Identifier
192hi def link rstStandaloneHyperlink Identifier
Bram Moolenaar97d62492012-11-15 21:28:22 +0100193hi def link rstCodeBlock String
Bram Moolenaar071d4272004-06-13 20:20:40 +0000194
195let b:current_syntax = "rst"
196
Bram Moolenaar42eeac32005-06-29 22:40:58 +0000197let &cpo = s:cpo_save
198unlet s:cpo_save