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 elpy
pacchetto ha questa funzione (oltre a molte altre utili funzioni IDE ). Tuttavia, se si utilizza elpy-goto-definition
per 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, elpy
non 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-definition
non 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 elpy
non ti lascia sospeso. In questo tipo di situazione uso sempre C-c C-s
( elpy-rgrep-symbol
) rgrep
per il simbolo nel punto in qualsiasi progetto mi trovo. Almeno per me, la cosa che cerco più o meno appare sempre nei rgrep
risultati. 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 elpy
l'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-definition
e, se fallisce, chiama elpy-rgrep-symbol
, ho deciso di hackerare insieme una semplice funzione che chiama elpy-rgrep-symbol
automaticamente solo se elpy-goto-definition
fallisce. 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!
python-mode
che Emacs ha di default. ( stackoverflow.com/questions/11363089/… )