Wie verwende ich emacsclient, um eine Verbindung zu einer Remote-Emacs-Instanz herzustellen?

44

Ich möchte Emacs auf einem Computer ausführen können:

server $ emacs --daemon

Und dann verbinden Sie sich von einem anderen:

local $ emacsclient -c server

Ist das möglich? Wenn das so ist, wie?

liszt
quelle
1
Nur ein Tipp: Wenn Sie die Remote-Emacs-Sitzung nicht weiter ausführen müssen und nur Dateien auf dem Remote-Host mit Emacs bearbeiten möchten, sollten Sie TRAMP ausprobieren, mit dem Sie Dateien transparent über das Netzwerk bearbeiten können.
Paprika
@ Paprika Ich denke, OP möchte eine Remote-Emacs-Konfiguration lokal verwenden. Daher ist TRAMP möglicherweise nicht geeignet. Aus diesem Grund habe ich meiner Antwort den Haftungsausschluss vorangestellt.
Vamsi
3
Es gab eine Diskussion zu StackOverflow zum Thema: stackoverflow.com/questions/12546722/…
Crash Coredump

Antworten:

21

Sie können mit emacsclient keine Verbindung zu einer Emacs-Instanz herstellen, die auf einem Remotecomputer ausgeführt wird. Dieses Client-Server-Konzept bezieht sich auf (lokale) Prozesse, nicht auf Netzwerkknoten. Sie können sich jedoch mit verschiedenen Netzwerktechnologien beim Remotecomputer anmelden, eine Verbindung zu einem dort ausgeführten Emacs-Server herstellen und den Bildschirm des Emacsclients lokal anzeigen. Abhängig vom verwendeten Betriebssystem kann die Vernetzung über SSH (Terminal / X-Forwarding), VNC, RDP usw. erfolgen.

UPDATE :
Wie einige wiesen darauf hin, hat emacsclient tatsächlich die Möglichkeit, über TCP eine Verbindung zum Server herzustellen. Emacsclient sollte jedoch niemals remote verwendet werden. Die TCP-Socket-Option ist aus Gründen der Kompatibilität mit Nicht-UNIX-Systemen (dh Betriebssystemen, auf denen keine UNIX-Domain-Sockets verfügbar sind, wie Windows) erforderlich.

Paprika
quelle
4
Laut diesem Beitrag ist Ihre Aussage nicht genau richtig. Könnten Sie genauer sein ?.
DJJ
5
@paprika: Nein, der für die TCP-Verbindung verwendete Authentifizierungsmechanismus wurde speziell für den RAS-Fall entwickelt. Ich habe auf der Windows-Seite auf die Verwendung von TCP gedrängt, damit der Code auch auf POSIX für Remoteverbindungen nützlich ist, wodurch Windows-spezifischer Code reduziert und der POSIX-Seite Funktionen hinzugefügt werden.
Stefan
9

Wahrscheinlich nicht das, wonach Sie gefragt haben, aber vorausgesetzt, Sie haben ssh-Setup mit X-Forwarding, könnten Sie emacsclient auf dem Server starten und an Remote-DISPLAY weiterleiten. (Haftungsausschluss: Code direkt in das Webformular eingegeben)

 local> ssh server -f emacsclient -c --display=$DISPLAY
Vamsi
quelle
Nein, das ist für die Frage irrelevant.
Heroxbd
4

Dies ist möglicherweise nicht das, was Sie wollen, aber nur für den Fall, ob es Ihnen irgendwie helfen kann.

Normalerweise arbeite ich in einer virtuellen Maschine, die mit Vagrant gebootet wurde. Ich habe mein ~/.emacs.dVerzeichnis zwischen meiner Maschine (lokal) und der virtuellen Maschine (remote) synchronisiert und Folgendes in die VagrantfileDatei eingefügt:

config.vm.synced_folder "~/.emacs.d", "/home/vagrant/.emacs.d"

Außerdem startet meine Emacs-Konfiguration beim Start automatisch einen Server:

(require 'server)
(setq server-use-tcp t
      server-socket-dir "~/.emacs.d/server")
(unless (server-running-p)
    (server-start))

Wenn ich also einen Emacs-Server in der virtuellen Maschine starte, kann ich folgendermaßen eine Verbindung dazu herstellen:

ssh -Y -i ~/.vagrant.d/insecure_private_key "<virtual machine hostname>" 'emacsclient -c -f ~/.emacs.d/server/server'

Hostname der virtuellen Maschine ist der Hostname der virtuellen Maschine, die ich in meiner ~ / .ssh / config konfiguriert habe:

Host <virtual machine hostname>
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/anler/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL
  ForwardAgent yes

Hinweis: Vor dem Starten des Emacs-Servers in der virtuellen Maschine überprüfe ich, ob die ~/.emacs.d/server/serverDatei nicht vorhanden ist (wenn ich sie nur entferne), da sie sonst nicht funktioniert.

Anler
quelle
Ich habe gerade festgestellt, dass Sie emacsclient auf dem Remote-Server aufrufen. In diesem Fall müssen Sie die Serverdatei nicht explizit übergeben, da emacsclient automatisch eine Verbindung zum ersten gefundenen Server herstellt.
Vamsi
Sie müssen die private Schlüsseldatei nicht in der Befehlszeile angeben, wenn Ihre Identitätsdatei korrekt in Ihrer .ssh/configDatei festgelegt ist. Sie müssen nur die Host. Im Zweifelsfall können Sie die Ausgabe des Befehls: verwenden vagrant ssh-config, um Ihre ~/.ssh/configDatei festzulegen.
Alexandro de Oliveira
3

emacsclient und TRAMP

Öffnen Sie automatisch entfernte Dateien in lokalen Emacs

Ich habe Erfolg mit der ersten Lösung gehabt. Das zweite scheint einfacher zu sein, ich muss es erst noch ausprobieren.

Absturz Coredump
quelle
7
Die Antwort sieht interessant aus, aber bitte posten Sie nicht nur Links. Fügen Sie einige Auszüge und Ausschnitte hinzu, damit die Antwort auf eigenen Beinen steht.
Malabarba