Emacs中打造强大的Python IDE
原作者关于Python的博文链接: http://www.cnblogs.com/coderzh/category/133952.html
本文将介绍,在Emacs中,通过各种扩展,打造强大的Python IDE环境,包括Snippet工具,智能提示,自动补全,重构工具,调试以及GAE的调试,等等。以下各工具的安装前提是你对Emacs的配置文件有一定的了解,所有相关的el文件都必须放在load_path能够加载的地方。
snippet工具,可自定义一些模板,必不可少的好东西!看了下面这个很酷的演示动画就明白了:
http://yasnippet.googlecode.com/files/yasnippet.avi
安装方法:
自动完成工具,会像VS里一样,弹出一个列表框让你去选择。
'
安装方法:
非常棒的重构工具,比如rename,move,extract method等等。还有非常好用的goto difinition(跳到定义),show documents(显示文档)等等。安装Ropemacs前,必须先安装rope和pymacs 。
rope的安装方法:
pymacs的安装方法:
.emacs中:
Ropmacs的安装方法:
.emacs中:
Ropemacs is a plugin for performing python refactorings in emacs. It uses rope library and pymacs.
You should install rope library, ropemode and pymacs before using ropemacs. You can download ropemacs from here.
Supports many of the refactorings that are supported by rope_ library:
Other refactoring-related features:
Code-assists:
一个更加强大的智能提示工具,比如,输入time.cl 然后按TAB键,会列出time模块所有cl开头的函数名。在调用函数时,还会在mini buffer中提示函数的参数类型。这个东西需要先安装pymacs。
安装方法:
1. 拷贝 python-mode.el and pycomplete.el 到Emacs的load_path中。
2. 拷贝 pycomplete.py 到PYTHONPATH (比如: c:/python25/Lib/site-packages)
3. .emacs中添加:
在Emacs中,通过M-x pdb可调出pdb对python代码进行调试。但是发现在Windows系统中,总进入不了调试模式。主要原因有:
1. windows中,找不到pdb.py位置。需自己制定pdb的路径。可以通过下面的方法设置pdb的路径:
2. windows中,调用pdb时,未使用python -i 参数。
针对上面两个问题,我的解决办法是,不设置pdb具体路径,M-x pdb 回车后,出现下面命令:
然后手动修改一下:
这样就搞定了。
GAE是一个Web应用,需要跨线程进行调试,而pdb本身对线程调试支持不好。
使用pdb进行线程调试时,只有在需要调试的地方插入下面代码:
然后直接运行被调试代码,而不是通过python pdb来执行,就可以多线程代码进行调试了。
但是Google App Engine这样的Web应用,使用这个方法还是不能调试,和stdin和stdout有关,最后找到一个很好的解决方法:
在任何需要调试的地方,调用上面的set_trace()函数。
如果你还有更好玩的东西,一定要告诉我!
参考文档:
http://www.emacswiki.org/emacs/PythonMode
http://www.enigmacurry.com/2008/05/09/emacs-as-a-powerful-python-ide/
http://jjinux.blogspot.com/2008/05/python-debugging-google-app-engine-apps.html
[ 配置Emacs下的Python开发环境 ]
在Linux论坛上总有人问Python用什么IDE比较好,然后总会有人回答说Emacs。最近开始学Python,也花了点时间研究怎么配置Emacs,发现没有想象中的那么麻烦。这篇文章大致上来自于Lei Chen博客文章的翻译,完成以后的Emacs具有以下特性:
其他特性还包括自动缩进,括号匹配,语法高亮,代码折叠等等。其中最有用的莫过于自动完成了,貌似很少有python编辑器可以做到这一点。而即时语法检测让emacs下的python代码书写变得像Eclipse一样,一旦有错误立刻就会高亮标记出来。
首先你得在home目录下有一个.emacs配置文件,并且有一个用来放插件的文件夹(比如说~/.emacs.d/)
(require ‘auto-complete) (global-auto-complete-mode t)
(require ‘yasnippet) (yas/initialize) (yas/load-directory “~/.emacs.d/snippets”)
我们需要使用最新的development版的rope和ropemacs,否则在emacs中不能找到rope-completion函数。通过如下步骤安装:
sudo apt-get install mercurial python-setuptools
mkdir /tmp/rope && cd /tmp/rope
hg clone http://bitbucket.org/agr/rope
hg clone http://bitbucket.org/agr/ropemacs
hg clone http://bitbucket.org/agr/ropemode
sudo easy_install rope
ln -s ../ropemode/ropemode ropemacs/
sudo easy_install ropemacs
sudo apt-get install pyflakes
在你的.emacs.d中创建一个init_python.el,并且加入以下内容:
(autoload 'python-mode "python-mode" "Python Mode." t) (add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode)) (add-to-list 'interpreter-mode-alist '("python" . python-mode)) (require 'python-mode) (add-hook 'python-mode-hook (lambda () (set-variable 'py-indent-offset 4) ;(set-variable 'py-smart-indentation nil) (set-variable 'indent-tabs-mode nil) (define-key py-mode-map (kbd "RET") 'newline-and-indent) ;(define-key py-mode-map [tab] 'yas/expand) ;(setq yas/after-exit-snippet-hook 'indent-according-to-mode) (smart-operator-mode-on) )) ;; 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) ;;(eval-after-load "pymacs" ;; '(add-to-list 'pymacs-load-path YOUR-PYMACS-DIRECTORY")) (pymacs-load "ropemacs" "rope-") (setq ropemacs-enable-autoimport t) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Auto-completion ;;; Integrates: ;;; 1) Rope ;;; 2) Yasnippet ;;; all with AutoComplete.el ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun prefix-list-elements (list prefix) (let (value) (nreverse (dolist (element list value) (setq value (cons (format "%s%s" prefix element) value)))))) (defvar ac-source-rope '((candidates . (lambda () (prefix-list-elements (rope-completions) ac-target)))) "Source for Rope") (defun ac-python-find () "Python `ac-find-function'." (require 'thingatpt) (let ((symbol (car-safe (bounds-of-thing-at-point 'symbol)))) (if (null symbol) (if (string= "." (buffer-substring (- (point) 1) (point))) (point) nil) symbol))) (defun ac-python-candidate () "Python `ac-candidates-function'" (let (candidates) (dolist (source ac-sources) (if (symbolp source) (setq source (symbol-value source))) (let* ((ac-limit (or (cdr-safe (assq 'limit source)) ac-limit)) (requires (cdr-safe (assq 'requires source))) cand) (if (or (null requires) (>= (length ac-target) requires)) (setq cand (delq nil (mapcar (lambda (candidate) (propertize candidate 'source source)) (funcall (cdr (assq 'candidates source))))))) (if (and (> ac-limit 1) (> (length cand) ac-limit)) (setcdr (nthcdr (1- ac-limit) cand) nil)) (setq candidates (append candidates cand)))) (delete-dups candidates))) (add-hook 'python-mode-hook (lambda () (auto-complete-mode 1) (set (make-local-variable 'ac-sources) (append ac-sources '(ac-source-rope) '(ac-source-yasnippet))) (set (make-local-variable 'ac-find-function) 'ac-python-find) (set (make-local-variable 'ac-candidate-function) 'ac-python-candidate) (set (make-local-variable 'ac-auto-start) nil))) ;;Ryan's python specific tab completion (defun ryan-python-tab () ; Try the following: ; 1) Do a yasnippet expansion ; 2) Do a Rope code completion ; 3) Do an indent (interactive) (if (eql (ac-start) 0) (indent-for-tab-command))) (defadvice ac-start (before advice-turn-on-auto-start activate) (set (make-local-variable 'ac-auto-start) t)) (defadvice ac-cleanup (after advice-turn-off-auto-start activate) (set (make-local-variable 'ac-auto-start) nil)) (define-key py-mode-map "\t" 'ryan-python-tab) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; End Auto Completion ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Auto Syntax Error Hightlight (when (load "flymake" t) (defun flymake-pyflakes-init () (let* ((temp-file (flymake-init-create-temp-buffer-copy 'flymake-create-temp-inplace)) (local-file (file-relative-name temp-file (file-name-directory buffer-file-name)))) (list "pyflakes" (list local-file)))) (add-to-list 'flymake-allowed-file-name-masks '("\\.py\\'" flymake-pyflakes-init))) (add-hook 'find-file-hook 'flymake-find-file-hook) (provide 'init_python)
事实上
init_python.el做的事情是通过使用auto_complete.el中的功能,把YASnippet和Rope的功能结合到了 一块儿,实现了类似TexMate的自动完成等功能。其中YASnippet可以自定义模板,很是实用。Rope的功能还在研究中。
Bonus:
Emacs补全利器:auto-complete+gccsense
from:
http://emacser.com/emacs-gccsense.htm
搜索引擎上关于emacs代码补全的文章一大堆,大多讲的是cedet、semantic、ctags之类的。我自己也尝试过一些“主流”的组合,奈何都不来感啊。用得最长的也就auto-complete了,但是用的也仅仅是它自带的buffer内内容的补全,基本不涉及语义的补全。偶然发现了gccsense这个东西,简单配置了下,比较满意。有图有真相
Emacs gccsense
auto-complete提供一个补全的前端,通过不同的后端,支持ctags等。
gccsense是补全的后端,能提供符合语义的补全。因为它是直接利用gcc的代码,使用了编译器内在的分析器。它是一个独立的程序,目前通过插件可以被用到emacs和vim的补全上。因为是用的gcc的代码,理论上可以补全所有gcc支持的语言。
auto-complete和gccsense是一家出的。
下载:http://cx4a.org/software/auto-complete/
配置.emacs,我的auto-complete在/mydoc/lib/emacs-plugins/下
; auto complete (add-to-list 'load-path "/mydoc/lib/emacs-plugins/auto-complete") (require 'auto-complete-config) (add-to-list 'ac-dictionary-directories "/mydoc/lib/emacs-plugins/auto-complete/ac-dict") (ac-config-default) |
gcc-code-assist就是在gcc代码基础上改的,主要用来从代码中提取补全信息
sudo apt-get install build-essential libgmp3-dev libmpfr-dev flex ruby rubygems libsqlite3-ruby |
其它系统,如freebsd、macos请自行参考用户手册。
$ tar xvjf gcc-code-assist-*.tar.bz2 $ cd gcc-code-assist-* $ ./configure --program-suffix=-code-assist --enable-languages=c,c++ --disable-bootstrap --disable-multilib $ make # -j2 $ sudo make install |
安装成功之后执行下,如果有正常输出,就说明安装成功:
$ gcc-code-assist --version $ g++-code-assist --version |
gccsense这个包包含一些辅助函数,以及编辑器的插件
$ cd gccsense-* $ sudo cp bin/* /usr/local/bin/ |
$ gccrec --version $ autopch --version |
(require 'gccsense) |
即可。
由于我的gccsense.el放到了。/mydoc/lib/emacs-plugins/c下,并且把auto-complete的补全命令绑定到了M+/上,所以这部分配置如下:
(add-to-list 'load-path "/mydoc/lib/emacs-plugins/c") (require 'gccsense) (global-set-key "\257" (quote ac-complete-gccsense)) |
ok,搞定。
在介绍使用前,简单介绍下几个主要模块的作用
#include <string> using namespace std; int main() { string s; } |
gccrec g++-code-assist test.cpp |
这里可以认为g++-code-assist就是g++,参数一样的,比如-I -l之类的。
这里贴上我的emacs相关部分的配置文件。
我把补全的命令绑定到了M-/上面,
gccsense.el放到了/mydoc/lib/emacs-plugins/c/下面,所以这样写:
(add-to-list 'load-path "/mydoc/lib/emacs-plugins/c") (require 'gccsense) (global-set-key "\257" (quote ac-complete-gccsense)) |
gccsense用户手册,http://cx4a.org/software/gccsense/manual.html
Emacs是一种强大的文本编辑器,在程序员和其他以技术工作为主的计算机用户中广受欢迎。EMACS,即Editor MACroS(编辑器宏)的缩写,最初由Richard Stallman(理查德·马修·斯托曼)于1975年在MIT协同Guy Steele共同完成。
Emacs不仅仅是一个编辑器,他是一个整合环境,或可称它为集成开发环境。在里面你可以收发电子邮件,FTP,上新闻组,日历,游戏,写代码,调试等等。对于某些人,打开电脑后,只要打开一个Emacs和FireFox,就可以完成所有的事情。甚至还流传着这么一句话:Emacs除了不能修理自行车,其他都可以做。
Emacs主页:http://www.gnu.org/software/emacs/
Emacs入手有些难度,很多初学者很快就放弃了。因为Emacs的很多快捷键让人开始很难适应,比如习惯了狂按ctrl + s保存的同学会不适应,大多数人习惯的复制粘贴ctrl + c,ctrl + v,变成了alt + w, ctrl + y。《卓有成效的程序员》中,作者说到,一个程序员需要坚持使用Emacs一年以上,才能真正熟练掌握。我也是个初学者,现在为止才坚持了几个星期,还要努力啊。如果你也是Emacs初学者,和我一起互勉吧。开始可能会遇到输入障碍,但是没关系,坚持下来,当掌握更多的东西时,效率就会提高上来。
Emacs的一些基本操作非常重要,必须牢记在心。一个最好的办法就是看Emacs的中文指南(ctrl + h, t),然后反复练习。
Emacs的快捷键都是绑定在ctrl和alt(或称meta)上的,例如c-x就是ctrl+x,m-x就是alt+x
C-x C-f 打开文件
C-x C-s 保存文件
C-x C-w 存为新文件
C-x C-c 退出Emacs
C-f 前进一个字符
C-b 后退一个字符
M-f 前进一个字
M-b 后退一个字
C-a 移到行首
C-e 移到行尾
M-a 移到句首
M-e 移到句尾
C-p 后退一行
C-n 前进一行
M-x goto-line 跳到指定行
C-v 向下翻页
M-v 向上翻页
M-< 缓冲区头部
M-> 缓冲区尾部
C-l 当前行居中
M-n or C-u n 重复操作随后的命令n次
C-d 删除一个字符
M-d 删除一个字
C-k 删除一行
M-k 删除一句
C-w 删除标记区域
C-y 粘贴删除的内容
注意:C-y可以粘贴连续C-k删除的内容;先按C-y,然后按M-y可以选择粘贴被删除的内容
C-空格 标记开始区域(需修改输入法快捷键)
C-x h 标记所有文字
M-w 复制标记区域
C-/ or C-x u 撤消操作
M-x shell 打开SHELL
M-! 执行SHELL命令 (shell-command)
C-x 0 关闭本窗口
C-x 1 只留下一个窗口
C-x 2 垂直均分窗口
C-x 3 水平均分窗口
C-x o 切换到别的窗口
C-x s 保存所有窗口的缓冲
C-x b 选择当前窗口的缓冲区
C-M v 另外一个窗口向下翻页(需要对照时很好用)
c-M-Shift v 另外一个窗口向上翻页
C-x C-b 打开缓冲区列表
C-x k 关闭缓冲区
C-s 向前搜索
C-s 查找下一个
ENTER 停止搜索
C-r 反向搜索
C-s C-w 以光标所在位置的字为关键字搜索
M-x replace-string ENTER search-string ENTER 替换
C-M-s 向前正则搜索
C-M-r 向后正则搜索
C-M-% 正则交互替换
C-h t 入门指南
C-h v 查看变量
C-h f 查看函数
C-h ? 查看帮助列表
作者:CoderZh(CoderZh的技术博客 - 博客园)
微博:http://t.sina.com.cn/coderzh
出处:http://coderzh.cnblogs.com
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
windows下安装emacs及添加配置文件
在这个蔚蓝色的星球上,流传着两大神器的传说:据说Emacs是神的编辑器,而Vim是编辑器之神。
一些人勇敢地拾起了Vim或Emacs,却发现学习曲线陡峭而漫长,还是有一些人留下来了,坚定地守护着这两大神器。
一些说葡萄太酸的人想离开又不甘心,总是问:它们到底神在哪里啊?
配置windowEmacs
首先我们需要下载windows版的emacs,官网下载地址:
http://ftp.gnu.org/pub/gnu/emacs/windows/
解压后有个addpm.exe,双击运行它
addpm.exe,注册系统变量ComSpec,它的值为C:\WINDOWS\system32\cmd.exe(和%SystemRoot%\system32\cmd.exe一样).该变量的作用是指示emacs调用系统的shell
当然也可以使用cgywin等其它的shell,使用cgywin等作为emacs默认的shell时可能会需要一些其它的设置,这些可以参考emacs的在线帮助
运行runemacs.exe可以启动emacs。
总的来说,Emacs的默认配置文件放在变量HOME所指的路径下,所以,只要我们把.emacs扔到HOME所指向的目录就可以了,下面就简单介绍一下在Windows下设置home目录的几种方法,并进行简单的对比。
第一种方法,改变home环境变量的值。
这种方法,改变了$home变量,也会影响Cygwin或是其他一些应用程序,因为有一些程序会根据Windows的home环境变量来寻找数据存放的路径。
第二种方法,不改变Windows默认的home值,设置默认的.emacs文件读取你自己的Emacs配置文件,并重新设定Emacs的home目录。
你可以在Emacs中输入C-x C-f,然后打开路径~
(即当前的home环境变量所指的路径,一般来说是这样的路径:C:/Documents and Settings/water/Application Data)。
看看显示的是哪个目录,如果此目录下没有.emacs,可以创建一个.emacs或_emacs,然后在这个.emacs文件里,加入如下语句:
(load-file "E:/water/.emacs") |
文件 E:/water/.emacs 才是我们真正的Emacs配置文件,我们可以在这个真正的配置文件里用如下语句设置我们的home目录:
1 2 3 4 5 |
(setenv "HOME" "E:/water") (setenv "PATH" "E:/water") ;;set the default file path (setq default-directory "~/") (add-to-list 'load-path "~/emacs/site-lisp") |
这个方法的优点是比较简单同样也方便对.emacs文件备份,不会对其它应用程序产生任何影响。
第三种方法,修改注册表,在注册表中进行如下设置:
HKEY_LOCAL_MACHINE\SOFTWARE\GNU\Emacs\HOME=%emacs_dir%
以上三种方法都可以设置好Emacs的Home目录,但是,系统是按什么顺序来解析它们的呢?大体上的顺序是这样的:
我个人比较喜欢用第二种方法,即简单又方便备份。
其实,如果你只是想要Emacs能找到你的.emacs的话,也可以不用管HOME目录的,写个批处理文件emacs.bat:
path-of-emacs.exe -q -l path-of-your.emacs
以后执行这个批处理文件就可以用你的配置打开Emacs了。