जब इसे खोला जाता है तो मैं ऑर्गमोड फ़ाइल में क्विक का मूल्यांकन कैसे कर सकता हूं?


13

जब वे लोड होते हैं (तो मैं अलग-अलग फाइलों के लिए अलग-अलग होता हूं, और फाइल में ही परिभाषित होता हूं) मेरे पास एलिस्प कोड है। क्या इसे करने का कोई तरीका है? मुझे http://orgmode.org/manual/In_002dbuffer-settings.html में कुछ भी दिखाई नहीं दिया

अगर मैं कुछ भी जोड़ सकता हूं तो इनिशियलाइज़ेशन जो एक ऑर्गेमोड फ़ाइल लोड होने पर विशेष रूप से नामित कोड ब्लॉक चलाता है, जो एक समाधान हो सकता है, लेकिन मुझे यकीन नहीं है कि यह कैसे करना है, और आदर्श रूप से कुछ में बनाया गया है।


1
फ़ाइल-स्थानीय चर, शायद?
दान

यह काम करता है! क्या आप इसे एक उत्तर देना चाहते हैं जिसे मैं स्वीकार कर सकता हूं?
अवं

आगे सोचा कि यह एक बहुत ही गन्दा वातावरण है जिसे संपादित करने के लिए, इसलिए एक अच्छा समाधान फ़ाइल नाम वाले स्थानीय वैरिएबल को एक कोड कोड चलाएगा।
avv

इसे एक प्रागंण या लैम्ब्डा में लपेटें, शायद?
दान

3
आप उपयोग भी कर सकते हैं # -*- eval: (lisp code here) -*-लेकिन आपको खतरों से भी अवगत होना होगा। यहां तक ​​कि अगर आप इन दस्तावेजों को किसी और के साथ साझा नहीं करते हैं, तो Emacs Lisp की व्याख्या की गई प्रकृति का मतलब होगा कि परिवर्तन से डेटा की हानि हो सकती है। इसके अलावा, मोड हुक एक बेहतर विकल्प की तरह लगता है यदि आप एक से अधिक फ़ाइल के लिए समान कोड चलाना चाहते हैं।
wvxvw

जवाबों:


9

इस समाधान में init.el(मामूली संशोधनों के साथ) बदलाव की आवश्यकता नहीं है । इसमें फ़ाइल-स्थानीय मूल्यांकन शामिल हैं, हालांकि - लेकिन यह वही है जो ओपी ने पूछा था। समाधान के लाभ हैं:

  • मूल्यांकन कोड की पुष्टि के लिए पूछता है
  • मूल-कोलाहल के माहौल के भीतर elisp कोड को संपादित और परीक्षण किया जा सकता है
  • समाधान के रूप में init.elऑर्गमोड फ़ाइल में संशोधनों की आवश्यकता नहीं होती है (विश्वसनीय) उपयोगकर्ताओं के बीच साझा किया जा सकता है

मैं यहाँ समाधान फिर से कर रहा हूँ।

अपनी फ़ाइल में कहीं एक src-block जोड़ें:

#+NAME: startup
#+BEGIN_SRC emacs-lisp
(your-code-here)
#+END_SRC

फिर, इसे अपनी ऑर्गेमोड-फाइल के अंत में रखें:

# Local Variables:
# eval: (progn (org-babel-goto-named-src-block "startup") (org-babel-execute-src-block) (outline-hide-sublevels 1))
# End:

मैंने जोड़ा है (outline-hide-sublevels 1)क्योंकि मैं एक शीर्षक के अंदर src-block को छिपाना पसंद करता हूं और चाहता हूं कि sublevels को स्टार्टअप पर छिपाया जाए। इस कथन के बिना, उपशीर्षकों का विस्तार हो जाएगा (org-babel-goto-named-src-block "startup")

इस समाधान के साथ, एमएसीएस निष्पादित करने के लिए 2 बार पूछेगा (1: स्थानीय चर लागू करें; 2: "स्टार्टअप" -src- ब्लॉक को निष्पादित करें)। जैसा कि मेरी फ़ाइल में बहुत सारे src-block हैं, मैंने एक और फ़ाइल-स्थानीय-चर सेट किया है org-confirm-babel-evaluate, जैसे:

# Local Variables:
# org-confirm-babel-evaluate: nil
# eval: (progn (org-babel-goto-named-src-block "startup") (org-babel-execute-src-block) (outline-hide-sublevels 1))
# End:

चेतावनी: इस अतिरिक्त के साथ, emacs निष्पादित करने की अनुमति के लिए केवल एक बार संकेत देगा - उस फ़ाइल के सभी src-block अब बिना किसी पुष्टि के निष्पादित हो सकते हैं। जैसा कि दूसरों ने पहले बताया है, यह व्यवहार खतरनाक हो सकता है और आपको इस सेटिंग से बहुत सावधान रहना चाहिए।

हालाँकि, मैं तर्क दूंगा कि यह समाधान (विशेष रूप से पहला संस्करण) जो कोर्नेलि द्वारा दिए गए एक से अधिक सुरक्षित है क्योंकि कम से कम आपको निष्पादित करने के लिए पुष्टि के लिए कहा जाएगा । जो का समाधान पुष्टि के बिना विशेष ब्लॉक का मूल्यांकन करेगा, अगर यह फ़ाइल में पाया जाता है। एक हमलावर को विशेष ब्लॉक के नाम का अनुमान लगाना होगा, निश्चित रूप से ...

मैं इस दृष्टिकोण का उपयोग बड़े दस्तावेजों को लिखने के लिए कर रहा हूं, जिनकी आवश्यकता है, उदाहरण के लिए, ऑर्ग-एक्सपोर्ट तंत्र के लिए अनुकूलन।


5

org-mode... किसी भी हुक के अलावा इसका मूल मोड outline-modeभी चल सकता है, यह मोड हुक को चलाता है org-mode-hook, आरंभीकरण के दौरान अंतिम चरण के रूप में।

तो, अपने init.el में:

(defun function-that-finds-and-evaluates-special-block ()
;; DWIM :-)
)
(add-hook 'org-mode-hook 'function-that-finds-and-evaluates-special-block)

इस कार्य के लिए, फ़ाइल-स्थानीय संस्करण की तुलना में यह मुझे अधिक उचित लगता है। लेकिन शायद मुझे कुछ याद आ रहा है।
ड्रयू

@ जो कॉर्नेल और फिर आप वास्तविक ऑर्ग फाइल में क्या डालेंगे?
गरमागरम

"विशेष ब्लॉक" को छोड़कर कुछ भी विशेष नहीं है।
जो कॉर्नेल जूल

3

चूंकि तुम मांगते हो

(विभिन्न फ़ाइलों के लिए अलग, और फ़ाइल में ही परिभाषित)

फिर, इस समाधान का प्रयास करें ।


नीचे वोट क्यों?
Emacs उपयोगकर्ता

ऐसा इसलिए है क्योंकि उत्तर जो अन्य उत्तरों के लिंक हैं वे हतोत्साहित हैं। यह कहा जा रहा है, हो सकता है कि यह सवाल आप से जुड़े लोगों का एक धोखा है?
लिनस अरवर

1

मैं हुक का उपयोग करने के बारे में @ जोए कॉर्नेल के सुझाव से सहमत हूं।

यह मेरे साथ भी होता है कि आप यहां बुकमार्क का लाभ उठा सकते हैं: हुक पर एक विशिष्ट बुकमार्क जंप करें। कोड ब्लॉक के लिए एक बुकमार्क का लाभ यह है कि यह आमतौर पर स्वचालित रूप से स्थानांतरित हो जाता है (जैसे फ़ाइल सामग्री में परिवर्तन), इसलिए ब्लॉक का पता लगाने का आमतौर पर स्वचालित रूप से ध्यान रखा जाना चाहिए।

[लेकिन यह मेरे लिए स्पष्ट नहीं है कि आपके पास कहीं और के बजाय ऑर्ग-मोड फ़ाइलों में कोड क्यों है। हम समस्या के कथन के अनुसार, इसे ले रहे हैं, लेकिन मुझे आश्चर्य है कि आप ऐसा क्यों कर रहे हैं। उस डिजाइन के बारे में अधिक जानकारी देने से हमें बेहतर मदद मिल सकती है।]


0

मैंने जो कॉर्नेल से कोड को बेहतर बनाने की कोशिश की है:

आपको अपनी init.el फ़ाइल में इसकी आवश्यकता है:

  (defun tdh/eval-startblock ()
    (if (member "startblock" (org-babel-src-block-names))
      (save-excursion
        (org-babel-goto-named-src-block "startblock")
        (org-babel-execute-src-block))
      nil
      )
    )
  (add-hook 'org-mode-hook 'tdh/eval-startblock)

हर बार जब आप एक ऑर्ग-मोड बफर खोलते हैं, तो यह स्टार्टब्लॉक नाम के एक स्रोत ब्लॉक की खोज करेगा, यदि कोई पाया जाता है, तो वह इसे निष्पादित करेगा।

ऑर्ग-मोड फ़ाइलों में, आप तब डाल सकते हैं:

#+NAME: startblock
#+BEGIN_SRC emacs-lisp
  ;; Any code you want
#+END_SRC
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.