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