valeri/ob-valeri.el

100 lines
3.5 KiB
EmacsLisp
Raw Normal View History

;;; ob-valeri.el --- org-babel functions for valeri evaluation
(require 'ob)
(require 'valeri-mode)
(defvar valeri-eoe-indicator "valeri-eoe")
(defvar org-babel-valeri-prompt "valeri> "
"String used for unique prompt.")
(defvar org-babel-valeri-command "valeri"
"Name of command to use for executing Valeri code.
It's possible to override it by using a header argument `:valeri'")
(defun org-babel-valeri-initiate-session (&optional session params)
"Initiate a valeri session.
If there is not a current inferior-process-buffer in SESSION
then create one. Return the initialized session.
Session settings (`:valeri' header arg value) are taken from PARAMS."
(unless (string= session "none")
(org-require-package 'valeri-mode)
(let* ((command (cdr (or (assq :valeri params)
'(nil . "valeri"))))
(buffer (get-buffer (format "*%s*" session)))
(new-session? (not buffer))
(session-buffer (or buffer (save-window-excursion
(run-valeri-or-pop-to-buffer
(if (functionp command)
(funcall command)
command)
(or session "valeri")
)
(current-buffer)))))
(if (org-babel-comint-buffer-livep session-buffer)
(progn
(sit-for .25)
;; Setup machine-readable prompt: no echo, prompts matching
;; uniquely by regexp.
(when new-session?
(with-current-buffer session-buffer
(setq-local
org-babel-comint-prompt-regexp-fallback comint-prompt-regexp
comint-prompt-regexp (concat "^" org-babel-valeri-prompt))
(comint-send-input nil t)
))
session-buffer)
(sit-for .5)
(org-babel-valeri-initiate-session session)))))
(defun org-babel-valeri-evaluate (buffer body)
"Pass BODY to the Valeri process in BUFFER."
(let ((escaped-body (format "\x1b[200~%s\x1b[201~" body))
(eoe-string (format "\n(println \"%s\")\n" valeri-eoe-indicator)))
(mapconcat
#'identity
(butlast
(split-string
(mapconcat
#'org-trim
(org-babel-comint-with-output
(buffer valeri-eoe-indicator t escaped-body)
(insert (org-babel-chomp escaped-body) eoe-string)
(comint-send-input nil t))
"\n") "[\r\n]")) "\n")
)
)
(defun org-babel-execute:valeri (body params)
"Execute Valeri BODY according to PARAMS.
This function is called by `org-babel-execute-src-block'."
(let* ((session (org-babel-valeri-initiate-session
(cdr (assq :session params)) params))
(org-babel-valeri-command
(or (cdr (assq :valeri params))
org-babel-valeri-command))
(result
(org-babel-valeri-evaluate session body)))
result
))
(defun org-babel-prep-session:valeri (session params)
"Prepare SESSION according to the header arguments specified in PARAMS."
;; (message "params=%S" params) ;; debugging
(let* ((session (org-babel-valeri-initiate-session session))
)
session))
(defun org-babel-load-session:valeri (session body params)
"Load BODY into SESSION."
(save-window-excursion
(let ((buffer (org-babel-prep-session:valeri session params)))
(with-current-buffer buffer
(goto-char (process-mark (get-buffer-process (current-buffer))))
(insert (org-babel-chomp body)))
buffer)))
(provide 'ob-valeri)
;;; ob-valeri.el ends here