Emacs Python 环境配置
Table of Contents
对于 Lisper 来说,交互式占据了重要的地位,很多 Lisp 黑客甚至常年开着一个 REPL,对 Lisp 镜像不断地增量开发。
下图是 Common Lisp 常见的开发环境——Emacs+Slime。左边是代码编辑区,右边运行着一个 REPL,左边写好代码后,可以马上在右边 REPL 中测试,也可以在右边先写一些测试代码,保证正确性后再到左边去编写正式的代码。
Python 脱胎于 Lisp,所以理当有这么完美的开发环境,不过大多数人把 Python 的交互式当作了做书后练习题的环境。多数人开发 Python 是这样的:
如果是写库,就在 Python 底部加一句if name == 'main':,然后把测试代码写在逻辑块中,保存并执行它;或者写单元测试脚本,运行测试用例;或者用 IPython 的 %edit 命令,编辑完后,让 IPython 自动加载脚本,然后在 IPython 的交互式环境里测试函数;或者用 IDE,多数 IDE 也有 Python 的交互式,但始终用着很不爽。
这是我追求的开发环境:
左边仍然是代码编辑区,编辑好之后,可以让某个函数马上可以在右边的 IPython 中生效。当然,有时还需要一个 shell 终端,像这样:
1. Emacs+Python 环境配置
在 Emacs 下配置这样的环境很简单,用包管理器安装以下:
Python mode
M-x package-install python-mode
IPython(如果你的 Emacs 版本是 24.2 以上,此步骤省略):
M-x package-install ipython
Jedi(Python 自动补全插件):
M-x package-install jedi
- elpy: 见:https://elpy.readthedocs.io/en/latest/introduction.html
接着配置,把以下内容写到 ~/.emacs 或 ~/.emacs/init.el 中:
(setq python-shell-interpreter "ipython" python-shell-interpreter-args "" python-shell-prompt-regexp "In \\[[0-9]+\\]: " python-shell-prompt-output-regexp "Out\\[[0-9]+\\]: " python-shell-completion-setup-code "from IPython.core.completerlib import module_completion" python-shell-completion-module-string-code "';'.join(module_completion('''%s'''))\n" python-shell-completion-string-code "';'.join(get_ipython().Completer.all_completions('''%s'''))\n") ;; Python 补全 (add-hook 'python-mode-hook 'jedi:setup)
最后:
- 打开 *.py 文件自动进入 python-mode
- 按 C-c C-p 打开 Python 交互式
- 按 C-c C-h 看有哪些功能
2. 常见功能
当前文件函数和类导航:C-c C-o
3. 远程编辑 Python 文件
如果要远程编辑 Python 文件,并且享有 REPL 环境,需要将以下代码写入到 ~/.bashrc 中:
export PYTHONPATH=/usr/share/emacs/24.3/etc
然后 C-x f,输入一个远程文件地址(Emacs 支持 SSH 协议):/ssh:user@host:/path/test.py,再按 C-c C-p,即可打开一个 REPL,这个 REPL 不是你本地的,而是远程服务器上的,由于之前配置了 python-shell-interpreter "ipython",所以必须保证远程服务器也有 IPython,如果远程没有,就只能用原生的 python 命令做交互式端了,具体做法:
- 按 C-x b 交换到
*scratch*
缓冲区 - 写句:(setq python-shell-interpreter "python")
- 光标移动到行尾,按 C-j 执行即可。
4. Python 插件推荐
- Anaconda mode,跳转代码、查看引用等,官网:https://github.com/proofit404/anaconda-mode