Yasnippet,Sweave:如何使.Rnw 文件中的片段发挥作用?

Yasnippet,Sweave:如何使.Rnw 文件中的片段发挥作用?

在使用 LaTeX 时,我使用yasnippet中定义的~/.emacs.d/plugins/yasnippet-0.6.1c/snippets/text-mode/latex-mode来插入小段代码。我最近开始使用 Sweave 并处理.Rnw文件。但是,我注意到 (ya) 代码片段不再起作用 -TAB在触发词后点击不会扩展定义的代码片段。相反,什么都没有发生。我以为这是一个很容易解决的问题,只需将代码片段复制到~/.emacs.d/plugins/yasnippet-0.6.1c/snippets/text-mode/rnw-mode或 即可.../noweb-mode。但这也不起作用(意味着点击TAB不会扩展触发词)。但是,我可以做的是M-x yas/expand在触发词之后,因此它可以工作,但不适用于TAB

如何使用 .Rnw 文件中的 yasnippets?

更新 1

我发现http://groups.google.com/group/smart-snippet/browse_thread/thread/8206a23037f598b1/39ed819692df63ad?lnk=gst&q=rnw#39ed819692df63ad 我正好有这个问题——<tab>受 noweb-mode 约束。但是,上一篇文章中发布的解决方案对我不起作用/似乎对问题没有影响(因此,如上所述,TAB触发词的 -expansion 不起作用)。

正如该帖子所述,模式会根据 .Rnw 文件中的点位置从 LaTeX 更改为 noweb。我只需要在 LaTeX 模式下扩展我的 LaTeX 宏(当然)。

如果这很重要,我会在 Mac OS X 10.7.3 上使用 Emacs 24。

更新 2

C-h k TAB导致(无论上面是否有解决方案):

<tab> runs the command noweb-indent-line, which is an interactive Lisp function
in `noweb-mode.el'.

It is bound to <tab>.

(noweb-indent-line)

Indent the current line according to mode, after narrowing to this chunk.

所以很明显,TAB被noweb使用了。

更新 3

当点位于 .Rnw 文件的 LaTeX 部分时,模式行中显示的模式为:LaTeX/MP Ref Fly yas pair vl Wrap Fill Noweb NWFL。如果点位于文件的 R 块中,则模式为:ESS[S] [none] Rox Fly ElDoc pair vl Wrap Noweb NWFL。因此,模式确实会在 R 块之外/之内发生变化。但是,我仍然无法TAB-expand 片段。我的.emacs包含(显然没有按预期工作):

(add-hook 'LaTeX-mode-hook
  '(lambda ()
     (make-variable-buffer-local 'yas/trigger-key)
     (setq yas/trigger-key [tab])))

答案1

最后,问题解决了。需要切换到tighter-tab的分支yasnippet。参见https://github.com/capitaomorte/yasnippet/issues/231更多细节

相关内容