Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
rmd.vim269 linesDownload Raw Back to syntax
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 
codekingpro/portable-devtools · Team Ai