Emacs द्वारा बुलाए गए एक प्रोग्राम से कॉल एमैक्शिएंट


9

मैं AucTex के साथ पीडीएफ प्रलेखन फ़ाइलों को देखने में एक समस्या है। मैं इमैक के pdf-toolsभीतर से पीडीएफ फाइलों को देखने के लिए उपयोग करता हूं , और मैंने emacsclient -nअपने डिफ़ॉल्ट पीडीएफ-दर्शक (डेबियन लिनक्स पर xdg-mime के माध्यम से) के रूप में सेट किया है। यह ज्यादातर परिस्थितियों में ठीक काम करता है, लेकिन यह (Tex-documentation-texdoc ...)ऑक्टेक्स ( C-c ?) के कार्य को तोड़ देता है ।

मैंने समस्या को कोड की एकल पंक्ति तक सीमित कर दिया है। जब मैं listingsपैकेज के लिए प्रलेखन देखने की कोशिश करता हूं , तो TeX-documentation-texdocयह निम्नलिखित सेक्सप में बदल जाता है:

(shell-command-to-string "texdoc --view  listings")

texdocबदले में कॉल emacsclientवास्तव में फ़ाइल को खोलने के लिए (इस आधार पर कि मैंने अपने डेस्कटॉप को xdg के माध्यम से कैसे कॉन्फ़िगर किया है)। हालांकि, इस बिंदु पर, Emacs लटका हुआ है और मुझे C-gनियंत्रण वापस लेने के लिए ( ) छोड़ने की आवश्यकता है । उसके बाद, कोई नया पीडीएफ नहीं खोला जाता है। वही बात होती है अगर मैं सीधे एमॅक्लियर को बुलाने की कोशिश करता हूं:

(shell-command-to-string "emacsclient -n tmp.pdf")

दोनों कमांड कमांड लाइन पर काम करते हैं (यानी, emacsclient -n tmp.pdfऔर texdoc --view listings

मेरा प्रश्न इस तरह से है, मैं Emacsclient को Emacs के भीतर से कैसे कॉल करूं? (और मुझे पता है कि मैं बस पीडीएफ फाइल को खोल सकता हूं find-file; यह यहां कोई विकल्प नहीं है क्योंकि मुझे फाइल को खोजने के लिए बाहरी प्रक्रिया (टेक्सडोक) को कॉल करने की आवश्यकता है, और फिर यह प्रक्रिया खाली करने के लिए आमंत्रित करती है)।


केवल texdoc -M --list listingsफ़ाइल खोजने के लिए उपयोग क्यों न करें , और फिर उपयोग करें find-file?
Quarky

@suvayu बस सुविधा। एक अन्य विकल्प कॉल करने के लिए एक टर्मिनल पर स्विच कर रहा है texdoc --viewऔर फिर फ़ाइल खोलने पर Emacs पर वापस स्विच कर रहा है। लेकिन मुझे लगता है कि Emacs से सिंगल स्टेप में ऐसा करने का कोई तरीका होना चाहिए?
टायलर

1
(async-shell-command "emacsclient -n tmp.pdf")समस्या का समाधान कर सकते हैं ?
नाम

1
@ नाम दिलचस्प है - (async-shell-command "emacsclient -n tmp.pdf")काम करता है, लेकिन नहीं (async-shell-command "texdoc --view listings")करता है। तो यह एक उपयोगी सुराग है।
टायलर

1
C-u C-c ?काम करता है ? यह पहले पैकेज से संबंधित डॉक्स की सूची दिखाता है, फिर दर्शक को खोलता है (call-process "texdoc" nil 0 nil "--just-view" doc)
जिओरडनो

जवाबों:


5

समाधान texdocएक अतुल्यकालिक प्रक्रिया के भीतर चलना है।

ऐसा करने का सबसे अच्छा तरीका शायद यह है कि start-file-processइसके बजाय shell-command-to-string(जो कि त्वरित और गंदे कोड के लिए एक आसान कार्य है, जब यह संबंधित एलिस्प कोड की तुलना में थोड़ा शेल स्क्रिप्ट लिखने के लिए अधिक समीचीन है, लेकिन अन्यथा मेरे अनुभव से बेहतर है)।

लेकिन इसे आसपास के कोड में पर्याप्त बदलाव करने की आवश्यकता होगी, क्योंकि start-file-processयह प्रक्रिया के आउटपुट को सीधे वापस नहीं करता है, इसके बजाय यह आपको संकेत देता है कि आउटपुट को किस बफर में रखा जाए और फिर आपको set-process-sentinelकॉलबैक फ़ंक्शन का उपयोग करना होगा जो उस बफर से आउटपुट प्राप्त करता है। कमांड खत्म होने पर "इसके साथ जो भी करने की आवश्यकता है" करता है।


texdocAUCTeX में चलने के विशिष्ट मामले में, मैं एक प्रहरी का उपयोग एक ओवरकिल के एक बिट से करता हूं, क्योंकि यह एक मौलिक विशेषता नहीं है (जैसे यह आउटपुट दस्तावेज़ के लिए दर्शक का उद्घाटन है, जिस स्थिति में हम उपयोग करते हैं प्रहरी)।
जियारडानो

मुझे नहीं पता कि "-to-string" फ़ंक्शन का उपयोग क्यों किया गया था, इसलिए मुझे नहीं पता कि कमांड के आउटपुट के साथ क्या किया जाता है। यदि इस आउटपुट की आवश्यकता है (जैसा कि उपयोग के द्वारा सुझाया गया है ...-to-string), तो एक एसिंक्स समाधान को या तो एक प्रक्रिया-फ़िल्टर या एक प्रॉसेस-प्रहरी की आवश्यकता होगी। यदि नहीं, तो कोड शायद कुछ का उपयोग कर सकता है (shell-command "texdoc --view listings &")
स्टेफान

यह टिप्पणियों में समझाया गया है TeX-documentation-texdoc: ...-to-stringउपयोगकर्ताओं को संभावित त्रुटि संदेशों को दिखाने के लिए वेरिएंट का उपयोग किया जाता है (उदाहरण के लिए जब कोई दस्तावेज नहीं मिलता है)। इसके अलावा, texdoc nonexistingpackageरिटर्न 0 है, लेकिन आउटपुट को पार्स करने के लिए प्रहरी का उपयोग किया जा सकता है।
जियारडानो

फिर एक प्रहरी सबसे अच्छा विकल्प लगता है।
स्टेफन

मुझे लगता है start-file-processकि वास्तव में यहाँ काम करता है की एक आह्वान नहीं मिल सकता है। (start-file-process "texdoc" "*texdoc*" "texdoc" "--view" "listings")बफर बनाता है *texdoc*, जिसमें "प्रोसेस टेक्सडोक समाप्त" डाला जाता है, और पीडीएफ कभी नहीं खुलता है। यही बात तब होती है जब मैं xdg-mime pdf व्यूअर सेट करने के लिए भी अवतार लेता हूँ।
टायलर

1

यदि आपको केवल जवाब के लिए इंतजार किए बिना, Emacs को एक अनुरोध वापस फीड करना है, तो आप emacsclientपृष्ठभूमि में चल सकते हैं । यूनिक्स-शैली OSes (Linux, macOS, Cygwin,…) के तहत:

emacsclient … &

देशी विंडोज के तहत:

start emacsclient …

ज़रूर, लेकिन इस विशेष मामले में मुझे एक प्रोग्राम (टेक्सडोक) को कॉल करने की आवश्यकता है जो तब कॉल करता है (इमैसेक्लिएंट)। पुनर्निर्देशन का अतिरिक्त स्तर समस्याओं का कारण बन रहा है।
टायलर

@ टायलर texdocअतुल्यकालिक है (यानी आप इसे पूरा होने का इंतजार नहीं कर रहे हैं), है ना? तो आप एक ही सिद्धांत लागू कर सकते हैं: texdoc … &शेल कमांड के रूप में चलाएं ।
गिलेस एसओ- बुराई को रोकना '

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