Emacs、R和Org-mode:如何在R代码块中启用自动切换到ESS模式?

11
当在 .Rnw 文档中使用 R 代码块时,Emacs 缓冲区会自动检测光标是否在代码块内(即在 <<>>@ 之间),并切换到 ESS 模式 - 这非常有价值,因为可以在代码块中获得基于 ESS 的代码格式化,并且更有用的是,可以将代码行/区域发送到下位机的 *R* 进程缓冲区。
如何在 R 代码块中的 org-mode 文件中获得相同的功能(即在 #+begin_src R#+end_src 之间)- 我希望 Emacs 自动识别它是在 R 代码块内部,并打开 ESS 模式,以便我可以将代码片段发送到 *R* 进程。我知道我可以执行 Ctl-C ' 并切换到不同的 ESS 模式缓冲区,在那里我可以编辑代码并获得所有其他 ESS 模式的便利(包括将代码发送给 R)。但是我不想这样做,即我希望能够从同一 org-mode 缓冲区中的 R 代码块中发送代码片段。

有一个mmm-mode - 或许它可以帮助您。我自己从未使用过它。 - Adobe
这个问题的回答已经有8年了,但是这个问题仍然非常相关。Org-mode一直在快速发展。如果能够发布更加更新的回答就好了。 - pglpm
5个回答

5
据我所知,目前的Org-mode实现无法完成这个任务。
我不确定在Org-mode中是否可以实现这个功能,除非深入研究elisp代码。 Org-mode中C-c '命令的主要作用是为您提供另一个缓冲区,其中包含您特定语言所需的所有语法突出显示。
可能有一种方法可以通过编写一些Org-mode钩子来解决R特定代码的问题,首先检查您是否在#+begin_src R...#+end_src R块中,然后检查代码块是否存在。 我怀疑这将会很麻烦,并与其他Org-mode功能冲突。 此外,您还需要编写另一个函数来获取当前代码块并将其传递给Org-mode的R解释器,以及您添加到src块中的所有选项。

感谢您的回复,我接受您的答案为最佳答案。很高兴知道没有我所错过的解决方案。现在,我将放弃它,并在我的工作流程中包含 `Ctl-C'。 - Prasad Chalasani

4
大约一年前,我在org-mode-list上提出了同样的问题。正如@cm2所提到的那样,无法在org-mode中使用ESS功能;据我所知,Emacs无法处理两种主要模式,即使使用mmm-mode也存在一些困难。

Dan Davison友好地发布了一些仿效ESS功能的elisp代码。因此,您可能想要查看Dan对我的问题的回复。


谢谢@Bernd。你提到的电子邮件线程似乎涵盖了我需要的大部分功能。我需要调查如何启用“shift-enter”将R代码块中的代码发送到R进程。然后我就可以开始了。我选择你的回答作为被接受的答案,因为它指向了一个几乎完整的解决方案的实际电子邮件线程。 - Prasad Chalasani

0
polymode 包中的 poly-org.el,旨在解决在 org-mode 中进行多模式编辑的问题。我尝试过,但由于未在间接缓冲区中启用 jit-lock,导致 Emacs 冻结。

0

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)

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