यदि कोई पहले से ही नहीं है, तो केवल एक फ्रेम बनाएं एमैक्स्क्लीकेंट


11

emacsclient -a '' -nयदि कोई पहले से ही नहीं है तो मैं केवल एक नया फ्रेम कैसे बना सकता हूं ?

-cझंडे के साथ समस्या यह है कि यह हर बार एक नया फ्रेम बनाता है। इसके बिना समस्या यह है कि अगर कोई फ्रेम खुला नहीं है तो यह कमांड लाइन में खुलेगा।

अगर मैं जांच कर सकता हूं कि क्या शेल से एक खुला एमएसीएस फ्रेम है, तो मैं -cउस व्यवहार के बिना या उसके बिना कॉल कर सकता हूं। मैंने कोशिश की:

$ emacsclient -a '' --eval '(frames-on-display-list)'
(#<frame F1 0xba2740>)

मुझे हमेशा एक ही परिणाम मिलता है।

मैं अस्थायी फ़ाइलों या pgrep का उपयोग कर सकता हूं, लेकिन वे दृष्टिकोण बहुत त्रुटि वाले हैं।

यह इस प्रश्न के समान है , लेकिन यह एक डुप्लिकेट नहीं है, क्योंकि ओपी कॉल करने से पहले एक फ्रेम खुला होने से संतुष्ट था emacsclient


1
एक ही सवाल superuser.com/questions/358037/… के साथ elisp, bashऔर shजवाब।
कॉन्स्टेंटिन मोरेंको

जवाबों:


3

मैंने इस पर आधारित इस स्क्रिप्ट का निर्माण किया

#!/bin/bash -e

if [[ "$DISPLAY" ]]; then
        frame=`emacsclient -a '' -e "(member \"$DISPLAY\" (mapcar 'terminal-name (frames-on-display-list)))" 2>/dev/null`
        [[ "$frame" == "nil" ]] && opts='-c' # if there is no frame open create one
        [[ "${@/#-nw/}" == "$@" ]] && opts="$opts -n" # don't wait unless we've asked to run in a terminal
else
        opts='-nw'
fi

exec emacsclient -a '' $opts "$@"

अगर कोई डिस्प्ले नहीं है, तो यह खुलता है -nw। यदि $DISPLAYइसे सेट किया जाता है तो यह देखने के लिए उस फ्रेम में दिखता है कि क्या इसे नया बनाने की जरूरत है।

संपादित करें: मैंने इसे संशोधित किया है ताकि आप मैन्युअल रूप से निर्दिष्ट कर सकें कि आप -nwटर्मिनल में खोलना चाहते हैं, भले ही कोई डिस्प्ले हो।


1
माइनर नाइटपिक: $@ उद्धृत किया जाना चाहिए
dshepherd

0

आप उपयोग कर सकते हैं:

emacsclient -s server_name -e '(+ 1 0)' >/dev/null 2>&1

यह जांचने के लिए कि क्या Emacs सर्वर "server_name"पहले से चल रहा है। यदि आदेश से बाहर निकलें कोड 0, यह चल रहा है। यदि ऐसा है, तो बस emacsclientकमांड का उपयोग करें :

emacsclient -s server_name -n file_name.txt

यदि यह नहीं चल रहा है, तो आप उदाहरण के लिए एक नया Emacs सर्वर खोल सकते हैं:

emacs --eval '(setq server-name "server_name")' --eval '(server-start)' file_name.txt &

लेकिन इस तरह से एक बार जब आप शेल को बंद कर देंगे तो आप सर्वर को मार देंगे, है ना? emacsclient -a ''शुरू होता है emacs --daemon, यदि आवश्यक हो, जो बनी रहती है, भले ही आप खोल बंद कर दें।
spelufo

@spelufo शेल को मारने से सर्वर की मृत्यु नहीं होती है। &कमांड के अंत में ध्यान दें ; यह एक पृष्ठभूमि प्रक्रिया के रूप में सर्वर को चलाने का मतलब है ..
Håkon Hlandgland

जो इसे वर्तमान शेल की पृष्ठभूमि के लिए पूछता है। जब आप अपना शेल वापस प्राप्त करते हैं तो यह मारा नहीं जाता है, लेकिन यह उस शेल को पूरी तरह से बंद करने पर मारा जाता है ( C-d)।
स्पेलुफो

यदि आप अपने सभी टर्मिनलों को बंद कर देते हैं तो भी डेमॉन चलता रहता है। यदि server-startसर्वर को डेमन प्रक्रिया के रूप में शुरू करता है तो यह केवल चालू रहेगा । आपको क्या मिलता है यदि आप उस तरह से एमएसीएस शुरू करते हैं और फिर सभी एमएसीएस और टर्मिनलों को बंद करते हैं, तो एक नया टर्मिनल खोलें और चलाएं pgrep emacs?
स्पेलफू

@spelufo वास्तव में यह अभी भी चल रहा है C-d। मैंने अब यह gnome-terminalUbuntu 14.10 पर उपयोग करने की कोशिश की .. मुझे लगता है कि आपके सभी Emacs फ्रेम को बंद करने के बाद एक चल रहे उदाहरण की बात कर रहे हैं? फिर, इसके लिए एक डेमन प्रक्रिया की आवश्यकता होगी ..
Håkon Hlandgland
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.