¿Cómo uso emacsclient como EDITOR o VISUAL?

10

Escenario: estoy en zsh y quiero editar un comando de shell largo en una instancia ya abierta de Emacs. Me puse $VISUALa emacsclient -n -c. Cuando ejecuto C-x C-edesde zsh, se abre un nuevo marco de Emacs, poblado con el contenido de la línea zsh. Después de editar y guardar el búfer, presiono C-x ky el búfer se cierra. La línea zsh permanece sin cambios . ¿Por qué zsh no reconoce los cambios realizados en Emacs?

Emacs 24.5.1, zsh 5.0.8, Mac OS X 10.10.4

cg433n
fuente

Respuestas:

11

Establecer VISUALen emacsclient -c(o alguna otra variación sin -n).

La opción -nhace emacsclientque regrese tan pronto como se contacte con la instancia de Emacs en ejecución para indicarle que edite el archivo. El programa que llama al editor (aquí, zsh, pero esto se aplica por igual a cualquier otro programa que invoque $VISUAL) sabe que ha terminado de editar porque el programa que invocó ha salido, lo que, con -n, ocurre esencialmente de inmediato.

Debe hacer que el programa invocado VISUALsalga cuando haya terminado de editar, es decir, cuando cierre el búfer en Emacs. Eso es exactamente lo que emacsclientno -nhace: se pone en contacto con la instancia de Emacs en ejecución para decirle que abra el archivo, luego se sienta hasta que Emacs responde para decirle a emacsclient que la sesión de edición ha finalizado. La forma normal de terminar una sesión de edición es presionar C-x #( server-edit). Esto notifica a emacsclient y cierra el búfer, así como el marco cuando fue abierto por emacsclient -c. Al cerrar el búfer también se notifica al proceso de emacsclient que la sesión ha finalizado, pero aparece un mensaje de advertencia ("¿El búfer ... todavía tiene clientes, lo mata?"), Que puede deshabilitar anulando la función server-kill-buffer-query-function(RMS cree que es peligroso). En un marco abierto poremacsclient -c, presionando C-x C-c( save-buffers-kill-terminal) guarda el archivo, lo cierra y cierra el marco.

Gilles 'SO- deja de ser malvado'
fuente
-ntambién evitará que emacsclient funcione como editor para git.
cg433n
Una tangente (y lo pondré en otra pregunta si lo desea), pero ¿qué usos tiene la -nbandera?
Squidly
3
@MrBones Digamos que estoy en un administrador de archivos o en la línea de comandos y quiero editar un archivo. No "edite un archivo y luego haga algo con él", simplemente comience a editarlo. Si ejecutara una instancia separada de Emacs por archivo, la ejecutaría emacs myfile &(o el equivalente de Windows), colocando el proceso de Emacs en el brackground. Con emacsclient, podría ejecutar emacsclient myfile &, pero eso deja un emacsclientproceso cuyo único trabajo es esperar y luego salir. En cambio, ejecuto emacsclient -n myfile, por lo que el proceso emacsclient desaparece por sí solo. Esto es tan común que tengo un alias de shell:alias e='emacsclient -n'
Gilles 'SO- deja de ser malvado'
@Gilles Me di cuenta de que solo corro emacsclienten la terminal, por lo que no podía entender el punto -n. Gracias
Squidly
2
@MrBones, diría que ejecutar emacsclient en un terminal es la razón precisa para usar -n: después de abrir el envío del archivo al marco abierto de Emacs, emacsclient termina y uno puede continuar trabajando en el terminal. Esto es excepcionalmente útil.
Daniel