कैसे पता करें कि वास्तव में एक प्रमुख अनुक्रम क्या करता है


14

समय-समय पर मैं पाठ को संपादित करते समय अप्रत्याशित व्यवहार का निरीक्षण करता हूं। मेरा पहला सहारा आमतौर पर C-h kयह पता लगाने के लिए उपयोग किया जाता है कि किसी दिए गए मुख्य अनुक्रम द्वारा क्या कार्य कहा जा रहा है। हालांकि, कभी-कभी प्रलेखन मनाया व्यवहार के साथ बाधाओं पर है। इन मामलों में, मैं आमतौर पर मानता हूं कि कुछ अन्य पैकेज ने उस फ़ंक्शन या कुंजी अनुक्रम में हुक किया है और अपने व्यवहार को संशोधित कर रहा है।

मैं कैसे पता लगा सकता हूं कि कौन से कार्य मेरे प्रमुख अनुक्रम में शामिल हैं?

एक उदाहरण जो मुझे हाल ही में मिला, वह यह था कि मैंने "कुंजी दबाया और उद्धरण चिह्न सक्रिय क्षेत्र की शुरुआत और अंत में डाले गए। मुझे संदेह था कि यह डिफ़ॉल्ट Emacs व्यवहार नहीं था, इसलिए मैं C-h k "यह पता लगाता था कि वास्तव में किस फ़ंक्शन को बुलाया जा रहा है।

describe-keyप्रलेखन ने मुझे बताया कि समारोह self-insert-commandबुलाया जा रहा था, एक अंतर्निहित समारोह है। लंबी कहानी को छोटा करने के लिए, कुछ मात्रा में परीक्षण और त्रुटि के बाद, मैं यह निर्धारित करने में सक्षम था कि व्यवहार किसके कारण हुआ था electric-pair-mode। भविष्य में, क्या इस निष्कर्ष पर पहुंचने का एक तेज़ तरीका है कि अपराधी को खोजने तक संदिग्ध पैकेजों को एक बार में बंद कर दिया जाए?


क्या यह संभव है कि electric-pair-modeकेवल कुछ प्रमुख मोड में सक्रिय किया गया था? आप अभी भी दिखाई दे रहा है self-insert-commandके लिए "जब आप करते हैं C-h k, जबकि electric-pair-modeसक्रिय है?
कौशल मोदी

@kaushalmodi: यह पता चलता है कि electric-pair-modeहुक लगाने से काम होता है post-self-insert-hook, न कि कीबाइंडिंग बदलने से।
nispio

C-h kआपको बताता है कि वास्तव में एक कीपर के लिए क्या होता है। यदि आप प्रलेखन के लिए देखते हैं self-insert-command, तो यह स्पष्ट रूप से कहता post-self-insert-hookहै कि कमांड खत्म होने के बाद चलाया जाता है।
शास्त्री

@ षोस्ती: इस सरल उदाहरण में, हाँ। लेकिन क्या होगा अगर after-change-functionsजॉर्डन अपने जवाब में एक एक्सटेंशन का उपयोग करता है ? किसी फ़ंक्शन के लिए प्रलेखन शायद विशेष रूप से उस हुक का उल्लेख नहीं करेगा, क्या यह होगा?
nispio

क्षमा करें, मुझे और अधिक स्पष्ट होना चाहिए था। C-h k+ मानक हुक == पूर्ण व्यवहार (अधिक या कम)। बेशक कभी-कभी यह बहुत सारी संभावनाएं छोड़ देता है, लेकिन मैं अभी भी किसी भी अन्य जटिल सॉफ़्टवेयर सिस्टम की तुलना में बहुत अधिक पारदर्शी है।
२१:१

जवाबों:


13

यह जानने का कोई आसान तरीका नहीं है कि एक एकल कुंजी प्रेस क्या करेगा।

यदि आप अतिरिक्त व्यवहार देखते हैं तो हमेशा सामान्य हुक की जांच करें। सूची यहाँ देखें: http://www.gnu.org/software/emacs/manual/html_node/elisp/Standard-Hooks.html

ज्यादातर मामलों में महत्वपूर्ण हैं:

  • बाद-परिवर्तन-कार्यों
  • पहले-परिवर्तन-कार्यों
  • पहले-परिवर्तन-हुक
  • बाद आदेश-हुक
  • पूर्व आदेश-हुक
  • बाद आत्म डालने हुक

आपको उन हुक का निरीक्षण करने और उन कार्यों को देखने की आवश्यकता होगी, जिनमें वे शामिल हैं जो यह देखना है कि कौन सा आपके व्यवहार को संशोधित कर रहा है।

यदि इन हुक में किए गए कार्य पूरी तरह से देखे गए व्यवहार का वर्णन नहीं करते हैं, तो उन कार्यों के लिए सलाह की जाँच करें जो उनके प्रलेखन में दिखाई देंगे describe-function


संपादित करें: मैंने कुछ फ़ंक्शन को एक-एक करके फ़ंक्शन के माध्यम से जाने से बेहतर हुक का वर्णन करने में मदद करने के लिए लिखा है: https://gist.github.com/jordonbiondo/bad03e44bb053db0f1eb आप describe-hookअन्य विवरण फ़ंक्शंस की तरह वहां परिभाषित उपयोग कर सकते हैं । यहाँ इसका एक नमूना आउटपुट है:

और यहाँ सभी कोड, मामले गायब होने पर:

(defun guess-all-hooks ()
  "Return a list of all variables that are probably hook lists."
  (let ((syms '()))
    (mapatoms
     (lambda (sym)
       (if (ignore-errors (symbol-value sym))
           (let ((name (symbol-name sym)))
             (when (string-match "-\\(hook[s]?\\|functions\\)$" name)
               (push sym syms))))))
    syms))

(defun face-it (str face)
  "Apply FACE to STR and return."
  (propertize str 'face face))

(defun describe-hook (hook)
  "Display documentation about a hook variable and the
functions it contains."
  (interactive
   (list (completing-read
          "Hook: " (mapcar (lambda (x) (cons x nil)) (guess-all-hooks)))))
  (let* ((sym (intern hook))
         (sym-doc (documentation-property sym 'variable-documentation))
         (hook-docs (mapcar
                     (lambda (func)
                       (cons func (ignore-errors (documentation func))))
                     (symbol-value sym))))
    (switch-to-buffer
     (with-current-buffer (get-buffer-create "*describe-hook*")
       (let ((inhibit-read-only t))
         (delete-region (point-min) (point-max))
         (insert (face-it "Hook: " 'font-lock-constant-face) "\n\n")
         (insert (face-it (concat "`" hook "'") 'font-lock-variable-name-face))
         (replace-string "\n" "\n\t" nil
                         (point)
                         (save-excursion
                           (insert "\n" sym-doc "\n\n")
                           (1- (point))))
         (goto-char (point-max))
         (insert (face-it "Hook Functions: " 'font-lock-constant-face) "\n\n")
         (dolist (hd hook-docs)
           (insert (face-it (concat "`" (symbol-name (car hd)) "'")
                            'font-lock-function-name-face)
                   ": \n\t")
           (replace-string "\n" "\n\t" nil
                           (point)
                           (save-excursion
                             (insert (or (cdr hd) "No Documentation") "\n\n")
                             (1- (point))))
           (goto-char (point-max))))
       (help-mode)
       (help-make-xrefs)
       (read-only-mode t)
       (setq truncate-lines nil)
       (current-buffer)))))

क्या इसका मतलब यह है कि जब किसी फ़ंक्शन को सलाह दी जाती है, तो परिवर्तन को प्रतिबिंबित करने के लिए प्रलेखन स्वचालित रूप से अपडेट हो जाता है?
nispio

मुझे नहीं पता कि क्या वास्तविक गुण अपडेट किए गए हैं, लेकिन इसके द्वारा लौटाए गए मूल्य documentationको प्रतिबिंबित करने के लिए अपडेट किया गया है।
जॉर्डन बियोडो

1
@nispio हाँ, यह है।
मालाबार

1
Gist.github.com/jordonbiondo/bad03e44bb053db0f1eb में कोड / फ़ंक्शन और मेरी राय में, उत्तर में शामिल होना चाहिए। मुझे लगता है कि एसई जवाब में 30,000 अक्षरों की सीमा होती है।
फहीम मीठा

4

शायद आपके प्रश्न का पूर्ण उत्तर नहीं है, लेकिन पैकेज helm-descbindsआपको शॉर्टकट के एससीआई प्रतिनिधित्व से सभी परिभाषित कीबोर्ड बाइंडिंग को खोजने में मदद करता है । प्रत्येक हिट के लिए, यह आपको कीबोर्ड शॉर्टकट से जुड़े इंटरैक्टिव फ़ंक्शन को दिखाता है, और आप इसका वर्णनhelm-descbinds करने के लिए कह सकते हैं , या इसे सीधे खोज परिणामों से निष्पादित कर सकते हैं ।

यहाँ छवि विवरण दर्ज करें

यहाँ GitHub साइट से पैकेज विवरण दिया गया है:

हेल्म डेसकाइंड्स एमएसीएस के विवरण-बाइंडिंग के लिए एक इंटरफ़ेस प्रदान करता है जो वर्तमान में सक्रिय कुंजी बाइंडिंग को अंतःक्रियात्मक रूप से पतवार के साथ खोज करने योग्य बनाता है।

इसके अतिरिक्त आपके पास निम्नलिखित क्रियाएं हैं

  • आदेश निष्पादित करें
  • आज्ञा का वर्णन करें
  • आज्ञा पाओ

और C-zआपको वर्तमान कमांड का लगातार विवरण देगा।


2
यह भी खूब रही। मैं निश्चित रूप से इसे बांधूंगा C-h b। मेरी एकमात्र इच्छा यह है कि मैं सूची में आइटम पर कूद कर टाइप करने के बजाय वास्तविक कुंजी अनुक्रम दर्ज कर सकता हूंC - c _ C - p
nispio
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.