blob: b68089720bc8f1ade0aa10d1301ea1361cbdd346 [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 Moolenaar97d62492012-11-15 21:28:22 +01004" Latest Revision: 2012-11-01
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
138" TODO: Use better syncing. I don’t know the specifics of syncing well enough,
139" though.
Bram Moolenaar6dfc28b2010-02-11 14:19:15 +0100140syn sync minlines=50 linebreaks=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000141
Bram Moolenaar97d62492012-11-15 21:28:22 +0100142syn region rstCodeBlock contained matchgroup=rstDirective
143 \ start=+\%(sourcecode\|code\%(-block\)\=\)::\s+
144 \ skip=+^$+
145 \ end=+^\s\@!+
146 \ contains=@NoSpell
147syn cluster rstDirectives add=rstCodeBlock
148
149if !exists('g:rst_syntax_code_list')
150 let g:rst_syntax_code_list = ['vim', 'java', 'cpp', 'lisp', 'php', 'python', 'perl']
151endif
152
153for code in g:rst_syntax_code_list
154 unlet! b:current_syntax
155 exe 'syn include @rst'.code.' syntax/'.code.'.vim'
156 exe 'syn region rstDirective'.code.' matchgroup=rstDirective fold '
157 \.'start=#\%(sourcecode\|code\%(-block\)\=\)::\s\+'.code.'\s*$# '
158 \.'skip=#^$# '
159 \.'end=#^\s\@!# contains=@NoSpell,@rst'.code
160 exe 'syn cluster rstDirectives add=rstDirective'.code
161endfor
162
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000163hi def link rstTodo Todo
164hi def link rstComment Comment
Bram Moolenaar9b451252012-08-15 17:43:31 +0200165hi def link rstSections Title
166hi def link rstTransition rstSections
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000167hi def link rstLiteralBlock String
168hi def link rstQuotedLiteralBlock String
169hi def link rstDoctestBlock PreProc
170hi def link rstTableLines rstDelimiter
171hi def link rstSimpleTableLines rstTableLines
172hi def link rstExplicitMarkup rstDirective
173hi def link rstDirective Keyword
174hi def link rstFootnote String
175hi def link rstCitation String
176hi def link rstHyperlinkTarget String
177hi def link rstExDirective String
178hi def link rstSubstitutionDefinition rstDirective
179hi def link rstDelimiter Delimiter
180" TODO: I dunno...
181hi def rstEmphasis term=italic cterm=italic gui=italic
182hi def link rstStrongEmphasis Special
183"term=bold cterm=bold gui=bold
184hi def link rstInterpretedTextOrHyperlinkReference Identifier
185hi def link rstInlineLiteral String
186hi def link rstSubstitutionReference PreProc
187hi def link rstInlineInternalTargets Identifier
188hi def link rstFootnoteReference Identifier
189hi def link rstCitationReference Identifier
190hi def link rstHyperLinkReference Identifier
191hi def link rstStandaloneHyperlink Identifier
Bram Moolenaar97d62492012-11-15 21:28:22 +0100192hi def link rstCodeBlock String
Bram Moolenaar071d4272004-06-13 20:20:40 +0000193
194let b:current_syntax = "rst"
195
Bram Moolenaar42eeac32005-06-29 22:40:58 +0000196let &cpo = s:cpo_save
197unlet s:cpo_save