系统mac os 10.12+ ,emacs 25.2 ,大家有什么好的资料或本身就是大神,烦请不吝赐教,补充一下 主要面向data science
响应号召,来献丑回答一下。
emacs 上有很多选择,关键看你要做什么
- ein 只简单试用了一下,不太对我的口味,不多评价。
- ob-ipython(以及基于它的 scimax ),主要优势在于 org markup,适合于不太长的代码块。写写文档,博客什么的。不然会很乱。
- lpy 可以看作是 python-mode 下的 org-mode + ipython notebook。相比 ein 和 ob-ipython,主要优势是简单,随意切换进程。另外一个优势是开发者是个大神,响应很及时。缺点是暂时还不支持 async eval。
这三个我都用过,目前倾向于 lpy。因为不知道你的主要用途,不好瞎推荐。你可以都试试,应该很容易决定。这个帖子应该也可以给你提供一些思路:
另外,如果不考虑 emacs,可以在 jupyter notebook 上安装插件,实现 vim keybinding。
如果不是data science那种交互 其实python-mode自带的inferior-python-mode
和lpy
可以解决大多数需求了 可以顺便装上anaconda mode (spacemacs里好像自带了)
如果是data science的用法:
- 推荐安装 conda.el 一键切换conda environment
-
ein
是emacs里和jupyter notebook交互的唯一选择 建议如果用jupyter notebook就别和org一块用了 感觉这俩的integration有点buggy -
ob-ipython
好处是轻便, 可以和org mode无缝衔接, 支持async eval, 代码不多 有啥功能没有可以自己hack (ein就别想了。。) 比如我就hack了一套自动使用指定remote server kernel 运行 code的workflow,另外还有一些整合ob-ipython 和 inferior-python-mode以及lpy的code 坏处是async机制不够robust - lpy好处是abo-abo对代码编辑时候的需求很懂 各种功能都可以一键触发 非常带感 其实可以折腾一下作为python code编辑的主要工具
data science 的交互有什么特殊要求? async?还是远程?
这个赞同,只是我现在基本上用的原生的 lpy (spacemacs 下)。作为交互式 IDE 的话,不知道还可以往哪个方向折腾/优化?
async 远程 画图 文档吧
如果主要用lpy的话我觉得可以进一步优化的地方不太多了 可能就是和其他一些mode的整合吧 比如outshine 和inferior-Python-mode?
对我来说主要希望把lpy和org-edit-src-block结合的更好 比如用org mode specify的ipython kernel来负责lpy的eval
ob-ipython的async执行太buggy了,差不多是基本不可用的状态
确实很buggy。。不过我还是一直忍气吞声的用得很high😂
我都自己动手修了好几个bug了。但是输出一大速度巨慢这条还暂时无解。ob-ipython异步执行时每隔一定区间例如1K读取一次输入,然后尝试解析JSON看能不能输出一个答案。如果输出都是些文字那没问题,如果我输出一个800K的图片,那它就开始解析1K的JSON,失败,2K的JSON失败,3K的JSON,失败。。。。709K的JSON,失败,800K的JSON,OK输出,整个是O(N^2)复杂度 >_<
卧槽这样。。。不知道jupyter notebook是怎么处理的。。
你的图片是在json里用base64 string传回来的吗? 之前有遇到过这种情况 然后那个string还很长且不分行 导致emacs直接crash
但有时候好像没这个问题 我不确定是不是什么argument设置的区别 还是纯粹是图片大小的问题。。
图片都是json里的base64串。分不分行倒不是关键,这个process buffer是个binary的,也不在屏幕上显示。
你能不能感觉到这个慢,主要是和大小有关,因为这是个O(N^2)复杂度,所以随着图片大小增加,所需时间呈平方增长。
时间主要都是耗在ob-ipython–run-async里那个process filter里。其实这个filter可以整个注释掉,最后结果也会显示出来,因为ob-ipython在把这个json反复解析了几百遍以后最后在process sentinel里还要再解析一遍 (没错,这效率无敌了)。区别是没有process filter,如果你一把计算10个代码框,结果不会一个一个显示出来,而是最后一起出来。
交互的话,今天才发现了这个:
可以<C-return>
发送当前行或函数。