赋闲脱产的半年里,自己用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如下:

1
2
3
4
5
(: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的参考设置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(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安装。我本机上的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
;;; 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安装:

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

配置:

1
2
3
4
;; 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设置:

1
2
3
4
5
6
(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的朋友有些许帮助。

Emacs as a Python IDE(转)的更多相关文章

  1. Linux 下配置 Python IDE——Emacs

    工欲善其事,必先利其器.Python作为高级语言,因为其简介.灵活已经被越来越多的程序员所青睐.在尝试了众多IDE之后,终于找到了自己的挚爱.废话少说,下面开始说一下如何在linux下安装配置Emac ...

  2. 10 款最好的 Python IDE

    Python 非常易学,强大的编程语言.Python 包括高效高级的数据结构,提供简单且高效的面向对象编程. Python 的学习过程少不了 IDE 或者代码编辑器,或者集成的开发编辑器(IDE).这 ...

  3. 推荐 10 款最好的 Python IDE

    简述 Python 非常易学,强大的编程语言.Python 包括高效高级的数据结构,提供简单且高效的面向对象编程. Python 的学习过程少不了 IDE 或者代码编辑器,或者集成的开发编辑器(IDE ...

  4. 提供给开发者 10 款最好的 Python IDE

    Python 非常易学,强大的编程语言.Python 包括高效高级的数据结构,提供简单且高效的面向对象编程. Python 的学习过程少不了 IDE 或者代码编辑器,或者集成的开发编辑器(IDE).这 ...

  5. 转载八个最佳Python IDE

    八个最佳Python IDE 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Python是一种功能强大.语言简洁的编程语言.本文向大家推荐8个适合Pyt ...

  6. 转载文章之提供给开发者 10 款最好的 Python IDE

    Python 非常易学,强大的编程语言.Python 包括高效高级的数据结构,提供简单且高效的面向对象编程. Python 的学习过程少不了 IDE 或者代码编辑器,或者集成的开发编辑器(IDE).这 ...

  7. Use Vim as a Python IDE

    Use Vim as a Python IDE I love vim and often use it to write Python code. Here are some useful plugi ...

  8. 7款公认比较出色的Python IDE,你值得拥有!

    Python作为一款比较“简洁”的编程语言,它拥有很多性价比高的性能,造就了它现在比较火热的局面,很多人都来学习Python.Python 的学习过程少不了 IDE 或者代码编辑器,或者集成的开发编辑 ...

  9. Python IDE推荐

    八个最佳Python IDE 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Python是一种功能强大.语言简洁的编程语言.本文向大家推荐8个适合pyt ...

随机推荐

  1. 【小梅哥SOPC学习笔记】系统时钟的使用

    给NIOS II CPU添加一颗澎湃的心——系统时钟的使用 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchd ...

  2. kafka学习默认端口号9092

    一 Kafka 概述1.1 Kafka 是什么在流式计算中,Kafka 一般用来缓存数据,Storm 通过消费 Kafka 的数据进行计算.1)Apache Kafka 是一个开源消息系统(微信公众号 ...

  3. hadoop大致问题

    一.项目编码实现 HDFS文件上传 HDFS文件下载 定位文件读取 通过API操作HDFS 通过IO流操作HDFS HDFS写数据流程 HDFS读数据流程 统计一堆文件中单词出现的个数(WordCou ...

  4. javascript高级程序设计读书笔记----引用类型

        Array类型. ECMAScript数组的每一项可以保存任何类型的数据. 数组大小是可以动态调整的. 创建数组第一种基本方式方式: 使用Array构造函数 var colors = new ...

  5. Android-Application来传递数据

    在上一篇博客中介绍到,Android-Intent意图传递数据,能够传递基本数据类型系列,能够传递对象(需要序列化),等操作: 但是如果要传递 List<T>,这种类型的数据,就不能通过I ...

  6. dataframe 转为list

    首先使用np.array()函数把DataFrame转化为np.ndarray(),再利用tolist()函数把np.ndarray()转为list.

  7. react.js学习之路六

    学习react中,我一直认为,总组件里面才有构造函数,但是我才发现我的观点是错误的,构造函数是可以出现在子组件里面的. 今天有一个错误是点击增加/减少input框里面 的数值 我一直在寻找input框 ...

  8. php 获取 post 请求体参数

    private function getPostData() { $postdata = file_get_contents("php://input"); $data = url ...

  9. 洛谷P5158 【模板】多项式快速插值

    题面 传送门 前置芝士 拉格朗日插值,多项式多点求值 题解 首先根据拉格朗日插值公式我们可以暴力\(O(n^2)\)插出这个多项式,然而这显然是\(gg\)的 那么看看怎么优化,先来看一看拉格朗日插值 ...

  10. 三,PHP中错误日志display_errors与error_reporting配置

    1,display_errors display_errors 错误回显,一般常用语开发模式,但是很多应用在正式环境中也忘记了关闭此选项.错误回显可以暴露出非常多的敏感信息,为攻击者下一步攻击提供便利 ...