Comment utiliser emacsclient pour se connecter à une instance distante d'emacs?


44

J'aimerais pouvoir utiliser emacs sur un seul ordinateur:

server $ emacs --daemon

Et puis connectez-vous à partir d'un autre:

local $ emacsclient -c server

Est-ce possible? Si c'est le cas, comment?


1
Juste un conseil: si vous n'avez pas besoin de garder la session Emacs distante en marche et que vous voulez juste éditer des fichiers sur l'hôte distant avec Emacs, vous pouvez essayer TRAMP, qui vous permet d'éditer des fichiers sur le réseau de manière transparente.
paprika

@paprika Je pense que OP veut utiliser une configuration emacs distante localement. Par conséquent, TRAMP pourrait ne pas convenir. C'est la raison pour laquelle j'ai préfixé ma réponse avec l'avertissement.
Vamsi

3
Il y a eu une discussion à propos de StackOverflow: stackoverflow.com/questions/12546722/…
Crash Coredump

Réponses:


21

Vous ne pouvez pas utiliser emacsclient pour vous connecter à une instance Emacs s'exécutant sur un ordinateur distant. Ce concept client-serveur est lié aux processus (locaux) et non aux nœuds de réseau. Cependant, vous pouvez utiliser différentes technologies réseau pour vous connecter à l'ordinateur distant, vous connecter à un serveur emacs qui y est installé et afficher l'écran de emacsclient localement. Selon le système d'exploitation utilisé, la mise en réseau peut être réalisée via SSH (terminal / X-Forwarding), VNC, RDP, etc.

UPDATE :
Comme certaines personnes l’ont souligné, emacsclient a en fait une option pour se connecter au serveur via TCP. Cependant, emacsclient n'a jamais été conçu pour être utilisé à distance. L'option socket TCP est requise pour la compatibilité avec les systèmes non UNIX (c'est-à-dire les systèmes d'exploitation où les sockets de domaine UNIX ne sont pas disponibles, comme Windows).


4
D'après ce message, votre déclaration n'est pas tout à fait juste. Pourriez-vous être plus précis?.
DJJ

5
@paprika: Non, le mécanisme d'authentification utilisé pour la connexion TCP a été conçu spécifiquement pour le cas de l'accès à distance. J'ai insisté pour l'utilisation de TCP du côté Windows, de sorte que le code soit également utile pour POSIX pour les connexions distantes, réduisant ainsi le code spécifique à Windows et ajoutant des fonctionnalités au côté POSIX.
Stefan

9

Probablement pas ce que vous avez demandé, mais en supposant que vous avez configuré ssh avec X-forwarding, vous pouvez démarrer emacsclient sur le serveur et le transférer vers DISPLAY à distance. (Avertissement: code saisi directement dans le formulaire Web)

 local> ssh server -f emacsclient -c --display=$DISPLAY

Non, cela n'a rien à voir avec la question.
Heroxbd

4

Ce n'est peut-être pas ce que vous voulez, mais juste au cas où cela pourrait vous aider.

Je travaille habituellement dans une machine virtuelle démarrée avec Vagrant. Mon ~/.emacs.drépertoire est synchronisé entre ma machine (locale) et la machine virtuelle (distante), en mettant les informations suivantes dans le Vagrantfilefichier:

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

De plus, ma configuration Emacs démarre automatiquement un serveur au démarrage:

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

Ainsi, lorsque je lance un serveur Emacs dans la machine virtuelle, je peux me connecter à celui-ci avec les éléments suivants:

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

virtual machine hostname est le nom d'hôte de la machine virtuelle que j'ai configurée dans mon ~ / .ssh / config:

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

Note: Avant de lancer le serveur Emacs à l'intérieur de la machine virtuelle, je vérifie que le ~/.emacs.d/server/serverfichier n'est pas présent (si c'est le cas, je le supprime), car sinon il ne fonctionnerait pas.


Je viens juste de réaliser que vous appelez emacsclient sur le serveur distant. Dans ce cas, vous n'avez pas besoin de transmettre explicitement le fichier du serveur, car emacsclient se connectera automatiquement au premier serveur trouvé.
Vamsi

Vous n'avez pas besoin de spécifier le fichier de clé privée dans la ligne de commande si votre fichier d'identité est correctement défini dans votre .ssh/configfichier. Il vous suffit de spécifier le Host. En cas de doute, vous pouvez utiliser le résultat de la commande: vagrant ssh-configpour définir votre ~/.ssh/configfichier.
Alexandro de Oliveira

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.