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 elpy
pacote 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, elpy
nã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-definition
nã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 elpy
não o deixa esperando. Nesse tipo de situação, eu sempre uso C-c C-s
( elpy-rgrep-symbol
) rgrep
para 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 rgrep
resultados. 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 elpy
a 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-definition
e, se falhar, chamei elpy-rgrep-symbol
, decidi criar uma função simples que apenas chama elpy-rgrep-symbol
automaticamente se elpy-goto-definition
falhar. 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-mode
que o Emacs possui por padrão. ( stackoverflow.com/questions/11363089/… )