Emacs, R, Org-mode: how to enable automatic switch to ESS-mode within R code blocks?
문제
When using R
code chunks in an .Rnw
document, the emacs buffer automatically detects that the cursor is within a code chunk (i.e. within <<>>
and @
), and switches to ESS-mode -- this is very valuable because one can get ESS-based code-formatting within the code-chunk, and more-usefully, one can send code lines/regions to the inferior *R*
process-buffer.
How do I get the same functionality in an org-mode file within R
code blocks (i.e. between #+begin_src R
and #+end_src
) -- I'd like emacs to automatically recognize it's within an R code code block, and turn on ESS-mode so I can send snippets of code to the *R*
process. I am aware that I can do Ctl-C '
and switch to a different ESS-mode buffer where I can edit the code and get all the other ESS-mode conveniences (including sending code to R
). However I'd like to not have to do this, i.e. I want to be able to send code-snippets from the R code block in the same org-mode buffer.
해결책
A year ago or so, I asked the same question on the org-mode-list. @cm2 has already mentioned, that it is not possible to use ESS functionality within org-mode; as far as I know Emacs cannot handle two major modes and even with mmm-mode there seem to be some difficulties.
Dan Davison kindly posted some elisp-code which mimics some of the ESS features. So, you might want to check Dan's replies to my question.
다른 팁
AFAIK, this can not be done with the current implementation of Org-mode.
I'm not sure this is doable at all within Org-mode without some delving into elisp code. The main point of the C-c '
command in Org-mode is so that you have an additional buffer that has all the syntax highlighting that you want/need for your particular language.
There is probably a way to hack around this for R
-specific code by writing some Org-mode hook that checks first to see if you are in an #+begin_src R
...#+end_src R
block, and then checking for a code chunk. I suspect this would be messy and conflict with other Org-mode features. In addition, you would have to write another function to grab the current code block and pass it to Org-mode's R
interpreter, along with all the options you added to the src
block.
Could be that the new polymode mode https://github.com/vitoshka/polymode/blob/master/readme.md could help. I have not tried yet, but seems promising.
The poly-org.el in polymode package, is designed to address multiple mode editing in org-mode. I tried, but it freezes Emacs due to not enabling jit-lock in indirect buffer.
A workaround is toggling manually between modes when needed, for instance, adding the following code to .emacs and using 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)