¿Cómo uso Emacs para buscar una función en Python?

22

¿Cuál es la forma más fácil de configurar Emacs para poder buscar dónde se define una función? Quiero resaltarlo en Emacs y presionar una combinación de teclas para buscar dónde está la fuente de la función.

¿También puede averiguar dónde se está utilizando una función específica?

Esto se hace fácilmente en PyCharm, pero ¿también se puede hacer fácilmente en Emacs?

Bajo Kian Seong
fuente

Respuestas:

14

¿Intentaste con Elpy ? Se une elpy-goto-definitiona la clave M-..
Si tiene un Emacs reciente, creo que también puede volver con xref-pop-marker-stack( M-,). Elpy tiene algunas otras características agradables también.

Para instalarlo, siga las instrucciones en el enlace.

bmag
fuente
12

Uso el modo Jedi para Python y estoy muy contento con él. No solo realiza búsquedas precisas para llamadas a funciones, sino que resuelve las funciones con la definición correcta incluso en situaciones complicadas (como la herencia). Viene con autocompletar para arrancar. http://tkf.github.io/emacs-jedi/latest/

Achintya Sharma
fuente
8

La característica de PyCharm que mencionas fue una de mis favoritas, y una de las primeras cosas que busqué al tratar de reemplazar PyCharm completamente con Emacs (que estoy feliz de decir que he podido hacer).

Como se mencionó en otra respuesta, el elpypaquete tiene esta característica (además de muchas otras características útiles de IDE ). Sin embargo, si usa elpy-goto-definitionpara buscar el símbolo en el punto, tarde o temprano encontrará que, en algunos casos, PyCharm podría encontrar lo que está buscando, elpypero no lo hará. Como dicen los documentos:

los backends no siempre pueden identificar qué tipo de símbolo está en el punto. Especialmente después de algunas indirectas, básicamente no tienen ninguna esperanza de acertar, por lo que no

En este caso, invocar elpy-goto-definitionno hará nada y mostrará un pequeño mensaje de error en el área de eco. Cuando esto sucede, por supuesto, todavía desea encontrar lo que está buscando y elpyno lo deja colgado. En este tipo de situación siempre uso C-c C-s( elpy-rgrep-symbol) rgreppara el símbolo en el punto en cualquier proyecto en el que me encuentre. Al menos para mí, lo que busco más o menos siempre aparece en los rgrepresultados. En realidad, creo que esto es similar a lo que hace PyCharm también: si intentas buscar la definición de algo y PyCharm no está seguro de dónde está definido, te hará elegir de una lista. De hecho, prefiero elpyla implementación, porque en lugar de una lista transitoria que desaparece cuando vas a la primera opción,elpy-rgrep-symbol dejará la lista de posibilidades abierta en otro búfer para que pueda saltar entre ellas si es necesario.

Como mi flujo de trabajo es casi siempre llamar primero elpy-goto-definitiony si falla, llamar elpy-rgrep-symbol, decidí hackear una función simple que solo llama elpy-rgrep-symbolautomáticamente si elpy-goto-definitionfalla. Esa función está abajo:

(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)))))

Luego lo asocio a M-.(el enlace predeterminado para elpy-goto-definition).

(define-key elpy-mode-map (kbd "M-.") 'goto-def-or-rgrep)

De esta manera, puedo usar una de mis funciones favoritas de PyCharm en mi editor favorito. Sé que esta es una pregunta vieja y es posible que ya haya resuelto este problema o haya seguido adelante, ¡pero espero que usted u otra persona lo encuentren útil!

elethan
fuente
4

python-mode.el proporciona un comando py-find-definition; consulte el menú Ayuda.

Andreas Röhler
fuente
66
Tenga en cuenta que python-mode.el tiene que estar instalado. No es el python-modeque Emacs tiene por defecto. ( stackoverflow.com/questions/11363089/… )
Brian Z
2

METRO-. funciona en modo anaconda (que cambié después de tener problemas con elpy).

Tenga en cuenta que lo que necesita el medio ambiente pitón adecuada, en mi caso hago lo siguiente: - mkvirtualenv someenv - python setup.py developpara todos los módulos se desarrollan o uso (o prefieren llegar a la fuente en lugar de la versión instalada) - M-x venv-workon someenvpara permitir caminos en emacs.

Luego configuro anaconda-modepara estar activo cada vez que edito python y voila, M-.funciona

Mekk
fuente
1

Buena pregunta, que no está disponible desde el primer momento y es una característica útil de los IDE completos. Lo hago cscopecon una bonita interfaz de timón:  http://wikemacs.org/wiki/Python#cscope Puede responder preguntas como "¿dónde se define este símbolo? ¿Dónde se usa?".

ps: en modo malvado podemos ir a la definición de un símbolo en el mismo archivo con gd.

Ehvince
fuente
Creo gden el mal solo encuentra la primera aparición del símbolo en el archivo (a pesar de la cadena de documentación: "Ir a la definición o primera aparición del símbolo debajo del punto")
Gordon Gustafson
0

M-.que está obligado a elpy-goto-definitionhacer el truco. El uso M-*le permitirá volver a la ubicación anterior en el búfer. Esto le permite verificar rápidamente algo y volver a la ubicación anterior.

También uso a C-c C-omenudo ( elpy-occur-definitions). Esto abrirá una ventana con toda la clase y la función es el búfer actual. Desde ese búfer, presionar lo Enterllevará a la definición en el código fuente.

usuario989762
fuente
En realidad, AFAICT M-.está vinculado xref-find-definitionsy elpy-goto-definitionno está en ninguna tecla por defecto (aunque está en los menús). Encontrar definiciones en los paquetes del sitio no parece funcionar del todo bien.
Robert P. Goldman
0

Jedi es una impresionante biblioteca de autocompletado / análisis estático para Python, la utilicé mucho antes cuando usaba vim.

Al igual que el motor de autocompletado de golang (es decir, gocode) funciona tanto para vim como para emacs, el mismo motor Jedi funciona tanto para vim como para emacs .

phye
fuente