按下 C-c ’ 后进入 Org-src block 下写代码时,可以自动补全代码,只是当调用 Python 库的函数时,会无法补全关于这个库的代码,必须要加载所需要的库,但是之前已经加载过了,难道为了能愉快地补全代码,每次开头都要写上需要加载的Python库吗
我之前问过类似的问题,貌似是无解
什么叫做“已经加载过了”?两个代码块之间默认不是相互独立的吗?
我用的是 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:
给块命名,可以解决上诉问题。
我的配置里自带补全好像不好使
这个问题应该可以 hack 一下 elpy 或 org,等我有时间了研究一下
edit:elpy 和 anaconda 都是一样的问题,只对当前 buffer 导入的 module 有反应。
我想到了一个好方法,等明天实现看看。
应该是今天 ,等白天了吧
这条是不成立的,因为 :session 也可以命名
失察了,的确可以:
#+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 中
- 不用再命名 Name ,和不用再次
import **
了,都可以在 Edit buffer 中自动补全了。 - 后面的 org-src-block 都能补全之前的写的函数和参数了。
但是不知道为什么一下子可以实现了,是 Python-mode 还是 Lsp-mode。
肯定不是 python mode,那只是负责语法高亮与缩进
你这也太邪乎了,lsp 有 company 后端吗?我试的时候没有见到啊
你补全的时候需要按 tab 吗?
那个后端名字叫什么?
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。