关于Org-mode文学编程时自动补全代码的问题

按下 C-c ’ 后进入 Org-src block 下写代码时,可以自动补全代码,只是当调用 Python 库的函数时,会无法补全关于这个库的代码,必须要加载所需要的库,但是之前已经加载过了,难道为了能愉快地补全代码,每次开头都要写上需要加载的Python库吗

我之前问过类似的问题,貌似是无解

1 个赞

什么叫做“已经加载过了”?两个代码块之间默认不是相互独立的吗?

我用的是 ob-ipython 来文学编程的,它借由 jupyter 的功能整合到 Emacs 上,在 org-mode 的文学编程就像在 jupyter-notebook 一样。

上面的代码块已经加载了 numpy 等这些库了,不然下面的代码块没法运行吧。 只是下面那段代码在调用 np.arange 这个函数时没法补全,需要加上 import numpy as np 才行。

代码块加 :sesion 就可以在 C-c C-c 之后保持住了。先执行 block1 ,然后执行 block2 ,此时 block1 的作用仍然存在。

:session 的缺点是:

  • 如果 block1 做了修改,需要重新 C-c C-c,其变更才能在 block2 上体现。
  • 如果新增了 block3 ,但是不希望受到 block2 的影响,这是不可能的,因为所有的块都处于一个"全局"的 session 里。

通过 +Name: 给块命名,可以解决上诉问题。

有个解决方法,我没开 company-anaconda 补全代码,用jupyter里面自带的补全方式。

缺点是补全代码时和jupyter-notebook一样,需要按 tab 建显示补全的代码。

我的配置里自带补全好像不好使

这个问题应该可以 hack 一下 elpy 或 org,等我有时间了研究一下

edit:elpy 和 anaconda 都是一样的问题,只对当前 buffer 导入的 module 有反应。

我想到了一个好方法,等明天实现看看。

应该是今天 :joy:,等白天了吧

这条是不成立的,因为 :session 也可以命名

1 个赞

失察了,的确可以:

#+BEGIN_SRC python :results silent :session session1
  foo = 'block1'
#+END_SRC

#+BEGIN_SRC python :results silent :session session2
  foo = 'block2'
#+END_SRC

#+BEGIN_SRC python :results output :session session1
  print(foo)
#+END_SRC

#+RESULTS:
: block1

不过还是不够灵活。需要把当前块,跟被引用的块放到同一个 session,你仍然不能排除掉 session 中的某些 block,也不能引入其他 session 的 block。

最近装了 Lsp-mode,取消了 Anaconda-mode。发现效果出奇的好,比如在 Org-mode 中

  1. 不用再命名 Name ,和不用再次 import ** 了,都可以在 Edit buffer 中自动补全了。
  2. 后面的 org-src-block 都能补全之前的写的函数和参数了。

但是不知道为什么一下子可以实现了,是 Python-mode 还是 Lsp-mode。

肯定不是 python mode,那只是负责语法高亮与缩进

你这也太邪乎了,lsp 有 company 后端吗?我试的时候没有见到啊

你补全的时候需要按 tab 吗?

company 会使用 emacs 内置的补全方式作为后端, 只要lsp-mode 支持, comany就可以识别。

那个后端名字叫什么?

company-capf 估计是这个后端

嗯嗯,好像是这个

没按 Tab 键啊,我也觉得太邪乎了。

你是在 virtualenv 下面安装 python language server 的吗?

啊啊啊! 我忘了一件事啊!

我用 pyenv 来切换 python2 和 python3 的。而 python language server 我只装在 python3 下。 今天要用到 python2 ,于是我切换到 python2,重点是我忘了在 Python2 下安装 python language server

于是像往常一样打开 Org-mode,发现了上述那些事情。虽然 Python2 没装 python language server 但是 Buffer 里有显示 Python Language Server stderr。

总之代码补全只能在 ob-ipython 下成功,单单的 Python session 下没法补全(还是需要定义 Name)。

所以是 ob-ipython 的功劳了?ob-ipython 最近刚刚更新过

但是,因为我也是 scimax 用户,所以没法跟上更新。只能希望 John 能抽空把这个问题解决了:

ob-ipython 的作者已经主动过来联系了,不过可能是 Kitchin 老师最近比较忙,一直都没有更新 scimax。