2011-12-05 8 views
9

Cuando se utilizan fragmentos de código R, el búfer emacs detecta automáticamente que el cursor está dentro de un fragmento de código (es basado en el formato de código dentro del código-fragmento, y más útilmente, uno puede enviar líneas de código/regiones al inferior *R* process-buffer.Emacs, R, modo Org: cómo habilitar el cambio automático al modo ESS dentro de los bloques de código R?

¿Cómo consigo la misma funcionalidad en un archivo en modo org dentro R bloques de código (es decir, entre #+begin_src R y #+end_src) - Me gustaría emacs para reconocer automáticamente que es dentro de un bloque de código de código R, y se encienden ESS -mode para que pueda enviar fragmentos de código al proceso *R*. Soy consciente de que puedo hacer Ctl-C ' y cambiar a un búfer de modo ESS diferente donde puedo editar el código y obtener todas las demás conveniencias del modo ESS (incluido el código de envío a R). Sin embargo, me gustaría no hacer esto, es decir, quiero poder enviar fragmentos de código desde el bloque de código R en el mismo buffer de modo orgánico.

+0

Hay un [modo mmm] (http://www.emacswiki.org/emacs/MmmMode) - puede ser que pueda ayudarlo. Nunca lo usé yo mismo. – Adobe

Respuesta

4

Hace un año más o menos, pregunté same question en la org-mode-list. @ cm2 ya ha mencionado, que no es posible usar la funcionalidad ESS dentro de org-mode; Hasta donde yo sé, Emacs no puede manejar dos modos principales e incluso con el modo mmm parece que hay algunas dificultades.

Dan Davison publicó amablemente un código elisp que imita algunas de las características de ESS. Por lo tanto, es posible que desee verificar las respuestas de Dan a mi pregunta.

+0

Gracias @Bernd. El hilo de correo electrónico que menciona parece abordar la mayor parte de la funcionalidad que necesitaba.Tengo que investigar cómo habilitar "shift-enter" para enviar código del bloque de código R al proceso R. Entonces estaré listo. Selecciono el suyo como la respuesta aceptada, ya que apuntaba a un hilo de correo electrónico real con una solución casi completa. –

4

AFAIK, esto no se puede hacer con la implementación actual de Org-mode.

No estoy seguro de que esto sea posible en Org-mode sin profundizar en el código elisp. El punto principal del comando C-c ' en Org-mode es que tenga un búfer adicional que tenga todos los resaltados de sintaxis que desee/necesite para su idioma en particular.

es probable que haya una manera de cortar alrededor de este código específico de R escribiendo algún gancho modo Org que comprueba primero para ver si usted está en un #+begin_src R ... #+end_src R bloque y, a continuación, la comprobación de un trozo de código. Sospecho que esto sería complicado y entraría en conflicto con otras características del modo Org. Además, debería escribir otra función para tomar el bloque de código actual y pasarlo al intérprete R de Org-mode, junto con todas las opciones que agregó al bloque src.

+0

Gracias por responder, aceptando la tuya como la mejor respuesta. Es bueno saber que no hay ninguna solución que me esté perdiendo. Y por ahora me rendiré e incluiré 'Ctl-C '' en mi flujo de trabajo. –

0

El paquete poly-org.el in polymode está diseñado para abordar la edición de modos múltiples en modo orgánico. Lo intenté, pero congela Emacs debido a que no habilita jit-lock en el buffer indirecto.

0

Una solución alternativa es alternar manualmente entre modos cuando sea necesario, por ejemplo, agregar el siguiente código a .emacs y usar 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) 
Cuestiones relacionadas