Hỗ trợ Quickfix cho tracebacks Python


18

Nói rằng tôi có một kịch bản python có lỗi thời gian chạy:

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

a = 1/0

cung cấp cho:

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

Tôi muốn Vim nhảy đến dòng có vấn đề của tập tin đó (dòng 3 trong trường hợp này). Tôi biết Vim có thể làm điều này bởi vì nó hoạt động tốt khi bắt lỗi tại thời gian biên dịch trong C bằng gcccách sử dụng :makequickfixcửa sổ.

đầu ra quickfix từ gcc

Chắc chắn, tôi có thể điền vào cửa sổ quickfix của Vim :set makeprg=python3\ %và sau đó :make, nhưng nó không nhảy đến số dòng nơi dấu vết trỏ tới. Khi tôi nhìn vào, :copennó chỉ làm nổi bật dòng đầu tiên của dấu vết và tôi không thể chuyển sang số dòng có liên quan.

đầu ra quickfix từ python3

(Tôi đang sử dụng Vim 7.4 trên Debian jessietrong trường hợp có vấn đề.)

Câu hỏi của tôi là:

  • Tôi có thể định cấu hình Vim để nó biết cách lấy số dòng liên quan từ truy nguyên Python không?

  • Tôi có thể sửa đổi trình thông dịch Python để tạo ra một định dạng lỗi mà Vim đã biết cách phân tích và lấy số dòng liên quan không?


Bạn có thể phân lớp logger trong tập lệnh của mình để tạo các điểm theo dõi trên mỗi dòng (xem tại đây để bắt đầu), sau đó điều chỉnh cho errorformatphù hợp và viết plugin trình biên dịch cho Vim (xem :help :compiler:help write-compiler-plugin). Có lẽ không đáng để nỗ lực nếu bạn không biết chính xác những gì bạn đang làm và bạn không đủ nhiệt tình để khai thác mọi thứ từ các tài liệu.
Sato Katsura

Tôi đã hỏi một câu hỏi tương tự trên StackOverflow, bạn có thể thấy những câu trả lời đó hữu ích stackoverflow.com/questions/11333112/
Kẻ

Câu trả lời:


7

Vim đi kèm với một tập lệnh "trình biên dịch", một trong số đó được gọi là "pyunit" . Nếu bạn chạy :compiler pyunitvà sau đó :make(với giá trị được đề xuất cho 'makeprg'), quickfix sẽ được điền như bạn mong đợi. Tuy nhiên, nó chỉ hoạt động tốt nếu có một cấp cho dấu vết ngăn xếp.

Cải thiện kịch bản trình biên dịch sẽ là một bài tập hữu ích.

Các unstack Plugin có thể quan tâm, vì nó cung cấp một cơ chế chung để phân tích và xem các địa điểm báo cáo trong một stack trace và có hỗ trợ Python được xây dựng trong.


4

Được xây dựng trong trình biên dịch plugin pyunit

Như đã được đề xuất bởi jamessan , một tùy chọn là sử dụng plugin trình biên dịch tích hợp pyunit:

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

Điều này có nhược điểm, đó là thu gọn dấu vết ngăn xếp thành một thông báo lỗi duy nhất. Ví dụ tập lệnh python sau:

def lumberjack():
    bright_side_of_death()

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

lumberjack()

... Tạo thông báo lỗi này:

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

Viết plugin trình biên dịch của riêng bạn

Thay vào đó, bạn có thể cung cấp plugin trình biên dịch của riêng mình trong ~/.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

Chọn plugin theo cách thủ công với :compiler pythonhoặc tải nó tự động bằng cách thêm phần này vào ~/.vim/after/ftplugin/python.vim:

if !exists("current_compiler")
  compiler python
endif

Với tập lệnh python ở trên, Vim điền vào cửa sổ quickfix với:

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

Xem :help write-compiler-pluginđể biết thêm thông tin.


3

quickfix.py phân tích cú pháp truy xuất thành một lỗi định dạng thân thiện với vim. Dưới đây là một ví dụ về việc chạy nó trên một tệp với một dòng duy nhất 1 / 0.

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

Theo mặc định, nó cũng hiển thị các tệp người dùng, nhưng nó cũng có thể hiển thị các tệp hệ thống (chạy nó trên một tệp chứa 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>

Cấu hình:

Khi quickfix.pycó sẵn trong đường dẫn hiện tại, hãy thêm các dòng sau vào vimrc để sử dụng nó.

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

-1

Không phải là một phương thức tự động nhưng Traceback python nêu số dòng --- 3 trong ví dụ của bạn --- và vì vậy gọi vim:

$ vim +3 example.py

sẽ mở example.pybằng con trỏ trên dòng thứ ba.


2
Tôi biết điều đó, nhưng đây là về hỗ trợ Quickfix. Sau khi tôi chạy :maketrên một tệp tôi đã mở, sử dụng :3để chuyển sang dòng thứ ba nhanh hơn là đóng và mở lại. Ngoài ra, làm điều này bằng tay là một nỗi đau cho các dấu vết ngăn xếp phức tạp hơn, đó là lý do tại sao tôi muốn hỗ trợ Quickfix.
Nathaniel M. Beaver
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.