Emacs as a Python IDE - 行者无疆 始于足下 - 行走,思考,在路上

Emacs as a Python IDE

xiaohanyu posted @ Sun, 07 Oct 2012 23:00:53 +0800 in Emacs with tags emacs python , 36625 readers

赋闲脱产的半年里,自己用C++/Java/Lisp胡乱写了几万行的代码,到了现在的公司,给OpenStack项目贴牛皮藓,反倒是Python用得最多。作为公司里面唯一的Emacser(没准也是 公司里JJ最长的吧,),我一直致力于在Emacs平台上折腾出一套顺手的Python开发环境,所幸有些小心得,付诸纸面,以飨大家。

1 Python.el的选择

Emacs的python-mode有两套,一个是Emacs官方提供的python.el,另外一套是Python社区提供的python-mode.el。不过python.el和python-mode.el都有各种各样的小问题,python.el似乎是无法正确处理python的docstring,而python-mode.el的menu项太过繁杂,而且很多menu无法正确工作。这里用到的python.el来自于https://github.com/fgallina/python.el,细节可以参考水木社区的讨论

安装方法可以参考项目主页的README,我自己针对el-get做了一个recipe,这样以后更新装卸都会方便很多,recipe如下:

(:name python
       :website "https://github.com/fgallina/python.el"
       :description "improved python.el from Fabián Ezequiel Gallina"
       :type github
       :pkgname "fgallina/python.el")

不过这个patch并没有被el-get接收,限于时间精力,我没有再去细究el-get撰写recipe的规范。

1.1 ipython集成

交互式的开发是python/ruby/lisp这类动态语言的重要特性,它让程序员从“编码-编译-运行-调试“的程序开发工程链中解放出来,从老旧的批处理是开发过渡到现代的交互式开发。如果你用过slime,你就会知道,交互式的开发不仅仅是一种开发模式,slime也不仅仅是一种工具,而是一种编程的革命。Emacs集成ipython,虽然没有slime那么强大,但是对于提高开发效率还是有莫大的帮助的。幸运的是,fgalling/python.el是支持ipython的。关于fgalling/python.el的参考设置如下:

(add-to-list 'load-path (expand-file-name                                                                        
                         "~/.emacs.d/el-get/python"))                                                            
(require 'python)                                                                                                
(add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))                                                       
(setq                                                                                                            
 python-shell-interpreter "ipython2"                                                                             
 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")

常用快捷键:

  • C-c C-z: (python-shell-switch-to-shell),切换至ipython解释器
  • C-c C-c: (python-shell-send-buffer &optional ARG),发送整个buffer内容到ipython解释器运行

2 Emacs补全:Pymacs和Ropemacs

语言补全一直是Vim/Emacs这类上古"IDE"的弱项,每种语言都有自己的补全插件、配置方法和版本差异,而网上资料、特别是中文资料,或是陈旧潦草,或是语焉不详,常常让初学者们不知所措。本文所载内容恐怕两年左右就会过时,诸位看官高贤注意鉴别……

Emacs下的通用补全插件大概就是auto-completeyasnippet了,前者可以做出基于buffer分词的补全,后者可以基于特定编程语言语法结构的补全。不过基于语义的补全,Emacs+Python下用的是pymacs和ropemacs。需要安装的有

  • pymacs
  • rope
  • ropemacs
  • ropemode

以上均可通过el-get安装。如若使用过程中出现莫名问题,不要纠缠,有可能是版本问题,无妨试验下用apt-get/pacman/yum安装。我本机上的配置如下:

;;; pymacs, rope and ropemacs
(add-to-list 'load-path "~/.emacs.d/el-get/pymacs")
(require 'pymacs)

(setq pymacs-load-path '("~/.emacs.d/el-get/rope"
                         "~/.emacs.d/el-get/ropemacs"))

;; Initialize Pymacs
(autoload 'pymacs-apply "pymacs")
(autoload 'pymacs-call "pymacs")
(autoload 'pymacs-eval "pymacs" nil t)
(autoload 'pymacs-exec "pymacs" nil t)
(autoload 'pymacs-load "pymacs" nil t)
;; Initialize Rope                                                                                             
(pymacs-load "ropemacs" "rope-")
(setq ropemacs-enable-autoimport t)

3 virtualenv

virtualenv是Python的sandbox(沙盒)。那么什么是sandbox呢?

在日常开发中我们常常碰到这样的场景:

  • 需要针对不同的python library做测试(兼容性、性能等)
  • 需要多人共享一台开发机

可是:

  • 并不是所有人都有向系统PYTHONPATH安装python library的权限
  • 我们常常需要同时安装多个不同版本的python library

而virtualenv通过一些脚本,通过软连接和修改环境变量的方式,提供了一个轻量级的虚拟python环境,在这里面个人可以按照自己意愿任意装卸配置library,也可以针对不同版本的library创建不同的virtualenv,方便的很。

3.1 virtualenvwrapper

virtualenv默认是在当前目录下建立一个.venv目录,但是这样有一个问题,就是virtualenv本身的管理很不方便,因为需要记忆不同的.venv的存放位置、具体用途等等。virtualenvwrapper则通过一些python和shell脚本,在virtualenv的基础上建立了一层抽象,实现了对virtualenv本身的统一管理。virtualenvwrapper会默认在$HOME/.virtualenvs目录下创建所有的virtualenv。

virtualenv和virtualenvwrapper均可以通过python pip安装:

pip install virtualenv virtualenvwrapper

常用命令:

  • mkvirtualenv venv_name: 建立一个新的virtualenv,
  • workon venv_name: 切换到venv_name这个virtualenv

3.2 virtualenv.el

virtualenv.el可以配合Emacs集成virtualenv,可以通过el-get安装。virtualenv.el需要virtualenv和virtualenvwrapper。

配置:

;; virtualenv support
(add-to-list 'load-path (expand-file-name
                         "~/.emacs.d/el-get/virtualenv"))
(require 'virtualenv)

常用命令:

  • M-x virtualenv-workon: 切换virtualenv

4 Miscs

一些hook设置:

(add-hook 'python-mode-hook
          (lambda ()
            (ropemacs-mode)
            (global-set-key (kbd "RET") 'newline-and-indent)
            (auto-fill-mode 1)
            (virtualenv-minor-mode 1)))

除了以上,Emacs中和Python开发有关的插件还可以有pylint、pep8、pyflakes等,参考文章:

以上,抛砖引玉,希望能够对刚刚接触Linux/Python/Emacs的朋友有些许帮助。

賢民 said:
Sat, 15 Dec 2012 15:37:42 +0800

請問博主,用python.el 來補全,是不是先要運行 ipython解釋器?我這裏沒運行就無法補全了……

Avatar_small
Lox said:
Fri, 21 Dec 2012 11:02:18 +0800

不是,ropemacs可以进行补全,不过有时候非常慢。

Richard said:
Sat, 26 Jan 2013 09:17:26 +0800

呵呵,原来你也用emacs,emacser很容易有代码洁癖,是不是有点关系呢?
至于jj长。。。我很赞同。。。。。:)
python最近出了一个库很好用。刷sina weibo不?求。。互粉

Avatar_small
Lox said:
Sat, 26 Jan 2013 10:54:00 +0800

也许吧,呵呵。

我有微博帐号的,不过不怎么用,僵尸状态。
原因参考我以前写的一些文章吧,《少即是多》。

感谢。

PoemCode said:
Sat, 26 Jan 2013 13:02:10 +0800

ropemode到现在都不支持Python3,这个有解吗?

ET said:
Sat, 26 Jan 2013 16:21:28 +0800

现在jedi的补全速度比rope快,非阻塞的...

或许可以尝试一下。

https://github.com/davidhalter/jedi

Avatar_small
Lox said:
Mon, 28 Jan 2013 01:34:04 +0800

这个暂且不知呃……不过rope很慢,我一般也不用。auto-complete补全基本够用了。

Avatar_small
Lox said:
Mon, 28 Jan 2013 02:16:40 +0800

谢谢提醒!
看上去很不错,一定尝试下。

cqzlxl said:
Mon, 18 Feb 2013 21:52:49 +0800

谢谢长鸟哥的分享,受益匪浅啊。

zarzen said:
Sat, 16 Mar 2013 21:00:43 +0800

前辈能再写个怎么在emacs里面调试代码的不~?


Login *


loading captcha image...
(type the code from the image)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee