我可以在R标记中使用vim高亮显示代码吗?

时间:2014-08-12 14:38:44

标签: r vim

说我有.Rmd这样的文件:

The total number of steps per day can also be calculated
using `tapply`.
```{r}
tapply(d$steps, INDEX=d$date, FUN=sum)[1:5]
```
What seems to be different is that, per default, `xtabs`
returns 0 for `NA` values and `tapply` returns `NA`.

在我的终端窗口中,看起来像这样:

enter image description here

如果以某种方式告诉vim,R块实际上是R代码,它可以突出显示就像在实际的.R文件中工作一样。 / p>

这可能吗?

2 个答案:

答案 0 :(得分:10)

是的,你可以。此代码取自here

将它放在~/.vim/r.vim文件中(如果这些文件中没有任何文件存在,则创建它们)

function! TextEnableCodeSnip(filetype,start,end,textSnipHl) abort
  let ft=toupper(a:filetype)
  let group='textGroup'.ft
  if exists('b:current_syntax')
    let s:current_syntax=b:current_syntax
    " Remove current syntax definition, as some syntax files (e.g. cpp.vim)
    " do nothing if b:current_syntax is defined.
    unlet b:current_syntax
  endif
  execute 'syntax include @'.group.' syntax/'.a:filetype.'.vim'
  try
    execute 'syntax include @'.group.' after/syntax/'.a:filetype.'.vim'
  catch
  endtry
  if exists('s:current_syntax')
    let b:current_syntax=s:current_syntax
  else
    unlet b:current_syntax
  endif
  execute 'syntax region textSnip'.ft.'
  \ matchgroup='.a:textSnipHl.'
  \ start="'.a:start.'" end="'.a:end.'"
  \ contains=@'.group
endfunction

现在你可以使用

:call TextEnableCodeSnip(  'r',   '```{r}',   '```', 'SpecialComment')

只要有r.vim语法文件。

每次打开.Rmd文件时,您也可以自动调用此方法:

autocmd BufNewFile,BufRead *.Rmd :call TextEnableCodeSnip(  'r',   '```{r}',   '```', 'SpecialComment')

如果你想用r后跟任意数量的字符来突出显示,你可以使用正则表达式:

:call TextEnableCodeSnip(  'r',   '```{r.*}',   '```', 'SpecialComment')

或者在.vimrc中:

autocmd BufNewFile,BufRead *.Rmd :call TextEnableCodeSnip(  'r',   '```{r.*}',   '```', 'SpecialComment')

.*正则表达式表示任何重复字符。因此r.*表示r后跟任意数量的字符。

因此,这将与

一起使用
```{r whatever you want to put here}`
    Some r code here
```

答案 1 :(得分:4)

你可能也对SyntaxRange plugin感兴趣,这是基于@Zach的回答中的Vim提示。它简化了这种语法区域的设置。

设置就像这样(例如在~/.vim/ftplugin/markdown.vim中):

call SyntaxRange#Include('^````{r}', '^````', 'r', 'SpecialComment')