Como implementar o operador de tubulação%>% no modo ESS?

8

Recentemente, Rtestemunhei a introdução inteligente do operador de tubulação %>%ou thenoperador no código que eu uso com bastante frequência atualmente. Gostaria de saber se isso já foi implementado na versão mais recente do ESS . Caso contrário, não deve ser um problema criar elispcódigo para escrever uma função para ele. Preciso implementar isso para que ele imprima esse operador %>%e salte para uma nova linha recuada.

MWE

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

Meu teste elisp - no .init.elou .emacsarquivo:

(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, mas quero verificar se há algo errado com ela ou se há alguma sugestão para melhorá-la (ser um novato no elisp). Como restringir isso apenas ao ESSmodo?

Observe
que percebi que o bloqueio de fontes %>%pode ser feito ativando ess-fl-keyword:operatorsno menu ESS.

doutorado
fonte
Eu cuidaria do personagem espacial (just-one-space 1)antes do tubo. Você deseja usar o ess-mode-map(e provavelmente o inferior-ess-mode-map) para definir a chave (define-key ess-mode-map (kbd "C-%") 'then_R_operator).
mutbuerger
obrigado! qual é a diferença entre os dois: inferior...e ess-mode...?
doctorado
ess-modeativa-se ao editar, por exemplo, .Rarquivos. inferior-ess-modeé ativado ao executar um Rprocesso interativo no Emacs (ou seja, através do Rcomando ou com o C-c C-zqual chama ess-switch-to-inferior-or-script-buffer).
undostres
@undostres thanks. o que você quer dizer se eu quiser definir uma chave para esse operador? inferior...Isso permitirá que eu a use no console R interativo, que está dentro do Emacs? se sim, então acho que seria melhor definir chaves para ambos ess-modee inferior, certo?
doutorado
@doctorate Sim.
undostres

Respostas:

8

obrigado a mutbuerger pelos comentários úteis. Atualmente, eu uso isso para este operador trabalhar apenas com 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)
doutorado
fonte