【问题标题】:Emacs, R, Org-mode: how to enable automatic switch to ESS-mode within R code blocks?Emacs、R、Org-mode:如何在 R 代码块中启用自动切换到 ESS 模式?
【发布时间】:2012-01-13 06:55:56
【问题描述】:

当在.Rnw 文档中使用R 代码块时,emacs 缓冲区会自动检测光标在代码块内(即在<<>>@ 内),并切换到 ESS 模式 --这是非常有价值的,因为可以在代码块中获得基于 ESS 的代码格式,而且更有用的是,可以将代码行/区域发送到劣质的*R* 进程缓冲区。

如何在R 代码块(即#+begin_src R#+end_src 之间)的 org-mode 文件中获得相同的功能——我希望 emacs 自动识别它在 R 代码块中,然后打开 ESS 模式,这样我就可以将代码的 sn-ps 发送到*R* 进程。我知道我可以执行Ctl-C ' 并切换到不同的 ESS 模式缓冲区,在那里我可以编辑代码并获得所有其他 ESS 模式的便利(包括将代码发送到R)。但是我希望必须这样做,即我希望能够从同一 org-mode 缓冲区中的 R 代码块发送 code-sn-ps。

【问题讨论】:

  • 有一个mmm-mode - 可能对你有帮助。我自己从来没有用过。

标签: r emacs org-mode ess noweb


【解决方案1】:

一种解决方法是在需要时在模式之间手动切换,例如,将以下代码添加到 .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)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      可能是新的多模模式https://github.com/vitoshka/polymode/blob/master/readme.md 有帮助。我还没有尝试过,但看起来很有希望。

      【讨论】:

        【解决方案4】:

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

        Dan Davison 好心地发布了一些模仿某些 ESS 功能的 elisp 代码。所以,您可能想查看 Dan 对我的问题的回复。

        【讨论】:

        • 谢谢@Bernd。您提到的电子邮件线程似乎确实解决了我需要的大部分功能。我必须研究如何启用“shift-enter”将代码从 R 代码块发送到 R 进程。那我就准备好了。我选择你的作为接受的答案,因为它指向一个具有几乎完整解决方案的实际电子邮件线程。
        【解决方案5】:

        AFAIK,目前的 Org-mode 实现无法做到这一点。

        如果不深入研究 elisp 代码,我不确定这在 Org 模式中是否可行。在 Org 模式下,C-c ' 命令的主要目的是让您有一个额外的缓冲区,其中包含您想要/需要的特定语言的所有语法突出显示。

        可能有一种方法可以解决 R 特定代码的问题,方法是编写一些 Org 模式挂钩,首先检查您是否在 #+begin_src R ...#+end_src R 块中,然后检查对于代码块。我怀疑这会很混乱并与其他 Org 模式功能发生冲突。此外,您必须编写另一个函数来获取当前代码块并将其传递给 Org-mode 的 R 解释器,以及您添加到 src 块的所有选项。

        【讨论】:

        • 感谢您的回复,接受您的作为最佳答案。很高兴知道那里没有我缺少的解决方案。现在我将放弃它,并将Ctl-C ' 包含在我的工作流程中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-08
        • 1970-01-01
        • 2013-04-07
        • 2011-02-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多