xref: /vim-8.2.3635/runtime/syntax/rmd.vim (revision 11e3c5ba)
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