Wie implementiere ich den Rohrleitungsoperator%>% im ESS-Modus?

8

Vor kurzem war ich RZeuge der intelligenten Einführung des Rohrleitungsbetreibers %>%oder then-betreibers in Code, den ich heutzutage ziemlich häufig verwende. Ich frage mich, ob dies bereits in der neuesten Version von ESS implementiert wurde . Wenn nicht, sollte es kein Problem sein, elispCode zum Schreiben einer Funktion dafür zu finden. Ich muss dies implementieren, damit es diesen Operator druckt %>%und dann zu einer neuen eingerückten Zeile springt.

MWE

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

Mein Elisp-Prozess - in .init.eloder .emacsDatei:

(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)  

Es funktioniert, aber ich möchte überprüfen, ob etwas nicht stimmt oder ob es Verbesserungsvorschläge gibt (ein Neuling in Elisp zu sein). Wie kann ich dies nur auf den ESSModus beschränken?

Hinweis
Ich habe festgestellt, dass das Sperren von Schriftarten %>%durch Aktivieren ess-fl-keyword:operatorsüber das ESS-Menü erfolgen kann.

Promotion
quelle
Ich würde mich (just-one-space 1)vor der Pipe um den Space-Charakter kümmern . Sie möchten das ess-mode-map(und wahrscheinlich das inferior-ess-mode-map) verwenden, um den Schlüssel mit zu setzen (define-key ess-mode-map (kbd "C-%") 'then_R_operator).
Mutbuerger
Vielen Dank! Was ist der Unterschied zwischen den beiden: inferior...und ess-mode...?
Promotion
ess-modeAktiviert sich beim Bearbeiten von zB .RDateien. inferior-ess-modeWird aktiviert, wenn ein interaktiver RProzess in Emacs ausgeführt wird (dh über den RBefehl oder mit C-c C-zwelchen Aufrufen ess-switch-to-inferior-or-script-buffer).
Undostres
@undostres danke. Meinst du, wenn ich einen Schlüssel für diesen Operator definieren möchte inferior..., kann ich ihn in der interaktiven R-Konsole verwenden, die sich in Emacs befindet? Wenn ja, dann denke ich, wäre es besser, Schlüssel für beide zu definieren, ess-modeund inferior?
Promotion
@doctorate Ja.
Undostres

Antworten:

8

danke an mutbuerger für die hilfreichen kommentare. Derzeit verwende ich dies für diesen Operator, um nur mit ESS zu arbeiten.

(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)
Promotion
quelle