Skip to content

Commit 582e1ad

Browse files
izahnGreg Sexton
authored andcommitted
Configure babel blocks for each kernel
1 parent b429ebd commit 582e1ad

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

ob-ipython.el

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,67 @@ a new kernel will be started."
468468

469469
(add-to-list 'org-src-lang-modes '("ipython" . python))
470470

471+
;; Configure jupyter-<language> blocks for each installed kernel
472+
(defun ob-ipython-detect-kernels (&optional replace)
473+
"Detect jupyter kernels if they are not specified in `ob-ipython-active-kernels`.
474+
With optional `replace` replace`ob-ipython-active-kernels` even if it is
475+
already populated."
476+
(when (or replace (not ob-ipython-active-kernels))
477+
(let ((jupyter-executable (executable-find "jupyter")))
478+
(when jupyter-executable
479+
(let ((jupyter-kernelspec-json
480+
(cdr (car (json-read-from-string
481+
(shell-command-to-string
482+
(concat jupyter-executable
483+
" kernelspec list --json")))))))
484+
(let ((jupyter-kernelspecs nil))
485+
(dolist (x jupyter-kernelspec-json)
486+
(add-to-list 'jupyter-kernelspecs
487+
(list (car x) (cdr (assoc 'language (assoc 'spec x))))))
488+
(defcustom ob-ipython-active-kernels jupyter-kernelspecs
489+
"A `plist` containing language and kernel name pairs.
490+
This list is used by `ob-ipython-auto-configure-kernels` to configure
491+
org-bable to execute juypter kernel blocks and to associate jupyter kernal
492+
blocks with the correct emacs mode for editing."
493+
:group 'ob-ipython)
494+
; (setq ob-ipython-active-kernels jupyter-kernelspecs)
495+
))))))
496+
497+
(ob-ipython-detect-kernels t)
498+
499+
(defun ob-ipython-configure-kernel (kernel language)
500+
"Configure org mode to use specified kernel."
501+
(set (intern (format "org-babel-default-header-args:jupyter-%S"
502+
(intern language)))
503+
`((:session . ,language)
504+
(:kernel . ,kernel)
505+
(:results . "output")))
506+
(defalias (intern (format "org-babel-execute:jupyter-%S"
507+
(intern language)))
508+
'org-babel-execute:ipython)
509+
(let ((orig-org-src-lang-mode (assoc language org-src-lang-modes)))
510+
(if orig-org-src-lang-mode
511+
(let ((new-org-src-lang-mode `(,(format "jupyter-%S"
512+
(intern (car orig-org-src-lang-mode))) .
513+
,(cdr orig-org-src-lang-mode)))))
514+
(let ((new-org-src-lang-mode `(,(format "jupyter-%S"
515+
(intern language)) .
516+
,(intern (replace-regexp-in-string
517+
"[0-9]" ""
518+
kernel)))))))
519+
(add-to-list 'org-src-lang-modes 'new-org-src-lang-mode)))
520+
521+
(defun ob-ipython-auto-configure-kernels (&optional replace)
522+
"Detects jupyter kernels installed on your system and configures them for use in org-babel.
523+
With &optional argument `replace` use auto-detected kernels, otherwise configure kernels
524+
specified in `ob-ipython-active-kernels`."
525+
(interactive)
526+
(ob-ipython-detect-kernels replace)
527+
(dolist (kernel ob-ipython-active-kernels)
528+
(ob-ipython-configure-kernel (symbol-name (car kernel)) (car (cdr kernel)))))
529+
530+
(add-hook 'org-mode-hook 'ob-ipython-auto-configure-kernels)
531+
471532
(defvar org-babel-default-header-args:ipython '())
472533

473534
(defun org-babel-edit-prep:ipython (info)

0 commit comments

Comments
 (0)