2010-04-22 5 views
8

Ich habe Probleme beim Einrichten von Tramp mit EmacsW32 und Cygwin. Ich habe Emacs so konfiguriert, dass sie cygwin als Shell mit w32shell verwenden. Ich habe auch die HOME enviromental Variable c:/Cygwin/home/myusernameVerwendung von Tramp mit EmacsW32 und Cygwin, möglich?

Problem ist, dass tramp zu hängen scheint und dass keine Verbindung hergestellt wird:

"Tramp für Eingabeaufforderungen für den neu Shell warten".

Ich habe versucht, Debugging zu aktivieren, aber immer noch nur diese Nachricht zu sehen. Ich freue mich darauf, ein paar Tipps dazu zu bekommen. Vielen Dank.

+0

haben Sie versucht, 'c: \ cygwin' mit dem Schrägstrich die andere Art und Weise? – Mica

Antwort

5

Beachten Sie die Cygwin bezogenen Informationen im Wiki Emacs: http://www.emacswiki.org/emacs/TrampMode

Ich benutze EmacsW32 nicht, aber ich erfolgreich TRAMP über ssh mit Cygwin und NT Emacs verwenden.

Ich habe nie funktioniert TRAMP ohne ssh-Agent (d. H. Aufforderung zur Eingabe von Anmeldeinformationen) - wie Sie bemerkt haben, hängt es einfach - aber es funktioniert gut mit einem, so dass ich nicht verbrachte Zeit versuchen, das zu lösen. Angenommen, Sie sind auch glücklich, einen Agenten zu verwenden (und Sie haben bereits Ihre Schlüssel erzeugt und hinzugefügt authorized_keys-Dateien je nach Bedarf), den Ansatz, die für mich funktioniert, ist:

  1. Run ssh-agent von Cygwin.
  2. Starten Sie NT Emacs über Cygwin (damit er die Umgebungsvariablen ssh-agent erbt).
  3. Verwenden Sie 'sshx' als die TRAMP-Methode (Sie können es manuell in jedem Dateipfad angeben, aber ich empfehle, es als Standard zu setzen, mit (setq tramp-default-method "sshx")).

Diese Punkte alle im Wiki abgedeckt sind, aber Sie können auch Dinge automatisieren etwas:

Für Schritt 1 mein bash Profil startet automatisch eine SSH-Agent, wenn man nicht bereits ausgeführt wird, oder fordert mich für meine Passphrase, wenn meine Identität abgelaufen ist. (. Siehe Code unten)

Für Schritt 2 sieht das Ziel meiner Windows-Verknüpfung für den Start Emacs wie folgt aus:

C:\cygwin\bin\bash.exe --login -c "env HOME=\"`cygpath '%APPDATA%'`\" /cygdrive/c/emacs/emacs-23.1/bin/runemacs.exe"

Das --login Argument bedeutet mein bash Profil ausgeführt wird, was diesen Schritt wird sichergestellt, 1 ist immer schon erledigt, bevor Emacs gestartet wird.

(HOME Einstellung ist für TRAMP nicht notwendig, aber %APPDATA% ist der Standard unter NT Emacs, und dies verhindert das Cygwin Home-Verzeichnis aus Vorrang nehmen, damit Ihre Emacs halten konsequent Config unabhängig davon, ob Sie diese Abkürzung, um sie auszuführen .)

Schließlich ist hier der Code von meinem cygwin .bash_profile, das meine ssh-Agent verwaltet. Es ist ein bisschen hacky, aber es funktioniert für mich.

Beachten Sie, dass meine Identität nach 4 Stunden (14400 Sekunden) abgelaufen ist. TRAMP kann hängen bleiben, nachdem das passiert ist (wie zuvor erwähnt, habe ich es nie bekommen, um mich nach Anmeldeinformationen zu fragen), also sei dir dieses Problems bewusst. Geben Sie C-g ein, um zu verhindern, dass eine Verbindung hergestellt werden kann. Um die Konnektivität wieder aufzunehmen, können Sie im Allgemeinen einfach eine andere Cygwin-Shell starten, Ihre Passphrase erneut eingeben, und dann wird TRAMP wieder glücklich. Gelegentlich hat es nicht reagiert, aber das Töten des * tramp * -Puffers wird das beheben.Das Auslaufen Ihrer Identität sollte dieses Problem natürlich nicht umgehen, sollte dies akzeptabel sein.

SSH_ENV="${HOME}/.ssh/environment" 

# Run ssh-agent, if one is not already running 
function start_agent { 
    echo "Initialising new SSH agent..." 
    /usr/bin/ssh-agent -t 14400 | sed 's/^echo/#echo/' > "${SSH_ENV}" 
    echo succeeded 
    chmod 600 "${SSH_ENV}" 
    . "${SSH_ENV}" >/dev/null 
    /usr/bin/ssh-add; 
} 

# Source SSH settings, if applicable 
if [ -f "${SSH_ENV}" ]; then 
    . "${SSH_ENV}" >/dev/null 
    #ps ${SSH_AGENT_PID} doesn't work under cywgin 
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ >/dev/null || { 
     start_agent; 
    } 
    #if our ssh-added identity has expired (see -t option to ssh-agent) 
    #then we need to re-add it 
    if ! /usr/bin/ssh-add -l >/dev/null; then 
     /usr/bin/ssh-add; 
    fi 
else 
    #no ssh-agent running at the moment 
    start_agent; 
fi 
+0

mit W32 Emacs zu arbeiten, können Sie Putty und es Schlüsselverwaltung Agent Seitenumbruch verwenden. Um eine Verbindung herzustellen, verwenden Sie 'pscp' als Tramp-Methode. Sobald Sie diese Einstellung haben, funktioniert Tramp reibungslos. – vedang

+0

Danke für Ihre Antworten. Das Problem für mich, einen Schlüsselverwaltungsagenten zu verwenden, wurde behoben. Ging mit der ssh-agent-Lösung, da ich die Schlüsselverwaltung mit Kitt ein wenig umständlich finde. – grm

7

Als Fußnote habe ich seitdem die Art und Weise verändert, wie ich TRAMP unter Windows benutze.

TRAMP unter Windows war einfach zu langsam. Die Control Master-Funktion von OpenSSH war das, was ich brauchte - dies hält eine persistente SSH-Verbindung offen und eliminiert so die kostspielige Verbindung, die sonst für jede TRAMP-Operation erforderlich ist. Leider kann Cygwin zu diesem Zeitpunkt den Control Master grundsätzlich nicht unterstützen:/

Das ist der Fall, meine derzeitige Lösung ist es nicht, Emacs in Windows überhaupt auszuführen. Stattdessen installierte ich den X.Org-Server von Cygwin und startete Emacs auf einer GNU/Linux-VM (gehostet in meiner Windows-Box) und mit der Cygwin X-Anzeige.

Das funktioniert wirklich sehr gut.

Ich benutze Emacs im Daemon-Modus, was bedeutet, dass es keine Probleme gibt, wenn es irgendwelche Probleme mit dem X-Server gibt, und wenn ich die Windows-Box herunterfahren muss, kann ich einfach den Zustand der VM, stelle es danach wieder her und verliere meine Session nicht wirklich (*). (desktop.el bietet in jedem Fall eine recht anständige Sitzungsverwaltung oder wenn Sie die VM neu starten müssen; wenn Sie diese jedoch verwenden, möchten Sie möglicherweise die Variable desktop-files-not-to-save so ändern, dass sie nicht alle Ihre TRAMP-Puffer ignoriert Cygwin den X-Server mit startxwin statt startx (ersteres ermöglicht der X-Server die Fenster starten erscheinen als normale Windows-Fenster), und dann von einem xterm! ich stelle es nur um „^$“)

Seien Sie sicher, können Sie ausführen ssh -Y (me)@(linux) -f "emacs --daemon", um den Server zunächst zu starten, und ssh -Y (me)@(linux) -f "emacsclient -c", um einen neuen Client zu starten.

Die TRAMP-Methoden 'scpc' und 'rsyncc' verwenden Control Master automatisch. Ich betreibe jedoch immer noch einen ssh-Agenten auf der Linux-Box (um die Authentifizierung beim Öffnen von Remote-Shells aus Emacs usw. zu vermeiden). Der Befehl 'emacs --daemon' wird dann so ähnlich wie ssh -Y (me)@(linux) -f "source ~/.ssh/agent-environment && emacs --daemon", vorausgesetzt, Sie haben die ssh-agent-Ausgabe in diese Datei gelenkt/kopiert, als Sie sie ausgeführt haben (ich mache mir keine Zeitüberschreitung für diese Zeit).

Und schließlich, auf der letzten Anmerkung, wenn Sie einen ähnlichen Mechanismus zu dem, den ich ursprünglich erwähnt für die Verwaltung Ihrer cygwin ssh-Agent in Ihrem bash_profile, beachten Sie, was passiert, wenn Sie den X-Server von der starten Windows-Verknüpfung, wenn Sie keine authentifizierte Identität geladen haben - gar nichts (bis Sie im Task-Manager nachsehen und den ssh-add-Prozess dort sehen). Daher empfehle ich, immer startxwin von der Befehlszeile zu verwenden, um dies zu vermeiden.

bearbeiten:
(*) Das war eine schlechte Annahme. Ich habe seitdem erkannt, dass Neustart des X-Server tatsächlich tut verhindern mich später wieder mit dem Emacs-Daemon verbinden, was eher bedauerlich ist. Folglich bin ich voll und ganz auf die Desktop-Bibliothek angewiesen, um meine Sitzung wiederherzustellen. Ich verwende , um meine Desktop-Datei regelmäßig zu speichern, um sie auf dem neuesten Stand zu halten. Weitere Informationen zur Verbesserung der Desktop-Funktion finden Sie im Emacs-Wiki.

+0

Auch vorausgesetzt, Sie möchten Ihre .emacs zwischen den Windows- und Linux-Boxen freigeben, stellen Sie sicher, dass Sie Ihre Win32/Cygwin-Integration in etwa wie folgt verpacken: (when (eq system-type 'windows-nt) (erfordert' my-win32)) – phils

3

Ich benutzte den EmacsW32, hatte aber Tonnen von Problemen wie diese. Sie gingen alle weg, als ich zu Cygwins Emacs wechselte. Es ist wahrscheinlich schon installiert. Geben Sie Folgendes an einer Bash-Eingabeaufforderung ein:

 
XWin -multiwindow & 
export DISPLAY=:0.0 
emacs 

Es wird ein bisschen leichter als eine Linux-VM sein.

0

Heutzutage Cygwin kommen mit emacs-w32, so dass Sie X-Server nicht starten müssen.

Ich empfehle es zu starten:

run emacs-w32 
run emacsclient-w32 -a "" %FILE_OR_DIR% 

Weil es Cygwin Emacs mit nur native Windows-GUI ist es für sshing auf Linux-Hosts gut mit TRAMP funktioniert.

Sie können mein Skript http://hg.defun.work/utils/file/tip/emacs/e.bat als eine schnelle Datei öffnen.

UPDATE Mit modernen Windows und UAC kann es besser sein, Cygwin Emacs zu laufen wie:

cygstart --action=runas run emacs-w32 
Verwandte Themen