如何使用Emacs在Python中查找函数?


22

配置Emacs以便能够在定义函数的地方查找的最简单方法是什么?我想在Emacs中突出显示它,然后按一个组合键以查找该函数的来源。

您还能找出在哪里使用特定功能吗?

这可以在PyCharm中轻松完成,但是也可以在Emacs中轻松完成吗?

Answers:


14

您尝试过Elpy吗?它绑定elpy-goto-definition到密钥M-.
如果您最近使用过Emacs,我想您也可以使用xref-pop-marker-stackM-,)跳回。Elpy还具有其他一些不错的功能。

要安装它,请按照链接中的说明进行操作。


12

我为Python使用Jedi模式,对此我感到非常满意。它不仅可以对函数调用进行准确的查找,而且即使在复杂的情况下(如继承),也可以将函数解析为正确的定义。带有自动完成启动功能。 http://tkf.github.io/emacs-jedi/latest/


8

您提到的PyCharm的功能是我最喜欢的功能之一,也是我试图用Emacs完全替代PyCharm时要寻找的第一件事(我很高兴地说我已经能够做到)。

如另一个答案中所述,elpy程序包具有此功能(除了许多其他有用的IDE功能之外)。但是,如果您elpy-goto-definition过去经常在点上查找符号,则迟早会发现,在某些情况下PyCharm可以成功找到所需的内容,elpy而不会。正如文档所说:

后端不能总是识别出哪种符号。尤其是经过几次间接访问后,他们基本上没有猜对的希望,因此他们不会

在这种情况下,调用elpy-goto-definition将不执行任何操作,并在回显区域中显示一些错误消息。当发生这种情况时,您当然当然仍然希望找到想要的东西,并且elpy不会让您感到困惑。在这种情况下,无论我处于哪个项目中,我总是使用C-c C-selpy-rgrep-symbol)来rgrep表示符号。至少对于我来说,我正在寻找的东西或多或少总是显示在rgrep结果中。实际上,我认为这也与PyCharm相似:如果您尝试查找某物的定义,而PyCharm不确定该在何处定义,它将从列表中进行选择。实际上elpy,我更喜欢使用的实现,因为当您转到第一个选项时,瞬态列表不会消失,elpy-rgrep-symbol 会将可能性列表留在另一个缓冲区中,以便您在必要时在它们之间来回跳转。

由于我的工作流程几乎总是要首先调用elpy-goto-definition,如果失败,请致电elpy-rgrep-symbol,我决定将一个简单的函数归为一体,该函数elpy-rgrep-symbolelpy-goto-definition失败时会自动调用。该功能如下:

(defun goto-def-or-rgrep ()
  "Go to definition of thing at point or do an rgrep in project if that fails"
  (interactive)
  (condition-case nil (elpy-goto-definition)
    (error (elpy-rgrep-symbol (thing-at-point 'symbol)))))

然后将其绑定到M-.(的默认绑定 elpy-goto-definition)。

(define-key elpy-mode-map (kbd "M-.") 'goto-def-or-rgrep)

这样,我可以在我最喜欢的编辑器中使用我最喜欢的PyCharm功能之一。我知道这是一个古老的问题,您可能已经解决了这个问题或继续前进,但是我希望您或其他人觉得这有用!



2

M- 在anaconda模式下工作(在遇到elpy问题后切换到该模式)。

请注意,您需要正确的Python环境,在我来说,我做到以下几点: - mkvirtualenv someenv - python setup.py develop所有模块的开发或使用(或希望达到源,而不是安装版) - M-x venv-workon someenv让在Emacs的路径。

然后我配置anaconda-mode是活跃的,每当我编辑蟒蛇,瞧,M-.作品


1

很好的问题,这不是开箱即用的,是成熟的IDE的便捷功能。我使用cscopeHelm界面不错,可以做到这一点:http//wikemacs.org/wiki/Python#cscope它可以回答诸如“此符号在哪里定义?在哪里使用?”之类的问题。

ps:在邪恶模式下,我们可以使用转到同一文件中符号的定义gd


我相信gd邪恶只会在文件中找到符号的第一个出现(尽管文档字符串:“转到定义或指向点下的符号的第一个出现。”)
Gordon Gustafson

0

M-.势必elpy-goto-definition会成功。使用M-*将使您跳回到缓冲区的上一个位置。这使您可以快速检查某些内容并返回到先前的位置。

我也C-c C-o经常使用(elpy-occur-definitions)。这将打开一个窗口,其中所有类均是当前缓冲区。从该缓冲区中,按Enter将使您进入源代码中的定义。


实际上,默认情况下,AFAICT M-.绑定到任何键,xref-find-definitions并且elpy-goto-definition不在任何键上(尽管它在菜单上)。在站点包中查找定义似乎根本无法正常工作。
罗伯特·P·高曼

0

Jedi是一个很棒的Python自动补全/静态分析库,我早在使用vim时就使用了它。

就像golang自动补全引擎(即gocode)适用于vim和emacs一样,相同的Jedi引擎适用于vimemacs

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.