2010-02-09 9 views
12

Esta es probablemente una pregunta algo fuera de serie. Utilizo vagabundo para editar archivos remotos, pero también abro varios terminales ssh-ing a esa máquina remota y para otros trabajos (tuve problemas para ejecutar ssh shell dentro de emacs).Originar la edición del archivo remoto usando emacs vagabundo desde la sesión ssh

Muchas veces durante el trabajo del terminal me gustaría editar algunos archivos, y mi procedimiento actual es copiar el nombre del archivo, y luego usar emacs vagabundo para abrir ese archivo (después de jugar con la ruta del archivo en el formato vagabundo). Esto es demasiado trabajo para una edición rápida y bastante propenso a errores en la parte de manejo de ruta.

La pregunta es: ¿Puedo ejecutar algún comando en la sesión ssh remoto que lleva el nombre del archivo, transformar esa a Tramp formato (que es la parte fácil), y ejecutar un comando local de(como emacsclient blahblahblah) de modo que pueda edite el archivo remoto usando vagabundo en mis emacs locales

No estoy seguro si soy lo suficientemente claro. No quiero ejecutar emacs en la máquina remota (ya sea en el terminal o por medio de una sesión X), pero yo quiero enviar archivos a mis emacs locales desde un indicador de distancia, así:

[email protected] ~/ $ run_local_emacs somefile 
# then the file "/ssh:[email protected]/:/home/user/somefile" shows up 
# in my local emacs 

Respuesta

12

usted puede configurar su emacs-servidor para utilizar una conexión TCP (no sólo un conector local), y luego por el lado opuesto, decirle emacsclient conectarse a esa conexión TCP:

en su .emacs

(setq server-use-tcp t) 
(setq server-host "name_of_local_machine") 
(server-start) 

Y luego en el lado remoto:

emacsclient -f ~/.emacs.d/server/server /`hostname`:/path/to/local/file 

La llamada anterior al emacsclient trae un archivo local a la máquina "remota" en su Emacs ejecutándose en la máquina "local". Obviamente, puede envolver la llamada al emacsclient en cualquier tipo de secuencia de comandos que desee para que sea más fácil.

Si el directorio de inicio no es visible en la máquina remota, tendrá que de personalizar la variable server-auth-dir así:

(setq server-auth-dir "/some/path/visible/on/both/machines") 

Para obtener más documentación, ver Emacsclient options.

+0

así que debería iniciar un servidor en la máquina remota, así? Recibí un error al ejecutar emacsclient en la máquina remota (en ssh): "emacsclient: error al acceder al archivo del servidor" ~/.emacs.d/server/server " – polyglot

+0

@polyglot No, no inicia un servidor en la máquina remota (eso es lo que intenta evitar). La ruta al archivo del servidor debe estar visible para que ambas máquinas funcionen. Si eso no es posible ... es posible que pueda salirse con la suya al copiar el archivo del servidor, eso es no es tan transparente. –

+0

Ah, funciona ahora. Copié el archivo del servidor, pero hubo un error de permiso; ahora funciona! – polyglot

0

Puede usar urxvt (un excelente emulador de terminal) y escribir una extensión perl para hacer esto incluso si emacsclient no está instalado en la máquina remota.

0

Tal vez usted ya sabe acerca de esto y no funciona bien para usted, pero cuando estoy He necesitado hacer ese tipo de cosas, el nombre de archivo que completó en TRAMP ha sido lo suficientemente útil que nunca pensé en buscar alternativas.

C-xC-f/ssh:remotehost:/TabTab

Esto funciona mejor cuando se tiene las claves SSH o el acceso sin contraseña similares creados, pero suena como si tuviera que ya.

0

Lo que estoy haciendo aquí hay una conexión ssh inverso de remoto a emacsclient local y que se ejecutan localmente:

[email protected]$ ssh -f [email protected] emacsclient /ssh:remote-machine/$(realpath my-file-name) 
Cuestiones relacionadas