1db6ea063SBram Moolenaar" markdown Text with R statements 2db6ea063SBram Moolenaar" Language: markdown with R code chunks 377cdfd10SBram Moolenaar" Homepage: https://github.com/jalvesaq/R-Vim-runtime 4*11e3c5baSBram Moolenaar" Last Change: Wed Apr 21, 2021 09:55AM 5cd5c8f82SBram Moolenaar" 6cd5c8f82SBram Moolenaar" For highlighting pandoc extensions to markdown like citations and TeX and 7cd5c8f82SBram Moolenaar" many other advanced features like folding of markdown sections, it is 8cd5c8f82SBram Moolenaar" recommended to install the vim-pandoc filetype plugin as well as the 9cd5c8f82SBram Moolenaar" vim-pandoc-syntax filetype plugin from https://github.com/vim-pandoc. 10fc65cabbSBram Moolenaar 11db6ea063SBram Moolenaar 1277cdfd10SBram Moolenaarif exists("b:current_syntax") 13db6ea063SBram Moolenaar finish 14db6ea063SBram Moolenaarendif 15db6ea063SBram Moolenaar 16*11e3c5baSBram Moolenaar" Highlight the header of the chunks as R code 17*11e3c5baSBram Moolenaarlet g:rmd_syn_hl_chunk = get(g:, 'rmd_syn_hl_chunk', 0) 18fc65cabbSBram Moolenaar 19fc65cabbSBram Moolenaar" Pandoc-syntax has more features, but it is slower. 20cd5c8f82SBram Moolenaar" https://github.com/vim-pandoc/vim-pandoc-syntax 21fc65cabbSBram Moolenaarlet g:pandoc#syntax#codeblocks#embeds#langs = get(g:, 'pandoc#syntax#codeblocks#embeds#langs', ['r']) 22db6ea063SBram Moolenaarruntime syntax/pandoc.vim 23db6ea063SBram Moolenaarif exists("b:current_syntax") 24*11e3c5baSBram Moolenaar " Recognize inline R code 25fc65cabbSBram Moolenaar syn region rmdrInline matchgroup=rmdInlineDelim start="`r " end="`" contains=@R containedin=pandocLaTeXRegion,yamlFlowString keepend 26fc65cabbSBram Moolenaar hi def link rmdInlineDelim Delimiter 27*11e3c5baSBram Moolenaar 28*11e3c5baSBram Moolenaar " Fix recognition of language chunks (code adapted from pandoc, 2021-03-28) 29*11e3c5baSBram Moolenaar " Knitr requires braces in the block's header 30*11e3c5baSBram Moolenaar for s:lng in g:pandoc#syntax#codeblocks#embeds#langs 31*11e3c5baSBram Moolenaar let s:nm = matchstr(s:lng, '^[^=]*') 32*11e3c5baSBram Moolenaar exe 'syn clear pandocDelimitedCodeBlock_'.s:nm 33*11e3c5baSBram Moolenaar exe 'syn clear pandocDelimitedCodeBlockinBlockQuote_'.s:nm 34*11e3c5baSBram Moolenaar if g:rmd_syn_hl_chunk 35*11e3c5baSBram Moolenaar exe 'syn region rmd'.s:nm.'ChunkDelim matchgroup=rmdCodeDelim start="^\s*```\s*{\s*'.s:nm.'\>" matchgroup=rmdCodeDelim end="}$" keepend containedin=rmd'.s:nm.'Chunk contains=@R' 36*11e3c5baSBram Moolenaar exe 'syn region rmd'.s:nm.'Chunk start="^\s*```\s*{\s*'.s:nm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=rmd'.s:nm.'ChunkDelim,@'.toupper(s:nm) 37*11e3c5baSBram Moolenaar else 38*11e3c5baSBram Moolenaar exe 'syn region rmd'.s:nm.'Chunk matchgroup=rmdCodeDelim start="^\s*```\s*{\s*'.s:nm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=@'.toupper(s:nm) 39*11e3c5baSBram Moolenaar endif 40*11e3c5baSBram Moolenaar endfor 41*11e3c5baSBram Moolenaar unlet s:lng 42*11e3c5baSBram Moolenaar unlet s:nm 43*11e3c5baSBram Moolenaar hi def link rmdInlineDelim Delimiter 44*11e3c5baSBram Moolenaar hi def link rmdCodeDelim Delimiter 45fc65cabbSBram Moolenaar let b:current_syntax = "rmd" 46fc65cabbSBram Moolenaar finish 47fc65cabbSBram Moolenaarendif 48fc65cabbSBram Moolenaar 49*11e3c5baSBram Moolenaar" Configuration if not using pandoc syntax: 50*11e3c5baSBram Moolenaar" Add syntax highlighting of YAML header 51*11e3c5baSBram Moolenaarlet g:rmd_syn_hl_yaml = get(g:, 'rmd_syn_hl_yaml', 1) 52*11e3c5baSBram Moolenaar" Add syntax highlighting of citation keys 53*11e3c5baSBram Moolenaarlet g:rmd_syn_hl_citations = get(g:, 'rmd_syn_hl_citations', 1) 54*11e3c5baSBram Moolenaar 55fc65cabbSBram Moolenaarlet s:cpo_save = &cpo 56fc65cabbSBram Moolenaarset cpo&vim 57fc65cabbSBram Moolenaar 58fc65cabbSBram Moolenaar" R chunks will not be highlighted by syntax/markdown because their headers 59fc65cabbSBram Moolenaar" follow a non standard pattern: "```{lang" instead of "^```lang". 60fc65cabbSBram Moolenaar" Make a copy of g:markdown_fenced_languages to highlight the chunks later: 61fc65cabbSBram Moolenaarif exists('g:markdown_fenced_languages') 62fc65cabbSBram Moolenaar if !exists('g:rmd_fenced_languages') 63fc65cabbSBram Moolenaar let g:rmd_fenced_languages = deepcopy(g:markdown_fenced_languages) 64fc65cabbSBram Moolenaar let g:markdown_fenced_languages = [] 65fc65cabbSBram Moolenaar endif 66db6ea063SBram Moolenaarelse 67fc65cabbSBram Moolenaar let g:rmd_fenced_languages = ['r'] 68fc65cabbSBram Moolenaarendif 69fc65cabbSBram Moolenaar 70db6ea063SBram Moolenaarruntime syntax/markdown.vim 71db6ea063SBram Moolenaar 72fc65cabbSBram Moolenaar" Now highlight chunks: 73fc65cabbSBram Moolenaarfor s:type in g:rmd_fenced_languages 74fc65cabbSBram Moolenaar if s:type =~ '=' 75a6c27c47SBram Moolenaar let s:ft = substitute(s:type, '.*=', '', '') 76a6c27c47SBram Moolenaar let s:nm = substitute(s:type, '=.*', '', '') 77cd5c8f82SBram Moolenaar else 78a6c27c47SBram Moolenaar let s:ft = s:type 79fc65cabbSBram Moolenaar let s:nm = s:type 80cd5c8f82SBram Moolenaar endif 81fc65cabbSBram Moolenaar unlet! b:current_syntax 82a6c27c47SBram Moolenaar exe 'syn include @Rmd'.s:nm.' syntax/'.s:ft.'.vim' 83fc65cabbSBram Moolenaar if g:rmd_syn_hl_chunk 84*11e3c5baSBram Moolenaar exe 'syn region rmd'.s:nm.'ChunkDelim matchgroup=rmdCodeDelim start="^\s*```\s*{\s*'.s:nm.'\>" matchgroup=rmdCodeDelim end="}$" keepend containedin=rmd'.s:nm.'Chunk contains=@Rmdr' 85fc65cabbSBram Moolenaar exe 'syn region rmd'.s:nm.'Chunk start="^\s*```\s*{\s*'.s:nm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=rmd'.s:nm.'ChunkDelim,@Rmd'.s:nm 86cd5c8f82SBram Moolenaar else 87fc65cabbSBram Moolenaar exe 'syn region rmd'.s:nm.'Chunk matchgroup=rmdCodeDelim start="^\s*```\s*{\s*'.s:nm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=@Rmd'.s:nm 88cd5c8f82SBram Moolenaar endif 89cd5c8f82SBram Moolenaarendfor 90fc65cabbSBram Moolenaarunlet! s:type 91cd5c8f82SBram Moolenaar 92*11e3c5baSBram Moolenaar" Recognize inline R code 93*11e3c5baSBram Moolenaarsyn region rmdrInline matchgroup=rmdInlineDelim start="`r " end="`" contains=@Rmdr keepend 94*11e3c5baSBram Moolenaar 95fc65cabbSBram Moolenaarhi def link rmdInlineDelim Delimiter 96fc65cabbSBram Moolenaarhi def link rmdCodeDelim Delimiter 97db6ea063SBram Moolenaar 98fc65cabbSBram Moolenaar" You don't need this if either your markdown/syntax.vim already highlights 99fc65cabbSBram Moolenaar" the YAML header or you are writing standard markdown 100fc65cabbSBram Moolenaarif g:rmd_syn_hl_yaml 101fc65cabbSBram Moolenaar " Minimum highlighting of yaml header 102fc65cabbSBram Moolenaar syn match rmdYamlFieldTtl /^\s*\zs\w*\ze:/ contained 103fc65cabbSBram Moolenaar syn match rmdYamlFieldTtl /^\s*-\s*\zs\w*\ze:/ contained 104fc65cabbSBram Moolenaar syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start='"' skip='\\"' end='"' contains=yamlEscape,rmdrInline contained 105fc65cabbSBram Moolenaar syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start="'" skip="''" end="'" contains=yamlSingleEscape,rmdrInline contained 106fc65cabbSBram Moolenaar syn match yamlEscape contained '\\\%([\\"abefnrtv\^0_ NLP\n]\|x\x\x\|u\x\{4}\|U\x\{8}\)' 107fc65cabbSBram Moolenaar syn match yamlSingleEscape contained "''" 108fc65cabbSBram Moolenaar syn region pandocYAMLHeader matchgroup=rmdYamlBlockDelim start=/\%(\%^\|\_^\s*\n\)\@<=\_^-\{3}\ze\n.\+/ end=/^\([-.]\)\1\{2}$/ keepend contains=rmdYamlFieldTtl,yamlFlowString 109fc65cabbSBram Moolenaar hi def link rmdYamlBlockDelim Delimiter 110fc65cabbSBram Moolenaar hi def link rmdYamlFieldTtl Identifier 111fc65cabbSBram Moolenaar hi def link yamlFlowString String 112db6ea063SBram Moolenaarendif 113db6ea063SBram Moolenaar 114fc65cabbSBram Moolenaar" You don't need this if either your markdown/syntax.vim already highlights 115fc65cabbSBram Moolenaar" citations or you are writing standard markdown 116fc65cabbSBram Moolenaarif g:rmd_syn_hl_citations 117fc65cabbSBram Moolenaar " From vim-pandoc-syntax 118fc65cabbSBram Moolenaar " parenthetical citations 119fc65cabbSBram Moolenaar syn match pandocPCite /\^\@<!\[[^\[\]]\{-}-\{0,1}@[[:alnum:]_][[:alnum:]à-öø-ÿÀ-ÖØ-ß_:.#$%&\-+?<>~\/]*.\{-}\]/ contains=pandocEmphasis,pandocStrong,pandocLatex,pandocCiteKey,@Spell,pandocAmpersandEscape display 120fc65cabbSBram Moolenaar " in-text citations with location 121fc65cabbSBram Moolenaar syn match pandocICite /@[[:alnum:]_][[:alnum:]à-öø-ÿÀ-ÖØ-ß_:.#$%&\-+?<>~\/]*\s\[.\{-1,}\]/ contains=pandocCiteKey,@Spell display 122fc65cabbSBram Moolenaar " cite keys 123fc65cabbSBram Moolenaar syn match pandocCiteKey /\(-\=@[[:alnum:]_][[:alnum:]à-öø-ÿÀ-ÖØ-ß_:.#$%&\-+?<>~\/]*\)/ containedin=pandocPCite,pandocICite contains=@NoSpell display 124fc65cabbSBram Moolenaar syn match pandocCiteAnchor /[-@]/ contained containedin=pandocCiteKey display 125fc65cabbSBram Moolenaar syn match pandocCiteLocator /[\[\]]/ contained containedin=pandocPCite,pandocICite 126fc65cabbSBram Moolenaar hi def link pandocPCite Operator 127fc65cabbSBram Moolenaar hi def link pandocICite Operator 128fc65cabbSBram Moolenaar hi def link pandocCiteKey Label 129fc65cabbSBram Moolenaar hi def link pandocCiteAnchor Operator 130fc65cabbSBram Moolenaar hi def link pandocCiteLocator Operator 131fc65cabbSBram Moolenaarendif 132db6ea063SBram Moolenaar 133db6ea063SBram Moolenaarlet b:current_syntax = "rmd" 134db6ea063SBram Moolenaar 135fc65cabbSBram Moolenaarlet &cpo = s:cpo_save 136fc65cabbSBram Moolenaarunlet s:cpo_save 137fc65cabbSBram Moolenaar 138db6ea063SBram Moolenaar" vim: ts=8 sw=2 139