0. 开头废话
在2013年圣诞节期间,我浏览了Swaroop C H写的《A Byte of Python》,突然有种相见恨晚的感觉。想起大三大四时候看了两三本Java方面的书籍,云里雾里,不得要领。只记住了《Head First Java》里面比较面向对象和面向过程的一个例子,感性上认识了OOP在开发过程中的便利。目前在读Mark Lutz写的《Learning Python》,有点意外的是,在学习Python的过程中,竟然理解了以前在学习Java过程中的很多疑惑,比如this关键字。虽然目前对Python的学习只是入门,不过隐约中已经感觉到Python这种动态语言的灵活,不管是从开发角度还是从学习角度,都很简洁。
俗话说,工欲善其事,必先利其器。在学习Python之前,不小心上了Emacs这条道。当时只是为了找一款Win7和Ubuntu下都好用的文本编辑器,在尝试了Geany,JEdit,Sublime...等编辑器之后,还是觉得Ubuntu 12.04自带的Emacs确实强大。正好Swaroop C H也写了一篇重回Emacs的博文,于是就看了几章《Sams Teach Yourself Emacs in 24 Hours》,这样Emacs就入门了。
在尝试了Swaroop C H的配置后,只知其然而不知所以然,所以想从零开始,一个一个添加相关功能。刚入门就尝试配置Emacs Python IDE确实有很大挑战,在折腾Emacs过程中也走了不少弯路,所以写下来以备后用。
PS :本来开这个博客是想记录学习过程,不过自从使用了Github Pages,我也有了自己的博客网站,仅以此文作为祭奠,以后所有想法全都写到个人博客上了。目前博客StickMind还很简陋,虽不忍直视,不过还要推荐下,希望同样走在自学道路上的朋友们可以一起交流。
PS 2:本文所谈的配置已很陈旧,其实通篇只是围绕Emacs插件elpy-mode来设置Python支持的,而elpy插件的依赖都有变动,所以可以直接查看elpy-mode官方文档。另外,如果不嫌丑陋,也可以看看我的配置。
1. Python环境
Emacs实现的功能是建立在外部Python环境基础上的,所以在配置Emacs之前,需要安装一些Python模块。
安装pip,很好用的Python包管理工具,用pip安装Python模块很方便。
$sudo apt-get install python-pip #Python2
$sudo apt-get install python3-pip #Python3
接下来,就可以用pip安装其他模块了:
$sudo pip install elpy rope jedi #Python2
$sudo pip3 install elpy rope_py3k jedi #Python3
这样elpy、rope、jedi就安装好了
注意:因为我这里pypi被墙了(真坑爹啊),多亏阿里云开源镜像的帮助,可以去这里下载pip最新安装包,目前是pip-1.5.4.tar.gz。手动安装pip如下:
#切换到pip-1.5.4.tar.gz所在目录
$tar -zxvf pip-1.5.4.tar.gz
$cd pip-1.5.4
$sudo python setup.py install #Python2
$sudo python3 setup.py install #Python3
然后按照阿里云开源镜像帮助,更改pip默认安装源。在~/.pip/pip.conf(自建)文件中添加或修改:
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
2. 配置Emacs
在~/.emacs.d/init.el中初始化package.el并添加插件源:
(require 'package)
(setq package-archives
'(("gnu" . "http://elpa.gnu.org/packages/")
("marmalade" . "http://marmalade-repo.org/packages/")
("melpa" . "http://melpa.milkbox.net/packages/")))
(package-initialize)
重启Emacs,使用
M-x package-install [RET] elpy [RET]来安装(RET即Enter键)。也可以使用命令
M-x list-packages获取插件列表,使用
C-s找到
elpy来安装。
然后,在init.el文件中添加如下配置:
;; Configuration of Python IDE
;; https://github.com/jorgenschaefer/elpy
(require 'elpy nil t)
(elpy-enable)
重启Emacs。至此Python IDE就算完成了。新建一个Python文件试试,如下:
如图状态栏显示(Python Eldoc Elpy yas || Flymake AC),Python模式下已经包含了yasnippet、flymake、auto-complete等插件了。更多配置请参考ELPY文档。
3. 优化Auto-complete:
如图所示,在对列表a输入dot操作符时,Emacs并没有给出相应的列表方法,Mini Buffer里也出现了警告。这是因为elpy默认使用rope的缘故。
可以使用M-x elpy-rpc-set-backend [RET] jedi [RET]命令,将rope改为jedi。这时,输入dot操作符就可以显示列表对应的方法了。
如图所示,auto-complete不仅给出了相应的方法,还给出了该方法的文档。
如果不想每次都使用命令更改elpy-rpc-set-backend,可以在init.el配置文件中添加一行代码:
(setq elpy-rpc-backend "jedi")
4. 使用yasnippet
输入for,然后按TAB键将自动展开for模板:
更多yasnippet用法可以点击状态栏yas查看。
5. 优化Flymake
使用Flymake语法检测,只能在鼠标悬停到错误所在处才能显示具体错误信息,很不方便。特别是在Terminal下根本无法使用。所以我安装了flymake-cursor.el插件,这个插件将错误信息显示在Mini Buffer中,这样就可以避免使用鼠标。该插件不需要配置代码。效果如下:
使用flymake还有一个好处就是,如果代码不符合PEP8语法规范,也会提示警告信息,这样对养成良好代码规范很有帮助。由于PEP8有些规范比较陈旧,可以通过配置主目录下~/.config/flake8(自建)文件来自定义,参考flake8文档。
6. 运行Python程序
使用C-c C-c命令,Emacs将调出Python交互界面执行当前代码:
如果想使用Python3,可以在init.el配置文件中添加一行代码:
(setq elpy-rpc-python-command "python3")
如果想使用IPython,可以在init.el配置文件中添加一行代码:
(elpy-use-ipython)
————————————————————————————————————————————————————————————————
以上介绍的已经够多了,我也不想再写了,更多Emacs技巧可以在网上发现,像Eclipse等IDE能有的功能,Emacs都可以实现。很多优秀的Emacs插件都可以直接通过M-x list-packages安装。一个简单的配置文件,就可以把Python IDE配置好,Emacs也不是那么难啊!
附录
以下是上文介绍的init.el配置文件:
(require 'package)
(setq package-archives
'(("gnu" . "http://elpa.gnu.org/packages/")
("marmalade" . "http://marmalade-repo.org/packages/")
("melpa" . "http://melpa.milkbox.net/packages/")))
(package-initialize)
;; Configuration of Python IDE
;; https://github.com/jorgenschaefer/elpy
(require 'elpy nil t)
(elpy-enable)
(setq elpy-rpc-backend "jedi")
(setq elpy-rpc-python-command "python3")
(elpy-use-ipython)