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/… )M-. funciona no modo anaconda (para o qual mudei depois de ter problemas com o elpy).
Observe que você precisa de um ambiente python adequado, no meu caso, faço o seguinte: -
mkvirtualenv someenv
-python setup.py develop
para todos os módulos desenvolvem ou usam (ou preferem alcançar a fonte em vez da versão instalada) -M-x venv-workon
someenv
para ativar caminhos no emacs.Então eu configuro
anaconda-mode
para estar ativo sempre que eu editar python e voila,M-.
funcionafonte
Boa pergunta, isso não está disponível imediatamente e é um recurso útil dos IDEs completos. Eu faço isso com
cscope
, com uma boa interface de leme: http://wikemacs.org/wiki/Python#cscope Ele pode responder a perguntas como "onde esse símbolo é definido? Onde é usado?".ps: no modo maligno, podemos ir para a definição de um símbolo no mesmo arquivo com
gd
.fonte
gd
no mal só encontra a primeira ocorrência do símbolo no arquivo: (apesar do docstring "Ir para definição ou primeira ocorrência do símbolo no ponto.")M-.
que é obrigado aelpy-goto-definition
fazer o truque. O usoM-*
permitirá que você volte para o local anterior no buffer. Isso permite que você verifique rapidamente algo e volte ao local anterior.Eu também uso
C-c C-o
frequentemente (elpy-occur-definitions
). Isso abrirá uma janela com todas as classes e a função é o buffer atual. Nesse buffer, pressionar pressionaráEnter
você na definição no código-fonte.fonte
M-.
está vinculado axref-find-definitions
eelpy-goto-definition
não está em nenhuma tecla por padrão (embora esteja nos menus). Encontrar definições nos pacotes de sites não parece funcionar muito bem.O Jedi é uma excelente biblioteca de análise de preenchimento automático / estática para Python.
Assim como o mecanismo de preenchimento automático golang (ou seja, gocode) funciona tanto no vim quanto no emacs, o mesmo mecanismo Jedi funciona no vim e no emacs .
fonte