¿Cuál es la mejor manera de abrir archivos remotos con emacs y ssh?


80

Me conecto a la máquina remota con ssh user@192.168.1.5. Cuando necesito abrir un archivo en la máquina remota, lo hago, por ejemplo,

emacs /usr/share/nginx/html/index.html

y eso abre el index.htmlarchivo en el shell. Noté que algunos comandos de emacs funcionan pero otros no. Por ejemplo, C-wno funciona; M-<No funciona. ¿Cómo puedo solucionar este problema y cuál es la mejor manera de trabajar con emacs y ssh?

Encontré esta pregunta pero me confundió más.


1
¿Cuáles son algunos ejemplos de comandos que funcionan? (A veces existen combinaciones de teclas diferentes en la máquina remota; verifique su archivo .emacs en la máquina remota, y a veces una tecla completa funciona de manera diferente, por ejemplo, la pantalla GNU absorbe la parte Ctrl-A de un comando antes de que pueda llegar a emacs).
kbshimmyo

1
C-space, CF, Cg work
Zeynel

No pude encontrar el archivo .emacs en la máquina remota ahora, pero sé que no hice ningún
enlace de

sí, no estoy seguro de qué lleva a que este conjunto de combinaciones de teclas no funcione. ¿Emacs abre el archivo en el mismo modo en el servidor remoto en el que lo abriría localmente (donde todos los comandos han estado funcionando)? Quizás esto pueda dar una pista - M-x describe-mode.
kbshimmyo

¿También ejecuta emacs en su máquina local? ¿Hay alguna razón por la que desee utilizar emacs remotos en lugar de uno local?
Carl Groner

Respuestas:


157

Generalmente prefiero abrir archivos remotos desde una instancia local de Emacs.

Mientras ejecuta Emacs en su máquina local , abrir un archivo remoto a través de ssh no es muy diferente a abrir cualquier otro archivo además de una sintaxis ligeramente diferente .

Para ssh, puede escribir C-x C-f. Ahora, en el minubuffer que desea escribir /ssh:user@host:/path/to/file( tenga en cuenta que la finalización de tabulación funcionará una vez que comience a escribir una ruta. También observe el /carácter inicial ). Vea los documentos completos aquí .

En su ejemplo, eso sería:

C-x C-f /ssh:user@192.168.1.5:/usr/share/nginx/html/index.html

Ahora puede editar archivos remotos sobre ssh en Emacs mientras usa su configuración local y cualquier paquete instalado, etc.


24
OP podría estar interesado en saber que esta funcionalidad se llama: trampy es una de las cosas más útiles que jamás usará. ¡Incluso se compila de forma remota!
pmr

Esto funciona muy bien y todos los comandos parecen funcionar, pero veo que no me deja editar index.htmlporque dice que el búfer es de solo lectura. Pero puedo editar el mismo archivo si lo abro en la computadora remota. Por cierto, cuando abrí el archivo con C-x C-f /ssh:user@host filenameél me pidió la contraseña.
Zeynel

Probé con otro archivo del directorio de Documentos y pude editarlo sin problema.
Zeynel

¿Sabes cómo especificar el puerto con esto?
Philip Kirkbride

5
@PhilipKirkbride La sintaxis documentada completa es/method:user@host#port:filename
Carl Groner

28

Solo para agregar a la respuesta anterior, puede escribir accesos directos para las máquinas que usa con frecuencia:

(defun connect-remote ()
  (interactive)
  (dired "/user@192.168.1.5:/"))

Esto abrirá un diredbúfer en una máquina remota. Puede navegar por este búfer como lo haría con uno local.

Si ha configurado claves ssh para la máquina remota, ni siquiera tiene que ingresar la contraseña.

Si tiene un montón de máquinas remotas, puede dar un nombre reconocible a cada función, por ejemplo connect-cupcake, connect-kitkaty usar smexpaquete para completar.


Esto es genial. Lo intentaré. ¿También tiene una respuesta para la pregunta que hice en el comentario anterior? Puedo editar este archivo /usr/share/nginx/html/index.htmlsi lo abro en la máquina remota; pero cuando lo abro con ssh, index.htmles de solo lectura. ¿Por qué es esto?
Zeynel

Supongo que no se está conectando con el usuario root y, por lo general, solo él puede escribirle /usr/share/.
abo-abo

pero ¿cómo me conecto como usuario root? Probé algunas cosas como, C-x C-f /sudo ssh:user@host filenamepero eso no funciona.
Zeynel

1
Este es un problema que traté de resolver hace algún tiempo sin éxito. Puedo usar tramp para conectarme a control remoto, o para conectarme a local como sudo, pero no ambos. Una solución alternativa es convertirse en propietario de la /usr/share/nginx/html/carpeta con chown.
abo-abo

Abrí el archivo, lo /etc/nginx/sites-available/example.com.confedité, lo guardé y lo cerré. ¿Ahora lo abrí de nuevo, y esta vez no puedo editarlo? Supongo que tiene que ver con los permisos. ¿Puedes ayudarme a entender por qué sucede esto?
Zeynel

18

Y para agregar a la publicación de @ abo-abo sobre "atajos":

Utilice los marcadores de Emacs. Simplemente cree marcadores normalmente, cuando visite un archivo o directorio remoto. Entonces solo usaC-x r b para saltar a un marcador remoto, cuyo nombre proporcione (con la terminación).

Si usa Bookmark + , los marcadores remotos se resaltan especialmente en el *Bookmark List*, para que pueda reconocerlos más fácilmente. Y marcadores remotos a los que debe acceder suo sudo(root ) se resaltan de manera diferente.

Si usa Dired + , también puede marcar rápidamente varios archivos o directorios remotos, visitando el directorio remoto que los contiene en Dired, marcándolos y presionando C-x b. No es necesario dar nombres a los marcadores; llevan el nombre de los archivos. Incluso si nunca usa esos marcadores para navegar a los archivos remotos, puede usarlos con las etiquetas Bookmark + para organizar los archivos y así operar en subconjuntos de ellos.

Si usa Icicles , siempre que use un comando para saltar a un marcador, puede reducir los candidatos de finalización a aquellos que están remotos presionando C-M-@durante la finalización.



3

Una respuesta simple que se centra en la máquina remota:

Si planeo hacer todo mi trabajo emacs en la máquina remota, uso

ssh -X username@hostname

y luego ejecutar emacs en la sesión remota, mostrándose de nuevo en mi máquina local. Es una vieja pregunta, pero quería incluir esto para completarlo. De acuerdo, hay algunos problemas de configuración de xhost / X, pero en muchas redes esto funcionará desde el principio.


2

El modo SSH para emacs es lo que está buscando.

Una vez que lo haya configurado, simplemente ejecute

M-x ssh RET hostname RET

Luego le solicita su contraseña dos veces (una para la línea de comando, una vez para cargar archivos).

En su mayor parte, puede tratarlo como cualquier otro shell (no interactivo y algunas diferencias menores, pero eso es todo).

Realiza un seguimiento del directorio en el que se encuentra, por lo que cuando desea abrir un archivo desde el directorio que está viendo, se inicia automáticamente en el directorio correcto y solo necesita ingresar el nombre del archivo.

Emacs Wiki también tiene más información.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.