Quickfix对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行)。我知道Vim可以做到这一点,因为它可以很好地在C中gcc使用:makequickfix窗口捕获编译时的错误。

gcc的quickfix输出

当然,我可以使用:set makeprg=python3\ %和来填充Vim的quickfix窗口:make,但是它不会跳到回溯指向的行号。当我查看:copen它时,只需突出显示跟踪的第一行,就无法跳转到相关的行号。

python3的quickfix输出

jessie以防万一,我在Debian上使用Vim 7.4 。)

我的问题是:

  • 我可以配置Vim,使其知道如何从Python追溯中获取相关的行号吗?

  • 我可以修改Python解释器以吐出Vim已经知道如何解析并获取相关行号的错误格式吗?


您可以在脚本中将记录器子类化,以每行产生一个追溯点(请参阅此处开始),然后进行相应的调整errorformat并为Vim编写一个编译器插件(请参阅:help :compiler:help write-compiler-plugin)。如果您不确切知道自己在做什么,并且没有足够的热情从文档中挖掘出所有内容,则可能不值得付出努力。
佐藤桂2015年

我问StackOverflow上过类似的问题,你会发现这些问题的答案非常有用stackoverflow.com/questions/11333112/...
jalanb

Answers:


7

Vim带有一组“编译器”脚本,其中一个被称为“ pyunit”。如果您:compiler pyunit随后运行:make(使用的建议值'makeprg'),则会按预期填充quickfix。但是,只有在堆栈跟踪只有一层的情况下,它才能很好地工作。

改进编译器脚本将是一个有用的练习。

拆散插件可能会感兴趣,因为它提供了解析的通用机制,并查看位置报道堆栈跟踪,并内置了Python支持。


4

内置编译器插件 pyunit

正如jamessan所建议的那样,一种选择是使用内置的编译器插件pyunit

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

不利之处在于,它会将堆栈跟踪折叠为一条错误消息。例如以下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 / 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用光标在第三行打开。


2
我知道这一点,但这是关于Quickfix支持的。在我已经:make打开的文件上运行后:3,跳转到第三行比关闭然后重新打开更快。另外,对于更复杂的堆栈跟踪,手动执行此操作很痛苦,这就是为什么我需要Quickfix支持的原因。
纳撒尼尔·比弗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.