Mehrere Emacs-Instanzen mit jeweils eigenem Server?

7

In meinem Setup werden auf meinem lokalen Computer mehrere (GNU) Emacs-Instanzen gleichzeitig ausgeführt, eine für jedes Projekt oder jede Aufgabe, an der ich gerade arbeite.

Ich möchte in der Lage sein, Puffer in einer bereits laufenden Emacs-Instanz zu öffnen, beispielsweise durch einen Befehl wie

$ emacs file.txt

Die normalerweise vorgeschlagene Lösung besteht darin, Emacs im Servermodus auszuführen. Dies steht jedoch im Widerspruch zu meiner Verwendung mehrerer Emacs-Instanzen, da ich verstehe, dass standardmäßig immer nur ein einziger Emacsclient aktiv sein kann.

Wie kann ich Dateien als Puffer in vorhandenen (möglicherweise mehreren) Emacs-Instanzen öffnen? Das endgültige Ziel besteht darin, die Datei in der Emacs-Instanz zu öffnen, die sich im aktuellen Arbeitsbereich (Compiz) befindet, oder eine solche Instanz zu erstellen, falls sie noch nicht vorhanden ist.

Felix Hoffmann
quelle
Ich habe den Titel etwas bearbeitet. Anscheinend fragen Sie sich, wie mehrere Emacs-Server gleichzeitig ausgeführt werden sollen. Bitte korrigieren Sie mich, wenn ich etwas falsch gemacht habe.
Malabarba
1
Die Antworten hier sind wahrscheinlich von Interesse: emacs.stackexchange.com/q/41/93
nispio
Wenn das der Fall ist, werde ich meine Antwort entfernen, weil ich dachte, er würde nach verschiedenen Kunden in verschiedenen Arbeitsbereichen fragen.
Boccaperta-IT
@ Malabarba Ich bin mir ehrlich gesagt nicht sicher! Der Grund, warum ich die Frage allgemeiner formuliere, ist, dass ich nicht weiß, ob ich die Frage "Wie kann ich mehrere Emacs-Server haben?" Beantworte. ist der richtige Ansatz, um mein Problem zu beantworten "Wie kann ich mehrere Emacs-Instanzen haben und Dateien als Puffer in einer von ihnen über die Befehlszeile öffnen?". Ich sehe jedoch, dass das Erreichen mehrerer Server ein potenzieller Weg sein könnte, um mein Problem zu lösen.
Felix Hoffmann

Antworten:

5

Diese Antwort hat die allgemeine Methode, obwohl die Frage anders war als Ihre.

Sie können emacs --daemon=workspaceNkombiniert mit verwenden emacsclient -s workspaceN, um einen Emacs-Daemon im Arbeitsbereich N zu haben. Wenn Sie mehrere benötigen, führen Sie einfach Arbeitsbereich1, Arbeitsbereich2 usw. aus. Beachten Sie, dass der Name des Dämons völlig willkürlich ist und Sie ein beliebiges Benennungsschema verwenden können.

Es wird wahrscheinlich schwieriger sein, festzustellen, in welchem ​​Arbeitsbereich Sie sich befinden, und ich weiß nicht, wie ich es bestimmen soll. Wenn Sie eine Umgebungsvariable haben, reicht wahrscheinlich ein Shell-Alias ​​oder eine Shell-Funktion aus (wenn Sie Dinge nur über die Shell öffnen möchten).

J David Smith
quelle
1
Um Ihre Antwort zu ergänzen, können Sie server-namedasselbe tun, ohne einen Emacs-Daemon verwenden zu müssen. Stellen Sie es einfach vor dem Laufen ein (server-start). Es ist möglich, einen Wert festzulegen, der vom Wert von command-line-argsabhängt, um etwas Ähnliches wie den --daemonAufruf zu simulieren
Sigma
1
@ Sigma Danke! Während die --daemonLösung im Prinzip funktioniert, habe ich jetzt Probleme mit dem letzten Teil meiner Frage: "... oder eine solche Instanz zu erstellen, wenn sie noch nicht existiert." Ich kann entweder passieren -czu emacsclientoder nicht, aber es scheint nicht etwas dazwischen zu sein (was ich brauchen würde). Könnten Sie Ihre Lösung erläutern? Wie kann ich server-namevor dem Ausführen server-startfestlegen (set-variable reicht nicht aus, da die Variable noch nicht vorhanden ist). Eine init.el-Lösung, die server-namevon den Befehlszeilenargumenten abhängt, ist genau das, wonach ich suche.
Felix Hoffmann
(set-variable 'server-name "foo")arbeitete für mich. Hast du daran gedacht zu zitieren server-name? Außerdem: Sie können server-running-pdamit überprüfen, ob der Server bereits ausgeführt wird.
J David Smith
0

Soweit ich weiß, können Sie Emacs im Servermodus verwenden, um das zu erhalten, wonach Sie suchen. Ich habe oft mehrere Emacsclient-Instanzen in verschiedenen Arbeitsbereichen, wodurch ich beispielsweise problemlos Puffer zwischen ihnen austauschen kann.

Folgendes mache ich:

  • fange emacs --daemonin meinem an.xinitrc
  • emacsclient -cim Arbeitsbereich 2 ausführen
  • emacsclient -tin Arbeitsbereich 1 ausführen (wenn ich normalerweise einen Vollbild-tmux behalte)

Ich kann in jedem Fall Puffer bearbeiten und schnell von Begriff zu GUI und umgekehrt wechseln.

Weitere Ansätze finden Sie unter Starten Sie zwei separate Emacs-Daemons für Konsole und GUI

Boccaperta-IT
quelle
Dies beantwortet eine andere Frage: Zugriff auf dieselbe Emacs-Instanz von verschiedenen Standorten aus. Die Frage ist jedoch, ob mehrere Emacs-Instanzen vorhanden sind.
Gilles 'SO - hör auf böse zu sein'
1
Ja, der Titel des Themas wurde nach meiner Antwort geändert, sodass ich dachte, dass es sich bei der Frage um mehrere Emacsclient handelt. Es tut uns leid.
Boccaperta-IT