Come si usa Emacs per cercare una funzione in Python?


22

Qual è il modo più semplice per configurare Emacs per poter cercare dove è definita una funzione? Voglio evidenziarlo in Emacs e premere una combinazione di tasti per cercare dove si trova l'origine della funzione.

Puoi anche scoprire dove viene utilizzata una funzione specifica?

Questo è facilmente eseguibile in PyCharm, ma può essere facilmente eseguito anche in Emacs?

Risposte:


14

Hai provato Elpy ? Si lega elpy-goto-definitionalla chiave M-..
Se hai un Emacs recente, penso che puoi anche tornare indietro con xref-pop-marker-stack( M-,). Elpy ha anche altre belle funzionalità.

Per installarlo, seguire le istruzioni nel collegamento.


12

Uso la modalità Jedi per Python e ne sono molto contento. Non solo esegue ricerche accurate per le chiamate di funzione, ma risolve le funzioni nella definizione corretta anche in situazioni complicate (come l'ereditarietà). Viene fornito con il completamento automatico per l'avvio. http://tkf.github.io/emacs-jedi/latest/


8

La caratteristica di PyCharm che hai menzionato è stata una delle mie preferite e una delle prime cose che ho cercato nel tentativo di sostituire completamente PyCharm con Emacs (che sono felice di dire che sono stato in grado di fare).

Come menzionato in un'altra risposta, il elpypacchetto ha questa funzione (oltre a molte altre utili funzioni IDE ). Tuttavia, se si utilizza elpy-goto-definitionper cercare il simbolo in quel punto, prima o poi si scoprirà che in alcuni casi in cui PyCharm riuscirà a trovare quello che si sta cercando, elpynon lo sarà. Come dicono i documenti:

i backend non possono sempre identificare quale tipo di simbolo è al punto. Soprattutto dopo alcune indicazioni indirette, non hanno praticamente alcuna speranza di indovinare, quindi non lo fanno

In questo caso, invocare elpy-goto-definitionnon farà nulla e mostrerà un piccolo messaggio di errore nell'area dell'eco. Quando questo accade, ovviamente vuoi ancora trovare quello che stai cercando e elpynon ti lascia sospeso. In questo tipo di situazione uso sempre C-c C-s( elpy-rgrep-symbol) rgrepper il simbolo nel punto in qualsiasi progetto mi trovo. Almeno per me, la cosa che cerco più o meno appare sempre nei rgreprisultati. In realtà, penso che questo sia simile a quello che fa anche PyCharm: se provi a cercare la definizione di qualcosa e PyCharm non è sicuro di dove sia definito, ti farà scegliere da un elenco. In realtà preferisco elpyl'implementazione, perché piuttosto che un elenco temporaneo che scompare quando vai alla prima opzione,elpy-rgrep-symbol lascerà l'elenco delle possibilità aperto in un altro buffer in modo da poter saltare avanti e indietro tra di loro, se necessario.

Dato che il mio flusso di lavoro è quasi sempre quello di chiamare per primo elpy-goto-definitione, se fallisce, chiama elpy-rgrep-symbol, ho deciso di hackerare insieme una semplice funzione che chiama elpy-rgrep-symbolautomaticamente solo se elpy-goto-definitionfallisce. Quella funzione è di seguito:

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

Quindi lo associo a M-.(l'associazione predefinita per elpy-goto-definition).

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

In questo modo posso utilizzare una delle mie funzionalità preferite di PyCharm nel mio editor preferito. So che questa è una specie di vecchia domanda e potresti aver già risolto questo problema o andare avanti, ma spero che tu o qualcun altro lo trovi utile!



2

M-. funziona in modalità anaconda (a cui sono passato dopo aver avuto problemi con elpy).

Si noti che è necessario il corretto ambiente pitone, nel mio caso faccio la seguente: - mkvirtualenv someenv - python setup.py developper tutti i moduli sviluppare o utilizzare (o preferiscono per raggiungere fonte, invece di versione installata) - M-x venv-workon someenvper consentire percorsi di emacs.

Quindi configuro anaconda-modedi essere attivo ogni volta che modifico python e voilà, M-.funziona


1

Buona domanda, non disponibile immediatamente ed è una pratica funzionalità degli IDE in piena regola. Lo faccio con cscope, con una bella interfaccia timone:  http://wikemacs.org/wiki/Python#cscope Può rispondere a domande come "dove viene definito questo simbolo? Dove viene utilizzato?".

ps: in modalità male possiamo andare alla definizione di un simbolo nello stesso file con gd.


Credo che il gdmale trovi solo la prima occorrenza del simbolo nel file (nonostante la documentazione: "Vai alla definizione o prima occorrenza del simbolo sotto il punto").
Gordon Gustafson,

0

M-.che è destinato a elpy-goto-definitionfare il trucco. L'utilizzo M-*consente di tornare alla posizione precedente nel buffer. Ciò ti consente di controllare rapidamente qualcosa e tornare alla posizione precedente.

Uso anche C-c C-ospesso ( elpy-occur-definitions). Questo aprirà una finestra con tutte le classi e la funzione è il buffer corrente. Da quel buffer, premendo Enterti atterrerai sulla definizione nel codice sorgente.


In realtà, AFAICT M-.è associato xref-find-definitionse elpy-goto-definitionnon è su alcun tasto per impostazione predefinita (sebbene sia nei menu). Trovare le definizioni nei pacchetti del sito non sembra funzionare affatto bene.
Robert P. Goldman,

0

Jedi è una fantastica libreria di completamento automatico / analisi statica per Python, che ho usato molto indietro quando stavo usando vim.

Proprio come il motore golang completamento automatico (cioè gocode) funziona sia per vim e emacs, lo stesso motore Jedi funziona sia per vim e emacs .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.