Como usar o Emacs para procurar uma função no Python?

22

Qual é a maneira mais fácil de configurar o Emacs para poder procurar onde uma função está definida? Quero destacá-lo no Emacs e pressionar uma combinação de teclas para procurar onde está a fonte da função.

Você também pode descobrir onde uma função específica está sendo usada?

Isso é feito facilmente no PyCharm, mas também pode ser feito facilmente no Emacs?

Baixo Kian Seong
fonte

Respostas:

14

Você experimentou Elpy ? Liga-se elpy-goto-definitionà chave M-..
Se você tem um Emacs recente, acho que também pode voltar com xref-pop-marker-stack( M-,). Elpy também tem outros recursos interessantes.

Para instalá-lo, siga as instruções no link.

bmag
fonte
12

Eu uso o modo Jedi para Python e estou muito feliz com isso. Ele não apenas realiza pesquisas precisas de chamadas de função, mas também resolve as funções com a definição correta, mesmo em situações complicadas (como herança). Vem com auto completar para inicializar. http://tkf.github.io/emacs-jedi/latest/

Achintya Sharma
fonte
8

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!

elethan
fonte
4

python-mode.el fornece um comando py-find-definition- veja no menu Ajuda.

Andreas Röhler
fonte
6
Observe que o python-mode.el deve ser instalado. Não é o python-modeque o Emacs possui por padrão. ( stackoverflow.com/questions/11363089/… )
Brian Z
2

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 developpara todos os módulos desenvolvem ou usam (ou preferem alcançar a fonte em vez da versão instalada) - M-x venv-workon someenvpara ativar caminhos no emacs.

Então eu configuro anaconda-modepara estar ativo sempre que eu editar python e voila, M-.funciona

Mekk
fonte
1

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.

Ehvince
fonte
Eu acredito gdno 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.")
Gordon Gustafson
0

M-.que é obrigado a elpy-goto-definitionfazer o truque. O uso M-*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-ofrequentemente ( elpy-occur-definitions). Isso abrirá uma janela com todas as classes e a função é o buffer atual. Nesse buffer, pressionar pressionará Entervocê na definição no código-fonte.

user989762
fonte
Na verdade, AFAICT, M-.está vinculado a xref-find-definitionse elpy-goto-definitionnã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.
Robert P. Goldman
0

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 .

phye
fonte