blob: acb56163b3677834d73c6f5fdf91d9a63f0a7562 [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 Moolenaar6dfc28b2010-02-11 14:19:15 +01004" Latest Revision: 2010-01-23
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 Moolenaar779b74b2006-04-10 14:55:34 +0000142hi def link rstTodo Todo
143hi def link rstComment Comment
Bram Moolenaar5c736222010-01-06 20:54:52 +0100144hi def link rstSections Type
145hi def link rstTransition Type
Bram Moolenaar779b74b2006-04-10 14:55:34 +0000146hi def link rstLiteralBlock String
147hi def link rstQuotedLiteralBlock String
148hi def link rstDoctestBlock PreProc
149hi def link rstTableLines rstDelimiter
150hi def link rstSimpleTableLines rstTableLines
151hi def link rstExplicitMarkup rstDirective
152hi def link rstDirective Keyword
153hi def link rstFootnote String
154hi def link rstCitation String
155hi def link rstHyperlinkTarget String
156hi def link rstExDirective String
157hi def link rstSubstitutionDefinition rstDirective
158hi def link rstDelimiter Delimiter
159" TODO: I dunno...
160hi def rstEmphasis term=italic cterm=italic gui=italic
161hi def link rstStrongEmphasis Special
162"term=bold cterm=bold gui=bold
163hi def link rstInterpretedTextOrHyperlinkReference Identifier
164hi def link rstInlineLiteral String
165hi def link rstSubstitutionReference PreProc
166hi def link rstInlineInternalTargets Identifier
167hi def link rstFootnoteReference Identifier
168hi def link rstCitationReference Identifier
169hi def link rstHyperLinkReference Identifier
170hi def link rstStandaloneHyperlink Identifier
Bram Moolenaar071d4272004-06-13 20:20:40 +0000171
172let b:current_syntax = "rst"
173
Bram Moolenaar42eeac32005-06-29 22:40:58 +0000174let &cpo = s:cpo_save
175unlet s:cpo_save