Pythonトレースバックのクイックフィックスサポート


18

実行時エラーのあるPythonスクリプトがあるとします。

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

a = 1/0

与えるもの:

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

Vimにそのファイルの問題のある行(この場合は3行目)にジャンプしてほしい。私はそれがでCにコンパイル時にエラーをキャッチするためにうまく動作しますので、Vimはこれを行うことができます知っているgcc使用:makeしてquickfixウィンドウ。

gccからのクイックフィックス出力

もちろん、Vimのquickfixウィンドウにと:set makeprg=python3\ %を入力できます:makeが、トレースバックが指す行番号にジャンプしません。これを見る:copenと、トレースの最初の行が強調表示されているだけで、関連する行番号にジャンプできません。

python3からのクイックフィックス出力

jessie重要な場合に備えて、Debian でVim 7.4を使用しています。)

私の質問は:

  • Pythonトレースバックから関連する行番号を取得する方法を認識できるようにVimを構成できますか?

  • Pythonインタープリターを変更して、Vimが関連する行番号を解析および取得する方法を既に知っているエラー形式を吐き出すことができますか?


スクリプトでロガーをサブクラス化して、トレースバックポイントを1行に1つ作成し(開始するにはこちらを参照)、それにerrorformat応じて調整し、Vimのコンパイラプラグインを記述できます(:help :compilerおよびを参照:help write-compiler-plugin)。何をしているのか正確にわからず、ドキュメントからすべてを掘り下げるほど熱心でない場合は、おそらく努力する価値はありません。
佐藤桂

StackOverflowで同様の質問をしたところ、役に立つ回答が見つかるかもしれませんstackoverflow.com/questions/11333112/…–
jalanb

回答:


7

Vimには一連の「コンパイラ」スクリプトが付属しており、そのうちの1つは「pyunit」と呼ばれます。実行:compiler pyunitしてから:make(推奨値を使用して'makeprg')クイックフィックスが期待どおりに読み込まれます。ただし、スタックトレースに1つのレベルがある場合にのみ機能します。

コンパイラスクリプトを改善することは有用な演習になります。

スタック解除それは場所がスタックトレースで報告し、内蔵のPythonのサポートを持って解析して表示するための一般的なメカニズムを提供してプラグインは、興味深いものであってもよいです。


4

組み込みのコンパイラプラグイン pyunit

すでにjamessanが示唆しているように、1つのオプションは組み込みのコンパイラプラグインを使用することpyunitです。

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

これには、スタックトレースが1つのエラーメッセージに折りたたまれるという欠点があります。たとえば、次のpythonスクリプト:

def lumberjack():
    bright_side_of_death()

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

lumberjack()

...このエラーメッセージが生成されます。

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

独自のコンパイラプラグインを作成する

別の方法として、次の場所で独自のコンパイラプラグインを提供できます ~/.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

で手動でプラグインを選択する:compiler pythonか、これを~/.vim/after/ftplugin/python.vim以下に追加して自動的にロードします。

if !exists("current_compiler")
  compiler python
endif

上記のpythonスクリプトを使用すると、Vimはquickfixウィンドウに次の情報を入力します。

|| 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

詳細については:help write-compiler-plugin、を参照してください。


3

quickfix.pyは、トレースバックをvimに適したエラー形式に解析します。これは、1行のファイルで実行する例です1 / 0

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

デフォルトでは、ユーザーファイルが表示されますが、システムファイルも表示できます(を含むファイルで実行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>

構成:

quickfix.py現在のパスで使用可能な場合は、vimrcに次の行を追加して使用します。

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

-1

自動的な方法ではありませんが、python Tracebackには行番号が記載されています---例では3 ---そして、vimを呼び出します:

$ vim +3 example.py

example.pyカーソルを3行目に開きます。


2
私はそれを承知していますが、これはQuickfixサポートに関するものです。:make既に開いているファイルを実行した後:3、閉じて再度開くよりも、3行目にジャンプする方が高速です。また、これを手動で行うと、より複雑なスタックトレースが苦痛になります。そのため、Quickfixのサポートが必要です。
ナサニエルM.ビーバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.