cc-mode के लिए पहले से सेव-हुक


13

मैं cc-modeसहेजने से पहले किसी फ़ंक्शन को निष्पादित करने के लिए अनुकूलित करना चाहता हूं । एक समाधान एक cc-modeकीम को C-x C-sएक फ़ंक्शन से बाँधने के लिए संशोधित करना होगा जो मेरे द्वारा आवश्यक कार्य करता है और फिर इसे बचाता है।

मेरा सवाल यह है कि क्या कोई हुक है जो मैं इसके लिए अनुकूलित कर सकता हूं? सीसी हुक्स डॉक्स एक का उल्लेख नहीं है before-save-hookके लिए विशेष रूप cc-mode। यह एक हुक के माध्यम से कैसे किया जाना चाहिए?

वैकल्पिक रूप से, मैं यह कैसे करूं defadvice? मैनुअल पढ़ने से, मुझे देखने का एकमात्र तरीका बचत से पहले सलाह को सक्षम करना और फिर काम पूरा होने के बाद अक्षम करना था। यह बोझिल लगता है। adviceएस का उपयोग करने का मुहावरेदार तरीका क्या होगा ?


3
आपके द्वारा जोड़ा गया फ़ंक्शन before-save-hookवर्तमान प्रमुख मोड (जैसे (eq major-mode ...)) की जांच कर सकता है और कुछ भी नहीं कर सकता है यदि यह आपके द्वारा अनुकूलित किए जा रहे मोड से मेल नहीं खाता है।
कांस्टेंटाइन

@ कॉन्सटेंटाइन सहमत थे। मैं इस माध्यम से जांच करना चाहता था कि क्या इस तरह की चीज़ के लिए कुछ और "अंतर्निहित" है। IIRC haskell-modeमें कम से कम एक after/before-saveहुक है और मैंने मान लिया कि यह प्रोग-मोड के लिए मानक अभ्यास था।
प्रधान

@ कॉन्स्टेंटाइन: क्या आप अपनी टिप्पणी को उत्तर में बदल सकते हैं (थोड़ा विस्तार कर सकते हैं, बिल्कुल)?
दान

1
उदाहरण के उपयोग के लिए इस धागे को देखें after-save-hook; आप एक ही तरह की प्रक्रिया का उपयोग कर सकते हैं लेकिन स्थानापन्न कर सकते हैं before-save-hook
दान

जवाबों:


12

हुक की कार्रवाई को एक विशेष प्रमुख मोड में प्रतिबंधित करने का एक काफी सामान्य तरीका है, के मूल्य की जांच करना major-mode

उदाहरण के लिए, यह हुक बफ़र्स के उपयोग से बचाने से पहले एक संदेश प्रिंट करता है c++-mode:

(defun my-c++-mode-before-save-hook ()
  (when (eq major-mode 'c++-mode)
    (message "It's never too early to start saving (C++ code)!")))

(add-hook 'before-save-hook #'my-c++-mode-before-save-hook)

एक साइड नोट के रूप में: कभी-कभी यह जांचने के लिए उपयोगी हो सकता है कि क्या एक प्रमुख मोड सीसी मोड से निकला है; हम यह जाँच कर सकते हैं कि c-buffer-is-cc-modeक्या नहीं है nil:

(defun my-cc-mode-before-save-hook ()
  (when c-buffer-is-cc-mode
    (message "Saving a buffer with a major-mode derived from CC Mode.")))

19

वैकल्पिक रूप से, एक स्थानीय हुक का उपयोग करें:

(add-hook 'c++-mode-hook
          (lambda () (add-hook 'before-save-hook MY-HOOK-FUNC nil 'local)))

यह प्रत्येक C ++ मोड बफर MY-HOOK-FUNCके बफर-लोकल before-save-hook या C ++ मोड से व्युत्पन्न मोड में किसी भी बफर को जोड़ता है ।

मुझे यह अधिक सुरुचिपूर्ण लगता है जो स्पष्ट रूप से जाँच कर रहा है major-mode, और इसका लाभ यह है कि आप प्रत्येक बफर के लिए before-save-hook स्थानीय रूप सेM-: (remove-hook 'before-save-hook MY-HOOK-FUNC 'local) किसी अन्य बफ़र्स को प्रभावित किए बिना अक्षम कर सकते हैं ।


-1

जब एक बार मुझे अपनी एलीस फाइलों को स्वतः सहेजने के लिए कुछ ऐसा चाहिए था, तो मैंने इस तरह से एक दृष्टिकोण का उपयोग किया (सीसी-मोड के लिए दृष्टिकोण को परिवर्तित किया):

(add-hook 'c-common-hook #'(lambda ()
                              (add-hook 'before-save-hook #'(lambda ()
                                                               (funcall #'YOUR-FUNC-HOOK)))))

1
पहले, क्या आपका मतलब था c-mode-common-hook? दूसरा, ऐसा लगता है कि यह before-save-hookपहली बार जब आप एक- Cसंबंधित भाषा में प्रवेश करते हैं, तो फ़ंक्शन जोड़ देगा , लेकिन फिर उस फ़ंक्शन को प्रत्येक बफ़र पर प्रत्येक बचत से ठीक पहले कहा जाएगा। ओपी को एक विशिष्ट मोड में होने वाले बफर पर फ़ंक्शन सशर्त चलाने की आवश्यकता है (देखें कि कैसे के लिए @ कॉन्स्टेंटाइन की टिप्पणी)।
दान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.