假设我有一个运行时错误的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可以做到这一点,因为它在使用gcc:make窗口通过quickfix在C语言中编译时捕获错误时效果很好。

Vim的quickfix窗口分别带有:set makeprg=python3\ %:make,但它不会跳转到回溯指向的行号。当我查看:copen时,它只是突出显示了跟踪的第一行,而我无法跳到相关的行号。



(我正在使用Vim如果有问题,请在Debian jessie上使用7.4。)

我的问题是:


我可以配置Vim,以便它知道如何从中获取相关的行号。
我可以修改Python解释器以吐出Vim已经知道如何解析并获取相关行号的错误格式吗?


评论

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

我在StackOverflow上问了类似的问题,您可能会找到有用的stackoverflow.com/questions/11333112/…这些答案。...

#1 楼

Vim带有一组“编译器”脚本,其中一个被称为“ pyunit”。如果先运行:compiler pyunit,然后运行:make(具有'makeprg'的建议值),则将按预期填充quickfix。但是,只有在堆栈跟踪只有一个级别的情况下,它才能很好地发挥作用。
改进编译器脚本将是一个有用的练习。
unstack插件可能令人感兴趣,因为它提供了一种解析和解析文件的通用机制。查看堆栈跟踪中报告的位置,并内置Python支持。

#2 楼

内置的编译器插件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来自动加载它: br />
if !exists("current_compiler")
  compiler python
endif


有关更多信息,请参见: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


#4 楼

这不是一种自动方法,但是python Traceback指出了行号---在您的示例中为3 ---并因此调用vim:

$ vim +3 example.py

将使用以下命令打开example.py将光标放在第三行。

评论


我知道,但这是关于Quickfix支持的。在已经打开的文件上运行:make之后,使用:3跳到第三行比关闭然后重新打开更快。另外,对于更复杂的堆栈跟踪,手动执行此操作很痛苦,这就是为什么我需要Quickfix支持的原因。

– Nathaniel M. Beaver
16年3月3日在16:53