我能否在R标记中使用vim高亮代码?

4

假设我有一个像这样的.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文件中一样对其进行高亮显示。
这个可能吗?

我建议您坚持使用此页面:http://vim.wikia.com/wiki/Different_syntax_highlighting_within_regions_of_a_file - lord.garbage
2个回答

10

可以。这段代码摘自此处

将此代码放入~/.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
```

很好。你知道它如何处理 r 块,例如par(mar=c(3,3,1,1)) plot(d$dateint, d$steps)就是说,在 {r ...} 部分有更多的内容? - TMOTTM
抱歉,我不完全理解你的问题。你是在问是否可以只针对一行使用r标记吗?我不是r用户,也不太了解它。 - Zach
我的意思是,我现在正在我的.vimrc文件中使用你的代码,它完美地工作。然而,当一个r块以{r fig.height=5}开头时,而不是只有{r},那么代码将无法识别该块,因此也无法突出显示它。 - TMOTTM
可以的,我已经编辑了我的答案并添加了新信息。如果您发现它正确回答了问题,请接受它 :) 谢谢。 - Zach

4
你可能也会对我的SyntaxRange插件感兴趣,该插件基于@Zach答案中的Vim Tip。它简化了这种语法区域的设置。
设置如下(例如在~/.vim/ftplugin/markdown.vim中):
call SyntaxRange#Include('^````{r}', '^````', 'r', 'SpecialComment')

仅提供链接,但有用...或许应该作为注释? - Ben Bolker
@BenBolker 好的,我已经添加了一个示例来展示如何设置它,以便与其他答案进行对比。 - Ingo Karkat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接