如何在emacs中使用python中的元点(M-。)?

时间:2010-08-17 09:24:19

标签: python emacs ropemacs pymacs rope

是否有相当于python的粘液?

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

无论foo是否在

,这都应该有效

1)本地项目目录

2)在一些〜/ .virtualenvs / bar / lib / site-packages

3)在其他一些python-path

4)虚拟环境正在使用中(即,它应该在我当前的virtualenv中查看)

pymacs / ropemacs组合是否可以执行此操作?

6 个答案:

答案 0 :(得分:14)

要避免使用-e,您可以使用etags并使用find来递归添加py文件:

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

答案 1 :(得分:8)

这里提到的大部分答案都已过时。一个简单的解决方案是将elpy用于M-.而不使用etags(这需要额外的工作)。

安装elpy as mentioned here

M-x package-install elpy

然后安装python包

$ sudo pip install rope jedi

重启emacs,打开任何python文件并运行M-.

Elpy已完整记录,您可以阅读about M-. here

答案 2 :(得分: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 .

通常在项目的根目录中创建TAGS文件。

答案 3 :(得分:3)

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

正确的方法是将数据附加到--append的现有TAGS文件中

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

此外,如果您想要包含来自虚拟环境网站包dir的标识符(例如:~/.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版本

答案 4 :(得分:2)

以下内容将为您当前的项目编制索引

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

但是如果你想索引导入的libs。你首先激活你的virtualenv。然后使用which python来检测libs的位置,然后将它们传递给etags。

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

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

答案 5 :(得分:1)

尝试使用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)

如果您有pythonic-activate,请切换到带有M-.的virtualenv。

现在你已经M-*了,你可以按# column1 column2 column3 column4 # 0 1 ww 1 Sam # 1 2 ss 2 Bill # 2 None None 3 Jack lst = [[4, 'Jin'], [5, 'Carl']] app = pd.DataFrame([[None, None, x[0], x[1]] for x in lst], columns=['column'+str(i) for i in range(1, 5)]) df = df.append(app, ignore_index=True) # column1 column2 column3 column4 # 0 1 ww 1 Sam # 1 2 ss 2 Bill # 2 None None 3 Jack # 3 None None 4 Jin # 4 None None 5 Carl 返回!