Einrichten von emacsclient unter MS Windows

11

Ich versuche, den Emacs-Server-Daemon einzurichten und Emacsclient unter MS Windows zu verwenden, damit Dateien schnell und ohne Verzögerung und Overhead geöffnet werden können, die mit dem Starten zusätzlicher Emacs-Instanzen für jede geöffnete Datei verbunden sind. Ich folge den spezifischen Anweisungen in emacswiki für MS Windows, die Folgendes beinhalten:

  1. Emacs als Daemon ausführen, runemacs.exe --daemon
  2. Anschließend wird emacsclientw.exemit den entsprechenden Optionen aufgerufen.

Das Starten des Daemons ist erfolgreich (ich sehe emacs.exe in der Prozessliste), aber das Aufrufen von emacsclient führt zu Fehlern. Das Wiki sagt, dass Sie eine Verknüpfung zu erstellen emacsclientw.exeund das Ziel in ändern sollen

X:\path\to\emacs\bin\emacsclientw.exe -na "X:\path\to\emacs\bin\emacsclientw.exe" -c -n

Ist das richtig? Es sieht so aus, als würde der Client zweimal aufgerufen. Wenn Sie das Ziel wie gezeigt verwenden, wird das Programm nicht ausgeführt und es wird der Fehler "Dateiname oder Argument erforderlich" ausgegeben. Verwenden Sie nur den ersten Teil des oben gezeigten Ziels

X:\path\to\emacs\bin\emacsclientw.exe -na

erzeugt einen generischen Fehler. Verwenden Sie nur den zweiten Teil

X:\path\to\emacs\bin\emacsclientw.exe -c -n

erzeugt den Fehler "Kein Socket oder alternativer Editor." (Die offiziellen Emacsclient-Optionen werden hier beschrieben . )

Irgendwelche Vorschläge? Emacs läuft einwandfrei im Standardmodus, dh nicht im Daemon-Modus. Version 25.1. Ich würde es vorziehen, den Daemon auszuführen, anstatt den Server in meiner Initialisierungsdatei zu starten.

Snelephant
quelle

Antworten:

5

Ich bin mir über den Rat auf der Emacswiki-Seite nicht so sicher. Was Sie tun möchten, ist Folgendes:

  • Starten Sie einen Emacs-Client, der mit dem laufenden Emacs-Server verbunden ist.
  • Wenn der Emacs-Server nicht ausgeführt wird, starten Sie ihn und verbinden Sie den Emacs-Client.
  • Warten Sie nicht, bis der Client fertig ist (wenn Sie von einer Befehlszeile aus starten).

Der Befehl, den ich benutze, ist

C:\emacs\bin\emacsclientw.exe -n -c -a ""

Das -n bedeutet, dass Sie nicht warten müssen, bis der Client fertig ist, wenn Sie über die Befehlszeile starten. Mit -a können Sie einen alternativen Editor angeben, wenn der Emacs-Server nicht ausgeführt wird. Wenn Sie ihm jedoch eine leere Zeichenfolge geben, wird versucht, den Emacs-Server zu starten und eine Verbindung zu ihm herzustellen. Wenn Sie dies in eine Windows-Verknüpfung einfügen , möchten Sie außerdem ein -c hinzufügen, das einen neuen Frame öffnet ( siehe emacsclient-Optionen ).

Hier ist meine Verknüpfung, sie funktioniert für mich (unter Windows 7, Emacs 25.3). Ich weiß nicht, warum die emacswiki-Seite einen weiteren Aufruf von emacsclientw als alternativen Editor verwendet, der keinen Sinn ergibt.

Ich sollte hinzufügen, dass beim Versuch, die Option -c wegzulassen, wenn sie als Verknüpfung ausgeführt wird , ein Fehler auftritt.

emacsclientw Verknüpfung

Angelo
quelle
Wenn Sie die Verknüpfung emacsclientw.exe wie gezeigt konfigurieren, wird Folgendes ausgeführt: Error: Cannot connect even after starting the Emacs daemonBestätigt, dass diese Verknüpfung den Dämonprozess startet, die Dateien jedoch weiterhin in ihrer eigenen Emacs-Instanz geöffnet sind. Getestet mit und ohne Administratorrechte. Emacs 25.1, Windows 7.
Snelephant
@ Snelephant, hmm, ich weiß nicht, was falsch sein könnte. Ich habe sogar ein Downgrade auf Emacs 25.1 durchgeführt und meine Verknüpfung hat immer noch funktioniert. Wie öffnen Sie Dateien über ein Kontextmenü oder mit dem Befehl in der Verknüpfung, gefolgt vom Dateinamen?
Angelo
Der Fehler tritt sowohl auf, wenn ich auf die Verknüpfung zu emacsclientw.exe selbst klicke, ohne dass eine Datei angegeben ist, als auch wenn ich auf eine Verknüpfung zu einer Textdatei mit der im Feld Ziel angegebenen emacsclientw.exe und dem Dateinamen klicke. Eigentlich ist mir nicht klar, wie ich Dateien unter Windows auf dem Client öffnen soll? Ich möchte einfach auf die Datei im Windows Explorer klicken. Durch Klicken auf eine Datei in OSX wird die Datei in einer vorhandenen Instanz geöffnet. Durch Klicken auf eine Datei in Windows wird jedoch eine separate Instanz erstellt. Hinweis Ich habe Windows so konfiguriert, dass Textdateien mit der mit emacs gelieferten Datei runemacs.exe geöffnet werden.
Snelephant
Wenn Sie Windows so konfiguriert haben, dass Textdateien mit runemacs.exe geöffnet werden, werden sie in separaten Emacs-Prozessen geöffnet. Sie möchten diese Zuordnung ändern, um stattdessen emacsclientw zu verwenden.
Glucas
@glucas Die Zuordnungen von Textdateien zu der Verknüpfung zu emacsclientw.exe wurden geändert, wie von Angelo beschrieben. Durch Klicken auf eine Textdatei wird dasselbe erzeugt Error: Cannot connect even after starting the Emacs daemon.
Snelephant
1

Der Befehl, den ich benutze, ist:

emacsclientw.exe --create-frame --no-wait --alternate-editor runemacs.exe --server-file %APPDATA%\.emacs.d\server\server

(Wenn sich der Ordner Emacs bin nicht in Ihrem befindet PATH, verwenden Sie die vollständigen Pfade für emacsclientw.exeund runemacs.exe.)

oder mit den kurzen Optionsnamen und dem leeren String-Trick,

emacsclientw.exe -c -n -a "" -f %APPDATA%\.emacs.d\server\server

Beachten Sie, dass der leere String-Trick für -aden Daemon startet, wenn er nicht ausgeführt wird. Dies sollte jedoch erst mit Emacs 26 funktionieren (ich bin immer noch auf 25). Vor 26 müssen Sie den alternativen Editor explizit angeben. Ich habe verwendet runemacs.exe, aber mein Emacs ist so konfiguriert, dass der Server gestartet und ausgeführt wird.

Da Windows nicht über die lokalen Unix-Domänen-Sockets verfügt, die emacsclientnormalerweise für die Verbindung zum Server verwendet wurden, muss auf die Verwendung eines Netzwerk-TCP- Sockets zurückgegriffen werden. Aus offensichtlichen Sicherheitsgründen möchten Sie nicht, dass nur jemand in Ihrem Netzwerk über den Emacs-Server auf Ihr gesamtes Dateisystem zugreift. Daher emacsclientmuss der richtige (kurzlebige) Port und das Sicherheitstoken in der Serverdatei bekannt sein, bevor der Server die Verbindung zulässt.

Wenn der Server bereits läuft, sollten Sie den nicht benötigen -a(aber es tut nicht weh). Sie können die ALTERNATE_EDITORUmgebungsvariable festlegen , anstatt sie zu verwenden -a.

Wenn Sie die EMACS_SERVER_FILEUmgebungsvariable festlegen, müssen Sie sie nicht erneut mit angeben -f.

Gilch
quelle