Ich weiß, dass ich nach dem Aufruf von (start-server)
innerhalb einer bestehenden Emacs-Sitzung dann emacsclient -c
(auf demselben Computer) verwenden kann, um neue Frames zu erstellen, die sich mit diesem Server verbinden, sodass jeder neue Frame, der von emacsclient
erstellt wird, auf denselben Satz gemeinsam genutzter Daten (z. B. Puffer) zugreifen kann.
Die meisten Dokumentationen, die ich gefunden habe, konzentrieren sich auf den Anwendungsfall "Gib mir schnellen Zugriff auf mein lokales Emacs", und daher gibt es zwei Dinge, zu denen ich noch keine Details gesehen habe:
-
Kann
emacsclient -c
auf von anderen Benutzern gestartete Emacs-Server zugreifen, oder ist es fest verdrahtet, nur Sitzungen zu erkennen, die von meinem eigenen Benutzer gestartet wurden? -
Unterstützt der Emacs-Server (direkt oder indirekt) entfernte Verbindungen? Das heißt, gibt es eine Möglichkeit, Emacs (möglicherweise unter Einbeziehung von SSH) so einzurichten, dass Aufrufe von
emacsclient -c
auf remote Maschinen Zugriff auf den lokalen Status meines Emacs-Servers haben?
(Falls Sie es noch nicht erraten haben, was ich letztendlich tun möchte, ist, die oben genannten Techniken zu kombinieren, um rudimentäre kollaborative Bearbeitungsunterstützung zu bieten.)
Das ist ein Realitätsproblem, also das, woran ich arbeite:
- Die erforderliche Funktionalität sollte bereits in Emacs implementiert sein (23.3.1, 64-Bit). Ich kann zu Emacs-Erweiterungen aus den standardmäßigen Ubuntu-Repositories greifen, aber das würde ich lieber vermeiden. (Das schließt meiner Meinung nach Rudel aus, leider.)
- Keine neuen Benutzer oder Benutzerfälschungen. Lösungen sollten mit dem vorhandenen Benutzerkonten-Set arbeiten und Benutzer dürfen nicht vorgeben, andere Benutzer zu sein (z. B. über
su
oderssh
).
Falls es eine Rolle spielt, befinden sich die Maschinen in einem privaten LAN, haben OpenSSH-Clients und -Server installiert (und laufen), und alle Benutzer können eine Verbindung zu (ihrem eigenen Konto auf) allen Maschinen herstellen, haben jedoch kein gemeinsames Dateisystem.
Weiß also jemand, ob der Emacs-Server
- den Zugriff auf andere Benutzer gewähren kann, oder
- remoteen Zugriff bieten kann?
BEARBEITEN
Wie in rwb's Antwort kommentiert, ist klar, dass die lokal geöffneten neuen Fenster durch Ausführen von emacsclient -c
tatsächlich vom remoteen Emacs-Serverprozess erstellt werden. Das heißt, emacsclient
löst einfach das entsprechende Verhalten im Server aus. Dies führt zu einigen Problemen mit falschen Anzeigeeinstellungen, da der Server normalerweise keinen Zugriff auf den lokalen Desktop hat (siehe unten). Ich kann jedoch jetzt eine Verbindung zu einer remoteen Emacs-Sitzung herstellen, wenn ich die folgende Befehlssequenz verwende:
In einem Terminal, wobei 1.22.333.44
die IP-Adresse von remotehost
ist:
ssh -t -X remotehost \
"emacs -nw --eval
'(progn (setq server-host \"1.22.333.44\" server-use-tcp t) (server-start))'"
Dann in einem anderen (auf demselben Computer):
scp remotehost:.emacs.d/server/server /tmp/server-file
DISPLAY=localhost:10 emacsclient -c -f /tmp/server-file
Der emacsclient
-Befehl veranlasst den remoteen Emacs-Server (den er in /tmp/server-file
findet), ein grafisches Emacs-Fenster (auf der lokalen Anzeige) zu öffnen, das den Status mit der auf dem entfernten Host laufenden Emacs-Sitzung teilt.
Da der entfernte Emacs-Server über ssh -X
gestartet wurde, bietet SSH ihm Zugriff auf meine lokale Anzeige über eine "gefälschte" :10
-Anzeige. Das an ihn übergebene DISPLAY=:10
(über emacsclient
) führt daher dazu, dass ein Fenster auf meinem lokalen Desktop geöffnet wird.
Obwohl der oben beschriebene Ansatz das Kästchen "Emacs-Server auf dem remoteen Rechner ausführen und lokal mit emacsclient
darauf zugreifen" ankreuzt, ist er sehr begrenzt. Tatsächlich ist es nicht viel anders als das Ausführen des Servers und der Clients alle lokal als einzelnen Benutzer: Der einzige Unterschied besteht darin, dass der Server jetzt remote ist und daher Zugriff auf unterschiedliche Systemressourcen hat.
Leider ist das Starten über ssh -X
der einzige Weg, mit dem es mir erfolgreich gelungen ist, ein Fenster auf dem X-Server eines anderen Computers zu öffnen:
-
Die Angabe eines grundlegenden
DISPLAY=remote:0
führt zu nichts (da Ubuntu-X-Server mit der Option-nolisten tcp
gestartet werden). -
Die Verbindung über SSH und dann die Verwendung von
DISPLAY=:0
schlägt ebenfalls fehl, aber diesmal nur aufgrund fehlender geeigneter Authentifizierungsdaten. (Ich glaube, dass dies der Fall ist: die Fehlermeldung sagt kryptischNo protocol specified
/Can't open display
.)
Ich denke, dass das Finden eines Weges um das zweite Problem mich wahrscheinlich deutlich näher an eine Lösung bringen würde.
Nachdem ich die Beiträge unter http://comments.gmane.org/gmane.emacs.devel/103350 (beginnend beim Beitrag '25 Oct 14:50', etwa in der Mitte) gelesen habe, frage ich mich langsam, ob dies eine der seltenen Dinge ist, die Emacs nicht kann (d. h. unmöglich sind ;-)).
Wenn jedoch jemand einen Weg kennt, wie auf entfernte X-Anzeigen ohne den oben genannten Berechtigungsfehler zugegriffen werden kann, bin ich immer noch offen für Überredung....
Zusammenfassung
Wie in rwb's Antwort angemerkt, haben meine oben genannten Fragen, ob Emacs remoteen Zugriff gewähren kann, die Dinge falsch angegangen. Es gibt kein eigentliches Problem damit, dass Emacs anderen Benutzern Zugriff gewährt (server-use-tcp
und eine geeignete server-file
kümmern sich darum): vielmehr ist das Problem, wie ein Prozess auf einer Maschine neue X-Fenster auf den X-Anzeigen anderer Benutzer öffnen kann (speziell muss das laufende Emacs mit (start-server)
Fenster für Benutzer öffnen, die es über emacsclient -c
anfordern). Diese Antwort fällt außerhalb des Bereichs dieser Frage.
Alternative Lösung
Als Workaround verwenden wir Folgendes:
- machine0:
tmux -S /tmp/shared-tmux-socket new-session
- machine1..machineN:
ssh -t machine0 tmux -S /tmp/shared-tmux-socket attach
mit geeigneten Dateiberechtigungen für /tmp/shared-tmux-socket
.
Dann führen wir einen Textmodus-Emacs im gemeinsam genutzten Terminal aus. :-) Dadurch ergeben sich einige Fragen zur Benutzerfälschung, aber zumindest kann der Host alles sehen, was die Gäste tun.