blob: b3c89f835290c633ec752f83ccde2ce34add32d1 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
Bram Moolenaar7d76c802014-10-15 22:51:52 +02002" Language: reStructuredText documentation format
3" Maintainer: Marshall Ward <marshall.ward@gmail.com>
Bram Moolenaar7b61a542014-08-23 15:31:19 +02004" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
Bram Moolenaar345efa02016-01-15 20:57:49 +01005" Latest Revision: 2016-01-05
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 rstTransition /^[=`:.'"~^_*+#-]\{4,}\s*$/
Bram Moolenaar071d4272004-06-13 20:20:40 +000017
Bram Moolenaar779b74b2006-04-10 14:55:34 +000018syn cluster rstCruft contains=rstEmphasis,rstStrongEmphasis,
19 \ rstInterpretedText,rstInlineLiteral,rstSubstitutionReference,
20 \ rstInlineInternalTargets,rstFootnoteReference,rstHyperlinkReference
Bram Moolenaar071d4272004-06-13 20:20:40 +000021
Bram Moolenaar779b74b2006-04-10 14:55:34 +000022syn region rstLiteralBlock matchgroup=rstDelimiter
23 \ start='::\_s*\n\ze\z(\s\+\)' skip='^$' end='^\z1\@!'
24 \ contains=@NoSpell
Bram Moolenaar071d4272004-06-13 20:20:40 +000025
Bram Moolenaar779b74b2006-04-10 14:55:34 +000026syn region rstQuotedLiteralBlock matchgroup=rstDelimiter
27 \ start="::\_s*\n\ze\z([!\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]\)"
28 \ end='^\z1\@!' contains=@NoSpell
Bram Moolenaar071d4272004-06-13 20:20:40 +000029
Bram Moolenaar779b74b2006-04-10 14:55:34 +000030syn region rstDoctestBlock oneline display matchgroup=rstDelimiter
31 \ start='^>>>\s' end='^$'
Bram Moolenaar071d4272004-06-13 20:20:40 +000032
Bram Moolenaar779b74b2006-04-10 14:55:34 +000033syn region rstTable transparent start='^\n\s*+[-=+]\+' end='^$'
34 \ contains=rstTableLines,@rstCruft
35syn match rstTableLines contained display '|\|+\%(=\+\|-\+\)\='
Bram Moolenaar071d4272004-06-13 20:20:40 +000036
Bram Moolenaar779b74b2006-04-10 14:55:34 +000037syn region rstSimpleTable transparent
38 \ start='^\n\%(\s*\)\@>\%(\%(=\+\)\@>\%(\s\+\)\@>\)\%(\%(\%(=\+\)\@>\%(\s*\)\@>\)\+\)\@>$'
39 \ end='^$'
40 \ contains=rstSimpleTableLines,@rstCruft
41syn match rstSimpleTableLines contained display
42 \ '^\%(\s*\)\@>\%(\%(=\+\)\@>\%(\s\+\)\@>\)\%(\%(\%(=\+\)\@>\%(\s*\)\@>\)\+\)\@>$'
43syn match rstSimpleTableLines contained display
44 \ '^\%(\s*\)\@>\%(\%(-\+\)\@>\%(\s\+\)\@>\)\%(\%(\%(-\+\)\@>\%(\s*\)\@>\)\+\)\@>$'
Bram Moolenaar071d4272004-06-13 20:20:40 +000045
Bram Moolenaar779b74b2006-04-10 14:55:34 +000046syn cluster rstDirectives contains=rstFootnote,rstCitation,
47 \ rstHyperlinkTarget,rstExDirective
Bram Moolenaar071d4272004-06-13 20:20:40 +000048
Bram Moolenaar7b61a542014-08-23 15:31:19 +020049syn match rstExplicitMarkup '^\s*\.\.\_s'
Bram Moolenaar779b74b2006-04-10 14:55:34 +000050 \ nextgroup=@rstDirectives,rstComment,rstSubstitutionDefinition
Bram Moolenaar071d4272004-06-13 20:20:40 +000051
Bram Moolenaar779b74b2006-04-10 14:55:34 +000052let s:ReferenceName = '[[:alnum:]]\+\%([_.-][[:alnum:]]\+\)*'
Bram Moolenaar071d4272004-06-13 20:20:40 +000053
Bram Moolenaar779b74b2006-04-10 14:55:34 +000054syn keyword rstTodo contained FIXME TODO XXX NOTE
Bram Moolenaar071d4272004-06-13 20:20:40 +000055
Bram Moolenaar779b74b2006-04-10 14:55:34 +000056execute 'syn region rstComment contained' .
57 \ ' start=/.*/'
58 \ ' end=/^\s\@!/ contains=rstTodo'
Bram Moolenaar071d4272004-06-13 20:20:40 +000059
Bram Moolenaar779b74b2006-04-10 14:55:34 +000060execute 'syn region rstFootnote contained matchgroup=rstDirective' .
61 \ ' start=+\[\%(\d\+\|#\%(' . s:ReferenceName . '\)\=\|\*\)\]\_s+' .
62 \ ' skip=+^$+' .
63 \ ' end=+^\s\@!+ contains=@rstCruft,@NoSpell'
64
65execute 'syn region rstCitation contained matchgroup=rstDirective' .
66 \ ' start=+\[' . s:ReferenceName . '\]\_s+' .
67 \ ' skip=+^$+' .
68 \ ' end=+^\s\@!+ contains=@rstCruft,@NoSpell'
69
70syn region rstHyperlinkTarget contained matchgroup=rstDirective
71 \ start='_\%(_\|[^:\\]*\%(\\.[^:\\]*\)*\):\_s' skip=+^$+ end=+^\s\@!+
72
73syn region rstHyperlinkTarget contained matchgroup=rstDirective
74 \ start='_`[^`\\]*\%(\\.[^`\\]*\)*`:\_s' skip=+^$+ end=+^\s\@!+
75
76syn region rstHyperlinkTarget matchgroup=rstDirective
77 \ start=+^__\_s+ skip=+^$+ end=+^\s\@!+
78
79execute 'syn region rstExDirective contained matchgroup=rstDirective' .
80 \ ' start=+' . s:ReferenceName . '::\_s+' .
81 \ ' skip=+^$+' .
Bram Moolenaar12969c02015-09-08 23:36:10 +020082 \ ' end=+^\s\@!+ contains=@rstCruft,rstLiteralBlock'
Bram Moolenaar779b74b2006-04-10 14:55:34 +000083
84execute 'syn match rstSubstitutionDefinition contained' .
85 \ ' /|' . s:ReferenceName . '|\_s\+/ nextgroup=@rstDirectives'
86
87function! s:DefineOneInlineMarkup(name, start, middle, end, char_left, char_right)
88 execute 'syn region rst' . a:name .
89 \ ' start=+' . a:char_left . '\zs' . a:start .
Bram Moolenaar25394022007-05-10 19:06:20 +000090 \ '\ze[^[:space:]' . a:char_right . a:start[strlen(a:start) - 1] . ']+' .
Bram Moolenaar779b74b2006-04-10 14:55:34 +000091 \ a:middle .
92 \ ' end=+\S' . a:end . '\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
93endfunction
94
95function! s:DefineInlineMarkup(name, start, middle, end)
96 let middle = a:middle != "" ?
97 \ (' skip=+\\\\\|\\' . a:middle . '+') :
98 \ ""
99
100 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, "'", "'")
Bram Moolenaar7b61a542014-08-23 15:31:19 +0200101 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '"', '"')
102 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '(', ')')
103 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, '<', '>')
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000106
107 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '\%(^\|\s\|[/:]\)', '')
108
109 execute 'syn match rst' . a:name .
110 \ ' +\%(^\|\s\|[''"([{</:]\)\zs' . a:start .
111 \ '[^[:space:]' . a:start[strlen(a:start) - 1] . ']'
112 \ a:end . '\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
113
114 execute 'hi def link rst' . a:name . 'Delimiter' . ' rst' . a:name
115endfunction
116
117call s:DefineInlineMarkup('Emphasis', '\*', '\*', '\*')
118call s:DefineInlineMarkup('StrongEmphasis', '\*\*', '\*', '\*\*')
119call s:DefineInlineMarkup('InterpretedTextOrHyperlinkReference', '`', '`', '`_\{0,2}')
120call s:DefineInlineMarkup('InlineLiteral', '``', "", '``')
121call s:DefineInlineMarkup('SubstitutionReference', '|', '|', '|_\{0,2}')
122call s:DefineInlineMarkup('InlineInternalTargets', '_`', '`', '`')
123
Bram Moolenaar345efa02016-01-15 20:57:49 +0100124syn match rstSections "^\%(\([=`:.'"~^_*+#-]\)\1\+\n\)\=.\+\n\([=`:.'"~^_*+#-]\)\2\+$"
125
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000126" 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
Bram Moolenaar7d76c802014-10-15 22:51:52 +0200153 " guard against setting 'isk' option which might cause problems (issue #108)
154 let prior_isk = &l:iskeyword
Bram Moolenaar97d62492012-11-15 21:28:22 +0100155 exe 'syn include @rst'.code.' syntax/'.code.'.vim'
156 exe 'syn region rstDirective'.code.' matchgroup=rstDirective fold '
Bram Moolenaar7b61a542014-08-23 15:31:19 +0200157 \.'start=#\%(sourcecode\|code\%(-block\)\=\)::\s\+'.code.'\_s*\n\ze\z(\s\+\)# '
Bram Moolenaar97d62492012-11-15 21:28:22 +0100158 \.'skip=#^$# '
Bram Moolenaar7b61a542014-08-23 15:31:19 +0200159 \.'end=#^\z1\@!# contains=@NoSpell,@rst'.code
Bram Moolenaar97d62492012-11-15 21:28:22 +0100160 exe 'syn cluster rstDirectives add=rstDirective'.code
Bram Moolenaar7d76c802014-10-15 22:51:52 +0200161 " reset 'isk' setting, if it has been changed
162 if &l:iskeyword !=# prior_isk
163 let &l:iskeyword = prior_isk
164 endif
165 unlet! prior_isk
Bram Moolenaar97d62492012-11-15 21:28:22 +0100166endfor
167
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200168" TODO: Use better syncing.
169syn sync minlines=50 linebreaks=2
170
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000171hi def link rstTodo Todo
172hi def link rstComment Comment
Bram Moolenaar9b451252012-08-15 17:43:31 +0200173hi def link rstSections Title
174hi def link rstTransition rstSections
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000175hi def link rstLiteralBlock String
176hi def link rstQuotedLiteralBlock String
177hi def link rstDoctestBlock PreProc
178hi def link rstTableLines rstDelimiter
179hi def link rstSimpleTableLines rstTableLines
180hi def link rstExplicitMarkup rstDirective
181hi def link rstDirective Keyword
182hi def link rstFootnote String
183hi def link rstCitation String
184hi def link rstHyperlinkTarget String
185hi def link rstExDirective String
186hi def link rstSubstitutionDefinition rstDirective
187hi def link rstDelimiter Delimiter
188" TODO: I dunno...
189hi def rstEmphasis term=italic cterm=italic gui=italic
190hi def link rstStrongEmphasis Special
191"term=bold cterm=bold gui=bold
192hi def link rstInterpretedTextOrHyperlinkReference Identifier
193hi def link rstInlineLiteral String
194hi def link rstSubstitutionReference PreProc
195hi def link rstInlineInternalTargets Identifier
196hi def link rstFootnoteReference Identifier
197hi def link rstCitationReference Identifier
198hi def link rstHyperLinkReference Identifier
199hi def link rstStandaloneHyperlink Identifier
Bram Moolenaar97d62492012-11-15 21:28:22 +0100200hi def link rstCodeBlock String
Bram Moolenaar071d4272004-06-13 20:20:40 +0000201
202let b:current_syntax = "rst"
203
Bram Moolenaar42eeac32005-06-29 22:40:58 +0000204let &cpo = s:cpo_save
205unlet s:cpo_save