2010-08-17 7 views
17

Gibt es ein Äquivalent Schleim für Python?Wie kann ich Meta-Punkt (M-.) In Python mit Emacs verwenden?

Zum Beispiel, wenn ich den Cursor auf foo() positionieren und M- tun. (Springe zur Definition) Ich möchte die Quelle Definition der Funktion foo sehen

Dies sollte unabhängig davon arbeiten, ob foo ist in

1) das lokale Projektverzeichnis

2) in einigen ~/.virtualenvs/bar/lib/site-packages

3) in einem anderen python-Pfad

4) virtuelle env in Gebrauch ist (dh es sollte in meinem aktuellen virtualenv aussehen)

Macht die Kombination pymacs/ropemacs etwas davon?

+1

Ich würde das Äquivalent von Schleim bevorzugen, das heißt, etwas, das Python auf der Code/semantischen Ebene, nicht nur auf der Textebene grogt. Ropemacs oder pymacs können sein, was ich will, obwohl ich nicht weiß, ob es mit M- hilft. in irgendeiner Weise. – nunb

Antwort

11

Um die -e zu vermeiden Sie etags und mit einem finden fügen Sie rekursiv die py-Datei verwenden können:

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

Ja, aber die relevanten .py-Dateien sind nicht in einem Unterverzeichnis meines Codes, sie sind in ~/.virtualenv, während ich in ~/src/project/foo arbeiten – nunb

+0

Mit finden Sie ein beliebiges Verzeichnis, das Sie wollen: 'finden ~/.virtualenv -type f -name '* .py' | xargs etags' – mathk

+0

Ich schätze das verlangt nach einem virtualenv Hook dann, damit die Tags automatisch für welches Arbeitsverzeichnis + virtualenv combo der User erzeugt werden kann generiert werden. – nunb

4

M-. führt normalerweise die Funktion "find-tag" aus. Sie sollten eine TAGS-Datei Ihrer Python-Quelldateien erstellen. Dann "visit-tags-table" bevor Sie ein M- machen. Auf diese Weise springt Emacs zu allen Definitionen des Tags. Typ C-u M-. um die nächste Definition Ihres Tags zu überspringen. Weitere Informationen finden Sie in der Dokumentation zu find-tags. Wenden Sie sich an Emacs, um zu erfahren, wie Sie eine TAGS-Datei aus Python-Quelldateien erstellen können.

Sie können zum Beispiel Exuberant Ctags zum Erstellen der TAGS-Datei verwenden.

Gehen Sie in das Stammverzeichnis Ihrer Python-Dateien und tun dies:

ctags -e -R . 

A TAGS-Datei wird normalerweise im Stammverzeichnis des Projekts erstellt.

+3

Ich empfehle auch, http://www.emacswiki.org/emacs/EtagsSelect zu betrachten, was eine schönere Schnittstelle bietet, wenn Sie 'M-.' an' Etags-select-find-tag' binden. – phils

+0

Mit einem Etag in root , und mehrere Projekte würden nicht zwischen verschiedenen Installationen des gleichen Pakets (mehrere Site-Pakete?) verwechselt werden. Oder zumindest, jedes Mal, wenn es einen Puffer auftauchen würde, fragte mich * welcher * Quelle defn wollte ich gehen? – nunb

+0

Sie erstellen eine TAGS-Datei für jedes Projekt in ihrem jeweiligen Stammverzeichnis (nicht im Stammverzeichnis/des Systems). Dann verwenden Sie 'visit-tags-table' in jeder TAGS-Datei, die Sie interessiert. Alle TAGS-Dateiverweise werden an die Variable 'tags-table-list' angehängt. Dann, mit M-. , emacs sucht nach dem Schlüsselwort in allen TAGS-Dateien, auf die in 'tags-table-list' verwiesen wird. –

2

Der folgende Willen Index Ihr aktuelles Projekt

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

Aber wenn Sie möchte deine importierten Bibliotheken indizieren. Sie aktivieren zuerst Ihr virtualenv. Verwenden Sie dann which python, um zu erkennen, wo sich Ihre Bibliotheken befinden, und leiten Sie sie dann an 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

Die meisten der hier genannten Antworten sind veraltet. Eine einfache Lösung ist die Verwendung von elpy für M-. ohne Etags (was zusätzliche Arbeit erfordert).

Installieren Sie elpy as mentioned here.

M-x package-install elpy 

und dann Python-Pakete

$ sudo pip install rope jedi 

Restart Emacs, öffnen Sie eine beliebige Python-Datei installieren und M-.

Elpy ist vollständig dokumentiert laufen, Sie about M-. here lesen kann.

0

Akzeptierte Antwort fehlt ein wichtiger Punkt, wenn Sie wie find . -type f -name '*.py' | xargs etags ausführen, dann würde jede TAGS-Datei jedes Mal für jede Datei generiert werden.

Der richtige Weg, es zu tun mit --append wie

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

auch Daten an die bestehende TAGS-Datei anhängen, wenn Sie Kennungen von virtuellen env-Website-Pakete beinhalten wollen dir (zB: ~/.virtualenvs/bar/lib/site-packages):

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

* anpassen python3.6 Ihrer aktuellen Python-Version

0

Versuchen emacs anaconda-mode und company-anaconda Pakete. Update config:

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

Umschalten auf virtualenv mit pythonic-activate, wenn Sie eine haben.

Jetzt haben Sie M-. und Sie können M-* drücken, um zurück zu gehen!