;; Helpers
(defun text-around-cursor (&optional rows-around)
(let ((rows-around (or rows-around 10))
(current-line (line-number-at-pos))
(initial-point (point)))
(save-mark-and-excursion
(goto-line (- current-line rows-around))
(set-mark (point))
(goto-line (+ current-line rows-around))
(end-of-line)
;; Return a list of text, index
(list (buffer-substring-no-properties (mark) (point))
(+ (- initial-point (mark)) 1)))))
(defun strip-ess-output-junk (r-buffer)
(with-current-buffer r-buffer
(goto-char (point-min))
(while (re-search-forward "\\+\s" nil t)
(replace-match ""))))
(defun exec-r-fn-to-buffer (r_fn text)
(let ((r-process (ess-get-process))
(r-output-buffer (get-buffer-create "*R-output*")))
(ess-string-command
(format "cat(%s(%s))\n" r_fn text)
r-output-buffer nil)
(strip-ess-output-junk r-output-buffer)
(save-mark-and-excursion
(goto-char (point-max))
(newline)
(insert-buffer r-output-buffer))))
;; fnmate functions for keybindings
(defun fnmate ()
(interactive)
(let* ((input-context (text-around-cursor))
(text (prin1-to-string (car input-context)))
(index (cdr input-context)))
(ess-eval-linewise (format "fnmate::fnmate_fn.R(%s, %s)" text index))))
(defun fnmate-below ()
(interactive)
(let* ((input-context (text-around-cursor))
(text (prin1-to-string (car input-context)))
(index (cdr input-context))
(args (format "%s, %s" text index)))
(exec-r-fn-to-buffer "fnmate::fnmate_below" args)))