commit edd131262ff9831f0cf05135b9c32f35b60462fa
parent 52ed768b0c98e6aea355c0468567b226421b18bf
Author: Shimmy Xu <shimmy.xu@shimmy1996.com>
Date: Thu, 11 Apr 2019 10:41:56 -0400
Add auto formatting for R code.
Diffstat:
M | README.org | | | 52 | ++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 52 insertions(+), 0 deletions(-)
diff --git a/README.org b/README.org
@@ -844,6 +844,58 @@ Use ESS (Emacs Speaks Statistics) for R and Julia support.
(setq tab-always-indent 'complete))
#+END_SRC
+*** Auto Format R Code
+Use the =styler= R package to format buffer or region. Modeled after =yapfify=.
+#+BEGIN_SRC emacs-lisp
+ (defun user/r-format-call-bin (input-buffer output-buffer beginning end)
+ "Format specified region in INPUT-BUFFER saving the output to OUTPUT-BUFFER.
+
+ BEGINNING and END specify region to format."
+ (with-current-buffer input-buffer
+ (write-region beginning end "r-format-temp.R"))
+ (call-process "R" nil nil nil "-e"
+ "library(styler);style_file(\"r-format-temp.R\")")
+ (with-current-buffer output-buffer
+ (insert-file-contents "r-format-temp.R" nil nil nil t))
+ (with-current-buffer input-buffer
+ (delete-region beginning end)
+ (insert-buffer-substring output-buffer))
+ (delete-file "r-format-temp.R"))
+
+ (defun user/r-format-region (beginning end)
+ "Try to r-format the current region.
+
+ Output from R is stored in *r-format*."
+ (interactive "r")
+ (let* ((original-buffer (current-buffer))
+ (original-point (point)) ; Because we are replacing text, save-excursion does not always work.
+ (buffer-windows (get-buffer-window-list original-buffer nil t))
+ (original-window-pos (mapcar 'window-start buffer-windows))
+ (tmpbuf (generate-new-buffer "*r-format*"))
+ (r-output (user/r-format-call-bin original-buffer tmpbuf beginning end)))
+ (deactivate-mark)
+ ;; Clean up tmpbuf
+ (kill-buffer tmpbuf)
+ ;; restore window to similar state
+ (goto-char original-point)
+ (mapcar* 'set-window-start buffer-windows original-window-pos)))
+
+ (defun user/r-format-buffer ()
+ "Format whole buffer."
+ (interactive)
+ (user/r-format-region (point-min) (point-max)))
+#+END_SRC
+
+Auto format on save for =ess-r-mode=.
+#+BEGIN_SRC emacs-lisp
+ (defun user/r-format-before-save ()
+ "Runs r-format on current buffer if in ess-r-mode."
+ (interactive)
+ (when (eq major-mode 'ess-r-mode) (user/r-format-buffer)))
+
+ (add-hook 'before-save-hook 'user/r-format-before-save)
+#+END_SRC
+
** Lsp-mode
Use Language Server Protocol (LSP) for code completion, jump to definition, etc. Check [[https://github.com/emacs-lsp/lsp-mode#supported-languages][list of language servers]] and install needed ones.