मेरे पास मेरी Emacs init.el फ़ाइल में एक फ़ंक्शन है जो मुझे इसे एक साक्षर स्रोत फ़ाइल से पुनर्निर्माण और बाइट-संकलित करने देता है। इसमें एक lambda फ़ंक्शन होता है जो defun से लिपटा होता है और ठीक वैसे ही काम करता है जैसा मैं उम्मीद करता हूं। अब तक सब ठीक है।

(defun tangle-init-and-reload ()
  "Tangle the code blocks in init.org, byte-compile, and reload."
  (lambda ()
    (interactive)
    ;; Don't run hooks when tangling.
    (let ((prog-mode-hook nil))
      (org-babel-tangle-file (concat user-emacs-directory "init.org"))
      (byte-compile-file (concat user-emacs-directory "init.el"))
      (load-file user-init-file))))

जब मैं एलीस्प में कार्यों के बारे में पढ़ता हूं, तो मुझे ऐसा प्रतीत होता है कि मुझे नामित फ़ंक्शन को परिभाषित करने के लिए defun का उपयोग करने में सक्षम होना चाहिए और lambda को छोड़ देना चाहिए, इसलिए मैंने lambda को हटा दिया और अन्यथा समारोह को बरकरार रखा, जैसे:

(defun tangle-init-and-reload ()
  "Tangle the code blocks in init.org, byte-compile, and reload."
  (interactive)
  ;; Don't run hooks when tangling.
  (let ((prog-mode-hook nil))
    (org-babel-tangle-file (concat user-emacs-directory "init.org"))
    (byte-compile-file (concat user-emacs-directory "init.el"))
    (load-file user-init-file)))

इस तरह लिखा गया, फ़ंक्शन भी अपेक्षा के अनुरूप काम करता है - जब तक मैं इसे M-x tangle-init-and-reload RET के साथ कॉल करता हूं। यदि मैं इसे एक कुंजी बाइंडिंग असाइन करता हूं, तो यह स्टार्टअप पर दो अलग-अलग दुष्प्रभावों में से एक के साथ निष्पादित होता है: कुछ प्रमुख बाइंडिंग के साथ, यह init.elc को अधिलेखित करने का प्रयास करता है, जबकि Emacs के पास अभी भी यह खुला है, और अन्य के साथ यह सफलतापूर्वक init.elc, लेकिन फिर पुनः लोड होने पर पुन: निष्पादित होता है, जिससे अनंत पुनरावर्तन होता है।

मैं lambda संस्करण के साथ पूरी तरह से खुश हूं, जिसमें कुंजी बंधन के साथ कोई समस्या नहीं है, लेकिन मैं यह समझना चाहता हूं कि lambda कौन सा जादू कर रहा है और/या यह कुंजी बाध्यकारी के बारे में क्या कारण बनता है स्टार्टअप पर निष्पादित करने के लिए दूसरा संस्करण। क्या कोई समझा सकता है?

जो कुछ भी इसके लायक है, मेरी कुंजी बाइंडिंग एक कस्टम मामूली मोड में हैं जैसे:

(defvar custom-map (make-keymap)
  "Custom key bindings.")
(define-key custom-map (kbd "C-c C-i") (tangle-init-and-reload))
(define-minor-mode custom-bindings-mode
  "Activates custom key bindings."
  t nil custom-map)
2
alanhr 22 अगस्त 2019, 14:58

1 उत्तर

सबसे बढ़िया उत्तर

जब आप कुंजी बाइंडिंग को परिभाषित करते हैं, तो आप एक कुंजी को एक मान से जोड़ते हैं, जो आपके मामले में है:

(tangle-init-and-reload)

यह एक अभिव्यक्ति है जिसका मूल्यांकन सामान्य रूप से किया जाता है, अर्थात। जब आप बाइंडिंग को जोड़ते हैं तो आप फ़ंक्शन को कॉल करते हैं।

पिछले संस्करण में, एक ही फ़ंक्शन का मूल्यांकन करने से एक बंद हो गया, आपके पास एक स्तर का संकेत था, इसलिए आपने कॉल द्वारा tangle-init-and-reload को लौटाए गए फ़ंक्शन के लिए एक कुंजी से बाध्यकारी स्थापित किया।

आप इसे उद्धृत करके, बाध्यकारी से जुड़े फ़ंक्शन का नाम आसानी से दे सकते हैं:

(define-key custom-map (kbd "C-c C-i") 'tangle-init-and-reload)
1
coredump 22 अगस्त 2019, 12:02