Disons que j'ai un script python avec une erreur d'exécution:
$ cat example.py
#! /usr/bin/env python3
a = 1/0
qui donne:
$ python3 example.py
Traceback (most recent call last):
File "example.py", line 3, in <module>
a = 1/0
ZeroDivisionError: division by zero
Je veux que Vim passe à la ligne problématique de ce fichier (ligne 3 dans ce cas). Je sais que Vim peut le faire car cela fonctionne très bien pour détecter les erreurs au moment de la compilation en C avec l' gcc
aide de :make
et la quickfix
fenêtre.
Bien sûr, je peux remplir la fenêtre de correction rapide de Vim avec :set makeprg=python3\ %
puis :make
, mais il ne saute pas au numéro de ligne vers lequel pointe le traçage. Quand je regarde :copen
dedans, il met juste en évidence la première ligne de la trace, et je ne peux pas passer au numéro de ligne correspondant.
(J'utilise Vim 7.4 sur Debian jessie
au cas où cela compte.)
Mes questions sont:
Puis-je configurer Vim pour qu'il sache comment obtenir le numéro de ligne approprié à partir d'un suivi Python?
Puis-je modifier l'interpréteur Python pour cracher un format d'erreur que Vim sait déjà comment analyser et obtenir le numéro de ligne approprié?
la source
errorformat
conséquence et écrire un plugin de compilation pour Vim (voir:help :compiler
et:help write-compiler-plugin
). Cela ne vaut probablement pas la peine si vous ne savez pas exactement ce que vous faites et si vous n'êtes pas assez enthousiaste pour tout extraire des documents.Réponses:
Vim est livré avec un ensemble de scripts "compilateur", dont l'un est appelé "pyunit" . Si vous exécutez
:compiler pyunit
puis:make
(avec la valeur suggérée pour'makeprg'
), quickfix est renseigné comme prévu. Cependant, cela ne fonctionne bien que s'il y a un niveau dans la trace de la pile.Améliorer ce script de compilation serait un exercice utile.
Le plugin unstack peut être intéressant, car il fournit un mécanisme général pour analyser et afficher les emplacements signalés dans une trace de pile et prend en charge Python.
la source
Plugin de compilation intégré
pyunit
Comme déjà suggéré par jamessan , une option consiste à utiliser le plugin de compilation intégré
pyunit
:Cela a l'inconvénient de réduire la trace de la pile en un seul message d'erreur. Par exemple, le script python suivant:
... produit ce message d'erreur:
Écrire votre propre plugin de compilation
Comme alternative, vous pouvez fournir votre propre plugin de compilation dans
~/.vim/compiler/python.vim
:Sélectionnez le plugin manuellement avec
:compiler python
ou chargez-le automatiquement en l'ajoutant à~/.vim/after/ftplugin/python.vim
:Avec le script python d'en haut, Vim remplit la fenêtre quickfix avec:
Voir
:help write-compiler-plugin
pour plus d'informations.la source
quickfix.py analyse le traceback dans un format d'erreur compatible avec vim. Voici un exemple d'exécution sur un fichier avec une seule ligne
1 / 0
.Par défaut, il affiche les fichiers utilisateur, mais il peut également afficher les fichiers système (en l'exécutant sur un fichier contenant
import os; os.environ['123']
):Configuration:
Lorsque
quickfix.py
est disponible dans le chemin d'accès actuel, ajoutez les lignes suivantes dans le vimrc pour l'utiliser.la source
Ce n'est pas une méthode automatique mais le Python Traceback indique le numéro de ligne --- 3 dans votre exemple --- et donc invoque vim:
$ vim +3 example.py
ouvrira le
example.py
avec le curseur sur la troisième ligne.la source
:make
un fichier que j'ai déjà ouvert, il est plus rapide d'utiliser:3
pour passer à la troisième ligne que pour fermer et rouvrir. De plus, faire cela manuellement est pénible pour les traces de pile plus complexes, c'est pourquoi je veux un support Quickfix.