Ver buffers gestionados por otra instancia de emacs

7

¿Es posible ejecutar gnusu otras cosas que tienden a bloquearse con frecuencia en una instancia de emacs separada y "reenviar los buffers" a la instancia principal de emacs. Creo que, en general, me pregunto qué tipo de comunicación entre las instancias de emacs es posible.

Gregory Nisbet
fuente
No es una respuesta a su pregunta, sino solo algunas reflexiones: muchas personas parecen ejecutar múltiples instancias de Emacs por falta de un mejor método para mantener los buffers organizados. Los problemas de comunicación entre varias instancias se pueden evitar al no tenerlos, es decir, una mejor organización con una sola instancia, por ejemplo, organizando por marcos utilizando frame-bufs github.com/alpaker/Frame-Bufs o una variedad de otras bibliotecas organizacionales (por ejemplo, proyectos , etc.) En pocas palabras, hay muchas maneras de organizar efectivamente un enorme volumen de buffers activos dentro de una instancia de Emacs.
leyes
Estoy empezando a usarlo el-screenpara la organización del búfer, pero un enfoque orientado a proyectos podría tener más sentido. Estoy imaginando más de un maestro emacs y unos pocos trabajadores sin cabeza que bloquean cosas como gnus. La solución más simple posible: los emacses se comunican a través de sockets o el emacs maestro genera un trabajador efímero y toda la comunicación se realiza a través de stdin y stdout, pero luego tendría que tener muchos problemas para serializar y deserializar objetos específicos de emacs (ese es el trabajo duro que estoy tratando de evitar).
Gregory Nisbet
Ah, ya veo . . . Sí, generalmente tomo una taza de café o reviso las últimas preguntas sobre stackexchange mientras recibo / envío un correo electrónico por primera vez después de iniciar Emacs, es decir, siento tu dolor. Las comprobaciones / envíos posteriores por correo electrónico son mucho más rápidos con Wanderlust, pero la comprobación / envío inicial con miles de correos electrónicos almacenados puede durar unos minutos.
leyes del
@lawlist, intenté ejecutar mutt dentro de ansiterm porque solo ansiterm se bloqueaba, pero la frecuencia de actualización era horrible (y no pude descubrir cómo deshabilitar el color de fondo en mutt). También intenté usar wanderlust pero no pude entender cómo configurarlo para gmail (tengo una carpeta de escritorio vacía sin nada).
Gregory Nisbet
Yo uso mu4e, que utiliza un proceso asíncrono para descargar el correo. (El envío sigue siendo un problema, pero generalmente no lo es tanto, ya que es solo un mensaje)
Mbork

Respuestas:

4

Asegúrese de que cada instancia de Emacs ejecute un demonio con un nombre único. Establezca la variable server-startpara elegir el nombre del servidor, por ejemplo

emacs --daemon &          # Normal instance with the default server name ("server")
emacs --daemon=gnus &     # Instance for GNUS only

Desde una instancia, puede ejecutar código en otra instancia con la función server-eval-at. El valor de la expresión se devuelve a la instancia local. Debe ser un valor que pueda leerse de nuevo: enteros, cadenas, listas y otras estructuras de datos "transparentes" están bien, pero puede transferir buffers, marcos, etc. de esta manera.

Puede usar esta función para indicarle a otra instancia que abra un marco, para enumerar los nombres de búfer en otra instancia, etc. Tenga en cuenta que si la otra instancia está ocupada, su código se bloqueará hasta que responda al demonio.

(server-eval-at "gnus" `(frame-parameter
                          (make-frame-on-display ,(frame-parameter (selected-frame) 'display))
                          window-id))

No hay mucho código por ahí que utilice esta función: la mayoría de los usuarios de Emacs ejecutan una sola instancia. Entonces, haga lo que quiera hacer, probablemente tenga que hacer un trabajo de codificación.

Gilles 'SO- deja de ser malvado'
fuente
Simplemente puede decir en emacs --daemon=gnuslugar deemacs --daemon --eval '(setq server-name "gnus")'
phils
0

Emacsclient

Utilice en lugar de Emacs el cliente Emacs. Primero debe hacer un (server-start)en su Emacs (en) y luego ejecutar el cliente en su propio marco con emacsclient -c test.mac.

También puede distinguir diferentes archivos del servidor con las opciones -f ServerFile(en Windows) o los nombres de los servidores -s ServerName. Eche un vistazo a http://www.gnu.org/software/emacs/manual/html_node/emacs/emacsclient-Options.html . Para ello, debe configurar diferentes nombres de servidor para los diferentes Emacsen: (setq server-name "Server1")etc.

Dieter.Wilhelm
fuente
¿Puede emacsclient conectarse a múltiples demonios?
Gregory Nisbet
Me temo que no entiendo completamente sus casos de uso. ¿Podría darnos ejemplos, por favor?
Dieter.Wilhelm
1
Los programas de lectura de correo como gnus o wanderlust bloquean la interfaz de usuario durante la actualización. Realmente no necesito que estos programas interactúen con el resto de emacs la mayor parte del tiempo, pero me gustaría que los buffers se gestionen en un solo contexto, por lo que no necesito alternar entre el correo electrónico emacs y todo de lo contrario emacs. Sé que ciertos paquetes como helm usan una instancia de emacs separada para evitar el bloqueo, y me preguntaba si hay una manera de mostrar los búferes de otra instancia de emacs en lugar de reescribir parte de un cliente de emacs existente para que sea menos sincrónico.
Gregory Nisbet
@ GregoryNisbet: Ya veo, he actualizado mi respuesta para incluir su respuesta sobre múltiples demonios o instancias de servidor Emacs, espero que ayude ...
Dieter.Wilhelm
2
¿No sería lo mismo que ejecutar diferentes instancias de emacs, ya que a la vez una instancia de emacsclient podría acceder a los buffers de un solo servidor de emacs?
Iqbal Ansari