lang/org: refactor +babel/ipython library

+ Conform ipython advice and helpers to naming conventions.
+ Refactor out dash.el usage
This commit is contained in:
Henrik Lissner 2018-09-21 22:36:26 -04:00
parent fad1fc8f1b
commit ed1775b42d
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
2 changed files with 69 additions and 62 deletions

View file

@ -9,13 +9,16 @@
(sh . shell) (sh . shell)
(bash . shell) (bash . shell)
(matlab . octave)) (matlab . octave))
"An alist that maps languages to babel libraries. This is necessary for babel "An alist mapping languages to babel libraries. This is necessary for babel
libraries (ob-*.el) that don't match the name of the language.") libraries (ob-*.el) that don't match the name of the language.
For example, with (fish . shell) will cause #+BEGIN_SRC fish to load ob-shell.el
when executed.")
(defvar +org-babel-load-functions () (defvar +org-babel-load-functions ()
"A list of functions that are used to try to load the current executing src "A list of functions for loading the current executing src block. They take
block. They take one argument (the language specified in the src block, as one argument (the language specified in the src block, as a string). Stops at
string). Stops at the first function to return non-nil.") the first function to return non-nil.")
(defun +org|init-babel () (defun +org|init-babel ()
(setq org-src-fontify-natively t ; make code pretty (setq org-src-fontify-natively t ; make code pretty

View file

@ -18,54 +18,7 @@ Make sure your src block has a :session param.")
session) session)
params))) params)))
;;;###autoload (defun +org--ob-ipython-generate-local-path-from-remote (session host params)
(defun +org*ob-ipython--create-repl (name &optional params)
"Create repl based on NAME and PARAMS.
If PARAMS specifies remote kernel, copy the kernel config from remote server and
create a repl connecting to remote session."
(let ((cmd (string-join (ob-ipython--kernel-repl-cmd name) " ")))
(cond ((string= "default" name)
(run-python cmd nil nil)
(format "*%s*" python-shell-buffer-name))
((string-match "^remote-.*ssh.json" name)
(when (not (ignore-errors
(process-live-p
(get-process
(format
"Python:ob-ipython-%s"
name)))))
(let* ((remote (s-split "-" name))
(remote-host (nth 1 remote))
(remote-session (nth 3 remote)))
(+org/ob-ipython-generate-local-path-from-remote
remote-session
remote-host
params))))
((let* ((process-name (format "Python:ob-ipython-%s" name))
(python-shell-prompt-detect-enabled nil)
(python-shell-completion-native-enable nil)
(buf (python-shell-make-comint cmd process-name t))
(dir (cdr (assoc :pydir params))))
(if dir
(with-current-buffer buf
(setq-local default-directory dir)))
(sleep-for 1)
(format "*%s*" process-name))))))
;;;###autoload
(defun +org*org-babel-execute:ipython (body params)
"Execute a BODY of IPython code with PARAMS in org-babel.
This function is called by `org-babel-execute-src-block'."
(message default-directory)
(let ((session (cdr (assoc :session params))))
(org-babel-ipython-initiate-session session params))
(ob-ipython--clear-output-buffer)
(if (cdr (assoc :async params))
(ob-ipython--execute-async body params)
(ob-ipython--execute-sync body params)))
;;;###autoload
(defun +org/ob-ipython-generate-local-path-from-remote (session host params)
"Given a remote SESSION with PARAMS and corresponding HOST, copy remote config to local, start a jupyter console to generate a new one." "Given a remote SESSION with PARAMS and corresponding HOST, copy remote config to local, start a jupyter console to generate a new one."
(let* ((runtime-dir (let* ((runtime-dir
(substring (shell-command-to-string (concat "ssh " host " jupyter --runtime-dir")) 0 -1)) (substring (shell-command-to-string (concat "ssh " host " jupyter --runtime-dir")) 0 -1))
@ -100,7 +53,56 @@ This function is called by `org-babel-execute-src-block'."
(setq-local default-directory dir))) (setq-local default-directory dir)))
(format "*%s*" proc)))) (format "*%s*" proc))))
;;;###autoload
(defun +org*ob-ipython--create-repl (name &optional params)
"Create repl based on NAME and PARAMS.
If PARAMS specifies remote kernel, copy the kernel config from remote server and
create a repl connecting to remote session."
(let ((cmd (string-join (ob-ipython--kernel-repl-cmd name) " ")))
(cond ((string= "default" name)
(run-python cmd nil nil)
(format "*%s*" python-shell-buffer-name))
((string-match "^remote-.*ssh.json" name)
(when (not (ignore-errors
(process-live-p
(get-process
(format
"Python:ob-ipython-%s"
name)))))
(let* ((remote (s-split "-" name))
(remote-host (nth 1 remote))
(remote-session (nth 3 remote)))
(+org--ob-ipython-generate-local-path-from-remote
remote-session
remote-host
params))))
((let* ((process-name (format "Python:ob-ipython-%s" name))
(python-shell-prompt-detect-enabled nil)
(python-shell-completion-native-enable nil)
(buf (python-shell-make-comint cmd process-name t))
(dir (cdr (assoc :pydir params))))
(if dir
(with-current-buffer buf
(setq-local default-directory dir)))
(sleep-for 1)
(format "*%s*" process-name))))))
;;;###autoload
(defun +org*org-babel-execute:ipython (body params)
"Execute a BODY of IPython code with PARAMS in org-babel.
This function is called by `org-babel-execute-src-block'."
(message default-directory)
(let ((session (cdr (assoc :session params))))
(org-babel-ipython-initiate-session session params))
(ob-ipython--clear-output-buffer)
(if (cdr (assoc :async params))
(ob-ipython--execute-async body params)
(ob-ipython--execute-sync body params)))
;;
;; * org-src-edit ;; * org-src-edit
;;;###autoload ;;;###autoload
(defun +org*org-babel-edit-prep:ipython (info) (defun +org*org-babel-edit-prep:ipython (info)
(let* ((params (nth 2 info)) (let* ((params (nth 2 info))
@ -109,12 +111,12 @@ This function is called by `org-babel-execute-src-block'."
;; Support for python.el's "send-code" commands within edit buffers. ;; Support for python.el's "send-code" commands within edit buffers.
(setq-local python-shell-buffer-name (setq-local python-shell-buffer-name
(format "Python:ob-ipython-%s" (format "Python:ob-ipython-%s"
(->> info (nth 2) (assoc :session) (ob-ipython--normalize-session
cdr ob-ipython--normalize-session))) (cdr (assoc :session (nth 2 info))))))
(setq-local default-directory (setq-local default-directory
(format "%s" (format "%s"
(->> info (nth 2) (assoc :pydir) (ob-ipython--normalize-session
cdr ob-ipython--normalize-session))) (cdr (assoc :pydir (nth 2 info))))))
(ob-ipython-mode 1) (ob-ipython-mode 1)
;; hack on company mode to use company-capf rather than company-anaconda ;; hack on company mode to use company-capf rather than company-anaconda
(when (featurep! :completion company) (when (featurep! :completion company)
@ -127,14 +129,16 @@ This function is called by `org-babel-execute-src-block'."
(when (featurep 'lpy) (when (featurep 'lpy)
(setq lispy-python-proc (setq lispy-python-proc
(format "Python:ob-ipython-%s" (format "Python:ob-ipython-%s"
(->> info (nth 2) (assoc :session) (ob-ipython--normalize-session
cdr ob-ipython--normalize-session)) (cdr (assoc :session (nth 2 info)))))
lispy--python-middleware-loaded-p nil) lispy--python-middleware-loaded-p nil)
(lispy--python-middleware-load))) (lispy--python-middleware-load)))
;;
;; * retina ;; * retina
;;;###autoload
(defun +org/ob-ipython-mac-2x-image-file-name (filename &optional scale) (defun +org--ob-ipython-mac-2x-image-file-name (filename &optional scale)
"Return the name of high-resolution image file for FILENAME. "Return the name of high-resolution image file for FILENAME.
The optional arg SCALE is scale factor, and defaults to 2." The optional arg SCALE is scale factor, and defaults to 2."
(let ((pos (or (string-match "\\.[^./]*\\'" filename) (length filename)))) (let ((pos (or (string-match "\\.[^./]*\\'" filename) (length filename))))
@ -147,6 +151,6 @@ The optional arg SCALE is scale factor, and defaults to 2."
(defun +org*ob-ipython--write-base64-string (oldfunc &rest args) (defun +org*ob-ipython--write-base64-string (oldfunc &rest args)
(let ((file (car args)) (let ((file (car args))
(b64-string (cdr args))) (b64-string (cdr args)))
(let ((file2x (+org/ob-ipython-mac-2x-image-file-name file))) (let ((file2x (+org--ob-ipython-mac-2x-image-file-name file)))
(apply oldfunc file2x b64-string) (apply oldfunc file2x b64-string)
(shell-command (concat "convert " file2x " -resize 50% " file))))) (shell-command (concat "convert " file2x " -resize 50% " file)))))