2010-12-16 6 views
5

Ich benutze Emacs23 mit Tramp, um Python-Skripte auf einem Remote-Host zu ändern. Ich habe festgestellt, dass wenn ich die Python-Shell innerhalb von Emacs startet es startet Python auf dem Remote-Host.Evaluation-Puffer in Emacs Python-Modus auf Remote-Host

Mein Problem ist, dass, wenn ich dann versuchen, Python-send-Puffer über Cc Cc nennen es kommt mit dem Fehler

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

Nun, ich muss zugeben, dass ich nicht wirklich wissen, was los ist Hier. Gibt es eine Möglichkeit für mich, Emacs so zu konfigurieren, dass ich den Puffer auf dem Remote-Host auswerten kann?

Vielen Dank.

Edit: Ich habe EICHIN Rat gefolgt und Python-Send-Region neu implementiert. Siehe meine Antwort unten.

Antwort

2

Kurze Antwort: nicht ohne etwas fehlenden elisp Code zu schreiben.

Lange Version: In python.el, run-python fügt data-directory (was auf meinem Ubuntu 10.10 Box /usr/share/emacs/23.1/etc/ ist) zu $PYTHONPATH, und zwar so, dass es emacs.py finden (wie von der lokalen Emacs Distribution erhältlich.) Dann ist es ein (python-send-string "import emacs") tut und erwartet es zu arbeiten ...

es sieht aus wie die defadvice Wrapper, die tramp Anwendungen tatsächlich nicht PYTHONPATH passieren, so dass dies auch nicht funktioniert, wenn Sie die passende emacs-Version auf dem Remote-System haben.

Wenn Sie M-x customize-variable RET tramp-remote-process-environment RET dann drücken Sie eine der INS Tasten und fügen PYTHONPATH=/usr/share/emacs/23.1/etc treffen dann STATE und es auf „aktuelle Sitzung“ auf (nur um es zu testen, oder „für zukünftige Sitzungen speichern“, wenn es für Sie arbeitet) es fast funktioniert - die Beschwerde geht in jedem Fall weg, weil der Remote-Python jetzt die Remote emacs.py finden kann. Wenn Sie nun zur ursprünglichen Frage zurückkehren, indem Sie python-send-buffer tun, stoßen Sie nur auf einen anderen Fehler: No such file or directory: '/tmp/py24574XdA', da python-mode den Inhalt nur in eine temporäre Datei stopft und den Python-Subprozess anweist, diesen zu laden.

Du müss python-send-region ändern (die anderen Funktionen es nennen) und vor allem die Art und Weise es make-temp-file Tramp bewusst sein verwendet - es gibt sogar eine tramp-make-tramp-temp-file Sie wahrscheinlich auf bauen könnte. (Achten Sie darauf, es zu veröffentlichen, wenn Sie ...)

+0

Vielen Dank. Ich habe meine Implementierung der Python-Sende-Region unten gepostet und es scheint zu funktionieren. – Adrian

+0

Jedes Wort, wenn das in den letzten 4 Jahren behoben wurde? Es wäre großartig, wenn die aktualisierte Antwort lautet: "Es funktioniert jetzt". –

3

Ich versuche derzeit, meine nicht registrierte Frage mit diesem Konto zusammengeführt, nach dem ich in der Lage sein werde, Ekons Antwort anzunehmen und meinen Beitrag zu bearbeiten meine Lösung.

Ich folgte dem Vorschlag von Eichin und kopierte die Dateien emacs3.py und emacs.py emacs2.py auf den entfernten Host und fügte ihr Verzeichnis zu PYTHONPATH in der Variablen tram-remote-process-environment hinzu.

ich neu implementiert dann die Python-send-Pufferfunktion in meinem .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))) 
)) 

kopiere ich im Wesentlichen die Region in einen neuen Puffer, um den Einzug anpassen und dann in eine temporäre Datei schreiben, mit Getrampel erstellt -make-tramp-temp-Datei oder make-temp-Datei, je nachdem, ob die besuchte Datei remote oder lokal ist.

Ich hatte einige Probleme mit tramp-handle-write-region, die anscheinend keine Zeichenfolge als erstes Argument akzeptiert haben, weshalb ich zuerst die gesamte Formatierung in einem separaten Puffer durchgeführt habe.

Lassen Sie mich wissen, wenn es noch irgendwelche Probleme mit dem Code gibt, aber dies ist mein erster Versuch, elisp Codierung, also bitte sei sanft.

+0

Ich habe das obige versucht und den folgenden Fehler erhalten: "ad-Orig-error: Ungültiger Dateiname". Irgendwelche Zeiger? –