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

80

Me conecto a la máquina remota con ssh [email protected]. 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.

Zeynel
fuente
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.

Carl Groner
fuente
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 "/[email protected]:/"))

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.

abo-abo
fuente
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.

Dibujó
fuente
10

El cartel original expresó interés en abrir archivos remotos como usuario root. Esto se puede hacer con el comando:

C-x C-f /ssh:you@remotehost|sudo:remotehost:/path/to/file RET

Puede encontrar más documentación aquí: https://www.emacswiki.org/emacs/TrampMode#toc14

Alex
fuente
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.

JimLohse
fuente
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.

Drake Sobania
fuente