2010-08-17 13 views
17

¿Hay un equivalente de limo para python?¿Cómo puedo usar meta-dot (M-.) En python con emacs?

Por ejemplo, si coloco el cursor en foo() y hago M-. (Ir a la definición) Me gustaría ver la definición del origen de la función foo

Esto debería funcionar independientemente de si foo es en

1) el directorio de proyecto local

2) de alguna ~/.virtualenvs/bar/site-packages

3) en algún otro pitón-ruta

4) env virtual está en uso (es decir, que debe ser en mi virtualenv actual)

lib/

¿La combinación pymacs/ropemacs hace algo de esto?

+1

Preferiría el equivalente de limo, es decir, algo que asimila python en el nivel de código/semántica, no solo en el nivel textual. Ropemacs o pymacs pueden ser lo que quiero, aunque no sé si ayuda con M-. de cualquier manera. – nunb

Respuesta

11

Para evitar el -e puede utilizar etags y con una encuentra que recurrentemente añadir el archivo de py:

find . -type f -name '*.py' | xargs etags 
+0

Sí, pero los archivos .py relevantes no están en un subdirectorio de mi código, están en ~/.virtualenv mientras yo trabajo en ~/src/project/foo – nunb

+0

Con find puedes usar cualquier directorio que desees: 'encontrar ~/.virtualenv -type f -name '* .py' | xargs etags' – mathk

+0

Supongo que esto requiere un enlace virtualenv entonces, para que las etiquetas se puedan generar automáticamente para cualquier directorio de trabajo + combo virtualenv en el que se encuentre el usuario. – nunb

4

M-. normalmente ejecuta la función "find-tag". Debe crear un archivo TAGS de sus archivos fuente de python. Luego, "visit-tags-table" antes de hacer una M-. De esta forma, Emacs saltará a todas las definiciones de la etiqueta. Escriba C-u M-. para pasar a la siguiente definición de tu etiqueta. Consulte la documentación de find-tag para obtener ayuda. Consulte a Emacs para saber cómo crear un archivo TAGS a partir de archivos fuente de Python.

Puede, por ejemplo, usar Exuberant Ctags para crear el archivo TAGS.

Ir al directorio raíz de los archivos de pitón y hacer esto:

ctags -e -R . 

un fichero de etiquetas normalmente se crea en el directorio raíz del proyecto.

+3

Recomiendo mirar http://www.emacswiki.org/emacs/EtagsSelect también, que proporciona una interfaz más agradable si enlaza 'M-.' a' etags-select-find-tag' – phils

+0

Con un etags en la raíz y varios proyectos no se confundirían entre las diferentes instalaciones del mismo paquete (¿paquetes de sitios múltiples?). O al menos, cada vez que aparece un búfer preguntándome * ¿a qué fuente no quiero ir? – nunb

+0

Crea un archivo TAGS para cada uno de sus proyectos en su directorio raíz respectivo (no en el directorio raíz/del sistema). Luego, usa 'visit-tags-table' en cada archivo TAGS que le interese. Todos los archivos TAGS de referencia se anexan a la variable 'tags-table-list'. Entonces, usando M-. , emacs busca la palabra clave en todos los archivos TAGS a los que se hace referencia en 'tags-table-list'. –

2

El siguiente índice voluntad su proyecto actual

find . -type f -name '*.py' | xargs etags

Pero si desea indexar sus libs importados. Primero activas tu virtualenv. Luego use which python para detectar dónde están sus libs y luego canalícelas a etags.

workon my-project # if using virtualenvwrappwer 
source bin/activate # if using virtualenv 

find ${$(which python)/\/bin\/python/} -type f -name '*.py' | xargs etags 
6

La mayoría de las respuestas mencionadas aquí están desactualizadas. Una solución simple es usar elpy para M-. sin etags (que requiere trabajo adicional).

Instalar elpy as mentioned here.

M-x package-install elpy 

y luego instalar los paquetes de Python

$ sudo pip install rope jedi 

emacs Restart, abrir cualquier archivo Python y correr M-.

Elpy está totalmente documentado, se puede leer about M-. here.

0

La respuesta aceptada omite un punto importante, si ejecuta etags como find . -type f -name '*.py' | xargs etags, cada uno de los archivos TAGS se generará cada vez para cada archivo.

La forma correcta de hacerlo es añadir datos en el fichero de etiquetas existentes con --append como

rm -f TAGS 
find . -type f -name '*.py' -print0 | xargs -0 etags --append 

Además, si desea incluir identificadores de paquetes sitio env virtual de dir (por ejemplo: ~/.virtualenvs/bar/lib/site-packages):

SITEPACKAGES=$(cdvirtualenv;pwd)/lib/python3.6/site-packages/ 
find $SITEPACKAGES -type f -name '*.py' -print0 | xargs -0 etags -a 

* ajustar python3.6 a la versión actual de Python

0

Trate de emacs anaconda-mode y company-anaconda paquetes. Actualización de configuración:

(eval-after-load "company" 
'(add-to-list 'company-backends 'company-anaconda)) 
(add-hook 'python-mode-hook 'anaconda-mode) 
(add-hook 'python-mode-hook 'company-mode) 

Cambiar a virtualenv con pythonic-activate, si tiene uno.

¡Ahora tiene M-. y puede presionar M-* para volver!

Cuestiones relacionadas