2010-08-17 87 views
17

有没有相当于python的粘液?如何在Python中使用emacs使用meta-dot(M-。)?

例如,如果我将光标放在foo()上并执行M-。 (跳转到),我想看看函数foo的源定义

这应该不管富是在一些

1)本地项目目录

2)工作的〜/ .virtualenvs /酒吧/ lib中/在其他Python路径

4)虚拟ENV在使用中(即,它应该在我目前的virtualenv)

站点包

3)

pymacs/ropemacs组合是否可以做到这一点?

+1

我宁愿相当于粘液,也就是说,在代码/语义层面上,而不仅仅是在文本级别上咕py python。 Ropemacs或pymacs可能是我想要的,但我不知道它是否有助于M-。以任何方式。 – nunb 2010-08-18 05:02:34

回答

11

为了避免您可以使用ETag -e和有找到你递归添加PY文件:

find . -type f -name '*.py' | xargs etags 
+0

是的,但相关的.py文件是不是在我的代码的子目录,他们是在〜/ .virtualenv,而我在〜/ src目录/项目合作/富 – nunb 2010-08-18 04:59:58

+0

有了发现你可以使用任何目录,你想: '找到〜/ .virtualenv -type f -name'* .py'| xargs etags' – mathk 2010-08-18 07:07:33

+0

我想这需要一个virtualenv钩子,这样标签可以自动生成任何工作目录+ virtualenv组合用户所在。 – nunb 2010-08-18 08:42:12

4

M-。通常运行“find-tag”功能。 您应该创建一个Python源文件的TAGS文件。然后你在做M-之前“visit-tags-table”。这样,Emacs将跳转到标签的所有定义。类型C-u M-。跳转标签的下一个定义。请参阅find-tag文档以获取帮助。请教Emacs帮助知道如何从python源文件创建一个TAGS文件。

例如,您可以使用Exuberant Ctags创建TAGS文件。

转到您的Python文件的根目录,然后执行以下操作:

ctags -e -R . 

标签文件是在项目的根目录下创建的。

+3

我建议在看http://www.emacswiki.org/emacs/EtagsSelect为好,它提供了一个更好的接口,如果你绑定'M-.'到'的ETag选 - 查找 - tag' – phils 2010-08-17 22:13:27

+0

随着根的ETag的,并且几个项目不会在相同包的不同安装(多个站点包?)之间混淆。或者至少,每次它弹出一个缓冲区问我*哪一个源defn我想去? – nunb 2010-08-18 05:01:15

+0

您在每个项目的各自根目录(而不是系统的根目录)中创建一个TAGS文件。然后你在每个你感兴趣的TAGS文件上使用'visit-tags-table'。所有TAGS文件参考都附加到'tags-table-list'变量。然后,使用M-。 ,emacs在'tags-table-list'中引用的所有TAGS文件中搜索关键字。 – 2010-08-19 15:14:33

2

下将指数当前项目

find . -type f -name '*.py' | xargs etags

但是,如果你想索引你的导入库。你首先激活你的virtualenv。然后使用which python来检测你的库在哪里,然后将它们传送给etags。

workon my-project # if using virtualenvwrappwer 
source bin/activate # if using virtualenv 

find ${$(which python)/\/bin\/python/} -type f -name '*.py' | xargs etags 
6

这里提到的大多数答案都过时了。一个简单的解决方案是使用elpy作为M-.而没有etags(这需要额外的工作)。

安装elpy as mentioned here

M-x package-install elpy 

,然后再安装Python包

$ sudo pip install rope jedi 

重新启动emacs的,打开任何蟒蛇文件并运行M-.

Elpy是完全记录,你可以阅读about M-. here

0

接受的答案错过了一个重要的观点,如果您执行etags就像find . -type f -name '*.py' | xargs etags那么每个文件每次都会生成每个TAGS文件。

做到这一点是如果你要包括从虚拟ENV现场包标识符将数据追加到与--append现有的标签文件像

rm -f TAGS 
find . -type f -name '*.py' -print0 | xargs -0 etags --append 

也是正确的方法目录(例如:~/.virtualenvs/bar/lib/site-packages):

SITEPACKAGES=$(cdvirtualenv;pwd)/lib/python3.6/site-packages/ 
find $SITEPACKAGES -type f -name '*.py' -print0 | xargs -0 etags -a 

*调整python3.6到当前的Python版本

0

尝试的Emacs的anaconda-modecompany-anaconda包。更新配置:

(eval-after-load "company" 
'(add-to-list 'company-backends 'company-anaconda)) 
(add-hook 'python-mode-hook 'anaconda-mode) 
(add-hook 'python-mode-hook 'company-mode) 

切换到virtualenv与pythonic-activate,如果你有。

现在你已经得到M-.,你可以按M-*回去!

相关问题