Emacs Python 环境配置

Table of Contents

对于 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

1. 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

  4. 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 插件推荐