blob: 232d2a7de3e2a4aa087f6bea90a0837212d738a8 [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 Moolenaar7571d552016-08-18 22:54:46 +02005" Website: https://github.com/marshallward/vim-restructuredtext
6" Latest Revision: 2016-08-18
Bram Moolenaar071d4272004-06-13 20:20:40 +00007
Bram Moolenaar42eeac32005-06-29 22:40:58 +00008if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +00009 finish
10endif
11
Bram Moolenaar42eeac32005-06-29 22:40:58 +000012let s:cpo_save = &cpo
13set cpo&vim
14
Bram Moolenaar071d4272004-06-13 20:20:40 +000015syn case ignore
16
Bram Moolenaar5c736222010-01-06 20:54:52 +010017syn match rstTransition /^[=`:.'"~^_*+#-]\{4,}\s*$/
Bram Moolenaar071d4272004-06-13 20:20:40 +000018
Bram Moolenaar779b74b2006-04-10 14:55:34 +000019syn cluster rstCruft contains=rstEmphasis,rstStrongEmphasis,
20 \ rstInterpretedText,rstInlineLiteral,rstSubstitutionReference,
21 \ rstInlineInternalTargets,rstFootnoteReference,rstHyperlinkReference
Bram Moolenaar071d4272004-06-13 20:20:40 +000022
Bram Moolenaar779b74b2006-04-10 14:55:34 +000023syn region rstLiteralBlock matchgroup=rstDelimiter
24 \ start='::\_s*\n\ze\z(\s\+\)' skip='^$' end='^\z1\@!'
25 \ contains=@NoSpell
Bram Moolenaar071d4272004-06-13 20:20:40 +000026
Bram Moolenaar779b74b2006-04-10 14:55:34 +000027syn region rstQuotedLiteralBlock matchgroup=rstDelimiter
28 \ start="::\_s*\n\ze\z([!\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]\)"
29 \ end='^\z1\@!' contains=@NoSpell
Bram Moolenaar071d4272004-06-13 20:20:40 +000030
Bram Moolenaar779b74b2006-04-10 14:55:34 +000031syn region rstDoctestBlock oneline display matchgroup=rstDelimiter
32 \ start='^>>>\s' end='^$'
Bram Moolenaar071d4272004-06-13 20:20:40 +000033
Bram Moolenaar779b74b2006-04-10 14:55:34 +000034syn region rstTable transparent start='^\n\s*+[-=+]\+' end='^$'
35 \ contains=rstTableLines,@rstCruft
36syn match rstTableLines contained display '|\|+\%(=\+\|-\+\)\='
Bram Moolenaar071d4272004-06-13 20:20:40 +000037
Bram Moolenaar779b74b2006-04-10 14:55:34 +000038syn region rstSimpleTable transparent
39 \ start='^\n\%(\s*\)\@>\%(\%(=\+\)\@>\%(\s\+\)\@>\)\%(\%(\%(=\+\)\@>\%(\s*\)\@>\)\+\)\@>$'
40 \ end='^$'
41 \ contains=rstSimpleTableLines,@rstCruft
42syn match rstSimpleTableLines contained display
43 \ '^\%(\s*\)\@>\%(\%(=\+\)\@>\%(\s\+\)\@>\)\%(\%(\%(=\+\)\@>\%(\s*\)\@>\)\+\)\@>$'
44syn match rstSimpleTableLines contained display
45 \ '^\%(\s*\)\@>\%(\%(-\+\)\@>\%(\s\+\)\@>\)\%(\%(\%(-\+\)\@>\%(\s*\)\@>\)\+\)\@>$'
Bram Moolenaar071d4272004-06-13 20:20:40 +000046
Bram Moolenaar779b74b2006-04-10 14:55:34 +000047syn cluster rstDirectives contains=rstFootnote,rstCitation,
48 \ rstHyperlinkTarget,rstExDirective
Bram Moolenaar071d4272004-06-13 20:20:40 +000049
Bram Moolenaar7b61a542014-08-23 15:31:19 +020050syn match rstExplicitMarkup '^\s*\.\.\_s'
Bram Moolenaar779b74b2006-04-10 14:55:34 +000051 \ nextgroup=@rstDirectives,rstComment,rstSubstitutionDefinition
Bram Moolenaar071d4272004-06-13 20:20:40 +000052
Bram Moolenaar779b74b2006-04-10 14:55:34 +000053let s:ReferenceName = '[[:alnum:]]\+\%([_.-][[:alnum:]]\+\)*'
Bram Moolenaar071d4272004-06-13 20:20:40 +000054
Bram Moolenaar779b74b2006-04-10 14:55:34 +000055syn keyword rstTodo contained FIXME TODO XXX NOTE
Bram Moolenaar071d4272004-06-13 20:20:40 +000056
Bram Moolenaar779b74b2006-04-10 14:55:34 +000057execute 'syn region rstComment contained' .
58 \ ' start=/.*/'
59 \ ' end=/^\s\@!/ contains=rstTodo'
Bram Moolenaar071d4272004-06-13 20:20:40 +000060
Bram Moolenaar779b74b2006-04-10 14:55:34 +000061execute 'syn region rstFootnote contained matchgroup=rstDirective' .
62 \ ' start=+\[\%(\d\+\|#\%(' . s:ReferenceName . '\)\=\|\*\)\]\_s+' .
63 \ ' skip=+^$+' .
64 \ ' end=+^\s\@!+ contains=@rstCruft,@NoSpell'
65
66execute 'syn region rstCitation contained matchgroup=rstDirective' .
67 \ ' start=+\[' . s:ReferenceName . '\]\_s+' .
68 \ ' skip=+^$+' .
69 \ ' end=+^\s\@!+ contains=@rstCruft,@NoSpell'
70
71syn region rstHyperlinkTarget contained matchgroup=rstDirective
72 \ start='_\%(_\|[^:\\]*\%(\\.[^:\\]*\)*\):\_s' skip=+^$+ end=+^\s\@!+
73
74syn region rstHyperlinkTarget contained matchgroup=rstDirective
75 \ start='_`[^`\\]*\%(\\.[^`\\]*\)*`:\_s' skip=+^$+ end=+^\s\@!+
76
77syn region rstHyperlinkTarget matchgroup=rstDirective
78 \ start=+^__\_s+ skip=+^$+ end=+^\s\@!+
79
80execute 'syn region rstExDirective contained matchgroup=rstDirective' .
81 \ ' start=+' . s:ReferenceName . '::\_s+' .
82 \ ' skip=+^$+' .
Bram Moolenaar12969c02015-09-08 23:36:10 +020083 \ ' end=+^\s\@!+ contains=@rstCruft,rstLiteralBlock'
Bram Moolenaar779b74b2006-04-10 14:55:34 +000084
85execute 'syn match rstSubstitutionDefinition contained' .
86 \ ' /|' . s:ReferenceName . '|\_s\+/ nextgroup=@rstDirectives'
87
88function! s:DefineOneInlineMarkup(name, start, middle, end, char_left, char_right)
89 execute 'syn region rst' . a:name .
90 \ ' start=+' . a:char_left . '\zs' . a:start .
Bram Moolenaar25394022007-05-10 19:06:20 +000091 \ '\ze[^[:space:]' . a:char_right . a:start[strlen(a:start) - 1] . ']+' .
Bram Moolenaar779b74b2006-04-10 14:55:34 +000092 \ a:middle .
Bram Moolenaar7571d552016-08-18 22:54:46 +020093 \ ' end=+\S' . a:end . '\ze\%($\|\s\|[''"’)\]}>/:.,;!?\\-]\)+'
Bram Moolenaar779b74b2006-04-10 14:55:34 +000094endfunction
95
96function! s:DefineInlineMarkup(name, start, middle, end)
97 let middle = a:middle != "" ?
98 \ (' skip=+\\\\\|\\' . a:middle . '+') :
99 \ ""
100
101 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, "'", "'")
Bram Moolenaar7b61a542014-08-23 15:31:19 +0200102 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, '{', '}')
106 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '<', '>')
Bram Moolenaar7571d552016-08-18 22:54:46 +0200107 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '’', '’')
108 " TODO: Additional Unicode Pd, Po, Pi, Pf, Ps characters
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000109
110 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '\%(^\|\s\|[/:]\)', '')
111
112 execute 'syn match rst' . a:name .
113 \ ' +\%(^\|\s\|[''"([{</:]\)\zs' . a:start .
114 \ '[^[:space:]' . a:start[strlen(a:start) - 1] . ']'
115 \ a:end . '\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
116
117 execute 'hi def link rst' . a:name . 'Delimiter' . ' rst' . a:name
118endfunction
119
120call s:DefineInlineMarkup('Emphasis', '\*', '\*', '\*')
121call s:DefineInlineMarkup('StrongEmphasis', '\*\*', '\*', '\*\*')
122call s:DefineInlineMarkup('InterpretedTextOrHyperlinkReference', '`', '`', '`_\{0,2}')
123call s:DefineInlineMarkup('InlineLiteral', '``', "", '``')
124call s:DefineInlineMarkup('SubstitutionReference', '|', '|', '|_\{0,2}')
125call s:DefineInlineMarkup('InlineInternalTargets', '_`', '`', '`')
126
Bram Moolenaar345efa02016-01-15 20:57:49 +0100127syn match rstSections "^\%(\([=`:.'"~^_*+#-]\)\1\+\n\)\=.\+\n\([=`:.'"~^_*+#-]\)\2\+$"
128
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000129" TODO: Can’t remember why these two can’t be defined like the ones above.
130execute 'syn match rstFootnoteReference contains=@NoSpell' .
131 \ ' +\[\%(\d\+\|#\%(' . s:ReferenceName . '\)\=\|\*\)\]_+'
132
133execute 'syn match rstCitationReference contains=@NoSpell' .
Bram Moolenaar25394022007-05-10 19:06:20 +0000134 \ ' +\[' . s:ReferenceName . '\]_\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000135
136execute 'syn match rstHyperlinkReference' .
Bram Moolenaar25394022007-05-10 19:06:20 +0000137 \ ' /\<' . s:ReferenceName . '__\=\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)/'
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000138
139syn match rstStandaloneHyperlink contains=@NoSpell
140 \ "\<\%(\%(\%(https\=\|file\|ftp\|gopher\)://\|\%(mailto\|news\):\)[^[:space:]'\"<>]\+\|www[[:alnum:]_-]*\.[[:alnum:]_-]\+\.[^[:space:]'\"<>]\+\)[[:alnum:]/]"
141
Bram Moolenaar97d62492012-11-15 21:28:22 +0100142syn region rstCodeBlock contained matchgroup=rstDirective
Bram Moolenaara02a5512016-06-17 12:48:11 +0200143 \ start=+\%(sourcecode\|code\%(-block\)\=\)::\s\+\w*\_s*\n\ze\z(\s\+\)+
Bram Moolenaar97d62492012-11-15 21:28:22 +0100144 \ skip=+^$+
Bram Moolenaar7b61a542014-08-23 15:31:19 +0200145 \ end=+^\z1\@!+
Bram Moolenaar97d62492012-11-15 21:28:22 +0100146 \ contains=@NoSpell
147syn cluster rstDirectives add=rstCodeBlock
148
149if !exists('g:rst_syntax_code_list')
Bram Moolenaar7b61a542014-08-23 15:31:19 +0200150 let g:rst_syntax_code_list = ['vim', 'java', 'cpp', 'lisp', 'php',
151 \ 'python', 'perl', 'sh']
Bram Moolenaar97d62492012-11-15 21:28:22 +0100152endif
153
154for code in g:rst_syntax_code_list
155 unlet! b:current_syntax
Bram Moolenaar7d76c802014-10-15 22:51:52 +0200156 " guard against setting 'isk' option which might cause problems (issue #108)
157 let prior_isk = &l:iskeyword
Bram Moolenaar97d62492012-11-15 21:28:22 +0100158 exe 'syn include @rst'.code.' syntax/'.code.'.vim'
Bram Moolenaara02a5512016-06-17 12:48:11 +0200159 exe 'syn region rstDirective'.code.' matchgroup=rstDirective fold'
160 \.' start=#\%(sourcecode\|code\%(-block\)\=\)::\s\+'.code.'\_s*\n\ze\z(\s\+\)#'
161 \.' skip=#^$#'
162 \.' end=#^\z1\@!#'
163 \.' contains=@NoSpell,@rst'.code
Bram Moolenaar97d62492012-11-15 21:28:22 +0100164 exe 'syn cluster rstDirectives add=rstDirective'.code
Bram Moolenaar7d76c802014-10-15 22:51:52 +0200165 " reset 'isk' setting, if it has been changed
166 if &l:iskeyword !=# prior_isk
167 let &l:iskeyword = prior_isk
168 endif
169 unlet! prior_isk
Bram Moolenaar97d62492012-11-15 21:28:22 +0100170endfor
171
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200172" TODO: Use better syncing.
173syn sync minlines=50 linebreaks=2
174
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000175hi def link rstTodo Todo
176hi def link rstComment Comment
Bram Moolenaar9b451252012-08-15 17:43:31 +0200177hi def link rstSections Title
178hi def link rstTransition rstSections
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000179hi def link rstLiteralBlock String
180hi def link rstQuotedLiteralBlock String
181hi def link rstDoctestBlock PreProc
182hi def link rstTableLines rstDelimiter
183hi def link rstSimpleTableLines rstTableLines
184hi def link rstExplicitMarkup rstDirective
185hi def link rstDirective Keyword
186hi def link rstFootnote String
187hi def link rstCitation String
188hi def link rstHyperlinkTarget String
189hi def link rstExDirective String
190hi def link rstSubstitutionDefinition rstDirective
191hi def link rstDelimiter Delimiter
Bram Moolenaar7571d552016-08-18 22:54:46 +0200192hi def rstEmphasis ctermfg=13 term=italic cterm=italic gui=italic
193hi def rstStrongEmphasis ctermfg=1 term=bold cterm=bold gui=bold
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000194hi def link rstInterpretedTextOrHyperlinkReference Identifier
195hi def link rstInlineLiteral String
196hi def link rstSubstitutionReference PreProc
197hi def link rstInlineInternalTargets Identifier
198hi def link rstFootnoteReference Identifier
199hi def link rstCitationReference Identifier
200hi def link rstHyperLinkReference Identifier
201hi def link rstStandaloneHyperlink Identifier
Bram Moolenaar97d62492012-11-15 21:28:22 +0100202hi def link rstCodeBlock String
Bram Moolenaar071d4272004-06-13 20:20:40 +0000203
204let b:current_syntax = "rst"
205
Bram Moolenaar42eeac32005-06-29 22:40:58 +0000206let &cpo = s:cpo_save
207unlet s:cpo_save