पायथन ट्रेसबैक के लिए क्विकफ़िक्स समर्थन


18

कहो मेरे पास एक पायथन स्क्रिप्ट है जिसमें एक रनटाइम त्रुटि है:

$ 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) पर कूद जाए। मैं जानता हूँ कि विम ऐसा कर सकते हैं, क्योंकि यह साथ सी में संकलन समय पर त्रुटियों को पकड़ने के लिए बस ठीक काम करता है gccका उपयोग करते हुए :makeऔर quickfixखिड़की।

जीसीसी से क्विकफिक्स आउटपुट

ज़रूर, मैं विम की क्विकफ़िक्स विंडो को :set makeprg=python3\ %और फिर से पॉप्युलेट कर सकता हूं :make, लेकिन यह उस लाइन नंबर पर नहीं जाता है जहां ट्रेसबैक इंगित करता है। जब मैं :copenइसे देखता हूं तो ट्रेस की पहली लाइन को हाइलाइट करता हूं, और मैं संबंधित लाइन नंबर पर नहीं जा सकता।

python3 से क्विकफ़िक्स आउटपुट

(मैं jessieमामले में डेबियन पर विम 7.4 का उपयोग कर रहा हूं जो मायने रखता है।)

मेरे प्रश्न हैं:

  • क्या मैं विम को कॉन्फ़िगर कर सकता हूं ताकि यह पता चले कि पायथन ट्रेसबैक से संबंधित लाइन नंबर कैसे प्राप्त करें?

  • क्या मैं पायथन दुभाषिया को संशोधित कर सकता हूं ताकि त्रुटि प्रारूप तैयार किया जा सके कि विम पहले से ही जानता है कि संबंधित पंक्ति संख्या को कैसे पार्स और प्राप्त किया जाए?


आप अपनी स्क्रिप्ट में लकड़हारे को ट्रेसबैक पॉइंट्स प्रति एक लाइन बनाने के लिए उप-वर्ग ( यहाँ देखें आरंभ करने के लिए) को उप-कर सकते हैं , फिर उसके errorformatअनुसार समायोजित करें और Vim (देखें :help :compilerऔर :help write-compiler-plugin) के लिए एक कंपाइलर प्लगइन लिखें । प्रयास करता है, तो आप नहीं जानते कि लायक शायद नहीं बिल्कुल आप क्या कर रहे हैं और आप उत्साही पर्याप्त डॉक्स से सब कुछ बाहर खुदाई करने के लिए नहीं कर रहे हैं।
सातो सतसुरा

मैंने StackOverflow पर एक समान प्रश्न पूछा, आप उन उत्तरों को उपयोगी stackoverflow.com/questions/11333112/…
jalanb

जवाबों:


7

विम "संकलक" लिपियों के एक सेट के साथ आता है, जिनमें से एक को "प्यूनिट" कहा जाता है । यदि आप दौड़ते हैं :compiler pyunitऔर फिर :make(आपके सुझाए गए मूल्य के साथ 'makeprg'), तो आप की अपेक्षा के अनुसार क्विकफ़िक्स पॉपुलेटेड है। हालाँकि, यह केवल अच्छी तरह से काम करता है अगर स्टैक ट्रेस का एक स्तर है।

उस संकलक स्क्रिप्ट में सुधार एक उपयोगी अभ्यास होगा।

Unstack प्लगइन रुचि का हो सकता है, क्योंकि यह पार्स करने के लिए एक सामान्य तंत्र प्रदान करता है और देखने स्थानों एक स्टैक ट्रेस में सूचना दी और अजगर समर्थन में बनाया गया है।


4

कंपाइलर प्लगइन में निर्मित pyunit

जैसा कि पहले से ही जैमेसन द्वारा सुझाया गया है , एक विकल्प संकलक प्लगइन में निर्मित का उपयोग करना है 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

ऊपर से पाइथन लिपि के साथ, विम ने क्विकफिक्स विंडो को निम्न के साथ पॉप्युलेट किया:

|| 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 ट्रेसबैक को विम-फ्रेंडली एररफॉर्मेट में पार्स करता है। यहाँ एक फ़ाइल पर इसे एक पंक्ति के साथ चलाने का एक उदाहरण है 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

एक स्वचालित विधि नहीं है लेकिन अजगर ट्रैसबैक आपके उदाहरण में लाइन नंबर --- 3 बताता है --- और इसलिए आह्वान विम:

$ vim +3 example.py

example.pyतीसरी लाइन पर कर्सर के साथ खुलेगा ।


2
मुझे इसकी जानकारी है, लेकिन यह क्विकफिक्स समर्थन के बारे में है। :makeमेरे द्वारा पहले से खुली हुई फ़ाइल पर चलने के बाद :3, तीसरी पंक्ति में बंद होने और फिर से खोलने के लिए कूदने के लिए उपयोग करना तेज़ है । इसके अलावा, मैन्युअल रूप से ऐसा करना अधिक जटिल स्टैक निशान के लिए एक दर्द है, यही कारण है कि मैं क्विकफिक्स समर्थन चाहता हूं।
नथानिएल एम। बीवर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.