使用yasnippet和polymode在R Markdown中插入代码块


10

我正在尝试编写一个Yasnippet,以将代码块插入R Markdown文件中。我使用多模式在单个文件中具有多个主要模式(markdown,ESS [S])。这是我的片段:

# -*- mode: snippet -*-
# name: chunk
# key: chunk
# --
\`\`\`{r $1}
$0
\`\`\`

当我尝试以降价模式将代码段插入.Rmd文件时,出现以下错误:

Error in post-command-hook (yas--post-command-handler): (error "Marker points into wrong buffer" #<marker at 7 in test.Rmd>)

该代码段确实出现,并且我的光标位于正确的位置(紧接在第二个花括号之前):

```{r }

```

当我点击选项卡时,我得到以下信息:

yas-next-field: Wrong type argument: overlayp, nil

我猜想我正在与polymode进行交互:插入代码段时,我处于markdown模式,但是polymode将代码块的内容转换为ESS [S]模式。看起来最终会有一条命令在多模式下插入新的块,但是与此同时有什么办法可以使此代码段正常工作?

Answers:


6

我遇到了类似的问题,并编写了一个独立函数来解决yasnippet和之间的怪异互动polymode

以下函数模仿您尝试的代码片段的行为,首先提示您输入标头信息,$1然后将其插入,然后将您放到块体(您的$0)中:

(defun tws-insert-r-chunk (header) 
  "Insert an r-chunk in markdown mode. Necessary due to interactions between polymode and yas snippet" 
  (interactive "sHeader: ") 
  (insert (concat "```{r " header "}\n\n```")) 
  (forward-line -1))

谢谢你 我是一个狂热的emacs用户,但熟悉lisp,能否描述如何实现此功能Rmd工作流程?
钱德尔2014年

4
将代码放入.emacs文件中,以便每次启动Emacs时都将其加载。然后,您可以通过调用它M-x tws-insert-r-chunk。可能您希望将此命令绑定到键盘快捷键-这里有很多关于设置键绑定的问题。
泰勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.