Emacs, R, Org-mode: как включить автоматический переход в ESS-режим в блоках кода R?

при использовании R куски кода .Rnw документ, буфер emacs автоматически обнаруживает, что курсор находится внутри фрагмента кода (т. е. внутри <<>> и @), и переключается в ESS-режим - это очень ценно, потому что можно получить ESS-форматирование кода в пределах фрагмента кода, и более-полезно, можно отправить строки/регионы кода в подчиненный *R* process-buffer.

как получить ту же функциональность в файле org-mode в R код блоков (то есть между #+begin_src R и #+end_src) -- Я хотел бы, чтобы emacs автоматически распознал его в блоке кода R и включил ESS-mode, чтобы я мог отправлять фрагменты кода в

5 ответов


год назад или около того, я спросил тот же вопрос в списке org-mode -. @cm2 уже упоминал, что невозможно использовать функциональность ESS в org-mode; насколько я знаю, Emacs не может обрабатывать два основных режима и даже с MMM-mode, похоже, есть некоторые трудности.

Дэн Дэвисон любезно опубликовал некоторый elisp-код, который имитирует некоторые функции ESS. Возможно, вы захотите проверить ответы Дэна на мой вопрос.


AFAIK, это не может быть сделано с текущей реализацией Org-mode.

Я не уверен, что это выполнимо вообще в Орг-режиме без некоторого углубления в код elisp. Главный момент C-c ' команда в Org-mode такова, что у вас есть дополнительный буфер, который имеет всю подсветку синтаксиса, которую вы хотите/нужно для вашего конкретного языка.

вероятно, есть способ обойти это для R - конкретный код, написав некоторый крючок Org-mode, который проверяет во-первых, чтобы увидеть, если вы находитесь в #+begin_src R ...#+end_src R блок, а затем Проверка на наличие фрагмента кода. Я подозреваю, что это будет беспорядочно и конфликтовать с другими функциями Org-mode. Кроме того, вам нужно будет написать другую функцию, чтобы захватить текущий блок кода и передать его в Org-mode R интерпретатор вместе со всеми параметрами, которые вы добавили в src блок.


может быть, что новый полимодовый режим https://github.com/vitoshka/polymode/blob/master/readme.md может помочь. Я еще не пробовал, но выглядит многообещающе.


poly-org.el в пакете polymode, предназначен для решения нескольких режимов редактирования в org-режиме. Я пробовал, но он замораживает Emacs из-за не включения jit-блокировки в косвенном буфере.


обходной путь переключается вручную между режимами, когда это необходимо, например, добавление следующего кода .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)