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

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

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

5 ответов

Решение

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

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

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

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

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

Файл 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)

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

Другие вопросы по тегам