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