Doom-emacs: [BUG]与emacs-jupyter同步

创建于 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. 将jupyter添加到packages.el (package! 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自己针对babel插件的延迟加载机制是多余的。 不知道它是否可以解决您的问题,但可以。

否则,请尝试从jupyter软件包切换到:lang (org +ipython) 。 jupyter emacs软件包可能正在执行某些非标准的操作。

另外,尝试将:async yes:async no到您的src块中,看看是否有区别。

ob-ipython的问题在于,我似乎无法使用通过+ conda激活的环境。 ob-ipython似乎也失去了支持。

我想尝试emacs-jupyter,因为它默认情况下可以拾取conda环境,并且还具有使用R和远程内核的潜力。

如果不使用org-babel-do-load-languages如何将jupyter添加到org babel?

emacs-jupyter不使用ob-async 。 您需要具有以下设置,jupyter才能正常工作。

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

我在:lang org中添加了+jupyter功能,该功能设置了ob-async-no-async-languages-alist+org-babel-load-functions 。 让我知道是否可以解决您的问题。

谢谢@randomizedthinking@hlissner的帮助。

.doom.d/init.el, it seems babel does not pick up that language: 的org配置中添加+jupyter ,org-babel-execute-src-block:jupyter-python没有org-babel-execute功能!

另外,emacs-jupyter可以用作python文件的直接复制。 它不仅像ob-ipython这样与org-mode集成。 实话实说,我是doom / emacs的新手,几乎没有使用过emacs-jupyter,但是我可以看到emacs-jupyter提供的repl非常优越,它提供了强大的自动完成功能,对缓冲内图像的支持等。 。

所有这些要问,emacs-jupyter是否应将其设置作为python模块的一部分?

尽管我的知识非常有限,但我愿意尽一切可能为您提供帮助。

同时,我将此添加到我的配置文件中:

(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文档,需要在jupyter之前包括语言python (或我们计划与jupyter一起使用的任何其他语言)。

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

我第二个观点是,如果将emacs-jupyter集成到厄运的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情况下尝试。 在任何情况下,由于它会干扰Doom的惰性加载程序,因此已在3b2a37d9a中将其禁用。

@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哈哈似乎没有很多补偿,因为我仍然得到相同的行为:-(

对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 ...)再次尝试我的哑巴解决方案?

从我所看到的所有工作! :D

突出显示,块执行和特殊编辑。 所以我不确定您对解决方案的感觉如何,但是很高兴它能起作用:)

谢谢!!

嗨! 我认为这里有些东西使用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 等级