2012-11-22 15 views
6

मैं दूरस्थ सर्वर पर आर प्रक्रियाओं को चलाने के लिए स्थानीय emacs उदाहरण (एक्वामाक्स) का उपयोग कर रहा हूं, और मैं अपने सर्वर से कनेक्ट करने की प्रक्रिया को स्वचालित करना चाहता हूं। प्रक्रिया इस प्रकार है:मैं इन emacs ईएसएस (ess-remote) आदेशों को स्वचालित कैसे कर सकता हूं?

[Emacs में]

M-x shell 

[जिसके परिणामस्वरूप कंसोल में]

TERM=xterm 
ssh -Y -C <my remote server> 
screen -rd [and/or] R 

[Emacs में]

M-x ess-remote 
r 

मैं इस सामान्य दृष्टिकोण की खोज की यहां: http://blog.nguyenvq.com/2010/07/11/using-r-ess-remote-with-screen-in-emacs/। -Y -C विकल्प आपको प्लॉट देखने के लिए xterm का उपयोग करने की अनुमति देते हैं। मुझे लिस्प नहीं पता है और मैं थोड़ी देर के लिए गुग हो गया हूं, मैं इसे एक साथ टुकड़ा नहीं कर सकता कि वास्तव में इसे स्वचालित करने के लिए फ़ंक्शन को कैसे परिभाषित किया जाए (उदा।, .emacs.el में)। क्या किसी ने इस तरह कुछ भी लागू किया है?

उत्तर

6

मान लीजिए कि आप कोड में shell पर कॉल करना चाहते हैं। लिस्प में, सबकुछ पूर्ववत संकेत है जो कोष्ठक से घिरा हुआ है।

(shell) 

बंद कोष्ठक के बाद पंक्ति के अंत तक अपने पॉइंटर ले जाना, और लिस्प कोड निष्पादित करने के लिए <C-x C-e> टाइप करें: तो हम (जैसे कि, खरोंच बफर) एक बफर में दर्ज करें। आपको देखना चाहिए कि shell फ़ंक्शन को कॉल किया जाता है।

अब, चलिए इसे एक फ़ंक्शन बनाते हैं, इसलिए हम इसमें अन्य चीजें जोड़ सकते हैं। आदेश एक समारोह बनाने के लिए defun है, और यह नाम समारोह के तर्क सूची (कोष्ठकों में) समारोह के शरीर लेता है, और उसके बाद:

(defun automate-connection() 
    (shell)) 

कोड के अंत करने के लिए अपने कर्सर ले जाएँ , <C-x C-e> मारा, और फ़ंक्शन परिभाषित किया जाएगा।

(automate-connection) 

ठीक है, अब हमें कुछ पाठ को खोल बफर में डालने की आवश्यकता है, इसे आप Lisp से कॉल कर सकते हैं।

(defun automate-connection() 
    (shell) 
    (insert "TERM=xterm")) 

अब, जब हम इसे चलाते हैं, तो हमें शेल बफर में "TERM = xterm" डाल दिया जाता है। लेकिन यह वास्तव में कमांड नहीं भेजता है। आइए एक नई लाइन डालने का प्रयास करें।

(defun automate-connection() 
    (shell) 
    (insert "TERM=xterm\n")) 

जो एक नई लाइन में डालता है, लेकिन वास्तव में कमांड चलाने में सक्षम नहीं होता है। क्यों नहीं? चलो देखते हैं कि एंटर कुंजी क्या करती है। अपने *shell* बफर पर जाएं, और <C-h c> टाइप करें, फिर वापसी कुंजी दबाएं। (<C-h c> रन describe-key-briefly, जो दिए गए कुंजी को मारकर बुलाए गए फ़ंक्शन के नाम को प्रिंट करता है)। यह कहता है कि जब आपने आरईटी मारा, तो यह एक नई लाइन नहीं लगा रहा है, लेकिन वास्तव में comint-send-input पर कॉल कर रहा है। तो चलो कि करते हैं:,

(defun automate-connection() 
    (shell) 
    (insert "TERM=xterm") 
    (comint-send-input)) 

अब जब आप किसी भी लिस्प कोड से `(को स्वचालित-कनेक्शन) चलाने के लिए, आपके द्वारा भेजे दिए गए बात मिलना चाहिए। मैं इसे अपने अन्य आदेश जोड़ने के लिए पाठक को एक अभ्यास के रूप में छोड़ देता हूं।

लेकिन प्रतीक्षा करें! हम वास्तव में नहीं कर रहे हैं, हम हैं? मुझे लगता है कि आप एक लिस्प स्क्रैच बफर में नहीं जाना चाहते हैं, (automate-connection) में टाइप करें, फिर उस कोड का मूल्यांकन करें। आप शायद टाइप करना चाहते हैं, और इसे एक दिन कॉल करें।आप उस फ़ंक्शन के साथ डिफ़ॉल्ट रूप से ऐसा नहीं कर सकते जो हमने अभी बनाया है। के रूप में आप चाहते हैं

(defun automate-connection() 
    (interactive) 
    (shell) 
    (insert "TERM=xterm") 
    (comint-send-input)) 

अब आप यह कॉल कर सकते हैं, और यह *shell* बफर, पाठ में डाल खोल देंगे, और बता: बस अपने समारोह में (interactive) के लिए एक कॉल जोड़ें: सौभाग्य से, यह है कि अनुमति देने के लिए आसान है Emacs उस पाठ को चलाने के लिए खोल बताने के लिए।

+0

यह बेहद सहायक है, धन्यवाद। अब मेरे पास है: '(स्वचालित कनेक्शन() (इंटरैक्टिव) (खोल) (डालें "TERM = xterm \ n ssh -Y -C \ n स्क्रीन -rd") (कॉमेंट-प्रेषण-इनपुट) (एएस-रिमोट) ) ' लेकिन' (ess-remote) 'तब तक नहीं चल रहा है जब तक कि मेरे पास पहले से ही एक आर-इन-शैल प्रक्रिया चल रही न हो। मुझे अनुमान है कि मुझे '(कॉमेंट-सेंड-इनपुट)' और '(एएस-रिमोट)' के बीच कुछ करने की ज़रूरत है – Solomon

संबंधित मुद्दे

 संबंधित मुद्दे