2010-01-18 10 views
10

में लिंक करने योग्य फ़ाइल नाम/रेखा संख्याएं बनाना मैं पाइथन में गड्डी बफर के माध्यम से अपने टेस्टकेस पर पीडीबी चला रहा हूं। जब मैं अपने testcase में एक स्टैकट्रेस/विफलता मिलता है, यह इस तरह दिखता है:Emacs gud buffer

File "test/testfoo.py", line 499, in test_foo_function 

क्लिक करने योग्य और हो लेते हैं:

FAIL: test_foo_function (__main__.TestFoo) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "test/testfoo.py", line 499, in test_foo_function 
    self.assertEqual('foo', 'foo') 

मैं लाइन (रों) की तरह बनाने के लिए सक्षम होने के लिए अच्छा लगेगा testfoo.py में 49 9 लाइन करने के लिए।

(संपादित करें) पायथन-मोड सूची में लोगों ने मुझे पीडीबीट्रैक का नेतृत्व किया और मैं इसे वहां काम करने में सक्षम था। नीचे जवाब देखें ...

+1

जो बहुत अच्छा होगा। मैं गड़बड़ बफर में परीक्षण चलाने के लिए अपने सेटअप के बारे में और जानना उत्सुक हूं। क्षमा करें, मैं आपके प्रश्न का उत्तर नहीं दे सकता हूं हालांकि –

+0

मेरे पुराने सेटअप (http://panela.blog-city.com/python_and_emacs_5_pdb_and_emacs.htm) के संबंध में मेरे ब्लॉग पर एक पोस्ट है। मैं वर्तमान में शेल-मोड/पायथन-मोड का उपयोग कर रहा हूं (python.org संस्करण emacs संस्करण नहीं है) और pdbtrack –

उत्तर

2

मुझे लगता है कि आप जो अनुकूलित करना चाहते हैं वह compilation-parse-errors-filename-function है, जो एक ऐसा फ़ंक्शन है जो फ़ाइल नाम लेता है, और फ़ाइल नाम के संशोधित संस्करण को प्रदर्शित करने के लिए देता है। यह एक बफर स्थानीय चर है, इसलिए आपको इसे प्रत्येक बफर में सेट करना चाहिए जो कि पाइथन त्रुटियों को प्रदर्शित करेगा (शायद उपयोग करने के लिए उपयुक्त हुक है, मेरे पास पाइथन मोड स्थापित नहीं है इसलिए मैं इसे देख नहीं सकता)। इनपुट फ़ाइल नाम का एक संस्करण लौटने के लिए आप propertize का उपयोग करेंगे जो वास्तविक फ़ाइल लोड करने के लिए हाइपरलिंक के रूप में कार्य करता है। elisp मैनुअल में propertize अच्छी तरह से प्रलेखित है।

यदि संकलन-पार्स-त्रुटियों-फ़ाइल नाम-फ़ंक्शन को कॉल नहीं किया जा रहा है, तो आप compilation-error-regexp-alist-alist (जो अल्स्ट-एलीस्ट कहते हैं, जो टाइपो नहीं है) में एक सूची जोड़ना चाहते हैं जो कि मोड नामों की एक सूची है त्रुटियों से मेल खाने के लिए नियमित अभिव्यक्तियों से, और मेलिंग लाइन नंबर, फ़ाइल नाम आदि की संख्यात्मक अनुक्रमणिका त्रुटि regexp मिलान में जानकारी।

0

जस्टिन जवाब देने के लिए जोड़ा जा रहा है:

मैं अपने कीचड़ config जो एक फाइल और एक clojure स्टैक ट्रेस से लाइन पर जाने के लिए माना जाता है में निम्नलिखित है।

दुर्भाग्य से मुझे यह स्वीकार करना होगा कि यह वास्तव में मेरे लिए वास्तव में काम नहीं करता है - फ़ंक्शन सही फ़ाइल नहीं ढूंढ पा रहा है - लेकिन जहां तक ​​मैं कह सकता हूं, इसे project-root बदलकर ठीक करने योग्य होना चाहिए परिभाषित या फाइल सिस्टम पर मेरी परियोजनाओं की संरचना को बदलकर (मेरे पास समय देखने या झुकाव नहीं है)।

हालांकि यह एक अच्छा मुद्दा लाता है, हालांकि इस तरह की अधिकांश Functinality में एक सामान्य और पोर्टेबल फैशन में परियोजना रूट को समझना थोड़ा मुश्किल है। इस मामले में हम src निर्देशिका पर भरोसा करते हैं, लेकिन शायद यह आपके पायथन परियोजनाओं के लिए उपयुक्त नहीं है।

तो जस्टिन से निकलने के बाद से, आप नीचे दिए गए फ़ंक्शन से कुछ युक्तियां लेने में सक्षम होना चाहिए और फ़ाइल केस और लाइन नंबरों को टेस्ट केस त्रुटि से पार्स कर सकते हैं, लाइन नंबर का लिंक बना सकते हैं और इसका उपयोग कर सकते हैं compilation-parse-errors-filename-function और propertizegud में लाइन बनाने के लिए एक लिंक बफर करें।

यदि आप इसे काम करने के लिए प्राप्त करते हैं, तो कृपया अपने प्रश्न का उत्तर दें। मुझे लगता है कि बहुत से लोगों को यह उपयोगी लगेगा।

(defun slime-jump-to-trace (&optional on) 
    "Jump to the file/line that the current stack trace line references. 
    Only works with files in your project root's src/, not in dependencies." 
    (interactive) 
    (save-excursion 
     (beginning-of-line) 
     (search-forward-regexp "[0-9]: \\([^$(]+\\).*?\\([0-9]*\\))") 
     (let ((line (string-to-number (match-string 2))) 
      (ns-path (split-string (match-string 1) "\\.")) 
      (project-root (locate-dominating-file default-directory "src/"))) 

     (find-file (format "%s/src/%s.clj" project-root 
          (mapconcat 'identity ns-path "/"))) 
     (goto-line line)))) 

मुझे यह भी उल्लेख करना चाहिए कि मैंने इस फ़ंक्शन को वेब पर कहीं से कॉपी किया है, लेकिन मुझे यूआरएल याद नहीं है। ऐसा लगता है कि फिल हैगलबर्ग (टेक्नोमेंसी) उत्कृष्ट Emacs स्टार्टर किट से है।

4

जेरार्ड बी द्वारा संकेत के लिए धन्यवाद मैंने इसे समझ लिया। मैं इसे शुद्ध पीडीबी के बजाय पीडीबीट्रैक (खोल) से कर रहा हूं, लेकिन मुझे विश्वास है कि यह दोनों में काम करना चाहिए। आपको संकलन-शेल-नाबालिग-मोड को सक्षम करने की आवश्यकता है। और आपके पास निम्न कोड है।emacs:

;; if compilation-shell-minor-mode is on, then these regexes 
;; will make errors linkable 
(defun matt-add-global-compilation-errors (list) 
    (dolist (x list) 
    (add-to-list 'compilation-error-regexp-alist (car x)) 
    (setq compilation-error-regexp-alist-alist 
     (cons x 
      (assq-delete-all (car x) 
          compilation-error-regexp-alist-alist))))) 

(matt-add-global-compilation-errors 
`(
    (matt-python ,(concat "^ *File \\(\"?\\)\\([^,\" \n <>]+\\)\\1" 
        ", lines? \\([0-9]+\\)-?\\([0-9]+\\)?") 
      2 (3 . 4) nil 2 2) 
    (matt-pdb-stack ,(concat "^>?[[:space:]]*\\(\\([-_./a-zA-Z0-9 ]+\\)" 
         "(\\([0-9]+\\))\\)" 
         "[_a-zA-Z0-9]+()[[:space:]]*->") 
       2 3 nil 0 1) 
    (matt-python-unittest-err "^ File \"\\([-_./a-zA-Z0-9 ]+\\)\", line \\([0-9]+\\).*" 1 2) 
    ) 
) 

(defun matt-set-local-compilation-errors (errors) 
    "Set the buffer local compilation errors. 

Ensures than any symbols given are defined in 
compilation-error-regexp-alist-alist." 
    (dolist (e errors) 
    (when (symbolp e) 
     (unless (assoc e compilation-error-regexp-alist-alist) 
     (error (concat "Error %s is not listed in " 
         "compilation-error-regexp-alist-alist") 
       e)))) 
    (set (make-local-variable 'compilation-error-regexp-alist) 
     errors)) 

फिर आप त्रुटि स्टैक ट्रेस के माध्यम से ज़िप करने के लिए मानक संकलन मोड नेविगेशन का उपयोग कर सकते हैं।

+0

ध्यान दें कि यह तब काम करता है जब फ़ाइल/बफर पहले खुलता है। समय के साथ कुछ "बहाव" प्रतीत होता है (यानी कर्सर वास्तविक रेखा के बाद कुछ पंक्तियां दिखाई देता है) –

+0

धन्यवाद! लेकिन मुझे पता है कि लंबी ट्रेसबैक के शीर्ष पर लाइनें क्लिक करने योग्य हैं, लाइनें नीचे नहीं हैं। – nealmcb