Bram Moolenaar | dd60c36 | 2023-02-27 15:49:53 +0000 | [diff] [blame] | 1 | " Language: Markdown with chunks of R, Python and other languages |
| 2 | " Maintainer: Jakson Aquino <jalvesaq@gmail.com> |
Bram Moolenaar | 77cdfd1 | 2016-03-12 12:57:59 +0100 | [diff] [blame] | 3 | " Homepage: https://github.com/jalvesaq/R-Vim-runtime |
Bram Moolenaar | dd60c36 | 2023-02-27 15:49:53 +0000 | [diff] [blame] | 4 | " Last Change: Fri Feb 24, 2023 08:28AM |
Bram Moolenaar | cd5c8f8 | 2017-04-09 20:11:58 +0200 | [diff] [blame] | 5 | " |
| 6 | " For highlighting pandoc extensions to markdown like citations and TeX and |
| 7 | " many other advanced features like folding of markdown sections, it is |
| 8 | " recommended to install the vim-pandoc filetype plugin as well as the |
| 9 | " vim-pandoc-syntax filetype plugin from https://github.com/vim-pandoc. |
Bram Moolenaar | fc65cab | 2018-08-28 22:58:02 +0200 | [diff] [blame] | 10 | |
Bram Moolenaar | db6ea06 | 2014-07-10 22:01:47 +0200 | [diff] [blame] | 11 | |
Bram Moolenaar | 77cdfd1 | 2016-03-12 12:57:59 +0100 | [diff] [blame] | 12 | if exists("b:current_syntax") |
Bram Moolenaar | db6ea06 | 2014-07-10 22:01:47 +0200 | [diff] [blame] | 13 | finish |
| 14 | endif |
| 15 | |
Bram Moolenaar | dd60c36 | 2023-02-27 15:49:53 +0000 | [diff] [blame] | 16 | let s:cpo_save = &cpo |
| 17 | set cpo&vim |
| 18 | |
Bram Moolenaar | 11e3c5b | 2021-04-21 18:09:37 +0200 | [diff] [blame] | 19 | " Highlight the header of the chunks as R code |
| 20 | let g:rmd_syn_hl_chunk = get(g:, 'rmd_syn_hl_chunk', 0) |
Bram Moolenaar | fc65cab | 2018-08-28 22:58:02 +0200 | [diff] [blame] | 21 | |
| 22 | " Pandoc-syntax has more features, but it is slower. |
Bram Moolenaar | cd5c8f8 | 2017-04-09 20:11:58 +0200 | [diff] [blame] | 23 | " https://github.com/vim-pandoc/vim-pandoc-syntax |
Bram Moolenaar | dd60c36 | 2023-02-27 15:49:53 +0000 | [diff] [blame] | 24 | |
| 25 | " Don't waste time loading syntax that will be discarded: |
| 26 | let s:save_pandoc_lngs = get(g:, 'pandoc#syntax#codeblocks#embeds#langs', []) |
| 27 | let g:pandoc#syntax#codeblocks#embeds#langs = [] |
| 28 | |
| 29 | " Step_1: Source pandoc.vim if it is installed: |
Bram Moolenaar | db6ea06 | 2014-07-10 22:01:47 +0200 | [diff] [blame] | 30 | runtime syntax/pandoc.vim |
| 31 | if exists("b:current_syntax") |
Bram Moolenaar | dd60c36 | 2023-02-27 15:49:53 +0000 | [diff] [blame] | 32 | if hlexists('pandocDelimitedCodeBlock') |
| 33 | syn clear pandocDelimitedCodeBlock |
Bram Moolenaar | cd5c8f8 | 2017-04-09 20:11:58 +0200 | [diff] [blame] | 34 | endif |
Bram Moolenaar | dd60c36 | 2023-02-27 15:49:53 +0000 | [diff] [blame] | 35 | |
| 36 | if len(s:save_pandoc_lngs) > 0 && !exists('g:rmd_fenced_languages') |
| 37 | let g:rmd_fenced_languages = deepcopy(s:save_pandoc_lngs) |
| 38 | endif |
| 39 | |
| 40 | " Recognize inline R code |
| 41 | syn region rmdrInline matchgroup=rmdInlineDelim start="`r " end="`" contains=@Rmdr containedin=pandocLaTeXRegion,yamlFlowString keepend |
Bram Moolenaar | fc65cab | 2018-08-28 22:58:02 +0200 | [diff] [blame] | 42 | else |
Bram Moolenaar | dd60c36 | 2023-02-27 15:49:53 +0000 | [diff] [blame] | 43 | " Step_2: Source markdown.vim if pandoc.vim is not installed |
| 44 | |
| 45 | " Configuration if not using pandoc syntax: |
| 46 | " Add syntax highlighting of YAML header |
| 47 | let g:rmd_syn_hl_yaml = get(g:, 'rmd_syn_hl_yaml', 1) |
| 48 | " Add syntax highlighting of citation keys |
| 49 | let g:rmd_syn_hl_citations = get(g:, 'rmd_syn_hl_citations', 1) |
| 50 | |
| 51 | " R chunks will not be highlighted by syntax/markdown because their headers |
| 52 | " follow a non standard pattern: "```{lang" instead of "^```lang". |
| 53 | " Make a copy of g:markdown_fenced_languages to highlight the chunks later: |
| 54 | if exists('g:markdown_fenced_languages') && !exists('g:rmd_fenced_languages') |
| 55 | let g:rmd_fenced_languages = deepcopy(g:markdown_fenced_languages) |
| 56 | endif |
| 57 | |
| 58 | if exists('g:markdown_fenced_languages') && len(g:markdown_fenced_languages) > 0 |
| 59 | let s:save_mfl = deepcopy(g:markdown_fenced_languages) |
| 60 | endif |
| 61 | " Don't waste time loading syntax that will be discarded: |
| 62 | let g:markdown_fenced_languages = [] |
| 63 | runtime syntax/markdown.vim |
| 64 | if exists('s:save_mfl') > 0 |
| 65 | let g:markdown_fenced_languages = deepcopy(s:save_mfl) |
| 66 | unlet s:save_mfl |
| 67 | endif |
| 68 | syn region rmdrInline matchgroup=rmdInlineDelim start="`r " end="`" contains=@Rmdr keepend |
| 69 | |
| 70 | " Step_2a: Add highlighting for both YAML and citations which are pandoc |
| 71 | " specific, but also used in Rmd files |
| 72 | |
| 73 | " You don't need this if either your markdown/syntax.vim already highlights |
| 74 | " the YAML header or you are writing standard markdown |
| 75 | if g:rmd_syn_hl_yaml |
| 76 | " Basic highlighting of YAML header |
| 77 | syn match rmdYamlFieldTtl /^\s*\zs\w\%(-\|\w\)*\ze:/ contained |
| 78 | syn match rmdYamlFieldTtl /^\s*-\s*\zs\w\%(-\|\w\)*\ze:/ contained |
| 79 | syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start='"' skip='\\"' end='"' contains=yamlEscape,rmdrInline contained |
| 80 | syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start="'" skip="''" end="'" contains=yamlSingleEscape,rmdrInline contained |
| 81 | syn match yamlEscape contained '\\\%([\\"abefnrtv\^0_ NLP\n]\|x\x\x\|u\x\{4}\|U\x\{8}\)' |
| 82 | syn match yamlSingleEscape contained "''" |
| 83 | syn match yamlComment /#.*/ contained |
| 84 | " A second colon is a syntax error, unles within a string or following !expr |
| 85 | syn match yamlColonError /:\s*[^'^"^!]*:/ contained |
| 86 | if &filetype == 'quarto' |
| 87 | syn region pandocYAMLHeader matchgroup=rmdYamlBlockDelim start=/\%(\%^\|\_^\s*\n\)\@<=\_^-\{3}\ze\n.\+/ end=/^---$/ keepend contains=rmdYamlFieldTtl,yamlFlowString,yamlComment,yamlColonError |
| 88 | else |
| 89 | syn region pandocYAMLHeader matchgroup=rmdYamlBlockDelim start=/\%(\%^\|\_^\s*\n\)\@<=\_^-\{3}\ze\n.\+/ end=/^\([-.]\)\1\{2}$/ keepend contains=rmdYamlFieldTtl,yamlFlowString,yamlComment,yamlColonError |
| 90 | endif |
| 91 | hi def link rmdYamlBlockDelim Delimiter |
| 92 | hi def link rmdYamlFieldTtl Identifier |
| 93 | hi def link yamlFlowString String |
| 94 | hi def link yamlComment Comment |
| 95 | hi def link yamlColonError Error |
| 96 | endif |
| 97 | |
| 98 | " You don't need this if either your markdown/syntax.vim already highlights |
| 99 | " citations or you are writing standard markdown |
| 100 | if g:rmd_syn_hl_citations |
| 101 | " From vim-pandoc-syntax |
| 102 | " parenthetical citations |
| 103 | syn match pandocPCite /\^\@<!\[[^\[\]]\{-}-\{0,1}@[[:alnum:]_][[:alnum:]à-öø-ÿÀ-ÖØ-ß_:.#$%&\-+?<>~\/]*.\{-}\]/ contains=pandocEmphasis,pandocStrong,pandocLatex,pandocCiteKey,@Spell,pandocAmpersandEscape display |
| 104 | " in-text citations with location |
| 105 | syn match pandocICite /@[[:alnum:]_][[:alnum:]à-öø-ÿÀ-ÖØ-ß_:.#$%&\-+?<>~\/]*\s\[.\{-1,}\]/ contains=pandocCiteKey,@Spell display |
| 106 | " cite keys |
| 107 | syn match pandocCiteKey /\(-\=@[[:alnum:]_][[:alnum:]à-öø-ÿÀ-ÖØ-ß_:.#$%&\-+?<>~\/]*\)/ containedin=pandocPCite,pandocICite contains=@NoSpell display |
| 108 | syn match pandocCiteAnchor /[-@]/ contained containedin=pandocCiteKey display |
| 109 | syn match pandocCiteLocator /[\[\]]/ contained containedin=pandocPCite,pandocICite |
| 110 | hi def link pandocPCite Operator |
| 111 | hi def link pandocICite Operator |
| 112 | hi def link pandocCiteKey Label |
| 113 | hi def link pandocCiteAnchor Operator |
| 114 | hi def link pandocCiteLocator Operator |
| 115 | endif |
Bram Moolenaar | db6ea06 | 2014-07-10 22:01:47 +0200 | [diff] [blame] | 116 | endif |
Bram Moolenaar | cd5c8f8 | 2017-04-09 20:11:58 +0200 | [diff] [blame] | 117 | |
Bram Moolenaar | dd60c36 | 2023-02-27 15:49:53 +0000 | [diff] [blame] | 118 | " Step_3: Highlight code blocks. |
| 119 | |
| 120 | syn region rmdCodeBlock matchgroup=rmdCodeDelim start="^\s*```\s*{.*}$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend |
| 121 | syn region rmdCodeBlock matchgroup=rmdCodeDelim start="^\s*```.+$" matchgroup=rmdCodeDelim end="^```$" keepend |
| 122 | hi link rmdCodeBlock Special |
Bram Moolenaar | cd5c8f8 | 2017-04-09 20:11:58 +0200 | [diff] [blame] | 123 | |
Bram Moolenaar | fc65cab | 2018-08-28 22:58:02 +0200 | [diff] [blame] | 124 | " Now highlight chunks: |
Bram Moolenaar | dd60c36 | 2023-02-27 15:49:53 +0000 | [diff] [blame] | 125 | syn region knitrBodyOptions start='^#| ' end='$' contained containedin=rComment,pythonComment contains=knitrBodyVar,knitrBodyValue transparent |
| 126 | syn match knitrBodyValue ': \zs.*\ze$' keepend contained containedin=knitrBodyOptions |
| 127 | syn match knitrBodyVar '| \zs\S\{-}\ze:' contained containedin=knitrBodyOptions |
| 128 | |
| 129 | let g:rmd_fenced_languages = get(g:, 'rmd_fenced_languages', ['r']) |
Bram Moolenaar | fc65cab | 2018-08-28 22:58:02 +0200 | [diff] [blame] | 130 | for s:type in g:rmd_fenced_languages |
| 131 | if s:type =~ '=' |
Bram Moolenaar | a6c27c4 | 2019-05-09 19:16:22 +0200 | [diff] [blame] | 132 | let s:ft = substitute(s:type, '.*=', '', '') |
| 133 | let s:nm = substitute(s:type, '=.*', '', '') |
Bram Moolenaar | cd5c8f8 | 2017-04-09 20:11:58 +0200 | [diff] [blame] | 134 | else |
Bram Moolenaar | a6c27c4 | 2019-05-09 19:16:22 +0200 | [diff] [blame] | 135 | let s:ft = s:type |
Bram Moolenaar | fc65cab | 2018-08-28 22:58:02 +0200 | [diff] [blame] | 136 | let s:nm = s:type |
Bram Moolenaar | cd5c8f8 | 2017-04-09 20:11:58 +0200 | [diff] [blame] | 137 | endif |
Bram Moolenaar | fc65cab | 2018-08-28 22:58:02 +0200 | [diff] [blame] | 138 | unlet! b:current_syntax |
Bram Moolenaar | a6c27c4 | 2019-05-09 19:16:22 +0200 | [diff] [blame] | 139 | exe 'syn include @Rmd'.s:nm.' syntax/'.s:ft.'.vim' |
Bram Moolenaar | fc65cab | 2018-08-28 22:58:02 +0200 | [diff] [blame] | 140 | if g:rmd_syn_hl_chunk |
Bram Moolenaar | dd60c36 | 2023-02-27 15:49:53 +0000 | [diff] [blame] | 141 | exe 'syn match knitrChunkDelim /```\s*{\s*'.s:nm.'/ contained containedin=knitrChunkBrace contains=knitrChunkLabel' |
| 142 | exe 'syn match knitrChunkLabelDelim /```\s*{\s*'.s:nm.',\=\s*[-[:alnum:]]\{-1,}[,}]/ contained containedin=knitrChunkBrace' |
| 143 | syn match knitrChunkDelim /}\s*$/ contained containedin=knitrChunkBrace |
| 144 | exe 'syn match knitrChunkBrace /```\s*{\s*'.s:nm.'.*$/ contained containedin=rmd'.s:nm.'Chunk contains=knitrChunkDelim,knitrChunkLabelDelim,@Rmd'.s:nm |
| 145 | exe 'syn region rmd'.s:nm.'Chunk start="^\s*```\s*{\s*=\?'.s:nm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=knitrChunkBrace,@Rmd'.s:nm |
| 146 | |
| 147 | hi link knitrChunkLabel Identifier |
| 148 | hi link knitrChunkDelim rmdCodeDelim |
| 149 | hi link knitrChunkLabelDelim rmdCodeDelim |
Bram Moolenaar | fc65cab | 2018-08-28 22:58:02 +0200 | [diff] [blame] | 150 | else |
Bram Moolenaar | dd60c36 | 2023-02-27 15:49:53 +0000 | [diff] [blame] | 151 | 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 |
Bram Moolenaar | fc65cab | 2018-08-28 22:58:02 +0200 | [diff] [blame] | 152 | endif |
Bram Moolenaar | cd5c8f8 | 2017-04-09 20:11:58 +0200 | [diff] [blame] | 153 | endfor |
Bram Moolenaar | fc65cab | 2018-08-28 22:58:02 +0200 | [diff] [blame] | 154 | unlet! s:type |
Bram Moolenaar | cd5c8f8 | 2017-04-09 20:11:58 +0200 | [diff] [blame] | 155 | |
Bram Moolenaar | dd60c36 | 2023-02-27 15:49:53 +0000 | [diff] [blame] | 156 | " Step_4: Highlight code recognized by pandoc but not defined in pandoc.vim yet: |
| 157 | syn match pandocDivBegin '^:::\+ {.\{-}}' contains=pandocHeaderAttr |
| 158 | syn match pandocDivEnd '^:::\+$' |
Bram Moolenaar | 11e3c5b | 2021-04-21 18:09:37 +0200 | [diff] [blame] | 159 | |
Bram Moolenaar | dd60c36 | 2023-02-27 15:49:53 +0000 | [diff] [blame] | 160 | hi def link knitrBodyVar PreProc |
| 161 | hi def link knitrBodyValue Constant |
| 162 | hi def link knitrBodyOptions rComment |
| 163 | hi def link pandocDivBegin Delimiter |
| 164 | hi def link pandocDivEnd Delimiter |
Bram Moolenaar | fc65cab | 2018-08-28 22:58:02 +0200 | [diff] [blame] | 165 | hi def link rmdInlineDelim Delimiter |
| 166 | hi def link rmdCodeDelim Delimiter |
Bram Moolenaar | db6ea06 | 2014-07-10 22:01:47 +0200 | [diff] [blame] | 167 | |
Bram Moolenaar | dd60c36 | 2023-02-27 15:49:53 +0000 | [diff] [blame] | 168 | if len(s:save_pandoc_lngs) |
| 169 | let g:pandoc#syntax#codeblocks#embeds#langs = s:save_pandoc_lngs |
Bram Moolenaar | db6ea06 | 2014-07-10 22:01:47 +0200 | [diff] [blame] | 170 | endif |
Bram Moolenaar | dd60c36 | 2023-02-27 15:49:53 +0000 | [diff] [blame] | 171 | unlet s:save_pandoc_lngs |
Bram Moolenaar | fc65cab | 2018-08-28 22:58:02 +0200 | [diff] [blame] | 172 | let &cpo = s:cpo_save |
| 173 | unlet s:cpo_save |
| 174 | |
Bram Moolenaar | dd60c36 | 2023-02-27 15:49:53 +0000 | [diff] [blame] | 175 | let b:current_syntax = "rmd" |
| 176 | |
Bram Moolenaar | db6ea06 | 2014-07-10 22:01:47 +0200 | [diff] [blame] | 177 | " vim: ts=8 sw=2 |