2013-05-29 13 views
9

Ich mag R auf einem Remote Box unter einem lokalenEmacs laufe (I nicht wollen Emacs auf der Remote-Box läuft).emacs tramp über eine unzuverlässige Verbindung

Ich kann R auf einer Remote-Host ausgeführt TRAMP mit:

(let ((default-directory "/[email protected]:~")) 
    (R)) 

und alles funktioniert, außer dass, wenn die Verbindung zu remote verloren, R stirbt. Das ist nicht gut, weil das bedeutet, dass ich nach dem Neustart alle Daten in R neu laden muss, was Zeit braucht.

Ist es möglich, TRAMP mitzuteilen, ein persistentes Terminal zu verwenden? (GNU Screen oder tmux oder Mosh oder dtach)

Siehe auch emacs-devel Gewinde tramp:sshx:(screen|tmux).

Antwort

8

Hier ist, wie ESS zu verwenden, um mit R läuft in einer Remote-Bildschirm-Sitzung:

  • ssh auf die Remote-Host (außerhalb von Emacs)

  • Startbildschirm Sitzung

  • detach es

  • offene Schale in Emacs (M-x shell)

  • SSH an den entfernten Host wieder in der emacs

  • resume der Bildschirm-Sitzung (screen -r)

  • Start R

  • schließlich befestigen ESS an den R-Prozess-Shell M-x ess-remote in der Schale Puffer, wo Sie angefangen haben R

Es gibt mehr Details, Screenshots und Schlüssel in diesem Beitrag Bindungen http://blog.nguyenvq.com/2010/07/11/using-r-ess-remote-with-screen-in-emacs/

+0

ESS-Entwickler scheinen "ess-remote" als obsolet zu betrachten. – sds

+0

Nun, die Funktion selbst ist ziemlich einfach, alles, was sie tut, setzt einige Variablen und initialisiert den untergeordneten Modus für den Puffer und einige sprachspezifische Anpassungen. Ich benutze esse-remote sehr oft, um entfernte R- und SAS-Prozesse auszuführen, und hatte keine Probleme mit der Funktion. Sie können es auch mit R gestarteten ssh verwenden.el –

+2

@sds Als ESS-Entwickler kann ich versichern, dass ess-remote gewartet wird und verbessert wird. Ich untersuche Bildschirm Integration mit Ess und Tramp/Ess-Remote. Irgendwelche Ideenvorschläge sind willkommen. – VitoshKa

6

Hier ist ein alternativer Ansatz mit dtach:

(defvar R-remote-host "remote-server") 
(defvar R-remote-session "R") 
(defvar R-remote-directory "~") 
(defun R-remote (&optional remote-host session directory) 
    "Connect to the remote-host's dtach session running R." 
    (interactive (list 
       (read-from-minibuffer "R remote host: " R-remote-host) 
       (read-from-minibuffer "R remote session: " R-remote-session) 
       (read-from-minibuffer "R remote directory: " R-remote-directory))) 
    (pop-to-buffer (make-comint (concat "remote-" session) 
           "ssh" nil "-t" "-t" remote-host 
           "cd" directory ";" 
           "dtach" "-A" (concat ".dtach-" session) 
           "-z" "-E" "-r" "none" 
           inferior-R-program-name "--no-readline" 
           inferior-R-args)) 
    (ess-remote (process-name (get-buffer-process (current-buffer))) "R") 
    (setq comint-process-echoes t)) 

Anruf M-x R-Remote-RET RET RET RET.

Es funktioniert für mich.

+0

Danke für Ihren Code. Gerade jetzt, wenn Sie einen Remote-Prozess starten, startet der Prozess im Home-Verzeichnis. Ich habe versucht, Ihren Code open R in einem bestimmten Verzeichnis zu ändern, hatte aber ein Problem damit. Haben Sie eine Möglichkeit, das Verzeichnis auszuwählen, in dem der Prozess beginnen soll? – DJJ

+0

Ok, ich habe es nur die Zeile '" cd ~/Documents/R; "' nachdem Remote-Host macht den Job. Vielen Dank nochmal für deinen Code, es hat mir eine Menge Ärger erspart. – DJJ

+0

@DJJ: Ich habe 'R-remote-directory' hinzugefügt, danke für den Vorschlag. – sds