2011-03-09 16 views
10

के लिए विम त्रुटिफॉर्म मैं PHPUnit के लिए एक विम कंपाइलर प्लगइन पर काम कर रहा हूं।phpunit

मैंने निम्नलिखित errorformat लिखा है। त्रुटि संदेश सही ढंग से निकाला गया है, लेकिन फ़ाइल और रेखा संख्याएं नहीं हैं।

CompilerSet errorformat=%E%n)\ %.%#, 
         \%C%m, 
         \%+C%$, 
         \%C%f:%l, 
         \%Z%$ 

PHPUnit के उत्पादन इस तरह दिखता है:

PHPUnit 3.5.12 by Sebastian Bergmann. 

............................................................... 63/134 (47%) 
.........................E..... 

Time: 0 seconds, Memory: 11.25Mb 

There was 1 error: 

1) SomeClassTest::testSomething 
Undefined property: SomeClass::$var 

/path/to/SomeClass.php:99 
/path/to/SomeClassTest.php:15 

FAILURES! 
Tests: 94, Assertions: 170, Errors: 1. 

Press ENTER or type command to continue 

मैं सूचना फ़ाइल और लाइन स्टैक ट्रेस में प्रथम या अंतिम प्रविष्टि होने के लिए खुश हूँ। सबसे गहरी कॉल इस मुद्दे का वास्तविक स्रोत है। शीर्ष-स्तरीय कॉल पर कूदने का मतलब है कि मैं कॉल स्टैक में नीचे जाने के लिए उपयोग कर सकता हूं। मैं उपरोक्त उदाहरण में उत्तरार्द्ध, SomeClassTest.php:15 पसंद करूंगा।

उत्तर

5

मुझे लगता है कि समस्या %Z नियम का phrasing है। सबसे पहले मैं इस के साथ आया था:

:set errorformat=%E%n)\ %.%#,%Z%f:%l,%C%m,%-G%.%# 

है कि त्रुटि संदेश के साथ पहले फ़ाइल नाम और सहयोगी को पकड़ने के लिए होगा।

किसी कारण से, एसोसिएशन फ़ाइल नाम का उल्लेख बहुत कठिन था। मैं efm साथ यह करने के लिए सक्षम नहीं था, लेकिन इसके बजाय एक साथ इस अजगर फिल्टर काट दिया:

import sys                 
import re 
errors = [] 
OTHER = 0 
MESSAGE = 1 
FILE_LINE = 2 
next_is = OTHER 
lines = sys.stdin.readlines() 
for line in lines: 
    line = line.strip() 
    if (next_is == OTHER): 
     if (re.search("^[0-9]+\)", line)): 
      next_is = MESSAGE 
    elif (next_is == MESSAGE): 
     errors.append([line, '']) 
     next_is = FILE_LINE 
    elif (next_is == FILE_LINE): 
     if (re.search("^.+:[0-9]+", line)): 
      errors[-1][1] = line 
     elif (len(line) == 0 and len(errors[-1][1]) > 0): 
      next_is = OTHER 

for error in errors: 
    print "{0}:{1}".format(error[1], error[0]) 

यह एक एकल लाइन प्रारूप में सभी त्रुटियों और उन्हें आउटपुट को कैप्चर होगा। संबंधित फ़ाइल नाम और रेखा संख्या त्रुटि के लिए उल्लिखित हैं। यह स्क्रिप्ट सभी अन्य आउटपुट क्लॉबर करता है, लेकिन इसे जोड़कर हल किया जाएगा उदा। line = line.strip() के बाद print line

+0

धन्यवाद Ilkka! यह एक इलाज करता है। – afternoon

+1

मैंने गिटूब पर एक प्लगइन में कोड पोस्ट किया है: https://github.com/afternoon/vim-phpunit – afternoon

+0

इसे फिर से देखकर, शायद कारण यह काम नहीं कर रहा था कि '% + C% $ 'हमेशा'% Z% $ 'से पहले मेल खाता होगा और इसलिए मल्टी-लाइन संदेश को" बंद "ठीक से नहीं मिला। – Ilkka

 संबंधित मुद्दे