2011-12-05 33 views
9

当在.Rnw文档中使用R代码块时,emacs缓冲区会自动检测到光标位于代码块内(即在<<>>@之内),并切换到ESS模式 - 这非常有价值,因为可以获取ESS在代码块内部进行代码格式化,更有用的是,可以将代码行/区域发送到进程缓冲区。Emacs,R,组织模式:如何启用自动切换到R代码块内的ESS模式?

如何获得内R代码块(即#+begin_src R#+end_src之间)在组织模式文件相同的功能 - 我想Emacs的自动识别它的R代码代码块中,并打开ESS - 模式,以便我可以将代码片段发送到*R*进程。我知道我可以做Ctl-C '并切换到不同的ESS模式缓冲区,我可以编辑代码并获得所有其他ESS模式的便利(包括将代码发送到R)。不过我想不是必须这样做,即我希望能够在相同的组织模式缓冲区中的R代码块发送代码片段。

+0

有一个[mmm模式](http://www.emacswiki.org/emacs/MmmMode) - 可能它可以帮助你。我从来没有用过它。 – Adobe

回答

4

一年前,我询问了org-mode-list上的same question。 @ cm2已经提到,在org模式下不可能使用ESS功能;据我所知,Emacs无法处理两种主要模式,即使使用mmm模式,似乎也有一些困难。

Dan Davison善意地发布了一些模仿一些ESS功能的elisp代码。所以,你可能想检查丹对我的问题的答复。

+0

谢谢@Bernd。您提到的电子邮件线程似乎解决了我需要的大部分功能。我必须研究如何启用“shift-enter”将代码从R代码块发送到R进程。然后,我会一切安排。我选择你的答案作为接受的答案,因为它指向一个实际的电子邮件线索和几乎完整的解决方案。 –

4

AFAIK,这不能用组织模式的当前实现来完成。

我不确定这是可行的在组织模式内没有一些深入到elisp代码。组织模式中的C-c '命令的要点是,您可以使用额外的缓冲区,其中包含所有语法突出显示的内容,以满足您对特定语言的需求。

有可能是写了一些组织模式挂钩,先检查,看看你是否是在#+begin_src R ... #+end_src R块,然后检查代码块砍解决此为R特异性代码的方法。我怀疑这会很混乱,并与其他组织模式功能发生冲突。另外,您必须编写另一个函数来抓取当前代码块并将其传递给组织模式的R解释器,以及您添加到src块的所有选项。

+0

感谢您的回复,接受您的最佳答案。很高兴知道我没有找到解决方案。现在我会放弃它,并在我的工作流程中包含“Ctl-C”。 –

0

polymode包中的poly-org.el旨在解决组织模式下的多模式编辑问题。我试过了,但由于未在间接缓冲区中启用jit-lock,它冻结了Emacs。

0

解决方法是在需要时手动切换模式,例如,将以下代码添加到.emacs并使用F6。

;; Toggle between org & R modes. 
(defun toggle-org-R-mode() 
    (interactive) 
    "Toggle mode between org-R modes" 
    (cond 
    ((string= major-mode "org-mode") 
    (R-mode)) 
    ((string= major-mode "ess-mode") 
    (org-mode)) 
    ) 
) 
(global-set-key [f6] 'toggle-org-R-mode)