|
;;; ob-powershell.el --- org-babel functions for powershell evaluation |
|
|
|
;; Authors: Chris Bilson |
|
;; Keywords: literate programming, reproducible research |
|
;; Homepage: http://orgmode.org |
|
|
|
;;; Commentary: |
|
|
|
;; Org-Babel support for evaluating powershell source code. |
|
|
|
|
|
;;; Code: |
|
(require 'ob) |
|
(require 'ob-core) |
|
(eval-when-compile (require 'cl)) |
|
|
|
(defvar org-babel-tangle-lang-exts) |
|
(add-to-list 'org-babel-tangle-lang-exts '("poweshell" . "ps1")) |
|
|
|
(defvar org-babel-default-header-args:powershell '()) |
|
|
|
(defun org-babel-expand-body:powershell (body params) |
|
body) |
|
|
|
(defun org-babel-execute:powershell (body params) |
|
"Execute a block of Powershell code with Babel. |
|
This function is called by `org-babel-execute-src-block'." |
|
(let* ((in-file (org-babel-temp-file "powershell-" ".ps1")) |
|
(cmdline (or (cdr (assq :cmdline params)) |
|
"-NoLogo -NonInteractive")) |
|
(cmd (or (cdr (assq :cmd params)) |
|
"powershell"))) |
|
(with-temp-file in-file |
|
(insert (org-babel-expand-body:powershell body params))) |
|
(message "cmd: %s" cmd) |
|
(message "cmdline: %s" cmdline) |
|
(message "in-file: %s" in-file) |
|
(message "body: %s" (org-babel-expand-body:powershell body params)) |
|
(org-babel-eval |
|
(concat cmd " " cmdline |
|
" -File " (org-babel-process-file-name in-file)) |
|
""))) |
|
|
|
;; TODO: I think I *can* support sessions in powershell and really want to... |
|
(defun org-babel-prep-session:powershell (session params) |
|
"Prepare SESSION according to the header arguments in PARAMS." |
|
(error "Sessions are not supported for Powershell")) |
|
|
|
(defun org-babel-variable-assignments:powershell (params) |
|
"Return list of powershell statements assigning the block's variables." |
|
(mapcar |
|
(lambda (pair) |
|
(org-babel-powershell--var-to-powershell (cdr pair) (car pair))) |
|
(mapcar #'cdr (org-babel--get-vars params)))) |
|
|
|
;; helper functions |
|
|
|
(defvar org-babel-powershell--lvl 0) |
|
|
|
(defun org-babel-powershell--var-to-powershell (var &optional varn) |
|
"Convert an elisp value to a powershell variable. |
|
The elisp value, VAR, is converted to a string of powershell source code |
|
specifying a var of the same value." |
|
(if varn |
|
(let ((org-babel-powershell--lvl 0) (lvar (listp var)) prefix) |
|
(concat "$" (symbol-name varn) "=" (when lvar "\n") |
|
(org-babel-powershell--var-to-powershell var) |
|
";\n")) |
|
(let ((prefix (make-string (* 2 org-babel-powershell--lvl) ?\ ))) |
|
(concat prefix |
|
(if (listp var) |
|
(let ((org-babel-powershell--lvl (1+ org-babel-powershell--lvl))) |
|
(concat "[\n" |
|
(mapconcat #'org-babel-powershell--var-to-powershell var "") |
|
prefix "]")) |
|
(format "${%s}" var)) |
|
(unless (zerop org-babel-powershell--lvl) ",\n"))))) |
|
|
|
(defvar org-babel-powershell-buffers '(:default . nil)) |
|
|
|
(defun org-babel-powershell-initiate-session (&optional session params) |
|
"Return nil because sessions are not supported by powershell." |
|
nil) |
|
|
|
(defvar org-babel-powershell-preface nil) |
|
|
|
(defun org-babel-powershell-evaluate (session ibody &optional result-type result-params) |
|
"Pass BODY to the Powershell process in SESSION. |
|
If RESULT-TYPE equals 'output then return a list of the outputs |
|
of the statements in BODY, if RESULT-TYPE equals 'value then |
|
return the value of the last statement in BODY, as elisp." |
|
(when session (error "Sessions are not supported for Powershell")) |
|
(let* ((body (concat org-babel-powershell-preface ibody)) |
|
(out-file (org-babel-temp-file "powershell-")) |
|
(tmp-babel-file (org-babel-process-file-name |
|
out-file 'noquote)) |
|
(in-file (org-babel-temp-file "powershell-")) |
|
(command (format "%s -File '%s'" org-babel-powershell-command in-file))) |
|
|
|
(with-temp-file in-file |
|
(insert body)) |
|
|
|
(message "body: %s" body) |
|
(message "in-file: %s" in-file) |
|
(message "out-file: %s" out-file) |
|
(message "command: %s" command) |
|
|
|
(let ((results |
|
(case result-type |
|
(output |
|
(with-temp-file out-file |
|
(insert |
|
(org-babel-eval org-babel-powershell-command body)) |
|
(buffer-string))) |
|
(value |
|
(message "evaliing now...") |
|
(org-babel-eval command body))))) |
|
(when results |
|
(org-babel-result-cond result-params |
|
(org-babel-eval-read-file out-file) |
|
(org-babel-import-elisp-from-file out-file '(16))))))) |
|
|
|
(provide 'ob-powershell) |
|
;;; ob-powershell.el ends here |
Hi,
I'm using your code and added support for passing variables. I'm sure it's not perfect, my knowledge of elisp is not the greatest but it works for my use case. So have a go and tell me something.
Thanks