2010-01-18 17 views
16

के लिए समस्या निवारण तकनीक मैं लगभग 4 वर्षों के लिए एक नियमित रूप से नियमित emacs उपयोगकर्ता रहा हूं, लेकिन जब भी emacs और समस्या निवारण elisp को अनुकूलित करने की बात आती है, तब भी मैं एक नौसिखिया हूं। हाल ही में, मैंने अपने रूबी विकास पर्यावरण के रूप में emacs को अनुकूलित करना शुरू कर दिया है और मैंने यहां StackOverflow में लोगों से कुछ तकनीकें सीखी हैं। उदाहरण के लिए, यहां किसी ने मुझे सी-यू सी-एम-एक्स के बारे में बताया है जिसमें एडबग के साथ एक फ़ंक्शन का वाद्य यंत्र है और फिर कोड के माध्यम से कदम उठाएं। मुझे यह भी पता चला कि एमएक्स में अधिकांश कमांड और मोड कई हुक (या तो फ़ंक्शंस या रेगेक्सप्स या कस्टमाइज़ेबल वेरिएबल्स) प्रदान करते हैं जो कि किसी भी नौसिखिया को प्रदान करेगा।
अब मैं लालची हूं - मैं आपके द्वारा उपयोग की जाने वाली अधिक तकनीकों और युक्तियों की तलाश में हूं और अतीत में उपयोगी पाया है।Emacs और Emacs Lisp

उत्तर

13
(setq debug-on-error t) 
(setq debug-on-quit t) 

जब आप मनमाने ढंग से गहरी समस्याओं को डीबग करना चाहते हैं तो वे मदद करते हैं। आप पहले ही edebug खोज चुके हैं (जो अन्य लोगों के कोड को ढूंढने के लिए मेरी पसंद का टूल है)। describe-function आमतौर पर आपको .el फ़ाइल (लाइन नंबर के साथ) पर एक लिंक देता है जहां इसे लोड किया गया था। समस्या के स्रोत पर कूदना उपयोगी है। मैं अक्सर ऐसा करता हूं, फ़ंक्शन कॉपी करता हूं, कुछ message कॉल में डालता हूं और मूल के बजाए उस दौड़ के लिए C-x C-e का फिर से मूल्यांकन करता हूं।

अद्यतन: यह एक छोटी सी चीज है जिसे मैंने presentation by John Wiegley से उठाया है।

(global-set-key (kbd "C-c C-d") 
     (lambda() (interactive) 
      (setq debug-on-error (if debug-on-error nil t)) 
      (message (format "debug-on-error : %s" debug-on-error)))) 

आइए आप एक ही कीस्ट्रोक साथ debug-on-error टॉगल।

+2

संपादित करें के बारे में, 'टॉगल-डिबग-ऑन-error' डिफ़ॉल्ट रूप से मौजूद है :) – phils

+0

+1 और धन्यवाद। कुछ कहता है जब किसी मौजूदा व्यक्ति की तलाश करने के बारे में सोचने के बजाय खुद को लिखना आसान होता है। :) –

5

सी-एक्स एएससी एएससी आपको एम-एक्स कमांड का एक ब्राउज़ करने योग्य इतिहास देता है जो आपको चलाया गया है, लेकिन आपको एलिस्प कोड दिखाता है।

आईईएलएम emacs lisp के लिए एक प्रतिलिपि है।

स्पीडबार आपकी .el फ़ाइलों को ब्राउज़ करने का एक शानदार तरीका है, मैं खुद को सी-एच का उपयोग करके अक्सर खोजता हूं (elisp मैन्युअल ब्राउज़ करने के लिए) और विषयों के नोड पेड़ को ब्राउज़ करने के लिए स्पीडबार का उपयोग करके।

जानकारी ब्राउज़र में सी-एस/सी-आर वृद्धिशील खोज वास्तव में पिछले पृष्ठ ब्रेक की खोज करेगी।

मैं अक्सर एम * चलाता हूं: मेरे * ielm * बफर पर स्विच किए बिना कोड के त्वरित बिट का परीक्षण करने के लिए।

विशेष रूप से मुश्किल कोड के लिए मैं emacs -q -l development-init.el चलाने के लिए अपने डेस्कटॉप पर एक शॉर्टकट बनाता हूं (यह विशेष रूप से कोड के साथ आसान है जो बफर और बाहरी प्रक्रियाओं पर निम्न स्तर के कुशलता से संबंधित है, ऐसी चीज जो आसानी से emacs को लटका सकती है या इसे segv से मार सकती है)।

2

यदि आपकी .emacs फ़ाइल हैकिंग करते हैं, तो हमेशा एक emacs प्रक्रिया चलाना छोड़ दें, और दूसरी Emacs प्रक्रिया शुरू करके परिवर्तनों का परीक्षण करें (--debug-init के साथ)। इस तरह, यदि कोई समस्या है, तो आपके पास अभी भी एक संपादक है जिसमें आप काम कर सकते हैं।

1

मेरे भाग के लिए, मैं edebug से अधिक (अनुशंसा करता हूं), लेकिन यह शायद स्वाद का सवाल है।

नोफल ने debug-on-* चर के बारे में उल्लेख किए जाने के अलावा, आप किसी दिए गए फ़ंक्शन के लिए M-x debug-on-entry के माध्यम से डीबगर दर्ज कर सकते हैं।

और आप कोड में ब्रेकपॉइंट्स पर debug पर स्पष्ट कॉल डाल सकते हैं: (debug) या (debug nil sexp-to-print)

0

ज्ञान के पहले कुछ चरणों में आपका स्वागत है।;)

सबसे पहले, कुछ आसान त्वरित हिट:

(add-hook 'emacs-lisp-mode-hook 'turn-on-eldoc-mode) 

यह आपको थोड़ा संकेत मिनी बफर पर दे देंगे। यह बेहद आसान है! यह युक्ति समस्या निवारण के बारे में कम है, और इसे लिखना आसान बनाने के बारे में अधिक है, लेकिन फिर भी।

एमईएलपीए से ईफैक्टर पैकेज प्राप्त करें, और यह देखें कि यह क्या करता है। मैंने देखा कि एक समारोह पर C-x C-e करने के बाद यह परिणाम elint के माध्यम से चलाएगा। बहुत परेशानी बचाता है।

emacs स्टार्टर किट से यह हुक भयानक है। यह किसी भी अवैध .elc फ़ाइलों को हटा देता है। यदि आप सावधान नहीं हैं तो पुराने एएलसी फाइलें आपकी तरफ एक असली कांटा हो सकती हैं। इसके विपरीत ऑटो-संकलन देखें।

(add-hook 'emacs-lisp-mode-hook 'starter-kit-remove-elc-on-save) 

(defun starter-kit-remove-elc-on-save() 
    "If you're saving an elisp file, likely the .elc is no longer valid." 
    (make-local-variable 'after-save-hook) 
    (add-hook 'after-save-hook 
      (lambda() 
       (if (file-exists-p (concat buffer-file-name "c")) 
        (delete-file (concat buffer-file-name "c")))))) 

अंत में, तुतलाना संपादित करते समय Emacs-तुतलाना या योजना सुनिश्चित करें कि आप paredit आजमाइए बनाते हैं। ये अदभुत है। डिबगिंग सुविधाओं पर

+0

व्यक्तिगत रूप से मुझे लगता है कि .elc फ़ाइलों को हटाने का एक भयानक विचार है। 'बाइट-रीकंपाइल-डायरेक्टरी 'जैसी सुविधाएं केवल एक फ़ाइल को संकलित करती हैं यदि संबंधित (लेकिन पुरानी) .elc फ़ाइल मौजूद है, इसलिए फ़ाइल को हटाने से वास्तव में पुन: संकलन रोक सकता है! इसके बजाय मैं बहुत ही अनुशंसा करता हूं * जब फ़ाइल पुरानी हो तो * स्वचालित रूप से पुनः फ़ाइल करें। मैं 'रन-सेव-हुक' चलाने के लिए उपयोग करता था '(जब (फ़ाइल-अस्तित्व-पी (बाइट-कंपाइल-dest-file buffer-file-name)) (बाइट-कंपाइल-फाइल बफर-फ़ाइल-नाम)) ', लेकिन इन दिनों मुझे वास्तव में पसंद है [ऑटो-संकलन] (https://github.com/tarsius/auto-compile), जो हर घटना की सुंदरता का ख्याल रखता है। – phils

+0

ईमानदारी से मैं असंगत धीमी गति से elisp होगा। –

+0

निश्चित रूप से, लेकिन यदि आवश्यक हो तो .elc फ़ाइलों को स्वचालित रूप से पुनः संकलित किया जाता है, तो आप दोनों दुनिया के सर्वश्रेष्ठ प्राप्त करते हैं: लगातार और तेज़। गंभीरता से, ऑटो संकलन पर एक नज़र डालें। – phils

2

मेरे init फ़ाइल टिप्पणियां:

;;;; * Debugging, Tracing, and Profiling 

;; M-: (info "(elisp) Debugging") RET 

;; Standard debugger: 
;; M-x debug-on-entry FUNCTION 
;; M-x cancel-debug-on-entry &optional FUNCTION 
;; debug &rest DEBUGGER-ARGS 
;; M-x toggle-debug-on-error 
;; M-x toggle-debug-on-quit 
;; setq debug-on-signal 
;; setq debug-on-next-call 
;; setq debug-on-event 
;; setq debug-on-message REGEXP 

;; Edebug -- a source-level debugger for Emacs Lisp 
;; M-x edebug-defun (C-u C-M-x) Cancel with eval-defun (C-M-x) 
;; M-x edebug-all-defs -- Toggle edebugging of all definitions 
;; M-x edebug-all-forms -- Toggle edebugging of all forms 
;; M-x edebug-eval-top-level-form 

;; Tracing: 
;; M-x trace-function FUNCTION &optional BUFFER 
;; M-x untrace-function FUNCTION 
;; M-x untrace-all 

;; Timing and benchmarking: 
;; (benchmark-run &optional REPETITIONS &rest FORMS) 

;; Emacs Lisp Profiler (ELP) 
;; M-x elp-instrument-package 
;; M-x elp-instrument-list 
;; M-x elp-instrument-function 
;; M-x elp-reset-* 
;; M-x elp-results 
;; M-x elp-restore-all 
;; 
;; "There's a built-in profiler called ELP. You can try something like 
;; M-x elp-instrument-package, enter "vc", and then try finding a file 
;; Afterwards, M-x elp-results will show you a profile report. 
;; (Note that if the time is instead being spent in non-vc-related 
;; functions, this technique will not show it, but you can instrument 
;; further packages if you like.)" http://stackoverflow.com/a/6732810/324105 

;; CPU & Memory Profiler ('Native Profiler') 
;; M-x profiler-start 
;; M-x profiler-report 
;; M-x profiler-reset 
;; M-x profiler-stop 
;; M-x profiler-* 

;; Dope ("DOtemacs ProfilEr. A per-sexp-evaltime profiler.") 
;; https://raw.github.com/emacsmirror/dope/master/dope.el 
;; M-x dope-quick-start will show a little introduction tutorial. 

;; Spinning: 
;; Set debug-on-quit to t 
;; When the problem happens, hit C-g for a backtrace. 
संबंधित मुद्दे