OSX में कमांड लाइन से GUI Emacs कैसे लॉन्च करें?


91

OSX में कमांड लाइन से GUI Emacs कैसे लॉन्च करूं?

मैंने http://emacsformacosx.com/ से Emacs डाउनलोड और इंस्टॉल किए हैं ।

मैं निम्नलिखित सभी मानदंडों को पूरा करने वाला उत्तर स्वीकार करूंगा:

  1. एमएसीएस विंडो मेरी टर्मिनल विंडो के सामने खुलती है
  2. टाइपिंग "emacs" एक GUI Emacs विंडो लॉन्च करता है। उस विंडो में फ़ाइलें ढूंढना उस निर्देशिका को देखने में डिफ़ॉल्ट होगा जहां से मैंने Emacs शुरू किया था।
  3. टाइपिंग "emacs foo.txt" जब foo.txt मौजूद है, तो GUI Emacs विंडो को foo.txt लोड करके लॉन्च करता है।
  4. टाइपिंग "emacs foo.txt" जब foo.txt मौजूद नहीं है, तो GUI Emacs विंडो को "foo.txt" नाम के खाली टेक्स्ट बफर के साथ लॉन्च करता है । उस बफ़र में Do X ^ S करने से उस निर्देशिका में foo.txt बच जाएगा जहां से मैंने Emacs शुरू किया था।

टर्मिनल प्रॉम्प्ट में 'एमएसीएस' दर्ज करने से कौन से मापदंड पूरे नहीं होते हैं? आपकी आवश्यकताएं लिनक्स पर डिफ़ॉल्ट व्यवहार का वर्णन करती हैं। मैंने थोड़ी देर में एक मैक का उपयोग नहीं किया है, लेकिन मुझे लगता है कि चाल सिर्फ निष्पादित करने के लिए सही कार्यक्रम ढूंढ रही थी - शायद emacs.app?
टायलर

8
टायलर, एक लिनक्स बैकग्राउंड से आ रहा हूँ, जो मैं आपके साथ हूँ; प्रॉम्प्ट पर सिर्फ "इमैक" टाइप करना चाहिए जो मुझे करना चाहिए। हालांकि OSX ने टर्मिनल विंडो में टेक्स्ट मोड Emacs लॉन्च किया है (इस प्रकार मानदंड 1 विफल हो रहा है), और यह वह नहीं है जो मैं चाहता हूं।
जोहान वाल्स

1
जोहान - क्या आपने इस बीच कोई हल ढूंढ लिया है? मैं उन्हीं समस्याओं से जूझ रहा हूं और एक इनाम शुरू करने के बारे में सोच रहा हूं। विशेष रूप से कष्टप्रद यह है कि कमांड लाइन से कॉलिंग एमएसीएस (और एमेकैप नहीं) पृष्ठभूमि में एक विंडो खोलता है ...
एलेक्साबा

1
@DougHarris मेरी आवश्यकताएं किसी भी लिनक्स डिस्ट्रो पर वास्तविकता से मेल खाती हैं, यही वह जगह है जहां से वे आते हैं। मुझे खुशी है कि आपको एक वर्कफ़्लो मिला है जो आपके लिए काम करता है। चीयर्स!
जोहान वॉल्स

2
मुझे नहीं पता कि यह OSX पर काम करता है या नहीं, लेकिन आप कोशिश कर सकते हैं: emacsclient -c -a "" "$@"कमांड
jfs

जवाबों:


113

निम्नलिखित स्क्रिप्ट को "emacs" कहें और इसे अपने PATHकहीं पर रखें:

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@"

जिसमें # 2, # 3, और # 4 शामिल हैं।

# 1 के लिए, इसे अपनी .emacs फ़ाइल में कहीं रखें:

(x-focus-frame nil)

Emacsformacosx.com स्थान अब एक है , कैसे करें-पेज जो है, जहां शीर्ष टुकड़ा से आया है,। emacsclientEmacs को चलाने और हुक करने के बारे में अधिक जानकारी है git mergetool


1
धन्यवाद डेविड, आप शासन करते हैं!
जोहान वाल्स

1
बहुत अच्छा काम करता है। बाउंटी आगामी
तमज़िन ब्लेक

2
Mavericks पर अगर मैं फ़ोल्डर में हूं ~/fooऔर bar.txtमैं टाइप करना चाहता हूं, gmacs bar.txtलेकिन यह ~/bar.txtखोलने के बजाय एक नई फ़ाइल बनाता है ~foo/bar.txt। क्या मुझसे कुछ गलत हो रही है?
डैनियल कॉम्पटन

2
.Emacs फ़ाइल कहाँ है?
ब्रेन

1
आप कहीं भी (x- फ़ोकस-फ़्रेम nil) नहीं जोड़ सकते हैं, यह (कस्टम-सेट-चर) अभिव्यक्ति के भीतर होना चाहिए, जो कि आपके द्वारा अनुकूलन के माध्यम से कुछ भी सेट करने के बाद emacs आपके लिए बनाएंगे। बस मेनू बार से कुछ को कस्टमाइज़ करें, जैसे "ब्लिंकिंग कर्सर" सेट करना (फिर यदि आप इसे नापसंद करते हैं) और वह अनुभाग आपके .emacs में बनाया जाएगा। इसके अलावा, यह भी परीक्षण किया है? मुझे यकीन नहीं है कि कोको पर emacs भी इस सेटिंग का सम्मान करेंगे।
चक एडम्स

70

आपके शेल में, OSX emacs एप्लिकेशन को इंगित करने के लिए कमांड 'emacs' उर्फ ​​करता है

मेरे शेल में (डिफ़ॉल्ट बैश चल रहा है), मेरे पास निम्नलिखित हैं (मेरे .bashrc में)

alias emacs='open -a /Applications/Emacs.app $1'

फिर, कमांड लाइन पर emacs टाइप करके emacs एप्लिकेशन शुरू होता है।

हालाँकि, मैं यह सलाह दूंगा कि आप emacs की एक प्रति खोलें और बस इसे चालू रखें। अगर ऐसा है, और आप किसी फ़ाइल को emacs की मौजूदा कॉपी में लोड करना चाहते हैं, तो आप अपने .bashrc में निम्नलिखित लिखकर emacsclient का उपयोग कर सकते हैं:

alias ec='/Applications/Emacs.app/Contents/MacOS/bin/emacsclient'

फिर emacs सर्वर शुरू करने के लिए अपने .emacs फ़ाइल में निम्नलिखित जोड़ें (जो कि emacsclient कॉल प्राप्त करता है)

;;========================================
;; start the emacsserver that listens to emacsclient
(server-start)

फिर आप टाइप कर सकते हैं

ec .bashrc

मौजूदा emacs सत्र में .bashrc की एक प्रति लोड करने के लिए!


4
हाय क्रिस! आपका पहला उत्तर मानदंड 2 को विफल करता है और 4. आपका दूसरा उत्तर मानदंड विफल रहता है। मैं एक ऐसे समाधान की तलाश में हूं जो सभी गिने गए मानदंडों को पूरा करता हो। सादर / जोहान
जोहान वाल्स

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

मुझे कहना है, इस साइट पर इन सवालों में से कई हैं जो इस सवाल से निपटते हैं, लेकिन यह एकमात्र ऐसा है जो एक फ़ाइल को खोलने की समस्या को पूरी तरह से हल करता है, संक्षिप्त रूप में।
टायलेटेहेमलर

3
@tylerthemiler, समस्या का पूरी तरह हल करने वाला उत्तर कहां है? इस उत्तर में दोनों के मानदंड 2 फेल हैं और पहले वाला फेल 4 भी।
जोहान वाल्स

5
एक छोटा सा सवाल जवाब करने में एक लंबा रास्ता तय करता है। तो थोड़ा Googling करता है।
ड्यूमा

10

यह पृष्ठभूमि में Emacs शुरू करके डेविड कैलडवेल के उत्तर पर सुधार करता है:

#!/bin/sh
$(/Applications/Emacs.app/Contents/MacOS/Emacs "$@") &

जैसा कि अन्य उत्तर में कहा गया है, यह # 2, # 3 और # 4 को कवर करता है। # 1 के लिए, इसे अपनी .emacs फ़ाइल में कहीं रखें (x-focus-frame nil):।

ध्यान दें कि निम्नलिखित मेरे लिए काम नहीं करता है - यह कमांड लाइन (जैसे emacs .) पर निर्दिष्ट निर्देशिका में Emacs शुरू नहीं करता है

# NOT RECOMMENDED
#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@" &

1
यह OSX के साथ एक समस्या को ठीक करता है (शायद 10.9 Mavericks के साथ शुरू)। 10.9 तक, "अनुशंसित नहीं" विधि विफल हो जाती है, जहां कम से कम 10.6 तक, अनुशंसित नहीं है शेल $ PWD और Emacs (pwd) को सिंक करता है। डेविड का जवाब कहीं और हो सकता है, लेकिन आपको यह समझने के लिए खोज इंजन कैसे मिलते हैं: "pwd pwd नहीं"?
infogizmo

5

मैं आपको मानता हूँ:

  • लॉगिन पर emacs डेमन शुरू करें
  • आपके .emacs में (सर्वर-स्टार्ट) है
  • Emacs की अलग-अलग प्रतियों को चलाने का बहुत बुरा मत मानना

यदि ऐसा है, तो मुझे लगता है कि यह मूल चार मानदंडों को संतुष्ट करता है, साथ ही एक और:

  1. एमएसीएस विंडो मेरे टर्मिनल विंडो के सामने खुलती है।

यह हमेशा अग्रभूमि (x- फ़ोकस-फ़्रेम के साथ) के लिए खुलेगा।

  1. टाइपिंग "emacs" एक GUI Emacs विंडो लॉन्च करता है। उस विंडो में फ़ाइलें ढूंढना उस निर्देशिका को देखने में डिफ़ॉल्ट होगा जहां से मैंने Emacs शुरू किया था।

यह एक मौजूदा emacs विंडो को dired मोड में खोलेगा।

  1. टाइपिंग "emacs foo.txt" जब foo.txt मौजूद है, तो GUI Emacs विंडो को foo.txt लोड करके लॉन्च करता है।

यदि ईमैक्स पहले से चल रहा है और सर्वर है, तो यह मौजूदा विंडो में खुलेगा और अग्रभूमि में आ जाएगा।

  1. टाइपिंग "emacs foo.txt" जब foo.txt मौजूद नहीं है, तो GUI Emacs विंडो को "foo.txt" नाम के खाली टेक्स्ट बफर के साथ लॉन्च करता है। उस बफ़र में Do X ^ S करने से उस निर्देशिका में foo.txt बच जाएगा जहां से मैंने Emacs शुरू किया था।

सही बात।

एक अतिरिक्त:

कमांड टाइप करने के तुरंत बाद टर्मिनल सेशन पर नियंत्रण।

~ / Bin / Emacs

#!/bin/bash
EMACSPATH=/Applications/Emacs.app/Contents/MacOS

# Check if an emacs server is available 
# (by checking to see if it will evaluate a lisp statement)

if ! (${EMACSPATH}/bin/emacsclient --eval "t"  2> /dev/null > /dev/null )
then
    # There is no server available so,
    # Start Emacs.app detached from the terminal 
    # and change Emac's directory to PWD

    nohup ${EMACSPATH}/Emacs --chdir "${PWD}" "${@}" 2>&1 > /dev/null &
else
    # The emacs server is available so use emacsclient

    if [ -z "${@}" ]
    then
        # There are no arguments, so
        # tell emacs to open a new window

        ${EMACSPATH}/bin/emacsclient --eval "(list-directory \"${PWD}\")"
    else    
        # There are arguments, so
        # tell emacs to open them

        ${EMACSPATH}/bin/emacsclient --no-wait "${@}"
    fi

    # Bring emacs to the foreground

    ${EMACSPATH}/bin/emacsclient --eval "(x-focus-frame nil)"
fi

बहुत बढ़िया! ऐसा लगता है कि आपके args और no-args पैर हालांकि स्विच किए गए हैं।
इरिकसेन्सी

4

माउंटेन लायन पर, मैं यममोटो मित्सुहारू के पोर्ट का उपयोग कर रहा हूं : निम्न एलियास के साथ https://github.com/railwaycat/emacs-mac-port :

alias emacs=/Applications/Emacs.app/Contents/MacOS/Emacs

और यह आपके सभी मानदंडों को पूरा करता है।


4

सरल उपाय ...

इस समस्या के बहुत जटिल समाधान यहां पोस्ट किए गए हैं। यह उचित है क्योंकि यह गैर-तुच्छ लगता है।

हालांकि, यह समाधान मेरे लिए वास्तव में अच्छी तरह से काम करता है।

ec() {
  emacsclient -n $@ 2> /dev/null
  if [[ $? == 1 ]]; then
    open -a Emacs.app  -- $@
  fi
}

प्रयोग

ec file [...]

आइए जानें क्या हो रहा है:

  1. ecखाली करने के लिए सभी तर्क पास करें और -nजारी रखने से पहले emacs की प्रतीक्षा न करें ( )।
    1. यदि Emacs पहले से चल रहे हैं, तो हम सभी काम कर रहे हैं और आप संपादन कर रहे हैं।
  2. जब कोई emacs नहीं चल रहा हो, तो emacsclient द्वारा पोस्ट किए गए त्रुटि संदेश को निगल लें। ( 2> /dev/null)
  3. मैन्युअल रूप से निकास कोड संभालें 1( [[ $? == 1 ]])
    1. Emacs.app खोलें और इसके लिए फ़ाइल तर्क पास करें (रास्ते सही ढंग से खोले जाएंगे।)
    2. आप सभी काम कर रहे हैं, और Emacs ने आपकी फाइलें खोल दी हैं।

3

होमबॉव पैकेज मैनेजर के साथ बस इस गाइड के अनुसार emacs का निर्माण किया गया: http://www.emacswiki.org/emacs/EmacsForMacOS के साथ काढ़ा स्थापित करें - कोको इमेक इसके बाद एक को gui प्राप्त करने के लिए .app संस्करण लॉन्च करना चाहिए, जो मेरे मामले में था। /usr/local/Cellar/emacs/24.3/Emacs.app/Contents/MacOS/Emacs


- कोको को हटा दिया गया था; का उपयोग कर - इसके बजाय कोको!
एरविन रूइजाक्कर्स

3

डेविड जेम्स की प्रतिक्रिया में और सुधार करने पर मेरे लिए निम्नलिखित कार्य:

Http://www.emacswiki.org/emacs/EmacsForMacOS#toc20 पर मिले टर्मिनल से एक फ़ाइल खोलने के निर्देश

open -a /Applications/Emacs.app <file-name>

डेविड जैम की प्रतिक्रिया के साथ इसे जोड़कर मैंने निम्नलिखित ईमैक्स बैश स्क्रिप्ट बनाई है और इसे ~ / बिन पर अपने पथ में रखा है

#!/bin/bash
(open -a /Applications/Emacs.app "$@") &

कैविएट : नाम मोड द्वारा Dired में वर्तमान निर्देशिका को खोलने के लिए emacs प्राप्त करने के लिए , आपको उपयोग करने की आवश्यकता है

emax .

वातावरण:

  • ओएस एक्स योसेमाइट संस्करण 10.10.2
  • 2014-11-13 का GNU Emacs 24.4.2 (x86_64-apple-darwin14.0.0, NS Apple-appkit-1343.14)

यह केवल एक मौजूदा फ़ाइल के लिए काम करता है, अगर यह नहीं है, तो इसे न बनाएं
Stíofán।

मैं macOS 10.15 (कैटालिना) का उपयोग कर रहा हूं, और ऐसा लगता है कि यह पहली बार काम करता है (जब Emacs पहले से खुला नहीं है), लेकिन दूसरी बार (जब Emacs विंडो पहले से खुली है) काम नहीं करता है। क्या आप जानते हैं कि इसे कैसे ठीक किया जाए?
उपयोगकर्ता 102008

1

यहाँ अन्य जवाब मेरे लिए काफी काम नहीं किया। विशेष रूप से, मेरी मशीन पर, बैश स्क्रिप्ट

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@" 

हमेशा घर निर्देशिका में emacs खोलता है। वर्तमान कार्य निर्देशिका में इसे खोलने के लिए, मुझे करना पड़ा

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$PWD/$@"

बजाय।


1
मेरे विशेष बिल्ड / इंस्टॉल में वह समस्या नहीं है, लेकिन आपके समाधान के साथ एक समस्या है। यदि आप एक से अधिक फ़ाइल खोलने का प्रयास करते हैं, तो केवल पहले PWD निर्देशिका में विस्तार होगा। बाकी में एक $ PWD पथ नहीं होगा।
किमी जूल

0

निम्नलिखित चरणों के अनुसार Emacs संकलित करें:

./configure --with-x --prefix=/usr
make
sudo make install

और आपका किया! यह XQuartz को डाउनलोड और इंस्टॉल करने में मदद कर सकता है, लेकिन यह सिर्फ मेरी राय है।


0

यह ओएक्स पर खुले ईमैक्स / एमेसक्लियेंट के लिए मेरी स्क्रिप्ट है।

#!/bin/bash

# Ensure (server-start) is added in your emacs init script.

EMACS=/Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs
EMACSCLIENT=/Applications/Macports/Emacs.app/\
Contents/MacOS/bin/emacsclient

# test if client already exsit.
$EMACSCLIENT -e "(frames-on-display-list)" &>/dev/null

# use emacsclient to connect existing server.
if [ $? -eq 0 ]; then
    $EMACSCLIENT -n "$@"
# open emacs.app instead.
else
    `$EMACS "$@"` &
fi

0

"ओपन" का उपयोग करते समय उपरोक्त सभी में - सुनिश्चित करें कि आप "--args" विकल्प का उपयोग करते हैं

यह मत करो:

alias emacs='open -a /Applications/Emacs.app $1'

इसके बजाय:

alias emacs='open -a /Applications/Emacs.app --args $1'

--argsविकल्प रोकता है Emacs लिए करना विभिन्न विकल्पों के उपभोग से "खुला"।

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