mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			208 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
			
		
		
	
	
			208 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
| " Vim syntax file
 | ||
| " Language: reStructuredText documentation format
 | ||
| " Maintainer: Marshall Ward <marshall.ward@gmail.com>
 | ||
| " Previous Maintainer: Nikolai Weibull <now@bitwi.se>
 | ||
| " Website: https://github.com/marshallward/vim-restructuredtext
 | ||
| " Latest Revision: 2016-08-18
 | ||
| 
 | ||
| if exists("b:current_syntax")
 | ||
|   finish
 | ||
| endif
 | ||
| 
 | ||
| let s:cpo_save = &cpo
 | ||
| set cpo&vim
 | ||
| 
 | ||
| syn case ignore
 | ||
| 
 | ||
| syn match   rstTransition  /^[=`:.'"~^_*+#-]\{4,}\s*$/
 | ||
| 
 | ||
| syn cluster rstCruft                contains=rstEmphasis,rstStrongEmphasis,
 | ||
|       \ rstInterpretedText,rstInlineLiteral,rstSubstitutionReference,
 | ||
|       \ rstInlineInternalTargets,rstFootnoteReference,rstHyperlinkReference
 | ||
| 
 | ||
| syn region  rstLiteralBlock         matchgroup=rstDelimiter
 | ||
|       \ start='::\_s*\n\ze\z(\s\+\)' skip='^$' end='^\z1\@!'
 | ||
|       \ contains=@NoSpell
 | ||
| 
 | ||
| syn region  rstQuotedLiteralBlock   matchgroup=rstDelimiter
 | ||
|       \ start="::\_s*\n\ze\z([!\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]\)"
 | ||
|       \ end='^\z1\@!' contains=@NoSpell
 | ||
| 
 | ||
| syn region  rstDoctestBlock         oneline display matchgroup=rstDelimiter
 | ||
|       \ start='^>>>\s' end='^$'
 | ||
| 
 | ||
| syn region  rstTable                transparent start='^\n\s*+[-=+]\+' end='^$'
 | ||
|       \ contains=rstTableLines,@rstCruft
 | ||
| syn match   rstTableLines           contained display '|\|+\%(=\+\|-\+\)\='
 | ||
| 
 | ||
| syn region  rstSimpleTable          transparent
 | ||
|       \ start='^\n\%(\s*\)\@>\%(\%(=\+\)\@>\%(\s\+\)\@>\)\%(\%(\%(=\+\)\@>\%(\s*\)\@>\)\+\)\@>$'
 | ||
|       \ end='^$'
 | ||
|       \ contains=rstSimpleTableLines,@rstCruft
 | ||
| syn match   rstSimpleTableLines     contained display
 | ||
|       \ '^\%(\s*\)\@>\%(\%(=\+\)\@>\%(\s\+\)\@>\)\%(\%(\%(=\+\)\@>\%(\s*\)\@>\)\+\)\@>$'
 | ||
| syn match   rstSimpleTableLines     contained display
 | ||
|       \ '^\%(\s*\)\@>\%(\%(-\+\)\@>\%(\s\+\)\@>\)\%(\%(\%(-\+\)\@>\%(\s*\)\@>\)\+\)\@>$'
 | ||
| 
 | ||
| syn cluster rstDirectives           contains=rstFootnote,rstCitation,
 | ||
|       \ rstHyperlinkTarget,rstExDirective
 | ||
| 
 | ||
| syn match   rstExplicitMarkup       '^\s*\.\.\_s'
 | ||
|       \ nextgroup=@rstDirectives,rstComment,rstSubstitutionDefinition
 | ||
| 
 | ||
| let s:ReferenceName = '[[:alnum:]]\+\%([_.-][[:alnum:]]\+\)*'
 | ||
| 
 | ||
| syn keyword     rstTodo             contained FIXME TODO XXX NOTE
 | ||
| 
 | ||
| execute 'syn region rstComment contained' .
 | ||
|       \ ' start=/.*/'
 | ||
|       \ ' end=/^\s\@!/ contains=rstTodo'
 | ||
| 
 | ||
| execute 'syn region rstFootnote contained matchgroup=rstDirective' .
 | ||
|       \ ' start=+\[\%(\d\+\|#\%(' . s:ReferenceName . '\)\=\|\*\)\]\_s+' .
 | ||
|       \ ' skip=+^$+' .
 | ||
|       \ ' end=+^\s\@!+ contains=@rstCruft,@NoSpell'
 | ||
| 
 | ||
| execute 'syn region rstCitation contained matchgroup=rstDirective' .
 | ||
|       \ ' start=+\[' . s:ReferenceName . '\]\_s+' .
 | ||
|       \ ' skip=+^$+' .
 | ||
|       \ ' end=+^\s\@!+ contains=@rstCruft,@NoSpell'
 | ||
| 
 | ||
| syn region rstHyperlinkTarget contained matchgroup=rstDirective
 | ||
|       \ start='_\%(_\|[^:\\]*\%(\\.[^:\\]*\)*\):\_s' skip=+^$+ end=+^\s\@!+
 | ||
| 
 | ||
| syn region rstHyperlinkTarget contained matchgroup=rstDirective
 | ||
|       \ start='_`[^`\\]*\%(\\.[^`\\]*\)*`:\_s' skip=+^$+ end=+^\s\@!+
 | ||
| 
 | ||
| syn region rstHyperlinkTarget matchgroup=rstDirective
 | ||
|       \ start=+^__\_s+ skip=+^$+ end=+^\s\@!+
 | ||
| 
 | ||
| execute 'syn region rstExDirective contained matchgroup=rstDirective' .
 | ||
|       \ ' start=+' . s:ReferenceName . '::\_s+' .
 | ||
|       \ ' skip=+^$+' .
 | ||
|       \ ' end=+^\s\@!+ contains=@rstCruft,rstLiteralBlock'
 | ||
| 
 | ||
| execute 'syn match rstSubstitutionDefinition contained' .
 | ||
|       \ ' /|' . s:ReferenceName . '|\_s\+/ nextgroup=@rstDirectives'
 | ||
| 
 | ||
| function! s:DefineOneInlineMarkup(name, start, middle, end, char_left, char_right)
 | ||
|   execute 'syn region rst' . a:name .
 | ||
|         \ ' start=+' . a:char_left . '\zs' . a:start .
 | ||
|         \ '\ze[^[:space:]' . a:char_right . a:start[strlen(a:start) - 1] . ']+' .
 | ||
|         \ a:middle .
 | ||
|         \ ' end=+\S' . a:end . '\ze\%($\|\s\|[''"’)\]}>/:.,;!?\\-]\)+'
 | ||
| endfunction
 | ||
| 
 | ||
| function! s:DefineInlineMarkup(name, start, middle, end)
 | ||
|   let middle = a:middle != "" ?
 | ||
|         \ (' skip=+\\\\\|\\' . a:middle . '+') :
 | ||
|         \ ""
 | ||
| 
 | ||
|   call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, "'", "'")
 | ||
|   call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '"', '"')
 | ||
|   call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '(', ')')
 | ||
|   call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '\[', '\]')
 | ||
|   call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '{', '}')
 | ||
|   call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '<', '>')
 | ||
|   call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '’', '’')
 | ||
|   " TODO: Additional Unicode Pd, Po, Pi, Pf, Ps characters
 | ||
| 
 | ||
|   call s:DefineOneInlineMarkup(a:name, a:start, middle, a:end, '\%(^\|\s\|[/:]\)', '')
 | ||
| 
 | ||
|   execute 'syn match rst' . a:name .
 | ||
|         \ ' +\%(^\|\s\|[''"([{</:]\)\zs' . a:start .
 | ||
|         \ '[^[:space:]' . a:start[strlen(a:start) - 1] . ']'
 | ||
|         \ a:end . '\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
 | ||
| 
 | ||
|   execute 'hi def link rst' . a:name . 'Delimiter' . ' rst' . a:name
 | ||
| endfunction
 | ||
| 
 | ||
| call s:DefineInlineMarkup('Emphasis', '\*', '\*', '\*')
 | ||
| call s:DefineInlineMarkup('StrongEmphasis', '\*\*', '\*', '\*\*')
 | ||
| call s:DefineInlineMarkup('InterpretedTextOrHyperlinkReference', '`', '`', '`_\{0,2}')
 | ||
| call s:DefineInlineMarkup('InlineLiteral', '``', "", '``')
 | ||
| call s:DefineInlineMarkup('SubstitutionReference', '|', '|', '|_\{0,2}')
 | ||
| call s:DefineInlineMarkup('InlineInternalTargets', '_`', '`', '`')
 | ||
| 
 | ||
| syn match   rstSections "^\%(\([=`:.'"~^_*+#-]\)\1\+\n\)\=.\+\n\([=`:.'"~^_*+#-]\)\2\+$"
 | ||
| 
 | ||
| " TODO: Can’t remember why these two can’t be defined like the ones above.
 | ||
| execute 'syn match rstFootnoteReference contains=@NoSpell' .
 | ||
|       \ ' +\[\%(\d\+\|#\%(' . s:ReferenceName . '\)\=\|\*\)\]_+'
 | ||
| 
 | ||
| execute 'syn match rstCitationReference contains=@NoSpell' .
 | ||
|       \ ' +\[' . s:ReferenceName . '\]_\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
 | ||
| 
 | ||
| execute 'syn match rstHyperlinkReference' .
 | ||
|       \ ' /\<' . s:ReferenceName . '__\=\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)/'
 | ||
| 
 | ||
| syn match   rstStandaloneHyperlink  contains=@NoSpell
 | ||
|       \ "\<\%(\%(\%(https\=\|file\|ftp\|gopher\)://\|\%(mailto\|news\):\)[^[:space:]'\"<>]\+\|www[[:alnum:]_-]*\.[[:alnum:]_-]\+\.[^[:space:]'\"<>]\+\)[[:alnum:]/]"
 | ||
| 
 | ||
| syn region rstCodeBlock contained matchgroup=rstDirective
 | ||
|       \ start=+\%(sourcecode\|code\%(-block\)\=\)::\s\+\w*\_s*\n\ze\z(\s\+\)+
 | ||
|       \ skip=+^$+
 | ||
|       \ end=+^\z1\@!+
 | ||
|       \ contains=@NoSpell
 | ||
| syn cluster rstDirectives add=rstCodeBlock
 | ||
| 
 | ||
| if !exists('g:rst_syntax_code_list')
 | ||
|     let g:rst_syntax_code_list = ['vim', 'java', 'cpp', 'lisp', 'php',
 | ||
|                                 \ 'python', 'perl', 'sh']
 | ||
| endif
 | ||
| 
 | ||
| for code in g:rst_syntax_code_list
 | ||
|     unlet! b:current_syntax
 | ||
|     " guard against setting 'isk' option which might cause problems (issue #108)
 | ||
|     let prior_isk = &l:iskeyword
 | ||
|     exe 'syn include @rst'.code.' syntax/'.code.'.vim'
 | ||
|     exe 'syn region rstDirective'.code.' matchgroup=rstDirective fold'
 | ||
|                 \.' start=#\%(sourcecode\|code\%(-block\)\=\)::\s\+'.code.'\_s*\n\ze\z(\s\+\)#'
 | ||
|                 \.' skip=#^$#'
 | ||
|                 \.' end=#^\z1\@!#'
 | ||
|                 \.' contains=@NoSpell,@rst'.code
 | ||
|     exe 'syn cluster rstDirectives add=rstDirective'.code
 | ||
|     " reset 'isk' setting, if it has been changed
 | ||
|     if &l:iskeyword !=# prior_isk
 | ||
|         let &l:iskeyword = prior_isk
 | ||
|     endif
 | ||
|     unlet! prior_isk
 | ||
| endfor
 | ||
| 
 | ||
| " TODO: Use better syncing.
 | ||
| syn sync minlines=50 linebreaks=2
 | ||
| 
 | ||
| hi def link rstTodo                         Todo
 | ||
| hi def link rstComment                      Comment
 | ||
| hi def link rstSections                     Title
 | ||
| hi def link rstTransition                   rstSections
 | ||
| hi def link rstLiteralBlock                 String
 | ||
| hi def link rstQuotedLiteralBlock           String
 | ||
| hi def link rstDoctestBlock                 PreProc
 | ||
| hi def link rstTableLines                   rstDelimiter
 | ||
| hi def link rstSimpleTableLines             rstTableLines
 | ||
| hi def link rstExplicitMarkup               rstDirective
 | ||
| hi def link rstDirective                    Keyword
 | ||
| hi def link rstFootnote                     String
 | ||
| hi def link rstCitation                     String
 | ||
| hi def link rstHyperlinkTarget              String
 | ||
| hi def link rstExDirective                  String
 | ||
| hi def link rstSubstitutionDefinition       rstDirective
 | ||
| hi def link rstDelimiter                    Delimiter
 | ||
| hi def rstEmphasis ctermfg=13 term=italic cterm=italic gui=italic
 | ||
| hi def rstStrongEmphasis ctermfg=1 term=bold cterm=bold gui=bold
 | ||
| hi def link rstInterpretedTextOrHyperlinkReference  Identifier
 | ||
| hi def link rstInlineLiteral                String
 | ||
| hi def link rstSubstitutionReference        PreProc
 | ||
| hi def link rstInlineInternalTargets        Identifier
 | ||
| hi def link rstFootnoteReference            Identifier
 | ||
| hi def link rstCitationReference            Identifier
 | ||
| hi def link rstHyperLinkReference           Identifier
 | ||
| hi def link rstStandaloneHyperlink          Identifier
 | ||
| hi def link rstCodeBlock                    String
 | ||
| 
 | ||
| let b:current_syntax = "rst"
 | ||
| 
 | ||
| let &cpo = s:cpo_save
 | ||
| unlet s:cpo_save
 | 
