;;; 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