Emacs के भीतर से emacs को पुनरारंभ करें


44

मैं अपने emacs को बहुत पुनरारंभ करता हूं। मैं सिर्फ इतना करना चाहता हूं कि एक ऐसा फंक्शन तैयार किया जाए जो करंट इमैक्स को मारता है, केवल एक नई जगह को स्पॉन्ट करता है। आदर्श रूप से, यह एक TTY में भी काम करेगा।


8
जिज्ञासा से बाहर, आप क्यों मारते हैं और तुरंत इतनी बार पुनः आरंभ करते हैं?
दान

2
मैं बहुत सक्रिय रूप से अपना विकास करता हूं .emacs.d, जिसका अर्थ है कि मैंने अपने वातावरण में जो भी कचरा नष्ट किया है, उसे निकालने के लिए मैं ईमैक्स को पुनरारंभ करता हूं। कुछ अन्य उपयोग-मामले हैं जहां मैं ऐसा करता हूं, लेकिन यह सबसे बड़ा है।
PythonNut

1
@PythonNut, मुझे लगता है कि आपको अपने प्रश्न को थोड़ा और सुधारने की आवश्यकता है। आप bashसमाप्त करने के बाद पुनः आरंभ करने के लिए कह सकते हैं ? या vi? या किसी अन्य प्रक्रिया, एक नियम के रूप में? नहीं, क्योंकि यह उनकी चिंताओं के दायरे से बाहर है, और ठीक से बाहरी रूप से नियंत्रित किया जाता है। किसी भी मामले में, जो आप वास्तव में चाहते हैं, वह अपने वीएम को हटाकर और अपने init कोड को फिर से चलाने ( अपनी प्रक्रिया को मारे बिना ) को हटाकर , emacs को फिर से संगठित करने का एक तरीका है । यह उपयोगी और emacs के लिए उचित होगा। मुझे नहीं पता कि यह मौजूद है, हालांकि :)
harpo

4
@harpo हाँ, मैं के bashसाथ पुनः आरंभ कर सकते हैं exec bash। मुझे विम के बारे में कोई जानकारी नहीं है।
पायथनटन

11
FWIW, मैं कॉन्फ़िगर परिवर्तनों का परीक्षण करने के लिए Emacs का एक नया उदाहरण शुरू करने के लिए अधिक इच्छुक हूं , बल्कि तब बाहर निकलने और फिर से शुरू कर रहा हूं । क्यों? क्योंकि यदि मेरे कोड में कोई त्रुटि है तो हो सकता है कि एमएसीएस पुनः आरंभ करने पर मेरा कॉन्फिगरेशन लोड न कर सके, और उस समय मुझे वास्तव में अपनी सामान्य सेटिंग्स के साथ रनिंग इंस्टेंस नहीं मिल सकता है, इसलिए मुझे कम-परिचित संपादन का उपयोग करना होगा बग को ठीक करने का वातावरण। यह अक्सर नहीं होगा, लेकिन जब यह होता है तो यह कष्टप्रद होता है। मैं emacs -qनिश्चित रूप से समस्या को चला सकता हूं और ठीक कर सकता हूं , लेकिन मैं अपने कॉन्फ़िगरेशन पर हैक करते समय हर समय 'अच्छा' उदाहरण रखना पसंद करता हूं, बस सुरक्षित रहने के लिए।
फिल्स

जवाबों:


25

नोट: मैंने यहांrestart-emacs उपलब्ध पैकेज में निम्नलिखित लपेटा है


यहाँ एक वैकल्पिक तरीका है जिसे आप प्राप्त करना चाहते हैं जिसे आप शुद्ध रूप से प्रयोग कर रहे हैं (वास्तव में जब से आप किसी शेल पर निर्भर करते हैं)। चाल वर्तमान emacs को मारने से पहले एक और emacs प्रक्रिया को बंद करने के लिए है।

(defun launch-separate-emacs-in-terminal ()
  (suspend-emacs "fg ; emacs -nw"))

(defun launch-separate-emacs-under-x ()
  (call-process "sh" nil nil nil "-c" "emacs &"))

(defun restart-emacs ()
  (interactive)
  ;; We need the new emacs to be spawned after all kill-emacs-hooks
  ;; have been processed and there is nothing interesting left
  (let ((kill-emacs-hook (append kill-emacs-hook (list (if (display-graphic-p)
                                                           #'launch-separate-emacs-under-x
                                                         #'launch-separate-emacs-in-terminal)))))
    (save-buffers-kill-emacs)))

जीयूआई संस्करण को एमएसीएस शुरू करने का कोड सीधा है। एक टर्मिनल में emacs शुरू करने के लिए कोड थोड़ा मुश्किल है। यह इस तथ्य का उपयोग करता है कि आप एक स्ट्रिंग पास कर सकते हैं suspend-emacsजिसे मूल प्रक्रिया (शेल) के लिए टर्मिनल इनपुट के रूप में पारित किया जाएगा। प्रलेखन से

(सस्पेंड-एमएसीएस और वैकल्पिक स्टफिंग)

Emacs को रोकें और बेहतर प्रक्रिया पर लौटें। आप बाद में फिर से शुरू कर सकते हैं। यदि `नहीं-सस्पेंड 'गैर-शून्य है, या यदि सिस्टम नौकरी नियंत्रण का समर्थन नहीं करता है, तो इसके बजाय एक उपधारा चलाएं।

यदि वैकल्पिक arg STUFFSTRING नॉन-नील है, तो इसके वर्णों को निलंबन के बाद Emacs के माता-पिता द्वारा टर्मिनल इनपुट के रूप में पढ़ा जा सकता है।

इसलिए हम मूल रूप से emacs को निलंबित कर देते हैं इससे पहले कि वह मारा जाता है माता-पिता को बताएं कि वर्तमान में निलंबित emacs (जो जल्द ही बाहर निकलने वाला है) को फिर से शुरू करें और फिर एक और emacs प्रक्रिया लॉन्च करें। ध्यान दें कि यह उन प्लेटफार्मों पर काम नहीं करता है जिन पर टर्मिनल ईएसीएस वास्तव में निलंबित नहीं कर सकता / सकती है लेकिन एक उपखंड शुरू करता है, उदाहरण के लिए खिड़कियों पर।


यह मेरे लिए काम नहीं करता है: जब मैं sh -c "emacs &"शेल से चलता हूं तो यह " emacs: standard input is not a tty" के साथ बंद हो जाता है । (जब मुझे M-x restart-emacsवह त्रुटि संदेश दिखाई भी नहीं देता है, तो Emacs बस समाप्त हो जाता है।)
कॉन्स्टेंटाइन

एक्स के तहत मेरे लिए काम करता है। टर्मिनल में काम नहीं करेगा क्योंकि यह स्टड और स्टडआउट को / dev / null में रीडायरेक्ट करता है; माता-पिता को उपप्रकार से गुजारना शायद उल्लेखनीय है लेकिन मुश्किल है।
बेनी चेर्नियाव्स्की-पास्किन

1
यह पूरी तरह से काम करता है, और यह वास्तव में मुझे थोड़ा डराता है। क्यों पृथ्वी पर Emacs को कमांड युक्त शेल में जाने की अनुमति है?
रेडॉन रोसबोरो

उसके लिए आप कौन सी कीबाइंडिंग का उपयोग करते हैं?
slk500

32

जहां तक ​​मुझे पता है कि आप Emacs को समाप्त करने के बाद फिर से शुरू करने के लिए नहीं कह सकते हैं, लेकिन आप बाहर निकलने का कोड सेट कर सकते हैं ताकि पहली बार में Emacs को शुरू करने वाली प्रक्रिया यह पता लगा सके कि आप फिर से शुरू करना चाहते हैं।

उदाहरण के लिए, यह शेल स्क्रिप्ट ईमैक्स को फिर से शुरू करता है अगर यह कोड 123 के साथ बाहर निकलता है।

#!/bin/sh
while emacs -nw "$@"; [ $? = 123 ]; do :; done

इसके बाद, हम परिभाषित करते हैं kill-emacs-and-restartकि Emacs स्क्रिप्ट द्वारा मान्यता प्राप्त जादू संख्या के बराबर निकास कोड के साथ समाप्त करता है:

(defun kill-emacs-and-restart ()
  (interactive)
  (kill-emacs 123))

अब यदि आप इस स्क्रिप्ट के माध्यम से Emacs चलाते हैं तो आप फिर से शुरू कर सकते हैं M-x kill-emacs-and-restart(या इसे एक महत्वपूर्ण अनुक्रम से बांध सकते हैं)।


समस्या के चारों ओर झालर लगाने का अच्छा तरीका! अगर आप मुझे बता सकते हैं तो मैं इसे क्यों स्वीकार करूंगा you cannot tell Emacs to re-start after terminating। क्या यह एक तकनीकी सीमा है?
PythonNut

3
@PythonNut: जहां तक ​​मुझे पता है कि एक प्रक्रिया को फिर से शुरू करने का एकमात्र तरीका exec...परिवार से कार्यों में से एक का उपयोग करके है (POSIX सिस्टम पर, वैसे भी)। Emacs लिस्प प्रक्रिया नियंत्रण कार्य ऐसे निम्न-स्तरीय कॉल को उजागर नहीं करते हैं। मैं एक विशेषज्ञ नहीं हूँ, हालाँकि, उम्मीद है कि कोई और जानकार इसमें झंकार करेगा।
कॉन्स्टेंटाइन

2

Https://unix.stackexchange.com/questions/114238/is-it-possibe-to-change-parent-shells-working-directory-programmatically से चोरी से चोरी

यह मानकर कि मुझे स्ट्रिंग में "एम्बेड करने के लिए वाक्यविन्यास अधिकार मिला है, यह करना चाहिए।

(defun restart-emacs ()
  (call-process "sh" nil nil nil "-c" "gdb -p $(ps h -o ppid -p $$) -ex 'call execl(\"/bin/sh\", \"/bin/sh\", \"-c\", \"exec emacs\")'"))

11
कृपया नहीं। यह एमएसीएस के सभी आंतरिक सफाई को दरकिनार करता है और बिना पुष्टि के सभी वर्तमान स्थिति (जैसे संशोधित बफ़र्स) को छोड़ देता है ।
चंद्रोदय l

Lunaryorn की चेतावनी सही है।
यहोशू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.