Supporto di Quickfix per i traceback di Python


18

Supponiamo che io abbia uno script Python con un errore di runtime:

$ cat example.py  
#! /usr/bin/env python3

a = 1/0

che dà:

$ python3 example.py 
Traceback (most recent call last):
  File "example.py", line 3, in <module>
    a = 1/0
ZeroDivisionError: division by zero

Voglio che Vim passi alla riga problematica di quel file (riga 3 in questo caso). So che Vim può farlo perché funziona benissimo per rilevare errori in fase di compilazione in C con gccusing :makee la quickfixfinestra.

uscita quickfix da gcc

Certo, posso popolare la finestra di quickfix di Vim con :set makeprg=python3\ %e quindi :make, ma non passa al numero di riga a cui punta il traceback. Quando lo guardo :copen, evidenzia solo la prima riga della traccia e non posso passare al numero di riga pertinente.

output quickfix da python3

(Sto usando Vim 7.4 su Debian jessienel caso in cui sia importante.)

Le mie domande sono:

  • Posso configurare Vim in modo che sappia come ottenere il numero di riga rilevante da un traceback di Python?

  • Posso modificare l'interprete Python per emettere un formato di errore che Vim già sa come analizzare e ottenere il numero di riga pertinente?


È possibile sottoclassare il logger nel proprio script per produrre punti di traceback uno per riga (vedere qui per iniziare), quindi regolare di errorformatconseguenza e scrivere un plug-in del compilatore per Vim (vedere :help :compilere :help write-compiler-plugin). Probabilmente non vale la pena se non sai esattamente cosa stai facendo e non sei abbastanza entusiasta di estrarre tutto dai documenti.
Sato Katsura,

Ho fatto una domanda simile su StackOverflow, si possono trovare quelle risposte utili stackoverflow.com/questions/11333112/...
jalanb

Risposte:


7

Vim viene fornito con una serie di script "compilatore", uno dei quali si chiama "pyunit" . Se si esegue :compiler pyunite quindi :make(con il valore suggerito per 'makeprg'), la correzione rapida viene popolata come previsto. Tuttavia, funziona bene solo se esiste un livello per la traccia dello stack.

Migliorare quello script del compilatore sarebbe un esercizio utile.

Il plugin unstack può essere interessante, in quanto fornisce un meccanismo generale per analizzare e visualizzare le posizioni riportate in una traccia dello stack e ha il supporto Python integrato.


4

Plugin compilatore integrato pyunit

Come già suggerito da jamessan , un'opzione è quella di utilizzare il plug-in del compilatore incorporato pyunit:

:compiler pyunit
:set makeprg=python3\ %
:make

Questo ha il rovescio della medaglia, che comprime la traccia dello stack in un singolo messaggio di errore. Ad esempio il seguente script python:

def lumberjack():
    bright_side_of_death()

def bright_side_of_death():
    return tuple()[0]

lumberjack()

... produce questo messaggio di errore:

|| Traceback (most recent call last):
lumberjack.py|7|  IndexError: tuple index out of range

Scrivi il tuo plugin compilatore

In alternativa, puoi fornire il tuo plugin compilatore in ~/.vim/compiler/python.vim:

if exists("current_compiler")
  finish
endif
let current_compiler = "python"

let s:cpo_save = &cpo
set cpo&vim

CompilerSet errorformat=
      \%*\\sFile\ \"%f\"\\,\ line\ %l\\,\ %m,
      \%*\\sFile\ \"%f\"\\,\ line\ %l,
CompilerSet makeprg=python3\ %

let &cpo = s:cpo_save
unlet s:cpo_save

Seleziona il plugin manualmente con :compiler pythono caricalo automaticamente aggiungendolo a ~/.vim/after/ftplugin/python.vim:

if !exists("current_compiler")
  compiler python
endif

Con lo script python dall'alto, Vim popola la finestra di quickfix con:

|| Traceback (most recent call last):
lumberjack.py|7| in <module>
||     lumberjack()
lumberjack.py|2| in lumberjack
||     bright_side_of_death()
lumberjack.py|5| in bright_side_of_death
||     return tuple()[0]
|| IndexError: tuple index out of range

Vedi :help write-compiler-pluginper maggiori informazioni.


3

quickfix.py analizza il traceback in un formato di errore compatibile con vim. Ecco un esempio di esecuzione su un file con una sola riga 1 / 0.

❯❯❯ quickfix.py tests/errors/div_by_zero.py
"tests/errors/div_by_zero.py":1: ZeroDivisionError: division by zero

Per impostazione predefinita, mostra i file dell'utente, ma può anche mostrare i file di sistema (eseguendolo su un file contenente import os; os.environ['123']):

❯❯❯ quickfix.py -a /tmp/test.py                                                                                                        
"/usr/lib/lib/python3.7/os.py":678: KeyError: '123'
"/tmp/test.py":1: in function <module>

Configurazione:

Quando quickfix.pyè disponibile nel percorso corrente, aggiungere le seguenti righe nel vimrc per usarlo.

if has("autocmd")
  autocmd FileType python setlocal makeprg=quickfix.py\ %
  autocmd FileType python setlocal errorformat=%E\"%f\":%l:%m,
endif

-1

Non è un metodo automatico ma Traceback di Python indica il numero di riga --- 3 nel tuo esempio --- e quindi invoca vim:

$ vim +3 example.py

aprirà il example.pycon il cursore sulla terza riga.


2
Ne sono consapevole, ma si tratta del supporto di Quickfix. Dopo aver eseguito :makeun file che ho già aperto, è più veloce usare :3per saltare alla terza riga che per chiudere e riaprire. Inoltre, fare questo manualmente è una seccatura per tracce di stack più complesse, motivo per cui voglio il supporto Quickfix.
Nathaniel M. Beaver,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.