2010-12-16 19 views
5

पर emacs python-mode में बफर का मूल्यांकन करने के लिए मैं रिमोट होस्ट पर पायथन स्क्रिप्ट को संशोधित करने के लिए tramp के साथ emacs23 का उपयोग कर रहा हूं। मैंने पाया कि जब मैं emacs के भीतर अजगर खोल शुरू करता हूं तो यह दूरस्थ होस्ट पर पायथन शुरू होता है।रिमोट होस्ट

मेरे समस्या यह है कि जब मैं तो फोन करने की कोशिश अजगर-भेज-बफर प्रतिलिपि प्रतिलिपि के माध्यम से यह त्रुटि के साथ आता है

Traceback (most recent call last): File "", line 1, in ? ImportError: No module named emacs

Traceback (most recent call last): File "", line 1, in ? NameError: name 'emacs' is not defined

अब, मैं मानता चाहिए मैं वास्तव में नहीं पता है कि क्या हो रहा है है यहाँ। क्या मेरे लिए emacs को कॉन्फ़िगर करने का कोई तरीका है ताकि मैं दूरस्थ होस्ट पर बफर का मूल्यांकन कर सकूं?

बहुत धन्यवाद।

संपादित करें: मैंने ईचिन की सलाह का पालन किया है और पाइथन-प्रेषण क्षेत्र को फिर से कार्यान्वित किया है। नीचे मेरा जवाब देखें।

उत्तर

2

संक्षिप्त उत्तर: कुछ गायब elisp कोड लिखने के बिना नहीं।

लांग संस्करण: python.el में, run-pythondata-directory को $PYTHONPATH, विशेष रूप से यह emacs.py पा सकते हैं ताकि (। के रूप में स्थानीय Emacs वितरण द्वारा आपूर्ति) (जो मेरे उबंटू 10.10 बॉक्स पर /usr/share/emacs/23.1/etc/ है) तो यह एक (python-send-string "import emacs") करता है और उम्मीद करता है कहते हैं यह काम करने के लिए ...

यह defadvice रैपर कि tramp का उपयोग करता है वास्तव में PYTHONPATH उत्तीर्ण नहीं की तरह लग रहा है, तो यह भी काम नहीं करता है आप दूरस्थ सिस्टम पर मिलान Emacs संस्करण है।

आप M-x customize-variable RET tramp-remote-process-environment RET तो INS बटनों में से एक मारा और जोड़ने PYTHONPATH=/usr/share/emacs/23.1/etc तो STATE मारा और यह निर्धारित करते हैं तो "वर्तमान सत्र" (बस इसे परीक्षण करने के लिए, या "भविष्य सत्रों के लिए सहेजना" अगर यह आप के लिए काम करता है) यह को लगभग काम करता है - किसी भी मामले में शिकायत दूर हो जाती है, क्योंकि रिमोट पायथन अब रिमोट emacs.py पा सकते हैं। यदि अब आप मूल प्रश्न पर वापस जाते हैं, तो python-send-buffer कर रहे हैं, तो आप बस एक अलग त्रुटि में चलाते हैं: No such file or directory: '/tmp/py24574XdA' क्योंकि python-mode बस सामग्री को अस्थायी फ़ाइल में रखता है और उसे लोड करने के लिए अजगर उपप्रोसेस को बताता है।

आप python-send-region (अन्य कार्यों इसे बुलाते हैं) और विशेष रूप से जिस तरह से यह make-temp-file का उपयोग करता आवारा-बारे में पता होना करने के लिए बदलने के लिए चाहते हैं - यहां तक ​​कि एक tramp-make-tramp-temp-file आप शायद का निर्माण कर सकता है। (यदि आप करते हैं तो इसे पोस्ट करना सुनिश्चित करें ...)

+0

बहुत धन्यवाद। मैंने नीचे पायथन-प्रेषण क्षेत्र के कार्यान्वयन को पोस्ट किया है और ऐसा लगता है कि यह काम करता है। – Adrian

+0

अगर कोई शब्द पिछले 4 वर्षों में तय किया गया है? यह अद्यतन होगा अगर अद्यतन उत्तर है, "यह अभी काम करता है"। –

3

मैं वर्तमान में इस अनधिकृत प्रश्न को इस खाते से विलय करने की कोशिश कर रहा हूं, जिसके बाद मैं ईचिन के उत्तर को स्वीकार कर पाऊंगा और अपनी पोस्ट को संपादित करने के लिए संपादित कर पाऊंगा मेरा समाधान

मैंने ईचिन के सुझाव का पालन किया और रिमोट होस्ट पर emacs2.py emacs3.py और emacs.py फ़ाइलों की प्रतिलिपि बनाई और ट्रम्प-रिमोट-प्रोसेस-पर्यावरण चर में अपनी निर्देशिका को PYTHONPATH में जोड़ा।

मैं तो मेरे .emacs

(require 'python) 

(defun python-send-region (start end) 
    "Send the region to the inferior Python process." 

    (interactive "r") 

    (let* ((loc_name) 
    (f (if (file-remote-p default-directory) 
     (let* ((con (tramp-dissect-file-name default-directory))) 
      (setq loc_name (tramp-make-tramp-temp-file con)) 
      (concat "/" 
       (tramp-file-name-method con) ":" 
       (tramp-file-name-user con) "@" 
       (tramp-file-name-host con) ":" 
       loc_name 
      )) 
      (setq loc_name (make-temp-file "py")))) 
    (command (format "emacs.eexecfile(%S)" loc_name)) 
    (orig-start (copy-marker start))) 
    (save-excursion 
     (let ((curbuf (current-buffer)) 
     (tempbuf (get-buffer-create "*python_temp*"))) 
    (set-buffer tempbuf) 
    (delete-region (point-min) (point-max)) 
    (insert-buffer-substring curbuf start end) 
    (python-mode) 
    (when (save-excursion 
     (goto-char (point-min)) 
     (/= 0 (current-indentation))) 
     (python-shift-left (point-min) (point-max))) 
    (write-region nil nil f nil 'nomsg)) 

    (python-send-command command) 
    (with-current-buffer (process-buffer (python-proc)) 
     ;; Tell compile.el to redirect error locations in file `f' to 
     ;; positions past marker `orig-start'. It has to be done *after* 
     ;; `python-send-command''s call to `compilation-forget-errors'. 
     (compilation-fake-loc orig-start f))) 
)) 

में अजगर भेजने-बफर समारोह reimplemented मैं अनिवार्य रूप से एक नया बफर में क्षेत्र की प्रतिलिपि, खरोज समायोजित करें और फिर यह एक अस्थायी फ़ाइल में लिखते हैं, आवारा के साथ बनाया -मेक-ट्रम्प-टेम्प-फ़ाइल या मेक-टेम्प-फ़ाइल, इस पर निर्भर करता है कि विज़िट की गई फ़ाइल दूरस्थ या स्थानीय है या नहीं।

मुझे ट्रम्प-हैंडल-राइट-एरिया के साथ कुछ समस्याएं थीं, जो पहले तर्क के रूप में एक स्ट्रिंग को स्वीकार नहीं करती थी, इसलिए मैंने पहले एक अलग बफर में सभी स्वरूपण किए थे।

मुझे बताएं कि कोड के साथ अभी भी कोई समस्या है, लेकिन यह elisp कोडिंग पर मेरा पहला प्रयास है, इसलिए कृपया नम्र रहें।

+0

मैंने उपर्युक्त कोशिश की और निम्न त्रुटि प्राप्त की: "विज्ञापन-उत्पत्ति-त्रुटि: अवैध फ़ाइल-नाम"। कोई संकेतक? –

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