Primero, deberá aprender el texto básico que funciona con emacs. Dado que emacs es muy sofisticado, descubrir cómo simplemente seleccionar texto y copiar puede ser un desafío. Así que invierta algo de tiempo en descubrir cómo hacerlo de manera eficiente. Leer el manual puede ayudar. Para Mac OS X, use Aquamacs, admite accesos directos nativos.
Trabajar con ESS no difiere de trabajar con R. Deben aplicarse las mismas reglas para organizar el código. En mi caso, cada proyecto tiene su propio directorio, que reside en el directorio principal llamado R, que está en mi directorio de inicio (para Windows, recomiendo apuntar el directorio de inicio de emacs al directorio donde reside toda su fuente). Entonces, cuando uso ESS para trabajar en el proyecto, siempre lo hago M-x R
y selecciono el directorio de inicio de mi directorio de proyectos.
Después de comenzar el proceso R, generalmente divido emacs en dos ventanas (terminología de emacs). Luego, a la izquierda, tengo un código fuente, que envío al proceso R a la derecha. Los atajos relevantes (estos son atajos de emacs) son C-x 3
para dividir ventanas verticalmente, C-x 1
para hacer que el búfer actual sea la única ventana y C-x 2
para dividir ventanas horizontalmente.
Al enviar código a R, mantengo la distinción entre funciones y declaraciones de R. Lo hago manteniendo todas mis funciones en un archivo que normalmente se llama 10code.R
. Entonces simplemente puedo cargar este archivo usando la opción cargar archivo ESS (acceso directo C-c C-l
). La ventaja de este enfoque es que genera todas las funciones y no produce nada en el búfer R. Si hay un error en su código, ESS muestra un mensaje en el minibúfer y puede investigarlo presionando C-c
`.
El otro código son las declaraciones R, que trato de explicar por sí mismo: cargar datos, limpiar datos, ajustar el modelo estadístico, inspeccionar los resultados, producir los resultados finales. El código fuente de estas declaraciones es el estado actual del proyecto. La intención es que, una vez finalizado el proyecto, la fuente de los archivos con este código reproduzca el proyecto (también uso git para el historial de seguimiento). Cuando trabajo con este archivo, generalmente trabajo solo con una declaración R, que envío al proceso R a través de la función eval, párrafo, comando de declaración, que es el acceso directo C-c C-c
. Este comando envía a R el proceso del párrafo, es decir, el texto delimitado por nuevas líneas. Esto es útil, ya que puede agrupar sentencias R en tareas y enviar tareas completas al proceso R. Tampoco requiere seleccionar texto, lo cual también es muy conveniente. El atajoC-c C-c
tiene la ventaja de que mueve el cursor a la ventana R, por lo que puede inspeccionar de inmediato los resultados de la declaración R enviada.
Así que mi flujo de trabajo básico se mueve mucho entre ventanas y buffers. Para facilitar esto, uso los siguientes accesos directos en mi archivo .emacs:
(define-key global-map [f1] 'Control-X-prefix)
(define-key global-map [f3] 'find-file)
(define-key global-map [f2] 'save-buffer)
(define-key global-map [f8] 'kill-buffer)
(define-key global-map [f5] 'switch-to-buffer)
(define-key global-map [f6] 'other-window)
(define-key global-map [f9] 'ess-load-file)
Raramente uso f1
, pero todos los demás con mucha frecuencia. Otras configuraciones específicas de ESS que uso son las siguientes:
(setq comint-input-ring-size 1000)
(setq ess-indent-level 4)
(setq ess-arg-function-offset 4)
(setq ess-else-offset 4)
Esto le dice a ESS que haga que la pestaña tenga 4 caracteres de ancho (el valor predeterminado es 2), que es mi preferencia personal, y expande el número de sus comandos emitidos que ESS guarda como un historial.
Para trabajar con el proceso R directamente, encontré los siguientes atajos muy útiles:
(add-hook 'inferior-ess-mode-hook
'(lambda nil
(define-key inferior-ess-mode-map [\C-up] 'comint-previous-matching-input-from-input)
(define-key inferior-ess-mode-map [\C-down] 'comint-next-matching-input-from-input)
(define-key inferior-ess-mode-map [\C-x \t] 'comint-dynamic-complete-filename)
)
)
Esto recuerda la declaración R de su historial de declaraciones R, pero trata de hacerla coincidir con la que ya está en su línea. Entonces, por ejemplo, al escribir pl
en el proceso R y presionar \C-up
(es decir, el control y la flecha hacia arriba) pasará por todas las declaraciones que comienzan pl
, por lo que recordará, por ejemplo, todos los plot(...
comandos.
La configuración final que uso con ESS es la siguiente:
(setq ess-ask-about-transfile t)
De esta manera, ESS siempre pregunta dónde guardar el texto en el búfer con el proceso R. Por lo general, numero estos archivos según la fecha, por lo que siempre tengo otra forma de rastrear lo que estaba haciendo exactamente. La única advertencia de esta opción es que, por alguna razón, ESS configura el búfer R para leer solo, después de cargar el R. El atajo para hacer que el búfer se pueda escribir es C-x C-q
.
Así que estos son mis ajustes que utilizo para trabajar con ESS, me siento feliz con ellos y no sentí la necesidad de agregar nada durante algunos años. Cuando presento ESS a los usuarios nuevos, generalmente les doy esta descripción general.
Terminaré con el acceso directo final, que para mí es el acceso directo más utilizado cuando trabajo con Emacs y con ESS en particular, es el C-g
que cierra el comando en el mini-búfer. A lo largo de todos los años que trabajo con Emacs y ESS, todavía consigo invocar algunos comandos de Emacs que no quería, C-g
es muy útil en estas situaciones.