Powiedzmy, że mam skrypt python z błędem środowiska wykonawczego:
$ cat example.py
#! /usr/bin/env python3
a = 1/0
co daje:
$ python3 example.py
Traceback (most recent call last):
File "example.py", line 3, in <module>
a = 1/0
ZeroDivisionError: division by zero
Chcę, aby Vim przeskoczył do problematycznej linii tego pliku (w tym przypadku linii 3). Wiem, że Vim może to zrobić, ponieważ działa dobrze do wychwytywania błędów w czasie kompilacji w C przy gcc
użyciu :make
i quickfix
okna.
Jasne, mogę wypełnić okno szybkiej poprawki Vima za pomocą, :set makeprg=python3\ %
a następnie :make
, ale nie przeskakuje on do numeru linii, na który wskazuje ślad. Kiedy patrzę w :copen
to, po prostu podświetla pierwszą linię śladu i nie mogę przeskoczyć do odpowiedniego numeru linii.
( jessie
W przypadku Debiana korzystam z Vima 7.4 .)
Moje pytania to:
Czy mogę skonfigurować Vima, aby wiedział, jak uzyskać odpowiedni numer linii ze śledzenia w Pythonie?
Czy mogę zmodyfikować interpreter Pythona, aby wyrzucił format błędu, który Vim już wie, jak analizować i uzyskać odpowiedni numer linii?
źródło
errorformat
odpowiednio go dostosuj i napisz wtyczkę kompilatora dla Vima (patrz:help :compiler
i:help write-compiler-plugin
). Prawdopodobnie nie warte wysiłku, jeśli nie wiesz dokładnie, co robisz i nie jesteś wystarczająco entuzjastyczny, aby wykopać wszystko z dokumentów.Odpowiedzi:
Vim zawiera zestaw skryptów „kompilatora”, z których jeden nazywa się „pyunit” . Jeśli uruchomisz,
:compiler pyunit
a następnie:make
(z sugerowaną wartością dla'makeprg'
), poprawka zostanie zapełniona zgodnie z oczekiwaniami. Działa to jednak dobrze tylko wtedy, gdy istnieje jeden poziom śledzenia stosu.Ulepszenie tego skryptu kompilatora byłoby przydatnym ćwiczeniem.
Rozebranie stosu wtyczki mogą być interesujące, gdyż zapewnia ogólny mechanizm do analizowania i wyświetlać lokalizacje zgłoszone w ślad stosu i posiada wsparcie Pythona wbudowany.
źródło
Wbudowana wtyczka kompilatora
pyunit
Jak już zasugerował jamessan , jedną z opcji jest użycie wbudowanej wtyczki kompilatora
pyunit
:Ma to tę wadę, że zwija ślad stosu do pojedynczego komunikatu o błędzie. Na przykład następujący skrypt Pythona:
... wyświetla ten komunikat o błędzie:
Pisanie własnej wtyczki kompilatora
Alternatywnie możesz podać własną wtyczkę kompilatora
~/.vim/compiler/python.vim
:Wybierz wtyczkę ręcznie za pomocą
:compiler python
lub załaduj ją automatycznie, dodając to do~/.vim/after/ftplugin/python.vim
:W powyższym skrypcie Pythona Vim zapełnia okno poprawki:
Zobacz
:help write-compiler-plugin
więcej informacji.źródło
quickfix.py analizuje dane śledzenia w przyjazny dla formatu vim format błędu. Oto przykład uruchomienia go na pliku z pojedynczą linią
1 / 0
.Domyślnie pokazuje pliki użytkownika, ale może także wyświetlać pliki systemowe (uruchamiając je na pliku zawierającym
import os; os.environ['123']
):Konfiguracja:
Gdy
quickfix.py
jest dostępny w bieżącej ścieżce, dodaj następujące wiersze w vimrc, aby go użyć.źródło
Nie jest to metoda automatyczna, ale Traceback w Pythonie podaje numer linii --- 3 w twoim przykładzie --- i dlatego wywołuje vim:
$ vim +3 example.py
otworzy
example.py
kursor w trzecim wierszu.źródło
:make
pliku, który już otworzyłem, szybsze:3
jest przejście do trzeciej linii niż zamknięcie i ponowne otwarcie. Robienie tego ręcznie jest również uciążliwe dla bardziej złożonych śladów stosu, dlatego chcę obsługiwać Quickfix.