O recurso do PyCharm que você mencionou foi um dos meus favoritos e uma das primeiras coisas que procurei ao tentar substituir completamente o PyCharm pelo Emacs (o que fico feliz em dizer que fui capaz de fazer).
Conforme mencionado em outra resposta, o elpypacote possui esse recurso (além de muitos outros recursos úteis do IDE ). No entanto, se você usarelpy-goto-definition procurar o símbolo no momento, descobrirá, mais cedo ou mais tarde, que em alguns casos em que o PyCharm conseguiria encontrar o que estava procurando, elpynão conseguiria. Como dizem os documentos:
os back-end nem sempre conseguem identificar que tipo de símbolo está em questão. Especialmente depois de alguns indiretos, eles basicamente não têm esperança de acertar, então não
Nesse caso, a chamada elpy-goto-definitionnão fará nada e mostrará uma pequena mensagem de erro na área de eco. Quando isso acontece, é claro que você ainda deseja encontrar o que está procurando e elpynão o deixa esperando. Nesse tipo de situação, eu sempre uso C-c C-s( elpy-rgrep-symbol) rgreppara o símbolo em ponto em qualquer projeto em que estou. Pelo menos para mim, o que estou procurando mais ou menos sempre aparece nos rgrepresultados. Na verdade, acho que isso é semelhante ao que o PyCharm também faz: se você tentar procurar a definição de algo e o PyCharm não tiver certeza de onde está definido, terá que escolher uma lista. Na verdade, eu prefiro elpya implementação, porque, em vez de uma lista transitória que desaparece quando você acessa a primeira opção,elpy-rgrep-symbol deixará a lista de possibilidades aberta em outro buffer, para que você possa alternar entre elas, se necessário.
Como meu fluxo de trabalho é quase sempre a primeira chamada elpy-goto-definitione, se falhar, chamei elpy-rgrep-symbol, decidi criar uma função simples que apenas chama elpy-rgrep-symbolautomaticamente se elpy-goto-definitionfalhar. Essa função está abaixo:
(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)))))
Então eu vinculo isso a M-.(a ligação padrão para elpy-goto-definition).
(define-key elpy-mode-map (kbd "M-.") 'goto-def-or-rgrep)
Dessa forma, posso usar um dos meus recursos favoritos do PyCharm no meu editor favorito. Sei que essa é uma pergunta antiga e você já pode ter resolvido esse problema ou seguiu em frente, mas espero que você ou outra pessoa ache isso útil!
python-modeque o Emacs possui por padrão. ( stackoverflow.com/questions/11363089/… )