OSX के तहत Emacs सर्वर का बेसिक सेटअप


9

मैंने हाल ही में एक दशक में अपना पहला मैक खरीदा और इसे कॉन्फ़िगर करने की प्रक्रिया में हूं। मैं एक Emacs उपयोगकर्ता हूं और मैंने निर्धारित किया है कि मैं चाहता हूं बस नियमित रूप से Emacs एक्वामाक्स नहीं ताकि मैं अन्य ऑपरेटिंग सिस्टम से अपने मौजूदा कॉन्फ़िगरेशन का उपयोग कर सकूं। मैंने ऑनलाइन पाया गया है कि कैसे- tos की एक बहुत का पालन करने की कोशिश की है यह वाला , यह वाला तथा यह उस साइट से जिसमें से मैंने Emacs डाउनलोड किया है ), और टुकड़ों को किसी भी तरीके से संयोजित करने की कोशिश की है, लेकिन कभी भी एक राज्य में चीजों को प्राप्त नहीं किया है, यहां तक ​​कि जो मैं करने के लिए उपयोग कर रहा हूं, उसके लिए भी उम्मीद कर रहा हूं

  1. एक Emacs डेमन या तो चलने लगता है प्रारंभ होने पर या जैसे ही मुझे इसकी आवश्यकता होगी ; कुछ भी चलेगा। किसी भी नए Emacs फ्रेम उसी सर्वर द्वारा समर्थित हैं।
  2. जब मैं खोजक से एक पाठ फ़ाइल खोलता हूं तो फ़ाइल एक संभव ग्राफिकल फ्रेम में Emacs में खुलती है।
  3. यदि मैं Emacs.app चलाता हूं, तो सिस्टम एक नया उदाहरण शुरू करने और उस पर एक नई विंडो खोलने के बजाय पृष्ठभूमि में चल रहे Emacs डेमन का पुन: उपयोग करता है। ( टोपी की नोक )
  4. जब मैं एक टर्मिनल से Emacs चलाता हूं तो टर्मिनल Emacs के साथ खत्म होने का इंतजार किए बिना अपने व्यवसाय के बारे में चला जाता है (जब तक कि मैं '-nw' का उपयोग नहीं करता)
  5. ऊपर वर्णित संचालन के दौरान AFAIK को किसी भी स्थिति में Emacs को एक राज्य में समाप्त नहीं होना चाहिए ("सर्वर-एडिट मोड?") जहां यह मेरे टाइप करने के लिए इंतजार कर रहा है C-x #, हालांकि मुझे इस बारे में गहरी समझ नहीं है।
  6. (मैं इसे बोनस के रूप में मानूंगा) मेरे लिए एक तरीका है कि मैं किसी टर्मिनल से Emacs को आमंत्रित करूं ताकि Emacs किसी मौजूदा फ्रेम का पुन: उपयोग कर सके।

मैं इस तरह का व्यवहार करने के लिए Emacs को कैसे कॉन्फ़िगर कर सकता हूं?

मैं विशेष रूप से Emacs में चीजों को खोलने के लिए खोजक को देखकर हैरान हूं (मैं # 2) चाहता हूं, क्योंकि मैंने जो मार्गदर्शक पाया है, वह आमतौर पर बहुत सारे उपनाम, एपलस्क्रिप्ट, बैश स्क्रिप्ट आदि बनाते हैं और मुझे यकीन नहीं है जो मैं खोजक को पाठ फ़ाइलों को खोलने के लिए उपयोग करने के लिए कहना चाहता हूं।

धन्यवाद!

ए। @lawlist पूछता है, "क्या एक नया फ्रेम डिफ़ॉल्ट रूप से खोला जा रहा है जब आप टर्मिनल से एक नई फ़ाइल खोलते हैं, भले ही एक मौजूदा फ्रेम हो?" इसका उत्तर यह है कि अगर मैं वर्णित रूप में स्टार्टअप पर एक सर्वर शुरू करता हूं यहाँ , एक फ़्रेम खोलें, और फिर टाइप करके एक फ़ाइल खोलें /Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n <whatever>, मैं एक मौजूदा फ्रेम में खोलने के लिए फ़ाइल प्राप्त कर सकता हूं। यदि वर्तमान में कोई फ्रेम नहीं खुला है तो मुझे "-nc" का उपयोग करना होगा या जब मैं फ़ाइल खोलने की कोशिश करूँगा तो कुछ नहीं होगा।

बी @lawlist पूछती है, "क्या आप लॉग ऑन पर चलने वाले डेमॉन को चाहते हैं, या लॉगिन के बाद मैन्युअल रूप से Emacs लोड करना पर्याप्त होगा?" मैन्युअल रूप से चलाना ठीक रहेगा।


क्या आप उन्हें संख्या 1, 2, 3, 4, 5, 6, और शायद 7 और 8 बता सकते हैं। इसके अलावा, एक नया फ्रेम डिफ़ॉल्ट रूप से खोला जा रहा है जब आप टर्मिनल से एक नई फाइल खोलते हैं, भले ही कोई मौजूदा फ्रेम हो ? मैं कुछ उत्तरों को जानता हूं, लेकिन उन सभी को नहीं - इसलिए प्रश्नों के लिए नंबर मददगार होंगे। क्या आप डेमन लॉगिन पर चल रहे हैं, या यह लॉगिन के बाद मैन्युअल रूप से Emacs लोड करने के लिए पर्याप्त होगा?
lawlist

@ गौरी रांता का अच्छा जवाब है। M-x server-start मैन्युअल रूप से सर्वर शुरू करेगा ताकि emacsclient इसके साथ संवाद कर सकते हैं। मैंने रखा है (server-start) मेरे में init.el प्रवेश पर डेमॉन का उपयोग करने के बजाय फ़ाइल - हालांकि, बहुत से लोग डेमन लॉगिन विकल्प पसंद करते हैं। और हां, द .emacs फ़ाइल के लिए एक उपयुक्त स्थान होगा (server-start)
lawlist

फाइंडर से फाइलें खोलने के संबंध में, मैं यह मान रहा हूं कि आप इस तरह की आवश्यकता के चरण से बहुत दूर हैं: dummies.com/how-to/content/... तो, यह मानते हुए कि आप बाहर हैं, तो आप शायद ठीक होने जा रहे हैं ns-find-file - जब Emacs.app के साथ कोई फ़ाइल संबद्ध होती है तो स्वचालित रूप से सक्रिय हो जाती है। ऊपर दिए गए लिंक में मेरा इंटरसेप्ट फ़ाइल फ़ंक्शन भी संशोधित करता है ns-find-file अगर ऐसा कुछ है जो आपको रुचिकर लगे। बेशक, आपको निर्मित Emacs की आवश्यकता है --with-ns
lawlist

जवाबों:


9

Emacs.app को एक नए फ्रेम के बजाय एक मौजूदा फ्रेम में खुली फाइलें बनाने के लिए, जोड़ें (setq ns-pop-up-frames nil) विन्यास फाइल की तरह ~/.emacs

आप टर्मिनल से फ़ाइल खोल सकते हैं open -a emacs file या emacsclient -n file। अगर Emacs.app खुला नहीं है लेकिन एक है Emacs --daemon प्रक्रिया, किसी कारण के लिए emacsclient -n file काम नहीं करता है लेकिन emacsclient -nc file कर देता है।

सुनिश्चित करें कि आप उपयोग करते हैं emacsclient आपके द्वारा उपयोग किए जाने वाले Emacs के संस्करण के साथ बाइनरी शामिल है, जैसे /Applications/Emacs.app/Contents/MacOS/bin/emacsclient, या /usr/local/bin/emacsclient यदि आप होमब्रे के साथ Emacs स्थापित करते हैं।

लॉगिन पर एक Emacs सर्वर शुरू करने के लिए, उदाहरण के लिए इस plist को सहेजें ~/Library/LaunchAgents/my.emacsdaemon.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>my.emacsdaemon</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Applications/Emacs.app/Contents/MacOS/Emacs</string>
    <string>--daemon</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/> <!-- run the program again if it terminates -->
</dict>
</plist>

अगली बार जब आप लॉगिन करते हैं, तो प्लास्ट स्वतः लोड हो जाता है, लेकिन आप इसे तुरंत चलाकर लोड कर सकते हैं launchctl load ~/Library/LaunchAgents/my.emacsdaemon.plist

संपादित करें: मुझे अभी भी पता नहीं है कि लोग सिर्फ Emacs.app के बजाय AppleScript एप्लिकेशन के साथ फाइल प्रकारों को क्यों जोड़ रहे हैं। कुज़ूरो के उत्तर की स्क्रिप्ट को एक शेल स्क्रिप्ट के रूप में भी लिखा जा सकता है:

macos=/Applications/Emacs.app/Contents/MacOS
if pgrep -qf 'Emacs.*--daemon'; then
  [[ $($macos/bin/emacsclient -e '(<= 2 (length (visible-frame-list)))') = t ]] && args=-nc || args=-n
else
  $macos/Emacs --daemon
  args=-nc
fi
$macos/bin/emacsclient $args "$@"
open -a /Applications/Emacs.app

आप उपयोग कर सकते हैं एक प्रकार का बत्तक-सदृश नाक से पशु एक आवेदन के रूप में स्क्रिप्ट को बचाने के लिए:

मैंने अभी Emacs का उपयोग शुरू किया है, लेकिन मेरे पास एक पूरी तरह से अलग सेटअप है। मैंने iTerm.app की एक प्रति बनाकर अपना खुद का Emacs एप्लिकेशन बनाया, InfoB.plist में CFBundleIdentifier को बदल दिया ताकि एप्लिकेशन एक अलग प्राथमिकता फ़ाइल का उपयोग करें, और डिफ़ॉल्ट कमांड को इसमें सेट करें /usr/local/bin/emacs। मैंने जोड़ा है (server-start) सेवा मेरे ~/.emacs और मैं लॉगिन पर कस्टम Emacs आवेदन खोलें। मैंने एक एप्लिकेशन बनाने के लिए प्लैटिपस का उपयोग किया जो चलता है emacsclient -n "$@";open -b my.emacs और मैंने इसे टेक्स्ट फ़ाइलों के लिए डिफ़ॉल्ट एप्लिकेशन बनाया।


2

टिप्पणियों के सुझावों के साथ संयुक्त लॉरी के समाधान ने काफी हद तक मेरे मुद्दों को संबोधित किया है। मैंने कुछ एपलस्क्रिप्ट के नीचे चिपकाया है जो मैंने ऑनलाइन मिले सामान से एक साथ सिले हैं। स्क्रिप्ट कुछ शेष झुर्रियों को सुचारू बनाने में मदद करती है, उदाहरण के लिए, इसका व्यवहार थोड़ा बेहतर है यदि कोई वर्तमान एमएसीएस फ्रेम नहीं है।

EDIT: स्क्रिप्ट का उद्देश्य फाइंडर में .txt फाइलों के साथ जुड़ा होना है।

-- http://superuser.com/questions/457484/how-to-open-emacs-from-macs-finder
-- https://gist.github.com/ambethia/304964#comment-799519
on run {input}
    set filepath to quoted form of POSIX path of input
    tell application "Terminal"
        try
            -- we look for <= 2 because Emacs --daemon seems to always have an entry in visibile-frame-list even if there isn't
            set frameVisible to do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -e '(<= 2 (length (visible-frame-list)))'"
            if frameVisible is "t" then
                do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n " & filepath
            else
                -- there is a not a visible frame, launch one
                do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c -n " & filepath
            end if
        on error
            -- daemon is not running, start the daemon and open a frame     
            do shell script "/Applications/Emacs.app/Contents/MacOS/Emacs --daemon"
            do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c -n"
        end try
    end tell

    -- bring the visible frame to the front
    tell application "Emacs" to activate

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