การสนับสนุนด่วนสำหรับการติดตาม Python


18

ว่าฉันมีสคริปต์หลามกับข้อผิดพลาด runtime:

$ 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

ฉันต้องการให้เป็นกลุ่มเพื่อข้ามไปยังบรรทัดที่มีปัญหาของไฟล์นั้น (บรรทัดที่ 3 ในกรณีนี้) ฉันรู้ว่ากลุ่มสามารถทำเช่นนี้เพราะมันทำงานได้ดีสำหรับการจับข้อผิดพลาดในเวลารวบรวมใน C กับการgccใช้:makeและquickfixหน้าต่าง

เอาต์พุตด่วนจาก gcc

แน่นอนว่าฉันสามารถเติมหน้าต่าง Quickfix ของ Vim ด้วย:set makeprg=python3\ %แล้ว:makeแต่จะไม่ข้ามไปยังหมายเลขบรรทัดที่ traceback ชี้ไปที่ เมื่อฉันมองเข้าไป:copenก็แค่ไฮไลท์บรรทัดแรกของการติดตามและฉันไม่สามารถข้ามไปยังหมายเลขบรรทัดที่เกี่ยวข้องได้

เอาต์พุตด่วนจาก python3

(ฉันใช้ Vim 7.4 บน Debian jessieในกรณีที่สำคัญ)

คำถามของฉันคือ:

  • ฉันสามารถกำหนดค่า Vim เพื่อให้รู้วิธีรับหมายเลขบรรทัดที่เกี่ยวข้องจากการติดตาม Python ได้หรือไม่

  • ฉันสามารถแก้ไข Python interpreter เพื่อพ่นรูปแบบข้อผิดพลาดที่ Vim รู้วิธีแยกวิเคราะห์และรับหมายเลขบรรทัดที่เกี่ยวข้องได้หรือไม่


คุณสามารถ subclass logger ในสคริปต์ของคุณเพื่อสร้างคะแนนย้อนกลับหนึ่งบรรทัดต่อบรรทัด (ดูที่นี่เพื่อเริ่มต้น) จากนั้นปรับerrorformatตามและเขียนปลั๊กอินคอมไพเลอร์สำหรับ Vim (ดู:help :compilerและ:help write-compiler-plugin) อาจไม่คุ้มค่ากับความพยายามหากคุณไม่รู้ว่าคุณกำลังทำอะไรอยู่และคุณไม่กระตือรือร้นพอที่จะขุดทุกอย่างออกจากเอกสาร
Sato Katsura

ฉันถามคำถามที่คล้ายกันใน StackOverflow คุณอาจพบคำตอบที่เป็นประโยชน์stackoverflow.com/questions/11333112/ …
jalanb

คำตอบ:


7

เป็นกลุ่มที่มาพร้อมกับชุดของ "คอมไพเลอร์" สคริปต์หนึ่งซึ่งเรียกว่า"pyunit" หากคุณเรียกใช้:compiler pyunitแล้ว:make(ด้วยค่าที่แนะนำสำหรับ'makeprg') Quickfix จะถูกเติมข้อมูลตามที่คุณต้องการ อย่างไรก็ตามจะใช้งานได้ดีหากมีระดับเดียวกับการติดตามสแต็ก

การปรับปรุงสคริปต์คอมไพเลอร์จะเป็นแบบฝึกหัดที่มีประโยชน์

unstackปลั๊กอินอาจจะเป็นที่น่าสนใจที่จะให้กลไกการทั่วไปในการแยกวิเคราะห์และดูสถานที่ที่มีการรายงานในกองติดตามและมีการสนับสนุนงูใหญ่สร้างขึ้นใน


4

สร้างขึ้นในปลั๊กอินคอมไพเลอร์ pyunit

ตามที่แนะนำโดยjamessanตัวเลือกหนึ่งคือใช้ปลั๊กอินในตัวคอมไพเลอร์pyunit:

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

นี่เป็นข้อเสียที่จะยุบการติดตามสแต็กเป็นข้อความแสดงข้อผิดพลาดเดียว ตัวอย่างเช่นสคริปต์หลามต่อไปนี้:

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

ด้วยสคริปต์ไพ ธ อนจากด้านบน 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 +3 example.py

จะเปิดexample.pyด้วยด้วยเคอร์เซอร์ในบรรทัดที่สาม


2
ฉันรู้เรื่องนี้ แต่นี่เป็นเรื่องเกี่ยวกับการสนับสนุน Quickfix หลังจากฉันเปิด:makeไฟล์ที่ฉันเปิดไว้แล้วมันจะเร็วกว่าที่จะใช้:3เพื่อข้ามไปยังบรรทัดที่สามแทนที่จะปิดและเปิดใหม่ การทำสิ่งนี้ด้วยตนเองเป็นความเจ็บปวดสำหรับการติดตามสแต็กที่ซับซ้อนมากขึ้นซึ่งเป็นสาเหตุที่ฉันต้องการการสนับสนุน Quickfix
นาธาเนียลเอ็มบีเวอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.