Emacs_Python环境配置
对于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终端,像这样:
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
接着配置,把以下内容写到~/.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看有哪些功能
远程编辑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执行即可。