emacs - प्रमुख मोड को स्विच करते समय कैसे डायर-लोकल चर रखने के लिए?




elisp (2)

मैं एक ऐसी परियोजना के लिए तैयार हूं जहां मानक इंडेंटेशन और टैब 3-वर्ण विस्तृत हैं, और यह एचटीएमएल, पीएचपी, और जावास्क्रिप्ट के मिश्रण का उपयोग कर रहा है। चूंकि मैं सब कुछ के लिए इमाक्स का उपयोग करता हूं, और केवल इस प्रोजेक्ट के लिए 3-चार इंडेंटेशन चाहता हूं, मैंने परियोजना के रूट पर ".dir-localals.el" फ़ाइल की स्थापना की है, जिसके अंतर्गत सभी फ़ाइलों / सभी विधियों पर लागू होता है:

; Match projets's default indent of 3 spaces per level- and don't add tabs
(
 (nil .
        (
         (tab-width . 3)
         (c-basic-offset . 3)
         (indent-tabs-mode . nil)
         ))
 )

जब मैं पहली बार फ़ाइल खोलता हूं, तो ठीक काम करता है समस्या तब होती है जब प्रमुख तरीकों को स्विच करना होता है- उदाहरण के लिए PHP फ़ाइल के अंदर एक शाब्दिक HTML के हिस्से पर काम करना। तब मैं सभी डायर-लोकल वैरिएबल खो देता हूं।

मैंने स्पष्ट रूप से ".dir-localals.el" में उपयोग किए जाने वाले सभी मोडों को बताते हुए प्रयास किया है, और मेरी .emac फाइल "dir-localals-set-class-variables / dir-locals-set-directory-class "। मुझे यह कहते हुए प्रसन्नता हो रही है कि वे सभी लगातार व्यवहार करते हैं, शुरू में डायर-लोकल चर सेट करते हैं, और फिर उन्हें खो देते हैं क्योंकि मैं प्रमुख मोड को स्विच करता हूं।

मैं जीएनयू एमैक्स 24.3.1 का उपयोग कर रहा हूं।

बफर के प्रमुख-मोड को स्विच करने पर डायर-लोकल वैरिएबल को पुनः लोड करने का एक शानदार तरीका क्या है?

- संपादित करें - उत्कृष्ट उत्तर और कमेंटरी के लिए धन्यवाद हारून और एफ़िल! यहां पोस्ट करने के बाद, मैंने सोचा कि "बग की तरह" बदबू आती है, इसलिए जीएनयू को एक रिपोर्ट में प्रवेश किया- इन चर्चाओं के संदर्भ में उन्हें भेज दिया जाएगा


चेतावनी दी है कि मैंने यह कोशिश नहीं की है , इसलिए यह आपके डीआईआर-लोकल वेरिएबल्स से लेकर अवांछित परिणाम उत्पन्न कर सकता है, जो आपकी बिल्ली को गड़बड़ने का प्रयास करने के लिए इमैक को लागू नहीं किया जा रहा है; एएमएसीएस को कैसे व्यवहार करना चाहिए, इसकी किसी भी समझदार परिभाषा से, यह लगभग निश्चित रूप से धोखाधड़ी है दूसरी ओर, यह सभी मानक पुस्तकालय में है, इसलिए यह बहुत अधिक पाप नहीं हो सकता। (मुझे उम्मीद है।)

निम्नलिखित का मूल्यांकन करें:

(add-hook 'after-change-major-mode-hook
          'hack-dir-local-variables-non-file-buffer)

तब से, जब आप बड़े मोड बदलते हैं, तो डीआईआर-लोकल वेरिएबल्स (मुझे लगता है) को बदलने के तुरंत बाद पुनः उपयोग किया जाना चाहिए।

अगर यह काम नहीं कर रहा है या आपको इसे पसंद नहीं है, तो आप 'एडे-हुक' को 'हटा-हुक' के साथ बदलकर और फॉर्म का मूल्यांकन करने के लिए इंपिक्स को पुन: प्रारंभ किए बिना इसे पूर्ववत कर सकते हैं।


मेरी इस पर:

(add-hook 'after-change-major-mode-hook #'hack-local-variables)

और या तो

(defun my-normal-mode-advice
    (function &rest ...)
  (let ((after-change-major-mode-hook
         (remq #'hack-local-variables after-change-major-mode-hook)))
    (apply function ...)))

यदि आप कष्टप्रद साथ रह सकते हैं

बाद-परिवर्तन-प्रमुख-मोड-हुक बफर-स्थानीय बनाने के लिए स्थानीय रूप से चलें!

संदेश या

(defun my-normal-mode-advice
    (function &rest ...)
  (remove-hook 'after-change-major-mode-hook #'hack-local-variables)
  (unwind-protect
      (apply function ...)
    (add-hook 'after-change-major-mode-hook #'hack-local-variables)))

अन्यथा और अंत में

(advice-add #'normal-mode :around #'my-normal-mode-advice)




elisp