blob: 425d225113761ce905bf00970d46821fc923be38 [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 Moolenaar779b74b2006-04-10 14:55:34 +00003" Maintainer: Nikolai Weibull <now@bitwi.se>
Bram Moolenaar36782082013-11-28 13:53:34 +01004" Latest Revision: 2013-11-26
Bram Moolenaar071d4272004-06-13 20:20:40 +00005
Bram Moolenaar42eeac32005-06-29 22:40:58 +00006if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +00007 finish
8endif
9
Bram Moolenaar42eeac32005-06-29 22:40:58 +000010let s:cpo_save = &cpo
11set cpo&vim
12
Bram Moolenaar071d4272004-06-13 20:20:40 +000013syn case ignore
14
Bram Moolenaar5c736222010-01-06 20:54:52 +010015syn match rstSections "^\%(\([=`:.'"~^_*+#-]\)\1\+\n\)\=.\+\n\([=`:.'"~^_*+#-]\)\2\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +000016
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 Moolenaar25394022007-05-10 19:06:20 +000050syn match rstExplicitMarkup '^\.\.\_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=+^$+' .
83 \ ' end=+^\s\@!+ contains=@rstCruft'
84
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 .
93 \ ' end=+\S' . a:end . '\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
94endfunction
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, "'", "'")
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, '{', '}')
106 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '<', '>')
107
108 call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '\%(^\|\s\|[/:]\)', '')
109
110 execute 'syn match rst' . a:name .
111 \ ' +\%(^\|\s\|[''"([{</:]\)\zs' . a:start .
112 \ '[^[:space:]' . a:start[strlen(a:start) - 1] . ']'
113 \ a:end . '\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
114
115 execute 'hi def link rst' . a:name . 'Delimiter' . ' rst' . a:name
116endfunction
117
118call s:DefineInlineMarkup('Emphasis', '\*', '\*', '\*')
119call s:DefineInlineMarkup('StrongEmphasis', '\*\*', '\*', '\*\*')
120call s:DefineInlineMarkup('InterpretedTextOrHyperlinkReference', '`', '`', '`_\{0,2}')
121call s:DefineInlineMarkup('InlineLiteral', '``', "", '``')
122call s:DefineInlineMarkup('SubstitutionReference', '|', '|', '|_\{0,2}')
123call s:DefineInlineMarkup('InlineInternalTargets', '_`', '`', '`')
124
125" TODO: Can’t remember why these two can’t be defined like the ones above.
126execute 'syn match rstFootnoteReference contains=@NoSpell' .
127 \ ' +\[\%(\d\+\|#\%(' . s:ReferenceName . '\)\=\|\*\)\]_+'
128
129execute 'syn match rstCitationReference contains=@NoSpell' .
Bram Moolenaar25394022007-05-10 19:06:20 +0000130 \ ' +\[' . s:ReferenceName . '\]_\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000131
132execute 'syn match rstHyperlinkReference' .
Bram Moolenaar25394022007-05-10 19:06:20 +0000133 \ ' /\<' . s:ReferenceName . '__\=\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)/'
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000134
135syn match rstStandaloneHyperlink contains=@NoSpell
136 \ "\<\%(\%(\%(https\=\|file\|ftp\|gopher\)://\|\%(mailto\|news\):\)[^[:space:]'\"<>]\+\|www[[:alnum:]_-]*\.[[:alnum:]_-]\+\.[^[:space:]'\"<>]\+\)[[:alnum:]/]"
137
Bram Moolenaar97d62492012-11-15 21:28:22 +0100138syn region rstCodeBlock contained matchgroup=rstDirective
139 \ start=+\%(sourcecode\|code\%(-block\)\=\)::\s+
140 \ skip=+^$+
141 \ end=+^\s\@!+
142 \ contains=@NoSpell
143syn cluster rstDirectives add=rstCodeBlock
144
145if !exists('g:rst_syntax_code_list')
146 let g:rst_syntax_code_list = ['vim', 'java', 'cpp', 'lisp', 'php', 'python', 'perl']
147endif
148
149for code in g:rst_syntax_code_list
150 unlet! b:current_syntax
151 exe 'syn include @rst'.code.' syntax/'.code.'.vim'
152 exe 'syn region rstDirective'.code.' matchgroup=rstDirective fold '
153 \.'start=#\%(sourcecode\|code\%(-block\)\=\)::\s\+'.code.'\s*$# '
154 \.'skip=#^$# '
Bram Moolenaar36782082013-11-28 13:53:34 +0100155 \.'end=#^\s\@!# contains=@NoSpell,@rst'.code.' keepend'
Bram Moolenaar97d62492012-11-15 21:28:22 +0100156 exe 'syn cluster rstDirectives add=rstDirective'.code
157endfor
158
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200159" TODO: Use better syncing.
160syn sync minlines=50 linebreaks=2
161
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000162hi def link rstTodo Todo
163hi def link rstComment Comment
Bram Moolenaar9b451252012-08-15 17:43:31 +0200164hi def link rstSections Title
165hi def link rstTransition rstSections
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000166hi def link rstLiteralBlock String
167hi def link rstQuotedLiteralBlock String
168hi def link rstDoctestBlock PreProc
169hi def link rstTableLines rstDelimiter
170hi def link rstSimpleTableLines rstTableLines
171hi def link rstExplicitMarkup rstDirective
172hi def link rstDirective Keyword
173hi def link rstFootnote String
174hi def link rstCitation String
175hi def link rstHyperlinkTarget String
176hi def link rstExDirective String
177hi def link rstSubstitutionDefinition rstDirective
178hi def link rstDelimiter Delimiter
179" TODO: I dunno...
180hi def rstEmphasis term=italic cterm=italic gui=italic
181hi def link rstStrongEmphasis Special
182"term=bold cterm=bold gui=bold
183hi def link rstInterpretedTextOrHyperlinkReference Identifier
184hi def link rstInlineLiteral String
185hi def link rstSubstitutionReference PreProc
186hi def link rstInlineInternalTargets Identifier
187hi def link rstFootnoteReference Identifier
188hi def link rstCitationReference Identifier
189hi def link rstHyperLinkReference Identifier
190hi def link rstStandaloneHyperlink Identifier
Bram Moolenaar97d62492012-11-15 21:28:22 +0100191hi def link rstCodeBlock String
Bram Moolenaar071d4272004-06-13 20:20:40 +0000192
193let b:current_syntax = "rst"
194
Bram Moolenaar42eeac32005-06-29 22:40:58 +0000195let &cpo = s:cpo_save
196unlet s:cpo_save