在使用 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更多细节