Wie benutze ich Emacs, um eine Funktion in Python nachzuschlagen?

22

Was ist die einfachste Möglichkeit, Emacs so zu konfigurieren, dass nachgeschlagen werden kann, wo eine Funktion definiert ist? Ich möchte es in Emacs hervorheben und eine Tastenkombination drücken, um nach der Quelle der Funktion zu suchen.

Können Sie auch herausfinden, wo eine bestimmte Funktion verwendet wird?

Dies ist in PyCharm problemlos möglich. Kann dies auch in Emacs problemlos durchgeführt werden?

Low Kian Seong
quelle

Antworten:

14

Hast du es mit Elpy versucht ? Es bindet elpy-goto-definitionan den Schlüssel M-..
Wenn Sie einen neuen Emac haben, können Sie auch mit xref-pop-marker-stack( M-,) zurückspringen . Elpy hat noch ein paar andere nette Features.

Folgen Sie zur Installation den Anweisungen im Link.

bmag
quelle
12

Ich benutze den Jedi-Modus für Python und bin sehr zufrieden damit. Es führt nicht nur eine genaue Suche nach Funktionsaufrufen durch, sondern löst Funktionen auch in komplizierten Situationen (wie Vererbung) in die richtige Definition auf. Kommt mit Auto-Vervollständigung zum Booten. http://tkf.github.io/emacs-jedi/latest/

Achintya Sharma
quelle
8

Das Feature von PyCharm, das Sie erwähnen, war eines meiner Favoriten und eines der ersten Dinge, nach denen ich gesucht habe, um PyCharm vollständig durch Emacs zu ersetzen (was ich gerne sagen kann).

Wie in einer anderen Antwort erwähnt, verfügt das elpyPaket über diese Funktion (zusätzlich zu vielen anderen nützlichen IDE-Funktionen ). Wenn Sie elpy-goto-definitionjedoch das Symbol an einer Stelle nachschlagen, werden Sie früher oder später feststellen, dass PyCharm in einigen Fällen nicht das finden kann, wonach Sie suchen elpy. Wie die Dokumente sagen:

Die Backends können nicht immer erkennen, um welche Art von Symbol es sich handelt. Vor allem nach ein paar Umwegen haben sie im Grunde keine Hoffnung, richtig zu raten, also tun sie es nicht

In diesem Fall bewirkt der Aufruf elpy-goto-definitionnichts und zeigt eine kleine Fehlermeldung im Echobereich an. In diesem Fall möchten Sie natürlich immer noch das finden, wonach Sie suchen, und elpylassen Sie nicht hängen. In solchen Situationen benutze ich immer C-c C-s( elpy-rgrep-symbol) rgrepfür das Symbol an der Stelle, an der sich das Projekt befindet. Zumindest für mich zeigt sich das, wonach ich suche, mehr oder weniger immer in den rgrepErgebnissen. Eigentlich denke ich, dass dies ähnlich ist, wie PyCharm es auch tut: Wenn Sie versuchen, die Definition von etwas nachzuschlagen und PyCharm nicht sicher ist, wo es definiert ist, müssen Sie aus einer Liste auswählen. Eigentlich bevorzuge ich die elpyImplementierung, da anstelle einer vorübergehenden Liste, die verschwindet, wenn Sie zur ersten Option wechseln,elpy-rgrep-symbol wird die Liste der Möglichkeiten in einem anderen Puffer offen lassen, so dass Sie bei Bedarf zwischen ihnen hin und her springen können.

Da sich mein Workflow fast immer auf den ersten Aufruf elpy-goto-definitionbezieht und der Aufruf fehlschlägt, habe elpy-rgrep-symbolich beschlossen, eine einfache Funktion zu hacken, die nur elpy-rgrep-symbolautomatisch aufruft , wenn der Aufruf elpy-goto-definitionfehlschlägt. Diese Funktion ist unten:

(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)))))

Dann binde ich dies an M-.(die Standardbindung für elpy-goto-definition).

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

Auf diese Weise kann ich eine meiner bevorzugten PyCharm-Funktionen in meinem bevorzugten Editor verwenden. Ich weiß, dass dies eine alte Frage ist, und Sie haben dieses Problem vielleicht bereits gelöst oder sind weitergegangen, aber ich hoffe, dass Sie oder jemand anderes dies nützlich finden!

elethan
quelle
4

python-mode.el bietet einen Befehl py-find-definition- siehe in der Menü-Hilfe.

Andreas Röhler
quelle
6
Beachten Sie, dass python-mode.el installiert sein muss. Es ist nicht das python-mode, was Emacs standardmäßig hat. ( stackoverflow.com/questions/11363089/… )
Brian Z
2

M-. arbeitet im anaconda-modus (auf den ich nach problemen mit elpy umgestiegen bin).

Beachten Sie, dass Sie die richtige Python - Umgebung, in meinem Fall brauchen kann ich die folgende: - mkvirtualenv someenv - python setup.py developfür alle Module oder Verwendung entwickeln (oder bevorzugen Quelle zu erreichen , statt der installierten Version) - M-x venv-workon someenvPfade in Emacs zu ermöglichen.

Dann habe ich configure anaconda-modeaktiv zu sein , wenn ich bearbeiten Python und voila, M-.Werke

Mekk
quelle
1

Gute Frage, das ist nicht sofort verfügbar und ein nützliches Feature für ausgewachsene IDEs. Ich mache das mit cscopeeiner netten Helm-Oberfläche:  http://wikemacs.org/wiki/Python#cscope Es kann Fragen wie "Wo ist dieses Symbol definiert? Wo wird es verwendet?" Beantworten.

ps: im bösen modus können wir mit zur definition eines symboles in der gleichen datei gehen gd.

Ehvince
quelle
Ich glaube gdan das Böse findet nur das erste Vorkommen des Symbols in der Datei (trotz der docstring: "Gehe zur Definition oder das erste Vorkommen des Symbols unter Punkt.")
Gordon Gustafson
0

M-.das ist verpflichtet, elpy-goto-definitionden Trick zu tun. Mit M-*können Sie zur vorherigen Position im Puffer zurückspringen. Auf diese Weise können Sie schnell etwas überprüfen und zum vorherigen Speicherort zurückkehren.

Ich benutze auch C-c C-o oft ( elpy-occur-definitions). Dies öffnet ein Fenster mit allen Klassen und Funktion ist der aktuelle Puffer. Wenn Sie in diesem Puffer auf drücken Enter, gelangen Sie zur Definition im Quellcode.

user989762
quelle
Tatsächlich ist AFAICT standardmäßig an eine Taste M-.gebunden xref-find-definitionsund elpy-goto-definitionbefindet sich auf keiner Taste (obwohl sie sich in Menüs befindet). Das Auffinden von Definitionen in Site-Paketen scheint überhaupt nicht zu funktionieren.
Robert P. Goldman
0

Jedi ist eine großartige Bibliothek für die automatische Vervollständigung / statische Analyse von Python. Ich habe sie viel früher verwendet, als ich vim verwendet habe.

Genau wie die Golang-Autovervollständigungs-Engine (dh der Gocode) sowohl für Vim als auch für Emacs funktioniert, funktioniert dieselbe Jedi-Engine sowohl für Vim als auch für Emacs .

Phye
quelle