Doom-emacs: [рдмрдЧ] emacs-jupyter рдХреЗ рд╕рд╛рде ob-async

рдХреЛ рдирд┐рд░реНрдорд┐рдд 16 рджрд┐рд╕ре░ 2019  ┬╖  30рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: hlissner/doom-emacs

рдХреНрдпрд╛ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдереА?
рдкрд░рд┐рдгрд╛рдо рдЦрдВрдб рдореЗрдВ рд╕реНрд░реЛрдд рдмреНрд▓реЙрдХ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рджреЗрдЦреЗрдВ

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛?
рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдЙрдЯрдкреБрдЯ-рдПрд╕рд┐рдВрдХреНрд╕ рдХреЛрдб рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИ

рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░рд┐рдпрд╛:
image

рдкрд╢реНрд╡-рдЕрдиреБрд░реЗрдЦрди:

Debugger entered--Lisp error: (file-missing "Cannot open load file" "No such file or directory" "ob-jupyter-python")
  signal(file-missing ("Cannot open load file" "No such file or directory" "ob-jupyter-python"))
  async-handle-result((lambda (result) (with-current-buffer #<buffer google_maps.org> (let ((default-directory "/home/pim/git/myMinsait/smartwaste/sprint20/")) (save-excursion (cond ((member "none" ...) (message "result silenced")) ((member "silent" ...) (message ...)) (t (goto-char #<marker at 692 in google_maps.org>) (let ... ... ... ...))) (run-hooks 'org-babel-after-execute-hook))))) (async-signal (file-missing "Cannot open load file" "No such file or directory" "ob-jupyter-python")) #<buffer *emacs*>)
  async-when-done(#<process emacs> "finished\n")

рдкреНрд░рдЬрдирди рдХрд░рдиреЗ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛:

  1. Jupyter рдХреЛ package.el (package! jupyter)
  2. рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдорд╛рд╣реМрд▓ рд╣реИ
  3. Org рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдб рдЪрд▓рд╛рдПрдБ
#+begin_src jupyter-python :session py :results raw drawer
%matplotlib inline
import numpy as np
import pandas as pd
x = np.linspace(1,100, 10)
y = np.random.normal(size=10)*x
df = pd.DataFrame({'x':x, 'y':y})
df.plot(x='x', y='y')
#+end_src

рдкреНрд░рдгрд╛рд▓реА рдХреА рдЬрд╛рдирдХрд╛рд░реА:

Compiling your literate config...
Tangled 0 code blocks from config.org

Done!
((emacs
  (version . "27.0.50")
  (features . "XPM JPEG TIFF GIF PNG RSVG CAIRO SOUND GPM DBUS GLIB NOTIFY INOTIFY ACL GNUTLS LIBXML2 FREETYPE HARFBUZZ LIBOTF ZLIB TOOLKIT_SCROLL_BARS GTK3 X11 XDBE XIM MODULES THREADS LIBSYSTEMD JSON PDUMPER LCMS2 GMP")
  (build . "dic 05, 2019")
  (buildopts "--prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib --localstatedir=/var --mandir=/usr/share/man --with-gameuser=:games --with-sound=alsa --with-modules --without-gconf --without-gsettings --enable-link-time-optimization --with-x-toolkit=gtk3 --without-xaw3d --without-m17n-flt --with-cairo --without-compress-install 'CFLAGS=-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt -flto -fuse-linker-plugin -flto -fuse-linker-plugin -fuse-ld=gold' CPPFLAGS=-D_FORTIFY_SOURCE=2 LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now")
  (windowsys . batch)
  (daemonp . server-running))
 (doom
  (version . "2.0.9")
  (build . "HEAD -> develop 207ce02a3 2019-12-16 05:45:27 -0500"))
 (system
  (type . gnu/linux)
  (config . "x86_64-pc-linux-gnu")
  (shell . "/usr/bin/zsh")
  (uname . "Linux 4.19.88-1-MANJARO #1 SMP PREEMPT Thu Dec 5 11:04:44 UTC 2019 x86_64")
  (path "~/anaconda3/envs/waste/bin" "~/anaconda3/condabin" "~/.local/bin" "/usr/local/bin" "/usr/local/sbin" "/usr/bin" "/usr/lib/jvm/default/bin" "/usr/bin/site_perl" "/usr/bin/vendor_perl" "/usr/bin/core_perl" "/usr/lib/emacs/27.0.50/x86_64-pc-linux-gnu"))
 (config
  (envfile . envvar-file)
  (elc-files . 0)
  (modules :completion company ivy :ui doom doom-dashboard doom-quit hl-todo modeline nav-flash ophints (popup +all +defaults) treemacs vc-gutter vi-tilde-fringe window-select workspaces :editor (evil +everywhere) file-templates fold multiple-cursors rotate-text snippets word-wrap :emacs dired electric ibuffer vc :term eshell :tools docker (eval +overlay) flycheck (lookup +docsets) lsp magit :lang data emacs-lisp markdown (org +dragndrop +ipython +pandoc +present) (python +lsp +conda) sh :config literate (default +bindings +smartparens))
  (packages jupyter)
  (elpa "n/a")))

:lang org new resolved-temporarily

рд╕рднреА 30 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЗрд╕реЗ рдЕрдкрдиреЗ рдирд┐рдЬреА config.el рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

(add-hook! '+org-babel-load-functions
  (defun +org-babel-load-jupyter-h (lang)
    (and (string-prefix-p "jupyter-" (symbol-name lang))
         (require lang nil t))))

рдЬрд▓реНрджреА рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХрд╛ рд╢реБрдХреНрд░рд┐рдпрд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рдЗрд╕реЗ рдареАрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдПрдХ рд╕рд░рд▓ рдХреЛрдб рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рднреА рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛:

#+begin_src jupyter-python :session py :results raw drawer
print('test')
#+end_src

#+RESULTS:
: test

#+begin_src jupyter-python :session py :results raw drawer
print('test')
#+end_src

#+RESULTS:
: c172bf02f62c4210de534c8e3147198b

рдпрд╣рд╛рдБ рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ ("рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛"):

;;; .doom.d/config.el -*- lexical-binding: t; -*-

;; Place your private configuration here

(def-package! org
  :config
  ;; (setq python-shell-interpreter "/home/pim/anaconda3/bin/python3")
  ;; (setq org-babel-python-command "/home/pim/anaconda3/bin/python3")
  (setq python-shell-interpreter-args "-m IPython --simple-prompt -i")
  (org-babel-do-load-languages
   'org-babel-load-languages
   '((latex . t)
     (python . t)
     (shell . t)
     (sql . t)
     (jupyter . t))))

(add-hook! '+org-babel-load-functions
  (defun +org-babel-load-jupyter-h (lang)
    (and (string-prefix-p "jupyter-" (symbol-name lang))
         (require lang nil t))))

org-babel-do-load-languages рдХреЙрд▓ рдирд┐рдХрд╛рд▓реЗрдВред рдпрд╣ рдмреЗрдореЗрд▓ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП Doom рдХреЗ рдЕрдкрдиреЗ рдЖрд▓рд╕реА-рд▓реЛрдбрд┐рдВрдЧ рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдмреЗрдорд╛рдиреА рд╣реИред рдпрдХреАрди рдирд╣реАрдВ рд╣реЛрддрд╛ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдиреНрдпрдерд╛, рдЬреНрдпреВрдкрд┐рдЯрд░ рдкреИрдХреЗрдЬ рд╕реЗ :lang (org +ipython) рдмрджрд▓реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЬреНрдпреВрдкрд┐рдЯрд░ рдИрдореИрдХ рдкреИрдХреЗрдЬ рдХреБрдЫ рдЧреИрд░-рдорд╛рдирдХ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдкрдиреЗ src рдмреНрд▓реЙрдХ рдореЗрдВ :async yes рдпрд╛ :async no рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдкрдбрд╝рддрд╛ рд╣реИред

Ob-ipython рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ + conda рдХреЗ рд╕рд╛рде рд╕рдХреНрд░рд┐рдп рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ ob-ipython рд╕рдорд░реНрдерди рдЦреЛ рд░рд╣рд╛ рд╣реИред

рдореИрдВ emacs-jupyter рдХреЛ рдЖрдЬрд╝рдорд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреЛрдВрдбрд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рдкрд┐рдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдФрд░ рдЗрд╕рдореЗрдВ рдЖрд░ рдФрд░ рд░рд┐рдореЛрдЯ рдХрд░реНрдиреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рднреА рдХреНрд╖рдорддрд╛ рд╣реИред

рдЕрдЧрд░ org-babel-do-load-languages рд╕рд╛рде рдирд╣реАрдВ рддреЛ рдореБрдЭреЗ jupyter рдХреЛ org babel рдореЗрдВ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛?

emacs-jupyter ob-async рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЬреНрдпреВрдкрд┐рдЯрд░ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрдЯрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

(setq ob-async-no-async-languages-alist
      '("jupyter-python"))

рдореИрдВрдиреЗ +jupyter рд╕реБрд╡рд┐рдзрд╛ рдХреЛ :lang org рдЬреЛрдбрд╝рд╛ рд╣реИ рдЬреЛ ob-async-no-async-languages-alist рдФрд░ +org-babel-load-functions ред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЕрдкрдиреЗ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

рдЖрдкрдХреА рдорджрдж рдХреЗ рд▓рд┐рдП @randomizedthinking рдФрд░ @Hissner рдХреЛ рдзрдиреНрдпрд╡рд╛рджред

+jupyter рдХреЛ рдСрд░реНрдЧрди рдХреЙрдиреНрдлрд┐рдЧрд░ рдореЗрдВ .doom.d/init.el, it seems babel does not pick up that language: рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, +jupyter рдСрд░реНрдЧрди-рдмреИрдмреЗрд▓-рдПрдХреНрдЬрд╝рд┐рдХреНрдпреВрдЯ-src-block: рдЬреНрдпреВрдкрд┐рдЯрд░-рдкрд╛рдЗрдерди рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдСрд░реНрдЧреЗрди-рдмреИрдмреЗрд▓-рдлрдВрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ! '

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, emacs-jupyter рдХреЛ рдЕрдЬрдЧрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реАрдзрд╛ рдЙрддреНрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдУрдЖрд░-рдЖрдЗрдкреАрдереЙрди рдХреА рддрд░рд╣ рдУрдЖрд░рдЬреА-рдореЛрдб рдХреЗ рд╕рд╛рде рд╕рд┐рд░реНрдл рдПрдХ рдПрдХреАрдХрд░рдг рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рд╕рдЪреНрдЪрд╛рдИ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрдпрд╛рдордд / emacs рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдВ рдФрд░ рдмрдореБрд╢реНрдХрд┐рд▓ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП emacs-jupyter, рд▓реЗрдХрд┐рди рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ emacs-jupyter рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЙрддреНрддрд░ рдХрд╛рдлреА рдмреЗрд╣рддрд░ рд╣реИ, рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдСрдЯреЛ-рдкреВрд░реНрддрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЗрди-рдмрдлрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди, рдЖрджрд┐ред ред

рдпрд╣ рд╕рдм рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╛рдпрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ emacs-jupyter рдЗрд╕рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ?

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореБрдЭреЗ рдмрд╣реБрдд рд╕реАрдорд┐рдд рдЬреНрдЮрд╛рди рд╣реИ, рдлрд┐рд░ рднреА рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдорджрдж рдХрд░рдиреЗ рдХреЛ рддреИрдпрд╛рд░ рд╣реВрдБред

рдЗрд╕ рдмреАрдЪ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреА рдХреЙрдиреНрдлрд╝рд┐рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛:

(use-package! jupyter
  :defer t
  :init
  (map! :after python
        :map python-mode-map
        :localleader
        (:prefix ("j" . "jupyter")
          :desc "Run REPL"      "o" #'jupyter-run-repl
          :desc "Eval funciton"      "f" #'jupyter-eval-defun
          :desc "Eval buffer"      "b" #'jupyter-eval-buffer
          :desc "Eval region"      "r" #'jupyter-eval-region
          :desc "Restart REPL"      "R" #'jupyter-repl-restart-kernel
          :desc "Interrupt REPL"      "i" #'jupyter-repl-interrup-kernel
          :desc "Scratch buffer"      "s" #'jupyter-repl-scratch-buffer
          :desc "Remove overlays"      "O" #'jupyter-eval-remove-overlays
          :desc "Eval string"      "w" #'jupyter-eval-string
          :desc "Inspect at point"      "d" #'jupyter-inspect-at-point
          )))

рдлрд┐рд▓рд╣рд╛рд▓, рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдХреЗрд╡рд▓ рдСрд░реНрдЧрдореЛрдб рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдЯреВрдЯрд╛ рд╣реБрдЖ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

@pmercatoris рдСрд░реНрдЧрди-рдмрд╛рдмреЗрд▓ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреНрдпреВрдкрд┐рдЯрд░ рдХреЗ рд▓рд┐рдП, рдореЗрд░реА рд╡рд░реНрддрдорд╛рди рд╕реЗрдЯрд┐рдВрдЧ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИред Emacs-jupyter рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рднрд╛рд╖рд╛ python (рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдЬреЛ рд╣рдо jupyter рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ) рдХреЛ jupyter рд╕реЗ рдкрд╣рд▓реЗ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

(org-babel-do-load-languages
 'org-babel-load-languages
 '((shell . t)
   (emacs-lisp . t)
   (python . t)
   (jupyter . t)))

рдореИрдВ рджреВрд╕рд░реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ emacs-jupyter рдХреЛ doom emacs рдврд╛рдВрдЪреЗ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдХреАрдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдзрдиреНрдпрд╡рд╛рджред рд╕рднреА рдореВрд▓реНрдпрд╛рдВрдХрди рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡рд░реНрддрдорд╛рди рдХрдпрд╛рдордд gr рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рд▓рдЧрд╛рддрд╛рд░ рдХреНрд░реЙрд╕ рдХрдпрд╛рдордд рдЙрддреНрддрд░ рд╣реЛрдЧрд╛ред

@pmercatoris рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ 17d0833 рдЖрдкрдХрд╛ рдореБрджреНрджрд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

рдЕрдЧрд░ рд╡рд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рджреЗрдЦреЗрдВ рдХрд┐ +org-babel-load-jupyter-h рдЬреНрдпрд╛рджрд╛ рд╣реЛ рддреЛ рдорджрдж рдорд┐рд▓рддреА рд╣реИ:

(defun +org-babel-load-jupyter-h (lang)
  (and (string-prefix-p "jupyter-" (symbol-name lang))
       (require 'ob-python)
       (require lang nil t)))

@randomizedthinking рдХреГрдкрдпрд╛ org-babel-do-load-languages рдмрд┐рдирд╛ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдБред рдЗрд╕реЗ 3b2a37d9a рдореЗрдВ рдЕрдХреНрд╖рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбреВрдо рдХреЗ рдЖрд▓рд╕реА рд▓реЛрдбрд░ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рддрд╛ рд╣реИред

@ рд╣рд┐рд▓рд╕рдирд░ рдХреЛ рди рддреЛ 17d0833 рдФрд░ рди рд╣реА рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ рдХрд╛рдо рд▓рдЧрддреА рд╣реИред

рдореБрдЭреЗ рдорд┐рд▓рддрд╛ рд╣реИ: рд╕реНрд░реЛрдд рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде org-babel-execute-src-block: No org-babel-execute function for jupyter-python!

рдареАрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ .doom.d / config.el рдореЗрдВ рдЬреЛрдбрд╝рд╛, рдФрд░ рдЕрдм рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! :)

(add-hook! '+org-babel-load-functions
    (defun +org-babel-load-jupyter-h (lang)
      (and (string-prefix-p "jupyter-" (symbol-name lang))
       (require 'ob-jupyter)
           (require lang nil t))))

рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрд░реЛрдд рдмреНрд▓реЙрдХ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдкрд╣рд▓реА рдмрд╛рд░ рдлрд╛рдЗрд▓ рдХрд╛ рджреМрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдПрдХ рд╕реНрд░реЛрдд рдмреНрд▓реЙрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдлрд┐рд░ рд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдЗрд░рд╛рджрд╛ рд╣реИ?

рдорд╣рд╛рди, рдореИрдВ рдЬреЛрдбрд╝реВрдВрдЧрд╛ рдХрд┐ + рдЬреНрдпреВрдкрд┐рдЯрд░ рд╕рдмрдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рдж рдЬрдм рд╣рдо рдЖрдкрдХреЗ рдмреНрд▓реЙрдХ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдЗрд╢реВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ (рдЬрд┐рд╕рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмреНрд▓реЙрдХ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд▓рд╕реА рд▓реЛрдбрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреНрдпреВрдкрд┐рдЯрд░ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдмреЗрдмреАрдмреЛрд░реНрдб рдкреНрд▓рдЧрдЗрди рд╣реИ)ред

рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ рдЕрдкрдиреЗ config.el рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ:

(after! org
  (defadvice! +org--src-lazy-load-library-a (lang)
    "Lazy load a babel package to ensure syntax highlighting."
    :before #'org-src--get-lang-mode
    (unless (cdr (assoc lang org-src-lang-modes))
      (or (run-hook-with-args-until-success '+org-babel-load-functions lang)
          (require (intern-soft (format "ob-%s" lang)) nil t)
          (require lang nil t)))))

рдареАрдХред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рд░рдЦрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреА рдкрд╣рд▓реА рдпрд╛рддреНрд░рд╛ рдкрд░ рдХреИрд╕реЗ рд╣реИ
image

рд╕реЗрд▓ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдлрд┐рд░ рд╕реЗ рднреЗрдЬреЗрдВ:
image

рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рд╕реНрдирд┐рдкреЗрдЯ рдХреЛ рдЖрдЬрд╝рдорд╛рдпрд╛ рд╣реИ? рдореИрдВрдиреЗ рдЗрд╕реЗ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рд╣реА рд╕рдордп рдмрд╛рдж рдЗрд╕реЗ рд╕реБрдзрд╛рд░ рд▓рд┐рдпрд╛ред

рд╣рд╛рдБ, рдЕрджреНрдпрддрди рд╕реНрдирд┐рдкреЗрдЯ рдХреЗ рд╕рд╛рдеред рдпрд╣рд╛рдБ рдореЗрд░рд╛ config.el рд╣реИ:

;;; .doom.d/config.el -*- lexical-binding: t; -*-

;; Place your private configuration here
;;

(setq python-shell-interpreter "ipython"
      python-shell-interpreter-args "--simple-prompt -i")

(after! org
  (defadvice! +org--src-lazy-load-library-a (lang)
    "Lazy load a babel package to ensure syntax highlighting."
    :before #'org-src--get-lang-mode
    (unless (cdr (assoc lang org-src-lang-modes))
      (or (run-hook-with-args-until-success '+org-babel-load-functions lang)
          (require (intern-soft (format "ob-%s" lang)) nil t)
          (require lang nil t)))))

(add-hook! '+org-babel-load-functions
  (defun +org-babel-load-jupyter-h (lang)
    (and (string-prefix-p "jupyter-" (symbol-name lang))
         (require 'ob-jupyter)
         (require lang nil t))))

;; Select window between frames
(after! ace-window
  (setq aw-scope 'global))

;;;
;;; Keybinds

(setq doom-localleader-key ",")

(use-package! jupyter
  :defer t
  :init
  (map! :after python
        :map python-mode-map
        :localleader
        (:prefix ("j" . "jupyter")
          :desc "Run REPL"      "o" #'jupyter-run-repl
          :desc "Eval funciton"      "f" #'jupyter-eval-defun
          :desc "Eval buffer"      "b" #'jupyter-eval-buffer
          :desc "Eval region"      "r" #'jupyter-eval-region
          :desc "Restart REPL"      "R" #'jupyter-repl-restart-kernel
          :desc "Interrupt REPL"      "i" #'jupyter-repl-interrupt-kernel
          :desc "Scratch buffer"      "s" #'jupyter-repl-scratch-buffer
          :desc "Remove overlays"      "O" #'jupyter-eval-remove-overlays
          :desc "Eval string"      "w" #'jupyter-eval-string-command
          :desc "Inspect at point"      "d" #'jupyter-inspect-at-point
          :desc "Associate buffer REPL"      "B" #'jupyter-repl-associate-buffer
          )))

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЗ рд╕рд╛рде, +org-babel-load-jupyter-h рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

(defun +org-babel-load-jupyter-h (lang)
  (and (string-prefix-p "jupyter-" (symbol-name lang))
       (require (intern
                 (format "ob-%s"
                         (string-remove-prefix "jupyter-" (symbol-name lang))))
                nil t)
       (require 'ob-jupyter nil t)
       (require lang nil t)))

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдЬреБрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕реНрд░реЛрдд рдмреНрд▓реЙрдХ рдХреЗрд╡рд▓ 2 x Cc, Cc рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ
рдкрд╣рд▓реА рдмрд╛рд░ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддрд╛ рд╣реИ:

executing Jupyter-Python code block...
org-babel-jupyter-session-key: Need a valid session and a kernel to form a key

рдФрд░ рджреВрд╕рд░реА рдмрд╛рд░ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

executing Jupyter-Python code block...
Starting python3 kernel process...done
Requesting kernel info...done
Code block evaluation complete. [2 times]

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реВрдВрдЧрд╛ред

рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл a948ca рдореЗрдВ рдЬреНрдпреВрдкрд┐рдЯрд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрдзрд╛рд░ рд▓рд┐рдЦреЗ рд╣реИрдВред рдХреГрдкрдпрд╛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдФрд░ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдореИрдВрдиреЗ рдЕрдм рддрдХ +org-babel-load-functions рдФрд░ +org--src-lazy-load-library-a рд╕реБрдЭрд╛рд╡ рджрд┐рдП рд╣реИрдВ)ред

рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА, рдЗрд╕рд▓рд┐рдП рд╕реНрд░реЛрдд рдмреНрд▓реЙрдХ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЕрдм config.el рдкрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдВрд╢реЛрдзрди рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдмрдиреА рд░рд╣рддреА рд╣реИред

рдЖрдкрдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЬреНрдпреВрдкрд┐рдЯрд░ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ _one_ рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреМрди рд╕рд╛ рдФрд░ рдХрдмред рдпрджрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдЬреБрдкрд┐рдЯрд░ рдХрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рд╣реЛрддрд╛ рддреЛ рдпрд╣ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реЛрддрд╛ред рд╢рд╛рдпрдж рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╡рд╛рддрд╛рд╡рд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдХреНрд╕ рдлрд╝рд╛рдЗрд▓ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдХрд┐рд╕реА рднреА рддрд░рд╣, рдЖрдк рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

(defadvice! oh-god-please-fix-jupyter-please-oh-please (lang)
  :override #'+org-babel-load-jupyter-h
  (when (string-prefix-p "jupyter-" (symbol-name lang))
    (let ((lang (string-remove-prefix "jupyter-" (symbol-name lang))))
      (unless (assoc lang org-src-lang-modes)
        (require (intern (format "ob-%s" lang))
                 nil t)))
    (with-demoted-errors "Jupyter: %s"
      (require 'jupyter nil t)
      (require lang nil t)
      (require 'ob-jupyter nil t))))

oh-god-please-fix-jupyter-please-oh-please haha doesn't рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдВрдЧрддрд┐ рд▓рдЧрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЕрднреА рднреА рд╡рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдорд┐рд▓рддрд╛ рд╣реИ :-(

рдирд┐рдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдкрддрд╛, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕реЗ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдзреНрдпрд╛рди рджреЗрдВ, рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдЬреБрдкрд┐рдЯрд░ рдХреЛ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЪрд░ рдЬреИрд╕реЗ рдХрд┐ org-src-lang-mode рдФрд░ org-babel-tangle-lang-exts рдЬреИрд╕реЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред Ob-jupyter рд▓реЛрдб рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, jupyter-LANG рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдирдП рд╕реНрд░реЛрдд рдХреЛрдб рдмреНрд▓реЙрдХ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗред LANG рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдкрд╛рдИ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрд░реНрдиреЗрд▓ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИред рджреЗрдЦреЗрдВ

рдХреНрдпрд╛ рдЗрд╕реЗ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдпрд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЙрд╕ рдкрд░ +org-babel-load-jupyter-h рд╕рд╛рде рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рддреЛ рдЪрд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рдФрд░ рдХреЛрд╢рд┐рд╢ рджреЗрддреЗ рд╣реИрдВ:

(defadvice! oh-god-please-fix-jupyter-please-oh-please (lang)
  :override #'+org-babel-load-jupyter-h
  (when (string-prefix-p "jupyter-" (symbol-name lang))
    (let* ((lang-name (symbol-name lang))
           (lang-tail (string-remove-prefix "jupyter-" lang-name)))
      (and (not (assoc lang-tail org-src-lang-modes))
           (require (intern (format "ob-%s" lang-tail))
                    nil t)
           (add-to-list 'org-src-lang-modes (cons lang-name (intern lang-tail)))))
    (with-demoted-errors "Jupyter: %s"
      (require lang nil t)
      (require 'ob-jupyter nil t))))

рдпрджрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдХреЗрд╡рд▓ рдЧреВрдВрдЧрд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдВрдЧреЗ:

(after! ob-jupyter
  (dolist (lang '(python julia R))
    (cl-pushnew (cons (format "jupyter-%s" lang) lang)
                org-src-lang-modes :key #'car)))

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕ рд╕реВрдЪреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЛрдЧреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдирд╛ рдкрдбрд╝реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЬреНрдпреВрдкрд┐рдЯрд░ рдЕрдзрд┐рдХ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЧреВрдВрдЧрд╛ рд╕рдорд╛рдзрд╛рди рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ org-edit-special рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИ:
org-edit-src-code: No such language mode: jupyter-python-mode

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдореИрдВ рдХрдпрд╛рдордд рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдирдпрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рдж doom refresh рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред

рдУрд╣, рдЙрдлрд╝ред рддреБрдо рдореЗрд░реЗ рдЧреВрдВрдЧрд╛ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдкреБрди: рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрд╛ (after! org-src ...) рдХреЗ рдмрдЬрд╛рдп (after! ob-jupyter ...) ?

рдореИрдВ рдХреНрдпрд╛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдБ рд╕реЗ рд╕рднреА рдХрд╛рдо !! : рдбреА

рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ, рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрди рдФрд░ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдкрд╛рджрдиред рддреЛ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЦреБрд╢реА рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ :)

рдзрдиреНрдпрд╡рд╛рдж!!

рдирдорд╕реНрддреЗ! рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ рдХреБрдЫ рдиреЗ Jupyter рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд░-рдСрд░реНрдЧрди рдореЛрдб рдореЗрдВ R рд╕рдкреЛрд░реНрдЯ рдХреЛ рддреЛрдбрд╝рд╛ рд╣реЛрдЧрд╛ред рдЬреНрдпреВрдкрд┐рдЯрд░-рдкрд╛рдЗрдерди рдмреНрд▓реЙрдХ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
Screen Shot 2020-02-13 at 2 01 09 PM
рд▓реЗрдХрд┐рди рдЬреБрдкрд┐рдЯрд░-рдЖрд░ рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ:
Screen Shot 2020-02-13 at 2 02 10 PM
рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд▓рд╛рд╣?

@mbosley https://github.com/hlissner/doom-emacs/pull/2477 рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЗ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдХрд░ рджреЗрдЧрд╛ред

рдЗрд╕ рдмреАрдЪ, рдореИрдВ рдУрдкреА рдХреЗ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдмрдВрдж рдХрд░ рджреВрдВрдЧрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

gilbertw1 picture gilbertw1  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Vvkmnn picture Vvkmnn  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rassie picture rassie  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

benjaminbauer picture benjaminbauer  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nasoundead picture nasoundead  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ