Emacs_Python环境配置

对于Lisper来说,交互式占据了重要的地位,很多Lisp黑客甚至常年开着一个REPL,对Lisp镜像不断地增量开发。

下图是Common Lisp常见的开发环境——Emacs+Slime。左边是代码编辑区,右边运行着一个REPL,左边写好代码后,可以马上在右边REPL中测试,也可以在右边先写一些测试代码,保证正确性后再到左边去编写正式的代码。

lisp_slime.png

Python脱胎于Lisp,所以理当有这么完美的开发环境,不过大多数人把Python的交互式当作了做书后练习题的环境。多数人开发Python是这样的:

如果是写库,就在Python底部加一句if name == 'main':,然后把测试代码写在逻辑块中,保存并执行它;或者写单元测试脚本,运行测试用例;或者用IPython的%edit命令,编辑完后,让IPython自动加载脚本,然后在IPython的交互式环境里测试函数;或者用IDE,多数IDE也有Python的交互式,但始终用着很不爽。

这是我追求的开发环境:

emacs-IPython.png

左边仍然是代码编辑区,编辑好之后,可以让某个函数马上可以在右边的IPython中生效。当然,有时还需要一个shell终端,像这样:

emacs-IPython-shell.png

Emacs+Python环境配置

在Emacs下配置这样的环境很简单,用包管理器安装以下:

  1. Python mode

    M-x package-install python-mode

  2. IPython(如果你的Emacs版本是24.2以上,此步骤省略):

    M-x package-install ipython

  3. 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)

最后:

远程编辑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命令做交互式端了,具体做法: