Mercurial > vim
view runtime/syntax/rmd.vim @ 33636:53416c49a7ab v9.0.2059
patch 9.0.2059: outstanding exceptions may be skipped
Commit: https://github.com/vim/vim/commit/0ab500dede4edd8d5aee7ddc63444537be527871
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Sat Oct 21 11:59:42 2023 +0200
patch 9.0.2059: outstanding exceptions may be skipped
Problem: outstanding exceptions may be skipped
Solution: When restoring exception state, process remaining outstanding
exceptions
closes: #13386
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sat, 21 Oct 2023 12:15:03 +0200 |
parents | 033f22d4a52a |
children | 34f6f3678cae |
line wrap: on
line source
" Language: Markdown with chunks of R, Python and other languages " Maintainer: Jakson Aquino <jalvesaq@gmail.com> " Homepage: https://github.com/jalvesaq/R-Vim-runtime " Last Change: Wed May 17, 2023 06:34AM " " For highlighting pandoc extensions to markdown like citations and TeX and " many other advanced features like folding of markdown sections, it is " recommended to install the vim-pandoc filetype plugin as well as the " vim-pandoc-syntax filetype plugin from https://github.com/vim-pandoc. if exists("b:current_syntax") finish endif let s:cpo_save = &cpo set cpo&vim " Highlight the header of the chunks as R code let g:rmd_syn_hl_chunk = get(g:, 'rmd_syn_hl_chunk', 0) " Pandoc-syntax has more features, but it is slower. " https://github.com/vim-pandoc/vim-pandoc-syntax " Don't waste time loading syntax that will be discarded: let s:save_pandoc_lngs = get(g:, 'pandoc#syntax#codeblocks#embeds#langs', []) let g:pandoc#syntax#codeblocks#embeds#langs = [] let g:rmd_dynamic_fenced_languages = get(g:, 'rmd_dynamic_fenced_languages', v:true) " Step_1: Source pandoc.vim if it is installed: runtime syntax/pandoc.vim if exists("b:current_syntax") if hlexists('pandocDelimitedCodeBlock') syn clear pandocDelimitedCodeBlock endif if len(s:save_pandoc_lngs) > 0 && !exists('g:rmd_fenced_languages') let g:rmd_fenced_languages = deepcopy(s:save_pandoc_lngs) endif " Recognize inline R code syn region rmdrInline matchgroup=rmdInlineDelim start="`r " end="`" contains=@Rmdr containedin=pandocLaTeXRegion,yamlFlowString keepend else " Step_2: Source markdown.vim if pandoc.vim is not installed " Configuration if not using pandoc syntax: " Add syntax highlighting of YAML header let g:rmd_syn_hl_yaml = get(g:, 'rmd_syn_hl_yaml', 1) " Add syntax highlighting of citation keys let g:rmd_syn_hl_citations = get(g:, 'rmd_syn_hl_citations', 1) " R chunks will not be highlighted by syntax/markdown because their headers " follow a non standard pattern: "```{lang" instead of "^```lang". " Make a copy of g:markdown_fenced_languages to highlight the chunks later: if exists('g:markdown_fenced_languages') && !exists('g:rmd_fenced_languages') let g:rmd_fenced_languages = deepcopy(g:markdown_fenced_languages) endif if exists('g:markdown_fenced_languages') && len(g:markdown_fenced_languages) > 0 let s:save_mfl = deepcopy(g:markdown_fenced_languages) endif " Don't waste time loading syntax that will be discarded: let g:markdown_fenced_languages = [] runtime syntax/markdown.vim if exists('s:save_mfl') > 0 let g:markdown_fenced_languages = deepcopy(s:save_mfl) unlet s:save_mfl endif syn region rmdrInline matchgroup=rmdInlineDelim start="`r " end="`" contains=@Rmdr keepend " Step_2a: Add highlighting for both YAML and citations which are pandoc " specific, but also used in Rmd files " You don't need this if either your markdown/syntax.vim already highlights " the YAML header or you are writing standard markdown if g:rmd_syn_hl_yaml " Basic highlighting of YAML header syn match rmdYamlFieldTtl /^\s*\zs\w\%(-\|\w\)*\ze:/ contained syn match rmdYamlFieldTtl /^\s*-\s*\zs\w\%(-\|\w\)*\ze:/ contained syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start='"' skip='\\"' end='"' contains=yamlEscape,rmdrInline contained syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start="'" skip="''" end="'" contains=yamlSingleEscape,rmdrInline contained syn match yamlEscape contained '\\\%([\\"abefnrtv\^0_ NLP\n]\|x\x\x\|u\x\{4}\|U\x\{8}\)' syn match yamlSingleEscape contained "''" syn match yamlComment /#.*/ contained " A second colon is a syntax error, unless within a string or following !expr syn match yamlColonError /:\s*[^'^"^!]*:/ contained if &filetype == 'quarto' syn region pandocYAMLHeader matchgroup=rmdYamlBlockDelim start=/\%(\%^\|\_^\s*\n\)\@<=\_^-\{3}\ze\n.\+/ end=/^---$/ keepend contains=rmdYamlFieldTtl,yamlFlowString,yamlComment,yamlColonError else syn region pandocYAMLHeader matchgroup=rmdYamlBlockDelim start=/\%(\%^\|\_^\s*\n\)\@<=\_^-\{3}\ze\n.\+/ end=/^\([-.]\)\1\{2}$/ keepend contains=rmdYamlFieldTtl,yamlFlowString,yamlComment,yamlColonError endif hi def link rmdYamlBlockDelim Delimiter hi def link rmdYamlFieldTtl Identifier hi def link yamlFlowString String hi def link yamlComment Comment hi def link yamlColonError Error endif " Conceal char for manual line break if &encoding ==# 'utf-8' syn match rmdNewLine ' $' conceal cchar=↵ endif " You don't need this if either your markdown/syntax.vim already highlights " citations or you are writing standard markdown if g:rmd_syn_hl_citations " From vim-pandoc-syntax " parenthetical citations syn match pandocPCite /\^\@<!\[[^\[\]]\{-}-\{0,1}@[[:alnum:]_][[:alnum:]à-öø-ÿÀ-ÖØ-ß_:.#$%&\-+?<>~\/]*.\{-}\]/ contains=pandocEmphasis,pandocStrong,pandocLatex,pandocCiteKey,@Spell,pandocAmpersandEscape display " in-text citations with location syn match pandocICite /@[[:alnum:]_][[:alnum:]à-öø-ÿÀ-ÖØ-ß_:.#$%&\-+?<>~\/]*\s\[.\{-1,}\]/ contains=pandocCiteKey,@Spell display " cite keys syn match pandocCiteKey /\(-\=@[[:alnum:]_][[:alnum:]à-öø-ÿÀ-ÖØ-ß_:.#$%&\-+?<>~\/]*\)/ containedin=pandocPCite,pandocICite contains=@NoSpell display syn match pandocCiteAnchor /[-@]/ contained containedin=pandocCiteKey display syn match pandocCiteLocator /[\[\]]/ contained containedin=pandocPCite,pandocICite hi def link pandocPCite Operator hi def link pandocICite Operator hi def link pandocCiteKey Label hi def link pandocCiteAnchor Operator hi def link pandocCiteLocator Operator endif endif " Step_3: Highlight code blocks. syn region rmdCodeBlock matchgroup=rmdCodeDelim start="^\s*```\s*{.*}$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend syn region rmdCodeBlock matchgroup=rmdCodeDelim start="^\s*```.+$" matchgroup=rmdCodeDelim end="^```$" keepend hi link rmdCodeBlock Special " Now highlight chunks: syn region knitrBodyOptions start='^#| ' end='$' contained containedin=rComment,pythonComment contains=knitrBodyVar,knitrBodyValue transparent syn match knitrBodyValue ': \zs.*\ze$' keepend contained containedin=knitrBodyOptions syn match knitrBodyVar '| \zs\S\{-}\ze:' contained containedin=knitrBodyOptions let g:rmd_fenced_languages = get(g:, 'rmd_fenced_languages', ['r']) let s:no_syntax_vim = [] function IncludeLanguage(lng) if a:lng =~ '=' let ftpy = substitute(a:lng, '.*=', '', '') let lnm = substitute(a:lng, '=.*', '', '') else let ftpy = a:lng let lnm = a:lng endif if index(s:no_syntax_vim, ftpy) >= 0 return endif if len(globpath(&rtp, "syntax/" . ftpy . ".vim")) unlet! b:current_syntax exe 'syn include @Rmd'.lnm.' syntax/'.ftpy.'.vim' let b:current_syntax = "rmd" if g:rmd_syn_hl_chunk exe 'syn match knitrChunkDelim /```\s*{\s*'.lnm.'/ contained containedin=knitrChunkBrace contains=knitrChunkLabel' exe 'syn match knitrChunkLabelDelim /```\s*{\s*'.lnm.',\=\s*[-[:alnum:]]\{-1,}[,}]/ contained containedin=knitrChunkBrace' syn match knitrChunkDelim /}\s*$/ contained containedin=knitrChunkBrace exe 'syn match knitrChunkBrace /```\s*{\s*'.lnm.'.*$/ contained containedin=rmd'.lnm.'Chunk contains=knitrChunkDelim,knitrChunkLabelDelim,@Rmd'.lnm exe 'syn region rmd'.lnm.'Chunk start="^\s*```\s*{\s*=\?'.lnm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=knitrChunkBrace,@Rmd'.lnm hi link knitrChunkLabel Identifier hi link knitrChunkDelim rmdCodeDelim hi link knitrChunkLabelDelim rmdCodeDelim else exe 'syn region rmd'.lnm.'Chunk matchgroup=rmdCodeDelim start="^\s*```\s*{\s*=\?'.lnm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=@Rmd'.lnm endif else " Avoid the cost of running globpath() whenever the buffer is saved let s:no_syntax_vim += [ftpy] endif endfunction for s:type in g:rmd_fenced_languages call IncludeLanguage(s:type) endfor unlet! s:type function CheckRmdFencedLanguages() let alines = getline(1, '$') call filter(alines, "v:val =~ '^```{'") call map(alines, "substitute(v:val, '^```{', '', '')") call map(alines, "substitute(v:val, '\\W.*', '', '')") for tpy in alines if len(tpy) == 0 continue endif let has_lng = 0 for lng in g:rmd_fenced_languages if tpy == lng let has_lng = 1 continue endif endfor if has_lng == 0 let g:rmd_fenced_languages += [tpy] call IncludeLanguage(tpy) endif endfor endfunction if g:rmd_dynamic_fenced_languages call CheckRmdFencedLanguages() augroup RmdSyntax autocmd! autocmd BufWritePost <buffer> call CheckRmdFencedLanguages() augroup END endif " Step_4: Highlight code recognized by pandoc but not defined in pandoc.vim yet: syn match pandocDivBegin '^:::\+ {.\{-}}' contains=pandocHeaderAttr syn match pandocDivEnd '^:::\+$' hi def link knitrBodyVar PreProc hi def link knitrBodyValue Constant hi def link knitrBodyOptions rComment hi def link pandocDivBegin Delimiter hi def link pandocDivEnd Delimiter hi def link rmdInlineDelim Delimiter hi def link rmdCodeDelim Delimiter if len(s:save_pandoc_lngs) let g:pandoc#syntax#codeblocks#embeds#langs = s:save_pandoc_lngs endif unlet s:save_pandoc_lngs let &cpo = s:cpo_save unlet s:cpo_save let b:current_syntax = "rmd" " vim: ts=8 sw=2