codekingpro/portable-devtools
114k
1" Language: Markdown with chunks of R, Python and other languages2" Maintainer: This runtime file is looking for a new maintainer.3" Former Maintainer: Jakson Alves de Aquino <jalvesaq@gmail.com>4" Former Repository: https://github.com/jalvesaq/R-Vim-runtime5" Last Change: 2023 Dec 24 07:21AM6" 2024 Feb 19 by Vim Project (announce adoption)7"8" For highlighting pandoc extensions to markdown like citations and TeX and9" many other advanced features like folding of markdown sections, it is10" recommended to install the vim-pandoc filetype plugin as well as the11" vim-pandoc-syntax filetype plugin from https://github.com/vim-pandoc.12 13 14if exists("b:current_syntax")15 finish16endif17 18let s:cpo_save = &cpo19set cpo&vim20 21let g:rmd_include_latex = get(g:, 'rmd_include_latex', 1)22if g:rmd_include_latex == 0 || g:rmd_include_latex == 123 let b:rmd_has_LaTeX = v:false24elseif g:rmd_include_latex == 225 let b:rmd_has_LaTeX = v:true26endif27 28" Highlight the header of the chunks as R code29let g:rmd_syn_hl_chunk = get(g:, 'rmd_syn_hl_chunk', 0)30 31" Pandoc-syntax has more features, but it is slower.32" https://github.com/vim-pandoc/vim-pandoc-syntax33 34" Don't waste time loading syntax that will be discarded:35let s:save_pandoc_lngs = get(g:, 'pandoc#syntax#codeblocks#embeds#langs', [])36let g:pandoc#syntax#codeblocks#embeds#langs = []37 38let g:rmd_dynamic_fenced_languages = get(g:, 'rmd_dynamic_fenced_languages', v:true)39 40" Step_1: Source pandoc.vim if it is installed:41runtime syntax/pandoc.vim42if exists("b:current_syntax")43 if hlexists('pandocDelimitedCodeBlock')44 syn clear pandocDelimitedCodeBlock45 endif46 47 if len(s:save_pandoc_lngs) > 0 && !exists('g:rmd_fenced_languages')48 let g:rmd_fenced_languages = deepcopy(s:save_pandoc_lngs)49 endif50 51 " Recognize inline R code52 syn region rmdrInline matchgroup=rmdInlineDelim start="`r " end="`" contains=@Rmdr containedin=pandocLaTeXRegion,yamlFlowString keepend53else54 " Step_2: Source markdown.vim if pandoc.vim is not installed55 56 " Configuration if not using pandoc syntax:57 " Add syntax highlighting of YAML header58 let g:rmd_syn_hl_yaml = get(g:, 'rmd_syn_hl_yaml', 1)59 " Add syntax highlighting of citation keys60 let g:rmd_syn_hl_citations = get(g:, 'rmd_syn_hl_citations', 1)61 62 " R chunks will not be highlighted by syntax/markdown because their headers63 " follow a non standard pattern: "```{lang" instead of "^```lang".64 " Make a copy of g:markdown_fenced_languages to highlight the chunks later:65 if exists('g:markdown_fenced_languages') && !exists('g:rmd_fenced_languages')66 let g:rmd_fenced_languages = deepcopy(g:markdown_fenced_languages)67 endif68 69 if exists('g:markdown_fenced_languages') && len(g:markdown_fenced_languages) > 070 let s:save_mfl = deepcopy(g:markdown_fenced_languages)71 endif72 " Don't waste time loading syntax that will be discarded:73 let g:markdown_fenced_languages = []74 runtime syntax/markdown.vim75 if exists('s:save_mfl') > 076 let g:markdown_fenced_languages = deepcopy(s:save_mfl)77 unlet s:save_mfl78 endif79 syn region rmdrInline matchgroup=rmdInlineDelim start="`r " end="`" contains=@Rmdr keepend80 81 " Step_2a: Add highlighting for both YAML and citations which are pandoc82 " specific, but also used in Rmd files83 84 " You don't need this if either your markdown/syntax.vim already highlights85 " the YAML header or you are writing standard markdown86 if g:rmd_syn_hl_yaml87 " Basic highlighting of YAML header88 syn match rmdYamlFieldTtl /^\s*\zs\w\%(-\|\w\)*\ze:/ contained89 syn match rmdYamlFieldTtl /^\s*-\s*\zs\w\%(-\|\w\)*\ze:/ contained90 syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start='"' skip='\\"' end='"' contains=yamlEscape,rmdrInline contained91 syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start="'" skip="''" end="'" contains=yamlSingleEscape,rmdrInline contained92 syn match yamlEscape contained '\\\%([\\"abefnrtv\^0_ NLP\n]\|x\x\x\|u\x\{4}\|U\x\{8}\)'93 syn match yamlSingleEscape contained "''"94 syn match yamlComment /#.*/ contained95 " A second colon is a syntax error, unless within a string or following !expr96 syn match yamlColonError /:\s*[^'^"^!]*:/ contained97 if &filetype == 'quarto'98 syn region pandocYAMLHeader matchgroup=rmdYamlBlockDelim start=/\%(\%^\|\_^\s*\n\)\@<=\_^-\{3}\ze\n.\+/ end=/^---$/ keepend contains=rmdYamlFieldTtl,yamlFlowString,yamlComment,yamlColonError99 else100 syn region pandocYAMLHeader matchgroup=rmdYamlBlockDelim start=/\%(\%^\|\_^\s*\n\)\@<=\_^-\{3}\ze\n.\+/ end=/^\([-.]\)\1\{2}$/ keepend contains=rmdYamlFieldTtl,yamlFlowString,yamlComment,yamlColonError101 endif102 hi def link rmdYamlBlockDelim Delimiter103 hi def link rmdYamlFieldTtl Identifier104 hi def link yamlFlowString String105 hi def link yamlComment Comment106 hi def link yamlColonError Error107 endif108 109 " Conceal char for manual line break110 if &encoding ==# 'utf-8'111 syn match rmdNewLine ' $' conceal cchar=↵112 endif113 114 " You don't need this if either your markdown/syntax.vim already highlights115 " citations or you are writing standard markdown116 if g:rmd_syn_hl_citations117 " From vim-pandoc-syntax118 " parenthetical citations119 syn match pandocPCite /\^\@<!\[[^\[\]]\{-}-\{0,1}@[[:alnum:]_][[:alnum:]à-öø-ÿÀ-ÖØ-ß_:.#$%&\-+?<>~\/]*.\{-}\]/ contains=pandocEmphasis,pandocStrong,pandocLatex,pandocCiteKey,@Spell,pandocAmpersandEscape display120 " in-text citations with location121 syn match pandocICite /@[[:alnum:]_][[:alnum:]à-öø-ÿÀ-ÖØ-ß_:.#$%&\-+?<>~\/]*\s\[.\{-1,}\]/ contains=pandocCiteKey,@Spell display122 " cite keys123 syn match pandocCiteKey /\(-\=@[[:alnum:]_][[:alnum:]à-öø-ÿÀ-ÖØ-ß_:.#$%&\-+?<>~\/]*\)/ containedin=pandocPCite,pandocICite contains=@NoSpell display124 syn match pandocCiteAnchor /[-@]/ contained containedin=pandocCiteKey display125 syn match pandocCiteLocator /[\[\]]/ contained containedin=pandocPCite,pandocICite126 hi def link pandocPCite Operator127 hi def link pandocICite Operator128 hi def link pandocCiteKey Label129 hi def link pandocCiteAnchor Operator130 hi def link pandocCiteLocator Operator131 endif132endif133 134" Step_3: Highlight code blocks.135 136syn region rmdCodeBlock matchgroup=rmdCodeDelim start="^\s*```\s*{.*}$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend137syn region rmdCodeBlock matchgroup=rmdCodeDelim start="^\s*```.+$" matchgroup=rmdCodeDelim end="^```$" keepend138hi link rmdCodeBlock Special139 140" Now highlight chunks:141syn region knitrBodyOptions start='^#| ' end='$' contained containedin=rComment,pythonComment contains=knitrBodyVar,knitrBodyValue transparent142syn match knitrBodyValue ': \zs.*\ze$' keepend contained containedin=knitrBodyOptions143syn match knitrBodyVar '| \zs\S\{-}\ze:' contained containedin=knitrBodyOptions144 145let g:rmd_fenced_languages = get(g:, 'rmd_fenced_languages', ['r'])146 147let s:no_syntax_vim = []148function s:IncludeLanguage(lng)149 if a:lng =~ '='150 let ftpy = substitute(a:lng, '.*=', '', '')151 let lnm = substitute(a:lng, '=.*', '', '')152 else153 let ftpy = a:lng154 let lnm = a:lng155 endif156 if index(s:no_syntax_vim, ftpy) >= 0157 return158 endif159 if len(globpath(&rtp, "syntax/" . ftpy . ".vim"))160 unlet! b:current_syntax161 exe 'syn include @Rmd'.lnm.' syntax/'.ftpy.'.vim'162 let b:current_syntax = "rmd"163 if g:rmd_syn_hl_chunk164 exe 'syn match knitrChunkDelim /```\s*{\s*'.lnm.'/ contained containedin=knitrChunkBrace contains=knitrChunkLabel'165 exe 'syn match knitrChunkLabelDelim /```\s*{\s*'.lnm.',\=\s*[-[:alnum:]]\{-1,}[,}]/ contained containedin=knitrChunkBrace'166 syn match knitrChunkDelim /}\s*$/ contained containedin=knitrChunkBrace167 exe 'syn match knitrChunkBrace /```\s*{\s*'.lnm.'.*$/ contained containedin=rmd'.lnm.'Chunk contains=knitrChunkDelim,knitrChunkLabelDelim,@Rmd'.lnm168 exe 'syn region rmd'.lnm.'Chunk start="^\s*```\s*{\s*=\?'.lnm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=knitrChunkBrace,@Rmd'.lnm169 170 hi link knitrChunkLabel Identifier171 hi link knitrChunkDelim rmdCodeDelim172 hi link knitrChunkLabelDelim rmdCodeDelim173 else174 exe 'syn region rmd'.lnm.'Chunk matchgroup=rmdCodeDelim start="^\s*```\s*{\s*=\?'.lnm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=@Rmd'.lnm175 endif176 else177 " Avoid the cost of running globpath() whenever the buffer is saved178 let s:no_syntax_vim += [ftpy]179 endif180endfunction181 182for s:type in g:rmd_fenced_languages183 call s:IncludeLanguage(s:type)184endfor185unlet! s:type186 187let s:LaTeX_included = v:false188function s:IncludeLaTeX()189 let s:LaTeX_included = v:true190 unlet! b:current_syntax191 syn include @RmdLaTeX syntax/tex.vim192 " From vim-pandoc-syntax193 syn region rmdLaTeXInlineMath start=/\v\\@<!\$\S@=/ end=/\v\\@<!\$\d@!/ keepend contains=@RmdLaTeX194 syn match rmdLaTeXCmd /\\[[:alpha:]]\+\(\({.\{-}}\)\=\(\[.\{-}\]\)\=\)*/ contains=@RmdLaTeX195 syn region rmdLaTeX start='\$\$' end='\$\$' keepend contains=@RmdLaTeX196 syn region rmdLaTeX start=/\\begin{\z(.\{-}\)}/ end=/\\end{\z1}/ keepend contains=@RmdLaTeX197endfunction198 199function s:CheckRmdFencedLanguages()200 let alines = getline(1, '$')201 call filter(alines, "v:val =~ '^```{'")202 call map(alines, "substitute(v:val, '^```{', '', '')")203 call map(alines, "substitute(v:val, '\\W.*', '', '')")204 for tpy in alines205 if len(tpy) == 0206 continue207 endif208 let has_lng = 0209 for lng in g:rmd_fenced_languages210 if tpy == lng211 let has_lng = 1212 continue213 endif214 endfor215 if has_lng == 0216 let g:rmd_fenced_languages += [tpy]217 call s:IncludeLanguage(tpy)218 endif219 endfor220 221 if hlexists('pandocLaTeXCommand')222 return223 endif224 if g:rmd_include_latex225 if !b:rmd_has_LaTeX && (search('\$\$', 'wn') > 0 ||226 \ search('\\begin{', 'wn') > 0) ||227 \ search('\\[[:alpha:]]\+', 'wn') ||228 \ search('\$[^\$]\+\$', 'wn')229 let b:rmd_has_LaTeX = v:true230 endif231 if b:rmd_has_LaTeX && !s:LaTeX_included232 call s:IncludeLaTeX()233 endif234 endif235endfunction236 237if g:rmd_dynamic_fenced_languages238 call s:CheckRmdFencedLanguages()239 augroup RmdSyntax240 autocmd!241 autocmd BufWritePost <buffer> call s:CheckRmdFencedLanguages()242 augroup END243endif244 245" Step_4: Highlight code recognized by pandoc but not defined in pandoc.vim yet:246syn match pandocDivBegin '^:::\+ {.\{-}}' contains=pandocHeaderAttr247syn match pandocDivEnd '^:::\+$'248 249hi def link knitrBodyVar PreProc250hi def link knitrBodyValue Constant251hi def link knitrBodyOptions rComment252hi def link pandocDivBegin Delimiter253hi def link pandocDivEnd Delimiter254hi def link rmdInlineDelim Delimiter255hi def link rmdCodeDelim Delimiter256 257if len(s:save_pandoc_lngs)258 let g:pandoc#syntax#codeblocks#embeds#langs = s:save_pandoc_lngs259endif260unlet s:save_pandoc_lngs261let &cpo = s:cpo_save262unlet s:cpo_save263 264syntax iskeyword clear265 266let b:current_syntax = "rmd"267 268" vim: ts=8 sw=2269 