¿Cómo uso emacsclient para conectarme a una instancia remota de emacs?

44

Me gustaría poder ejecutar emacs en una computadora:

server $ emacs --daemon

Y luego conéctese desde otro:

local $ emacsclient -c server

es posible? ¿Si es así, cómo?

liszt
fuente
1
Solo una pista: si no necesita mantener la sesión remota de Emacs ejecutándose y solo desea editar archivos en el host remoto con Emacs, entonces puede probar TRAMP, que le permite editar archivos en la red de manera transparente.
pimentón
@paprika Creo que OP quiere usar una configuración remota de emacs localmente. Por lo tanto, TRAMP podría no ser adecuado. Esa es la razón por la que prefijo mi respuesta con el descargo de responsabilidad.
Vamsi
3
Ha habido una discusión sobre StackOverflow sobre el tema: stackoverflow.com/questions/12546722/…
Crash Coredump

Respuestas:

21

No puede usar emacsclient para conectarse a una instancia de Emacs que se ejecuta en una computadora remota. Este concepto cliente-servidor está relacionado con procesos (locales), no con nodos de red. Sin embargo, puede usar varias tecnologías de red para iniciar sesión en la computadora remota, conectarse a un servidor emacs que se ejecuta allí y mostrar la pantalla del cliente emacs localmente. Dependiendo del sistema operativo que se utilice, la conexión en red podría realizarse a través de SSH (terminal / X-Forwarding), VNC, RDP, etc.

ACTUALIZACIÓN :
Como señalaron algunas personas, emacsclient realmente tiene una opción para conectarse al servidor a través de TCP. Sin embargo, emacsclient nunca fue diseñado para usarse de manera remota, la opción de socket TCP es necesaria para la compatibilidad con sistemas que no son UNIX (es decir, sistemas operativos donde los sockets de dominio UNIX no están disponibles, como Windows).

pimenton
fuente
44
Según esta publicación, su declaración no es exactamente correcta. ¿Podría ser más específico?.
DJJ
55
@paprika: No, el mecanismo de autenticación utilizado para la conexión TCP fue diseñado específicamente para el caso de acceso remoto. Presioné por el uso de TCP en el lado de Windows para que el código también sea útil en POSIX para conexiones remotas, reduciendo así el código específico de Windows y agregando funcionalidad al lado de POSIX.
Stefan
9

Probablemente no sea lo que solicitó, pero suponiendo que tenga una configuración ssh con X-forwarding, podría iniciar emacsclient en el servidor y reenviarlo a DISPLAY remoto. (Descargo de responsabilidad: código escrito directamente en el formulario web)

 local> ssh server -f emacsclient -c --display=$DISPLAY
Vamsi
fuente
No, esto es irrelevante para la pregunta.
heroxbd
4

Esto puede no ser lo que desea, pero por si acaso, vea si puede ayudarlo de alguna manera.

Normalmente trabajo dentro de una máquina virtual arrancada con Vagrant, tengo mi ~/.emacs.ddirectorio sincronizado entre mi máquina (local) y la máquina virtual (remota) poniendo lo siguiente en el Vagrantfilearchivo:

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

Además, mi configuración de Emacs inicia automáticamente un servidor al inicio:

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

Entonces, cuando inicio un servidor Emacs dentro de la máquina virtual, puedo conectarme a él con lo siguiente:

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

nombre de host de máquina virtual es el nombre de host de la máquina virtual que configuré en mi ~ / .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

Nota: Antes de iniciar el servidor Emacs dentro de la máquina virtual, verifico que el ~/.emacs.d/server/serverarchivo no esté presente (si es que lo elimino) porque de lo contrario no funcionará.

Anler
fuente
Me acabo de dar cuenta de que estás llamando a emacsclient en el servidor remoto. En ese caso, no tiene que pasar el archivo del servidor explícitamente ya que emacsclient se conectará automáticamente al primer servidor que encuentre.
Vamsi
No necesita especificar el archivo de clave privada en la línea de comando si tiene su archivo de identidad configurado correctamente en su .ssh/configarchivo. Solo necesita especificar el Host. En caso de duda, puede utilizar la salida del comando: vagrant ssh-configpara configurar su ~/.ssh/configarchivo.
Alexandro de Oliveira