Digamos que tengo un script de Python con un error de tiempo de ejecución:
$ cat example.py
#! /usr/bin/env python3
a = 1/0
lo que da:
$ python3 example.py
Traceback (most recent call last):
File "example.py", line 3, in <module>
a = 1/0
ZeroDivisionError: division by zero
Quiero que Vim salte a la línea problemática de ese archivo (línea 3 en este caso). Sé que Vim puede hacer esto porque funciona bien para detectar errores en tiempo de compilación en C con el gcc
uso :make
y la quickfix
ventana.
Claro, puedo llenar la ventana de corrección rápida de Vim con :set makeprg=python3\ %
y luego :make
, pero no salta al número de línea donde apunta el rastreo. Cuando lo miro :copen
, solo resalta la primera línea de la traza, y no puedo saltar al número de línea relevante.
(Estoy usando Vim 7.4 en Debian jessie
en caso de que eso importe).
Mis preguntas son:
¿Puedo configurar Vim para que sepa cómo obtener el número de línea relevante de un rastreo de Python?
¿Puedo modificar el intérprete de Python para escupir un formato de error que Vim ya sabe cómo analizar y obtener el número de línea relevante?
fuente
errorformat
consecuencia y escriba un complemento compilador para Vim (consulte:help :compiler
y:help write-compiler-plugin
). Probablemente no valga la pena el esfuerzo si no sabe exactamente lo que está haciendo y no está lo suficientemente entusiasmado como para sacar todo de los documentos.Respuestas:
Vim viene con un conjunto de scripts de "compilador", uno de los cuales se llama "pyunit" . Si ejecuta
:compiler pyunit
y luego:make
(con su valor sugerido para'makeprg'
), la solución rápida se rellena como espera. Sin embargo, solo funciona bien si hay un nivel en el seguimiento de la pila.Mejorar ese script del compilador sería un ejercicio útil.
El complemento de desapilamiento puede ser de interés, ya que proporciona un mecanismo general para analizar y ver las ubicaciones informadas en un seguimiento de pila y tiene incorporado soporte para Python.
fuente
Construido en el complemento del compilador
pyunit
Como ya sugirió jamessan , una opción es usar el complemento del compilador incorporado
pyunit
:Esto tiene el inconveniente de que contrae el seguimiento de la pila en un solo mensaje de error. Por ejemplo, el siguiente script de Python:
... produce este mensaje de error:
Escribir su propio complemento compilador
Como alternativa, puede proporcionar su propio complemento de compilador en
~/.vim/compiler/python.vim
:Seleccione el complemento manualmente
:compiler python
o cárguelo automáticamente agregándolo a~/.vim/after/ftplugin/python.vim
:Con el script de Python de arriba, Vim llena la ventana de corrección rápida con:
Ver
:help write-compiler-plugin
para más información.fuente
quickfix.py analiza el rastreo en un formato de error compatible con vim. Aquí hay un ejemplo de cómo ejecutarlo en un archivo con una sola línea
1 / 0
.Por defecto, muestra archivos de usuario, pero también puede mostrar archivos del sistema (ejecutándolo en un archivo que contiene
import os; os.environ['123']
):Configuración:
Cuando
quickfix.py
esté disponible en la ruta actual, agregue las siguientes líneas en el vimrc para usarlo.fuente
No es un método automático, pero Python Traceback establece el número de línea --- 3 en su ejemplo --- e invocando vim:
$ vim +3 example.py
se abrirá
example.py
con el cursor en la tercera línea.fuente
:make
un archivo que ya tengo abierto, es más rápido usar:3
para saltar a la tercera línea que cerrar y volver a abrir. Además, hacer esto manualmente es una molestia para los seguimientos de pila más complejos, por eso quiero soporte Quickfix.