2010-09-17 15 views
8

मैं Emacs में एक हुक खोजने की कोशिश कर रहा हूं, जो emacs सर्वर को सुंदर शटडाउन से ठीक पहले आग लगाना चाहिए। मैंने कोशिश की मार-Emacs-प्रश्न-काम करता है, को मारने-Emacs हुक, सर्वर-किया-हुक elisp की तरह साथ:मारने पर Emacsclient हुक

(add-hook 'server-done-hook 
      '(lambda() 
      (savehist-save) 
      ) 
     ) 

... लेकिन उनमें से कोई भी कहा जाता है जब ओएस बंद हो जाता है, तो इतिहास है बचाया नहीं

शायद कोई संकेत दे सकता है?

पीएस मैं जेनेटू लिनक्स पर हूं, emacs-vcs-23.2.9999 पैकेज, केवल टर्मिनल। वांछित व्यवहार का परीक्षण करने के लिए Emacs स्टार्ट-स्टॉप-डिमन उपयोगिता का उपयोग बंद कर दिया गया है।

उत्तर

14

Emacs बंद होने से पहले कुछ चलाने के लिए सही जगह या तो kill-emacs-query-function है यदि आप शटडाउन को रद्द करने में सक्षम होना चाहते हैं या kill-emacs-hook यदि आप नहीं करते हैं। जिस समस्या का आप सामना कर रहे हैं वह यह है कि आपका ओएस Emacs को इस तरह से बंद करने के लिए सूचित नहीं करता है कि Emacs समझता है, या इसे दूसरी तरफ देखने के लिए, Emacs आपके ओएस के अनुरोध को समझदारी से समझने में नहीं समझता है।

बाहर से Emacs 23 को बंद करने का एक शानदार तरीका emacsclient -n -e '(kill-emacs)' चलाने के लिए है। जाहिर है कि कार्यक्रम को शानदार तरीके से बंद करने के लिए एक सामान्य तरीका नहीं है।

यूनिक्स पर प्रक्रिया को बंद करने का सामान्य तरीका यह एक SUPUP या SIGTERM सिग्नल भेजना है। दुर्भाग्य से, Emacs लगभग सभी संकेतों को घातक के रूप में मानता है, और केवल एक आपातकालीन ऑटो सेव करता है और जब उन्हें प्राप्त होता है तो कोई लिस्प कोड नहीं चलाता है। यह lisp से विन्यास योग्य नहीं है। A different behavior has been requested, but turned down

आंशिक वर्कअराउंड (found here) delete-frame-functions में सत्र बचत हुक चलाने के लिए है। यह हुक सिस्टम शट डाउन अनुक्रम से पहले चलाया जा सकता है, या तो जब आप अपना अंतिम फ्रेम बंद करते हैं या जब एक्स सर्वर मर जाता है (यदि आप टर्मिनल में Emacs चलाते हैं तो अपने टर्मिनल लेते हैं)। सुनिश्चित करें कि आप उस हुक को नहीं चलाते जो delete-frame-functions में सर्वर को मारता है।

वैसे, अगर आप इस सटीक हुक का उपयोग करने के लिए जा रहे थे, ध्यान दें कि आपके कोड (add-hook 'server-done-hook 'savehist-save) लेखन की एक जटिल तरीका है, और है कि उपयोगी वहाँ kill-emacs-hook में है, क्योंकि पहले से ही savehist-autosave नहीं है।

+0

मैंने ओएस जानकारी जोड़ा। हां, मुझे पता है कि यह थोड़ा जटिल है तो होना चाहिए। – MageSlayer

+0

यदि आपने एक QUIT सिग्नल emacs को भेजा है, तो emacs '(kill-emacs)' के रूप में शानदार रूप से बंद हो सकता है। जैसे pkill -3 emacs या pkill -QUIT emacs, दुर्भाग्यवश, कुछ ओएस ने टीईआरएम सिग्नल भेजा, emacs इसके साथ अच्छी तरह से काम नहीं करते हैं। – zw963

संबंधित मुद्दे