Doom-emacs: [버그] emacs-jupyter와 ob-async

에 λ§Œλ“  2019λ…„ 12μ›” 16일  Β·  30μ½”λ©˜νŠΈ  Β·  좜처: hlissner/doom-emacs

무슨 일이 μΌμ–΄λ‚˜κΈ°λ₯Ό κΈ°λŒ€ ν–ˆμŠ΅λ‹ˆκΉŒ?
κ²°κ³Ό μ„Ήμ…˜μ—μ„œ μ†ŒμŠ€ λΈ”λ‘μ˜ 좜λ ₯을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

μ‹€μ œλ‘œ 무슨 일이 일어 λ‚¬μŠ΅λ‹ˆκΉŒ?
μ²˜μŒμ—λŠ” μ˜¬λ°”λ₯΄κ²Œ 좜λ ₯ν•˜μ§€λ§Œ ob-async μ½”λ“œλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

μΆ”κ°€ μ„ΈλΆ€ 사항:
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. packages.el (package! jupyter) jupyter μΆ”κ°€
  2. μž‘λ™ν•˜λŠ” jupyter ν™˜κ²½μ΄ μžˆμ–΄μ•Όν•©λ‹ˆλ‹€.
  3. 쑰직 파일의 슀크린 μƒ·μ—μ„œμ™€ 같이 μ½”λ“œ μ‹€ν–‰
#+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의 자체 지연 λ‘œλ”© λ©”μ»€λ‹ˆμ¦˜κ³Ό μ€‘λ³΅λ©λ‹ˆλ‹€. 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ 그럴 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

그렇지 μ•ŠμœΌλ©΄ jupyter νŒ¨ν‚€μ§€μ—μ„œ :lang (org +ipython) λŒ€μ‹  μ „ν™˜ ν•΄λ³΄μ‹­μ‹œμ˜€. jupyter emacs νŒ¨ν‚€μ§€κ°€ λΉ„ν‘œμ€€μ μΈ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³ μžˆμ„ κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ :async yes λ˜λŠ” :async no λ₯Ό src 블둝에 μΆ”κ°€ν•˜κ³  차이가 μžˆλŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€.

ob-ipython의 λ¬Έμ œλŠ” + conda둜 ν™œμ„±ν™” 된 ν™˜κ²½μ„ μ‚¬μš©ν•  수 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λ˜ν•œ ob-ipython은 지원을 μžƒμ–΄λ²„λ¦° 것 κ°™μŠ΅λ‹ˆλ‹€.

기본적으둜 conda ν™˜κ²½μ„ 선택할 수 있고 R 및 원격 컀널을 μ‚¬μš©ν•  κ°€λŠ₯성도 μžˆμœΌλ―€λ‘œ emacs-jupyterλ₯Ό μ‚¬μš©ν•΄λ³΄κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€.

org-babel-do-load-languages κ°€ μ•„λ‹Œ 경우 jupyterλ₯Ό org babel에 μΆ”κ°€ν•˜λ €λ©΄ μ–΄λ–»κ²Œν•΄μ•Όν•©λ‹ˆκΉŒ?

emacs-jupyter λŠ” ob-async μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. jupyterκ°€ μ œλŒ€λ‘œ μž‘λ™ν•˜λ €λ©΄ λ‹€μŒ 섀정이 ν•„μš”ν•©λ‹ˆλ‹€.

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

ob-async-no-async-languages-alist 및 +org-babel-load-functions λ₯Ό) μ„€μ •ν•˜λŠ” :lang org +jupyter κΈ°λŠ₯을 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. λ¬Έμ œκ°€ ν•΄κ²°λ˜λŠ”μ§€ μ•Œλ €μ£Όμ„Έμš”.

도움을 μ£Όμ‹  @randomizedthinking κ³Ό @hlissner μ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

.doom.d/init.el, it seems babel does not pick up that language: org-babel-execute-src-block의 쑰직 ꡬ성에 +jupyter 을 μΆ”κ°€ ν•œ ν›„ : jupyter-python에 λŒ€ν•œ org-babel-execute ν•¨μˆ˜κ°€ μ—†μŠ΅λ‹ˆλ‹€!`

λ˜ν•œ emacs-jupyterλŠ” 파이썬 파일의 직접 볡제둜 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ob-ipythonκ³Ό 같은 쑰직 λͺ¨λ“œμ™€μ˜ 톡합이 μ•„λ‹™λ‹ˆλ‹€. 사싀을 말씀 λ“œλ¦¬λ©΄ μ €λŠ” doom / emacsλ₯Ό 처음 μ ‘ν–ˆκ³  emacs-jupyterλ₯Ό 거의 μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ emacs-jupyterκ°€ μ œκ³΅ν•˜λŠ” repl이 맀우 μš°μˆ˜ν•˜μ—¬ κ°•λ ₯ν•œ μžλ™ μ™„μ„±, 버퍼 λ‚΄ 이미지 지원 등을 μ œκ³΅ν•œλ‹€λŠ” 것을 μ•Œ μˆ˜μžˆμ—ˆμŠ΅λ‹ˆλ‹€. .

이 λͺ¨λ“  μ§ˆλ¬Έμ— λŒ€ν•΄ 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
          )))

ν˜„μž¬λ‘œμ„œλŠ” 잘 μž‘λ™ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

orgmodeμ™€μ˜ 톡합 만 μ†μƒλœ 것 κ°™μŠ΅λ‹ˆλ‹€.

@pmercatoris jupyterκ°€ org-babelμ—μ„œ μž‘λ™ν•˜λ„λ‘ν•˜λ €λ©΄ ν˜„μž¬ 섀정은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. 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 ν”„λ ˆμž„ μ›Œν¬μ— ν†΅ν•©λ˜λ©΄ 쒋을 κ²ƒμž…λ‹ˆλ‹€.

λ˜ν•œ ν‚€ 바인딩을 κ³΅μœ ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. λͺ¨λ“  평가 κΈ°λŠ₯에 λŒ€ν•΄ ν˜„μž¬ doom gr μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μΌκ΄€λœ cross doom replμž…λ‹ˆλ‹€.

@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μ—μ„œλŠ” μ–΄λ–€ κ²½μš°μ—λ„ Doom의 지연 λ‘œλ”λ₯Ό λ°©ν•΄ν•˜κΈ° λ•Œλ¬Έμ— λΉ„ν™œμ„±ν™”λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

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

μœ μΌν•œ 것은 νŒŒμΌμ„ 처음 λ°©λ¬Έ ν•  λ•Œ μ†ŒμŠ€ 블둝 κ°•μ‘° ν‘œμ‹œκ°€λ‘œλ“œλ˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ†ŒμŠ€ 블둝을 μ‹€ν–‰ ν•œ ν›„ λ‹€μ‹œ λ°©λ¬Έν•΄μ•Όν•©λ‹ˆλ‹€. μ˜λ„ 된 κ±΄κ°€μš”?

μ’‹μŠ΅λ‹ˆλ‹€. 블둝 κ°•μ‘° ν‘œμ‹œ 문제λ₯Ό νŒŒμ•…ν•œ ν›„ + jupyter ν•˜μœ„ λͺ¨λ“ˆμ„ μΆ”κ°€ν•˜κ² μŠ΅λ‹ˆλ‹€ (μ˜λ„λ˜μ§€ μ•Šμ€ 블둝 κ°•μ‘° ν‘œμ‹œλ₯Όμœ„ν•œ 지연 λ‘œλ”κ°€ μžˆμ§€λ§Œ jupyterλŠ” 맀우 λΉ„μ •μƒμ μœΌλ‘œ ꡬ쑰화 된 babel ν”ŒλŸ¬κ·ΈμΈμž…λ‹ˆλ‹€).

이것을 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]

비둝 그것이 μ˜¬λ°”λ₯Έ 행동일지도 λͺ¨λ₯΄μ§€λ§Œ, λ‚˜λŠ” 그것을 μ–ΈκΈ‰ ν•  것이라고 μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

방금 af948caμ—μ„œ jupyter에 λŒ€ν•œ κ°œμ„  사항을 μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€. μ—…λ°μ΄νŠΈν•˜μ—¬ λ¬Έμ œκ°€ ν•΄κ²°λ˜λŠ”μ§€ μ•Œλ €μ£Όμ„Έμš” (그리고 μ§€κΈˆκΉŒμ§€ 제곡 ν•œ +org-babel-load-functions 및 +org--src-lazy-load-library-a μ œμ•ˆ 사항 μ‚­μ œ).

μ™„λ²½ν•˜λ―€λ‘œ μ†ŒμŠ€ λΈ”λ‘μ˜ 싀행은 이제 config.el을 μˆ˜μ •ν•˜μ§€ μ•Šκ³  μž‘λ™ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ κ°•μ‘° ν‘œμ‹œ λ¬Έμ œλŠ” κ³„μ†λ©λ‹ˆλ‹€.

μž‘μ—… ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

λ‚˜λŠ” μš°λ¦¬κ°€ jupyter의 라이브러리 쀑 _one_μ„λ‘œλ“œν•΄μ•Όν•œλ‹€λŠ” 것을 μ•Œκ³  μžˆμ§€λ§Œ, μ–΄λŠ 것이 μ–Έμ œμΈμ§€ λͺ¨λ₯΄κ² λ‹€. ν…ŒμŠ€νŠΈ ν•  jupyter ν™˜κ²½μ΄ μžˆλ‹€λ©΄ 훨씬 더 λΉ λ₯Ό κ²ƒμž…λ‹ˆλ‹€. μ•„λ§ˆλ„ 각 λͺ¨λ“ˆμ€ ν…ŒμŠ€νŠΈλ₯Όμœ„ν•œ μ΅œμ†Œ μ‹€ν–‰ κ°€λŠ₯ν•œ ν™˜κ²½μ„ μ„€μ •ν•˜κΈ° μœ„ν•΄ nix νŒŒμΌμ„ ν¬ν•¨ν•΄μ•Όν•©λ‹ˆλ‹€.

μ–΄μ¨Œλ“ , 이것을 μ‹œλ„ν•΄ λ³Ό 수 μžˆμŠ΅λ‹ˆκΉŒ?

(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λŠ” μ—¬μ „νžˆ λ˜‘κ°™μ€ 행동을 μ·¨ν•˜κΈ° λ•Œλ¬Έμ— λ§Žμ€ compationμ΄μ—†λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€ :-(

Nix에 λŒ€ν•΄ 아무것도 λͺ¨λ₯΄μ§€λ§Œ ν™•μ‹€νžˆ 쒋은 κΈ°λŠ₯처럼 λ“€λ¦½λ‹ˆλ‹€.

이 λŒ“κΈ€μ— 연결될 수 μžˆμŠ΅λ‹ˆκΉŒ?

jupyterλŠ” org-src-lang-modes 및 org-babel-tangle-lang-exts와 같은 λ³€μˆ˜μ˜ 값에 따라 달라 μ§€λ―€λ‘œ μ–Έμ–΄λ₯Όλ‘œλ“œ ν•  λ•Œ λ§ˆμ§€λ§‰ μš”μ†Œλ‘œ μΆ”κ°€ν•΄μ•Όν•©λ‹ˆλ‹€. ob-jupyterκ°€λ‘œλ“œλ˜λ©΄ 이름이 jupyter-LANG ν˜•μ‹ 인 μƒˆ μ†ŒμŠ€ μ½”λ“œ 블둝을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. LANG은 μ‹œμŠ€ν…œμ—μžˆλŠ” 컀널 μ–Έμ–΄ 쀑 ν•˜λ‚˜ 일 수 μžˆμŠ΅λ‹ˆλ‹€. jupyter-available-kernelspecsλ₯Ό μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€. (https://github.com/dzop/emacs-jupyter#org-mode-source-blocks)

이 λŒ“κΈ€μ— 연결될 수 μžˆμŠ΅λ‹ˆκΉŒ?

ν•˜μ§€λ§Œ +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)))

λ‚˜λŠ” 이것이 νš¨κ³Όκ°€ μžˆλ‹€λŠ” 것을 μ•Œκ³  μžˆμ§€λ§Œ jupyterκ°€ 더 λ§Žμ€ μ–Έμ–΄λ₯Ό λ„μž…ν•¨μ— 따라이 λͺ©λ‘μ„ ν™•μž₯ν•˜λ €λ©΄ μ‚¬λžŒλ“€μ—κ²Œ μ˜μ‘΄ν•΄μ•Ό ν•  κ²ƒμž…λ‹ˆλ‹€.

λ”°λΌμ„œ λ©μ²­ν•œ μ†”λ£¨μ…˜μ‘°μ°¨λ„ κ°•μ‘° ν‘œμ‹œμ— νš¨κ³Όκ°€ μ—†μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 더 μ€‘μš”ν•œ 것은 org-edit-special κ°€ λ‹€μŒμ„ λ°˜ν™˜ν•˜λ―€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.
org-edit-src-code: No such language mode: jupyter-python-mode

λ‚˜λŠ” λ‚΄κ°€ νŒŒλ©Έμ— 맀우 μ΅μˆ™ν•˜λ‹€κ³  λ§ν–ˆλ“―μ΄ λͺ¨λ“  것을 μ˜¬λ°”λ₯΄κ²Œ μ‹œλ„ν–ˆμ§€λ§Œ λ³€κ²½ ν›„ doom refresh λ₯Ό μˆ˜ν–‰ν•˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

였, 이런. λ‹€μ‹œ λ‚΄ 바보 같은 μ†”λ£¨μ…˜μ„ μ‹œλ„ ν•  수 (after! org-src ...) λŒ€μ‹  (after! ob-jupyter ...) ?

λ‚΄κ°€ λ³Ό μˆ˜μžˆλŠ” κ²ƒμ—μ„œ λͺ¨λ‘ μΌν•˜λŠ” 것 !! :λ””

ν•˜μ΄λΌμ΄νŠΈ, 블둝 μ‹€ν–‰ 및 특수 νŽΈμ§‘. κ·Έλž˜μ„œ λ‚˜λŠ” 당신이 해결책에 λŒ€ν•΄ μ–΄λ–»κ²Œ μƒκ°ν•˜λŠ”μ§€ 잘 λͺ¨λ₯΄κ² μ§€λ§Œ 그것이 νš¨κ³Όκ°€ μžˆλ‹€λŠ” 것은 맀우 κΈ°μ©λ‹ˆλ‹€. :)

κ°μ‚¬ν•©λ‹ˆλ‹€!!

μ•ˆλ…•ν•˜μ„Έμš”! 여기에 Jupyter ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•˜λŠ” 쑰직 λͺ¨λ“œμ—μ„œ R 지원이 μ€‘λ‹¨λ˜μ—ˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. jupyter-python 블둝 싀행이 잘 μž‘λ™ν•©λ‹ˆλ‹€.
Screen Shot 2020-02-13 at 2 01 09 PM
κ·ΈλŸ¬λ‚˜ jupyter-R λΈ”λ‘μ˜ 싀행은 λ‹€μŒμ„ μˆ˜ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
Screen Shot 2020-02-13 at 2 02 10 PM
진행 방법에 λŒ€ν•œ 쑰언이 μžˆμŠ΅λ‹ˆκΉŒ?

@mbosley https://github.com/hlissner/doom-emacs/pull/2477둜 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ·Έλ™μ•ˆ OP λ¬Έμ œκ°€ ν•΄κ²°λ˜μ—ˆμœΌλ―€λ‘œμ΄ μŠ€λ ˆλ“œλ₯Ό λ‹«κ² μŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰