¿Cómo implementar el operador de tubería%>% en modo ESS?

8

Recientemente, Rpresencié la introducción inteligente del operador de tuberías %>%u thenoperador en el código que uso con bastante frecuencia en la actualidad. Me pregunto si esto ya se ha implementado en la versión más reciente de ESS . Si no, no debería ser un problema encontrar un elispcódigo para escribir una función para él. Necesito implementar esto para que imprima ese operador %>%y luego salte a una nueva línea con sangría.

MWE

library(ggplot2)
library(dplyr)    
diamonds %>%
      filter(cut=="Ideal") %>%
      ggplot(aes(price)) +
      geom_histogram() +
      facet_wrap (~ color)

Mi prueba elisp - en .init.elo .emacsarchivo:

(defun then_R_operator ()
  "%>% operator or 'then' pipe operator"
  (interactive)
  (insert " %>%") ; note the space before the first %
  (reindent-then-newline-and-indent))
(global-set-key (kbd "C-%") 'then_R_operator)  

Funciona, pero quiero verificar si hay algo mal con él o si hay alguna sugerencia para mejorarlo (ser un novato en elisp). ¿Cómo restringir esto solo al ESSmodo?

Tenga en
cuenta que me di cuenta de que el bloqueo de fuente %>%se puede hacer habilitando ess-fl-keyword:operatorsdesde el menú ESS.

doctorado
fuente
Me encargaría del personaje espacial (just-one-space 1)antes de la tubería. Desea usar el ess-mode-map(y probablemente el inferior-ess-mode-map) para establecer la clave con (define-key ess-mode-map (kbd "C-%") 'then_R_operator).
mutbuerger
¡Gracias! ¿Cuál es la diferencia entre los dos: inferior...y ess-mode...?
doctorado
ess-modese activa al editar, por ejemplo, .Rarchivos. inferior-ess-modese activa cuando se ejecuta un Rproceso interactivo dentro de Emacs (es decir, a través del Rcomando o con el C-c C-zque llama ess-switch-to-inferior-or-script-buffer).
Desnuda
@undostres gracias. ¿quiere decir que si quiero definir una clave para este operador en inferior...esto me permitirá usarla en la consola interactiva de R, que está dentro de Emacs? en caso afirmativo, creo que sería mejor definir claves para ambos ess-modey inferior, ¿verdad?
Doctorado
@ doctorado Sí.
Desnuda

Respuestas:

8

Gracias a Mutbuerger por los útiles comentarios. Actualmente, uso esto para que este operador trabaje solo con ESS.

(defun then_R_operator ()
  "R - %>% operator or 'then' pipe operator"
  (interactive)
  (just-one-space 1)
  (insert "%>%")
  (reindent-then-newline-and-indent))
(define-key ess-mode-map (kbd "C-%") 'then_R_operator)
(define-key inferior-ess-mode-map (kbd "C-%") 'then_R_operator)
doctorado
fuente