मैक पर Emacsdaemon और Emacsclient


25

ओएस: ओएस एक्स 10.9.5, मावेरिक्स

GNU Emacs 24.3.1 (x86_64-apple-darwin13.1.0, कार्बन संस्करण 1.6.0 AppKit 1265.19) 2014-04-03 के रेनर्स-मैकबुक-प्रो-3.-फोकल पर

मैंने रेलवेकैट से होमब्रे के माध्यम से emacs स्थापित किए और यह अच्छी तरह से काम करता है - कोई शिकायत नहीं। मैं टर्मिनलों में emacs का उपयोग नहीं करता हूं, और मैं आमतौर पर एप्लिकेशन के माध्यम से इसे शुरू करता हूं।

जैसा कि मैंने कहा - मैं अब तक खुश हूं।

मेरे पास बस एक चीज है जिसे मैंने सही पाने के लिए प्रबंधित नहीं किया है (जो पहले लिनक्स के तहत अच्छी तरह से काम करता था), जो है:

  1. Emacs डेमन लॉगिन पर शुरू करें
  2. खोलने के लिए emacsclient का उपयोग करना
  3. Emacsdaemon बंद करें और लॉगऑफ़ पर अल फ़ाइलों को सहेजें

कोई भी काम करने वाली रेसिपी जो मुझे इसे स्थापित करने में मदद कर सकती है?

जानकारी जोड़ी गई

लॉगिन करने पर एक इमैक डेमॉन शुरू करने के लिए

मैंने bash कमांड को निष्पादित करने वाला एक Automator एप्लिकेशन बनाया

/usr/local/bin/emacs --daemon

और इसे लॉगिन आइटम में जोड़ा जो अच्छी तरह से काम करता है।

टर्मिनल से डेमॉन का उपयोग

मैं का उपयोग करके emacs डेमॉन का उपयोग कर सकते हैं

emacsclient .bashrc

जो एक emacs टर्मिनल सत्र में .bashrc को खोलता है।

GUI से उपयोग करना

अब यह सवाल बना हुआ है: मैं इसे GUI से कैसे उपयोग कर सकता हूं?

जैसा कि मैं emacsclient को समझता हूं, मैं एक emacsclient नहीं खोल सकता जब तक कि मैं फ़ाइल खोलने के लिए निर्दिष्ट नहीं करता।

मैं एक एमएसीएसक्लिएंट जीयूआई खोलना चाहता हूं और सभी फाइलें खोलना चाहता हूं जो पहले खोली गई थीं ? क्या यह संभव है?

मुझे पता चला कि मैं उपयोग कर सकता हूं

emacsclient -c

एक टर्मिनल में वह करने के लिए जो मैं चाहता हूं - लेकिन क्या मैं जीयूआई के लिए भी ऐसा कर सकता हूं?


मुझे समझ नहीं आया कि "GUI से" का क्या मतलब है। इसका मतलब "फाइंडर में किसी फाइल पर डबल क्लिक करना" या पूरी तरह से कुछ और हो सकता है।
तारसियस

ऐप लॉन्चर का उपयोग करना (जैसे स्पॉटलाइट के माध्यम से)
रेनर

क्या ऐप लॉन्चर फ़ाइलों का चयन करने की अनुमति देता है (जो तब फ़ाइल प्रकार के लिए डिफ़ॉल्ट एप्लिकेशन का उपयोग करके खोला जाता है)। या केवल "ऐप्स"? emacsclientजहां तक ​​OS X का संबंध है, केवल एक ऐप नहीं है, केवल Emacs(और केवल अगर यह उस तरह से स्थापित किया गया है)। आप केवल एक खुले एप्लिकेशन / विंडो के चयन के लिए सिस्टम कुंजी बाइंडिंग का उपयोग क्यों नहीं करते हैं? (काम नहीं करेगा यदि Emacs को डेमॉन मोड में शुरू किया गया था और अभी तक कोई फ्रेम ("विंडो") नहीं है)।
तरसियस

मैंने Emacsclient नाम से एक ऐप को परिभाषित किया जो Emacsclient लॉन्च करता है - इसलिए ऐप Emacsclient है। मैं स्पष्ट रूप से चल रहे एमएसीएस उदाहरण पर स्विच कर सकता हूं - लेकिन यह बिंदु के अलावा है, ऊपर वर्णित वर्कफ़्लो को देखकर।
रेनर

1
यह सवाल इसके जवाबों की तुलना में लगभग अधिक उपयोगी है :)
रॉय Truelove

जवाबों:


6

मैं वास्तव में Emacs.app पर हमेशा ध्यान नहीं देता, लेकिन यह तथ्य कि मैं गलती से Emacs सर्वर को मारे बिना खिड़की को बंद नहीं कर सकता था कष्टप्रद था। और यहां तक ​​कि अगर आप अंतिम फ्रेम को मारने के लिए वास्तव में कठिन प्रयास करते हैं, तो यह अभी भी आपको ऐसा नहीं करता है: "एकमात्र दृश्यमान या आइकन फ़्रेम को हटाने का प्रयास करें"। ... तो हम धोखा देते हैं।

यह समाधान सिर्फ Emacs (जैसे Command+ h) को छुपाता है, जब आप क्लोज बटन पर क्लिक करके आखिरी विंडो को बंद करने की कोशिश करते हैं।

कहीं अपने एमएसीएस इनिट में निम्नलिखित जोड़ें:

(defadvice handle-delete-frame (around my-handle-delete-frame-advice activate)
  "Hide Emacs instead of closing the last frame"
  (let ((frame   (posn-window (event-start event)))
        (numfrs  (length (frame-list))))
    (if (> numfrs 1)
      ad-do-it
      (do-applescript "tell application \"System Events\" to tell process \"Emacs\" to set visible to false"))))

और Emacs को "उपयोगकर्ता और समूह> लॉगिन आइटम" में जोड़ें, और "छिपाएं" चेकबॉक्स पर क्लिक करें।

आपके Emacs init को भी (start-server)कहीं कॉल करने की आवश्यकता है।

मैं इस emacsclientरैपर को पहले सामने लाने के लिए Emacs का उपयोग कर रहा हूँ :

#!/bin/sh
osascript -e 'tell application "Emacs" to activate'
exec emacsclient "$@"

मुद्दे:

  • Emacs को एक्टिवेट / अनहाइड करना सभी विंडो को सामने लाता है । यह थोड़ा कष्टप्रद है।
  • डॉक में Emacs आइकन पर क्लिक करने से लगता है कि बेतरतीब ढंग से कभी-कभी एक नई विंडो बनाई जा सकती है। लेकिन हमेशा नहीं।
  • TODO: हो सकता है कि मेक Command+ wपर आखिरी फ्रेम में भी Emacs छिपा हो?
  • संपादन के साथ नया: डॉक आइकन पर क्लिक करने पर जब सभी विंडो कम से कम हो जाती हैं, तो उनमें से एक स्वचालित रूप से अधिकतम नहीं होती है।

यह Emacs को कम करने का सुझाव देने वाले @ noaham के उत्तर पर आधारित है , और यह उत्तर यह बताता है कि अंतिम विंडो को बंद करने का प्रयास कैसे किया जाए।

संपादित करें:

स्रोत के माध्यम से खोज करने पर, मुझे "कुंजी बाइंडिंग"mac-apple-event-map मिला, जिसके लिए कॉल करता है mac-ae-reopen-applicationmac-ae-reopen-applicationदृश्यमान और प्रतिष्ठित फ़्रेमों की जांच करना संभव है और किसी तरह हमारे छिपे हुए को याद करना चाहिए। यह संभवतः एक बग है।

आसान सुधार सिर्फ अपने init में कुंजी बंधन को निष्क्रिय करना है:

(define-key mac-apple-event-map [core-event reopen-application] nil)

यह एक नया माइनर बग पेश करता है: डॉक आइकन पर क्लिक करने पर जब सभी विंडो कम से कम हो जाती हैं, तो उनमें से एक स्वचालित रूप से अधिकतम नहीं होता है। सही समाधान फिर से लिखना होगा mac-ae-reopen-application, लेकिन मैं मुश्किल से emacs और elisp जानता हूं।


अगर किसी को पता है कि यादृच्छिक नई विंडो (बुलेट बिंदु दो) को कैसे रोका जाए तो कृपया मुझे बताएं। यह शायद केवल एक चीज बची है जो अभी भी मुझे इस सेटअप के बारे में बता रही है।
जनक ५४६६

@ parent5446, किया! ठीक पहले के रूप में hacky के रूप में, लेकिन यह काम करता है।
bburky

धन्यवाद! इसका हैक हिस्सा मुझे परेशान नहीं करता है क्योंकि ज्यादातर मैं वैसे भी डॉक से Emacs की शुरुआत नहीं करता।
पैरेंट ५४४६

4

यामामोटो मित्सुहारू पोर्ट ऑफ एमएसीएस दुर्भाग्य से मल्टी-ट्टी का समर्थन नहीं करता है (इस मुद्दे को देखें )। इसका मतलब यह है कि आप टर्मिनल से emacs डेमन शुरू नहीं कर सकते हैं और emacsclient के साथ एक gui विंडो लॉन्च कर सकते हैं।

यहाँ मैं क्या करूँ: मेरे init.el में मेरे पास है (server-start)और मैंने लॉगिन पर Emacs.app लॉन्च किया है। यहाँ झुंझलाहट यह है कि यह एक खिड़की लाता है जिसे मुझे मैन्युअल रूप से कम करना होगा।

मेरे पास एक बैश स्क्रिप्ट है जिसे emacscनिम्नलिखित के साथ कहा जाता है

#!/bin/bash                                                                          
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
emacsclient -n -c

मैं तब एक ऐप बनाता हूं जिसमें एप्सस्क्रिप्ट होता है जिसमें निम्नलिखित होते हैं

tell application "Emacs"
    activate
end tell
do shell script "~/bin/emacsc"

-nध्वज को खाली करने के लिए पास करना महत्वपूर्ण है अन्यथा आप केवल एक ग्राहक को एक बार खोलने के लिए emacsc ऐप का उपयोग कर पाएंगे। पथ चर सेट करना यह सुनिश्चित करता है कि OS X इमैसेक्लाइंट का सही संस्करण पा सकता है।

Emacs को "सक्रिय" करने के लिए कहना सुनिश्चित करता है कि आपके क्लाइंट विंडो को अग्रभूमि में लॉन्च किया जाएगा।

जैसा कि मैंने कहा कि झुंझलाहट यह है कि आपको मैन्युअल रूप से लॉगिन पर एमएसीएस विंडो को कम करना होगा और फिर इसे गोदी में बैठना होगा। इससे बचने का एक तरीका यह है कि लॉगिन के बाद Emacs को अपने आप "छिपा" दिया जाए, लेकिन फिर इसे सक्रिय करने से यह अनहाइड हो जाएगा।


2

मुझे यकीन नहीं है कि कैसे रेलवेकैट एमएसीएस नियमित होम-ब्रु-फॉर्मूला से अलग है, लेकिन बाद के साथ आप ऐसा करेंगे ln -sfv /usr/local/opt/emacs/*.plist ~/Library/LaunchAgents, जो emacs --daemonलॉगिन के साथ चलेगा ।

सूत्र में एचआईआर-दस्तावेज के रूप में प्लिस्ट को शामिल किया गया है । आपको इसे अपनाने की आवश्यकता होगी जो पंक्ति में आपके emacs ऐप में पथ बदल रहा है <string>#{opt_bin}/emacs</string>

BTW, आप Emacs को Homebrew Emacs के साथ OS X ऐप के रूप में भी प्राप्त कर सकते हैं यदि आप इसे --cocoaविकल्प के साथ इंस्टॉल करते हैं । (आपको brew linkappsबाद में इसे चलाने के लिए /Applications, इसे लिंक करने के लिए या लिंक स्वयं बनाने की आवश्यकता होगी ।


1

मैक डेमन्स पर, 90% समय, लॉन्चड का उपयोग करने में कामयाब रहे । यह उन्हें कई ट्रिगर्स पर चला सकता है, जिसमें उपयोगकर्ता लॉगिन / लॉगआउट शामिल है। एक सुंदर मैक एप्लीकेशन है जिसे विभिन्न चीजों को लॉन्च करने के लिए लिंगोन कहा जाता है और जिसे लॉन्च करना विभिन्न चीजों का प्रबंधन है। Emacs wiki में इसके कुछ उल्लेख हैं, जिनमें और config फाइल भी शामिल है । लेकिन ऐसा लगता है कि यह आपकी चिंता को संबोधित नहीं करता है, यानी लॉगआउट पर डेमॉन को कैसे बंद किया जाए।


0

इस तरह एक AppleScript एप्लिकेशन बनाएं:

tell application "Terminal"
do shell script "/usr/local/bin/emacsclient -c"
endtell

आपको पथ को समायोजित करना पड़ सकता है, या आप पथ को पूरी तरह से छोड़ने में सक्षम हो सकते हैं। यदि आप अभी तक नहीं चल रहे हैं तो आप डेमॉन को शुरू करने के साथ कुछ कट्टरता का उपयोग कर सकते हैं।


@ रेनर को इससे कोई सफलता मिली? तुम भी कट्टर कार्यान्वयन के लिए खोज करना चाहते हो सकता है, जो भी आवश्यक शुरू करने से पहले अगर यह आवश्यक है कि emacsclient का उपयोग कर कनेक्ट करने के लिए डेमन शुरू करते हैं। "applescript emacsclient" Google खोज के साथ अच्छे परिणाम देता है।
tarsius

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