Angenommen, ich habe ein Python-Skript mit einem Laufzeitfehler:
$ cat example.py
#! /usr/bin/env python3
a = 1/0
was gibt:
$ python3 example.py
Traceback (most recent call last):
File "example.py", line 3, in <module>
a = 1/0
ZeroDivisionError: division by zero
Ich möchte, dass Vim zur problematischen Zeile dieser Datei (in diesem Fall Zeile 3) springt. Ich weiß, dass Vim dies kann, weil es gut funktioniert, um Fehler beim Kompilieren in C mit gcc
using :make
und dem quickfix
Fenster abzufangen.
Klar, ich kann das Quickfix-Fenster von Vim mit :set makeprg=python3\ %
und füllen :make
, aber es springt nicht zu der Zeilennummer, auf die das Traceback verweist. Wenn ich hineinschaue :copen
, hebt es nur die erste Zeile der Kurve hervor und ich kann nicht zur entsprechenden Zeilennummer springen.
(Ich benutze Vim 7.4 unter Debian, jessie
falls es darauf ankommt.)
Meine Fragen sind:
Kann ich Vim so konfigurieren, dass es weiß, wie die relevante Zeilennummer von einem Python-Traceback stammt?
Kann ich den Python-Interpreter so ändern, dass er ein Fehlerformat ausgibt, von dem Vim bereits weiß, wie man die relevante Zeilennummer analysiert und abruft?
quelle
errorformat
und ein Compiler-Plugin für Vim schreiben (siehe:help :compiler
und:help write-compiler-plugin
). Die Mühe lohnt sich wahrscheinlich nicht, wenn Sie nicht genau wissen , was Sie tun, und nicht enthusiastisch genug sind, um alles aus den Dokumenten herauszuholen.Antworten:
Vim wird mit einer Reihe von "Compiler " -Skripten geliefert , von denen eines "Pyunit" heißt . Wenn Sie ausführen
:compiler pyunit
und dann:make
(mit Ihrem vorgeschlagenen Wert für'makeprg'
), wird Quickfix wie erwartet ausgefüllt. Dies funktioniert jedoch nur, wenn der Stack-Trace eine Ebene aufweist.Die Verbesserung dieses Compilerskripts wäre eine nützliche Übung.
Das Unstack- Plugin kann von Interesse sein, da es einen allgemeinen Mechanismus zum Analysieren und Anzeigen der in einem Stack-Trace gemeldeten Speicherorte bietet und Python-Unterstützung integriert ist.
quelle
Eingebautes Compiler-Plugin
pyunit
Wie bereits von jamessan vorgeschlagen , besteht eine Möglichkeit darin, das eingebaute Compiler-Plugin zu verwenden
pyunit
:Dies hat den Nachteil, dass der Stack-Trace zu einer einzigen Fehlermeldung reduziert wird. Zum Beispiel das folgende Python-Skript:
... erzeugt diese Fehlermeldung:
Schreiben Sie Ihr eigenes Compiler-Plugin
Alternativ können Sie Ihr eigenes Compiler-Plugin bereitstellen
~/.vim/compiler/python.vim
:Wählen Sie das Plugin manuell mit aus
:compiler python
oder laden Sie es automatisch, indem Sie dies hinzufügen zu~/.vim/after/ftplugin/python.vim
:Mit dem Python-Skript von oben füllt Vim das Quickfix-Fenster mit:
Siehe
:help write-compiler-plugin
für weitere Informationen.quelle
quickfix.py analysiert das Traceback in ein vim-freundliches Fehlerformat. Hier ist ein Beispiel für die Ausführung in einer Datei mit einer einzelnen Zeile
1 / 0
.Standardmäßig werden Benutzerdateien angezeigt, es können jedoch auch Systemdateien angezeigt werden (die auf einer Datei ausgeführt werden, die Folgendes enthält
import os; os.environ['123']
):Aufbau:
Wenn
quickfix.py
im aktuellen Pfad verfügbar, fügen Sie die folgenden Zeilen in den vimrc ein, um ihn zu verwenden.quelle
Keine automatische Methode, aber das Python-Traceback gibt die Zeilennummer --- 3 in Ihrem Beispiel --- an und ruft so vim auf:
$ vim +3 example.py
öffnet das
example.py
mit dem Cursor in der dritten Zeile.quelle
:make
eine bereits geöffnete Datei ausgeführt habe, können Sie schneller:3
in die dritte Zeile springen, als sie schließen und erneut öffnen. Das manuelle Ausführen ist auch eine Herausforderung für komplexere Stack-Traces. Aus diesem Grund möchte ich Quickfix-Unterstützung.