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

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

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


person Prasad Chalasani    schedule 05.12.2011    source источник
comment
Есть ммм-режим - может быть, он вам поможет. Сам никогда не пользовался.   -  person Adobe    schedule 05.12.2011


Ответы (5)


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

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

person Bernd Weiss    schedule 05.12.2011
comment
Спасибо @Bernd. Цепочка электронной почты, о которой вы говорите, похоже, касается большей части необходимых мне функций. Я должен исследовать, как включить shift-enter для отправки кода из блока кода R в процесс R. Тогда все будет готово. Я выбираю ваш как принятый ответ, поскольку он указывал на реальную цепочку писем с почти полным решением. - person Prasad Chalasani; 07.12.2011

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

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

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

person cm2    schedule 05.12.2011
comment
Спасибо за ответ, принимая ваш как лучший ответ. Приятно знать, что мне не хватает решения. А пока я откажусь от этого и включу Ctl-C ' в свой рабочий процесс. - person Prasad Chalasani; 06.12.2011

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

person Pablo Marin-Garcia    schedule 08.07.2014

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

person Xizeng Mao    schedule 26.11.2014

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