(Tenga en cuenta que, a título de lo contrario, esta cuestión no es la misma que Cómo iniciar en modo demonio y suprimir diálogos interactivos? , Ya que esa pregunta fue "respondió" por el presentador de la eliminación de lo que estaba causando una determinada pronta a aparecer.)
Me gustaría saber si hay una forma general de evitar que se emacs --daemon
cuelgue para siempre esperando una respuesta a un mensaje que se muestra en un minibúfer que aún no existe.
Es imposible conectarse con un cliente de emacs para responder estas preguntas, porque el servidor no se inicia hasta que Emacs finaliza la secuencia de inicio. (Esto significa que si tiene ALTERNATE_EDITOR configurado en la cadena vacía, lo que hace emacsclient
que un servidor que no puede encontrar inicie un nuevo demonio, puede terminar con varios demonios de Emacs todos atascados y esperando). Tengo que killall emacs
solucionar el problema. Antes de continuar.
Puedo jugar whack-a-mole con cada cosa que causa un mensaje de inicio cuando lo identifico (iniciando Emacs en modo no demonio y viendo lo que está pidiendo), pero no es una solución porque no puede detener el próximo demonio de colgar en el inicio por una nueva razón.
Para dar un ejemplo: una razón común por la que se colgaría fue después de un reinicio del sistema o un bloqueo de Emacs, cuando el primer Emacs posterior al reinicio quería saber si estaba bien robar archivos de bloqueo de los Emacs desaparecidos. Podría arreglar eso creando consejos para hacer que ese mensaje siempre responda "sí" sin interacción. Pero luego, uno de los archivos que estaba abierto en la sesión anterior fue un archivo TRAMP que requería una contraseña sudo o SSH, por lo que el demonio está atascado esperando una solicitud de contraseña. Así que lo arreglo editando manualmente el archivo de sesión (con vi
o emacs -q
!) Para eliminar los archivos ofensivos, pero eso no evita que suceda la próxima vez.
Entonces, puedo dejar de cargar mi sesión automáticamente al inicio y cambiarlo a un comando que debo ejecutar manualmente desde mi primer cliente de correo electrónico. Pero si no está cargando mi sesión en segundo plano para que esté lista para cuando esté lista para usarla, ¡se pierde todo el propósito del demonio!
Entonces, lo que me gustaría es:
- (Mejor) Alguna forma de diferir las indicaciones del minibúfer hasta que abra un cliente de correo electrónico, mientras sigo completando el resto de la inicialización.
- (OK) Alguna forma de hacer todas las solicitudes de minibúfer que no he aconsejado de otra manera, como se describió anteriormente, solo devuelve a
no
menos que se esté ejecutando un cliente de correo electrónico. Puedo vivir con mis buffers TRAMP con errores, siempre y cuando funcione principalmente.
¿Hay alguna forma de lograr alguno de estos objetivos?
fuente
(read-desktop)
, luego, antes de ejecutarloemacs --daemon
, cree un archivo de bloqueo falso colocando un número entero en .emacs.desktop.lock (dónde colocar ese archivo, desafortunadamente, depende de su configuración , pero probablemente sea tu homedir o ~ / .emacs.d / .Respuestas:
Nuestra discusión aclaró que no tiene ningún servidor X funcionando, esto hace que mi primera solución sea inútil para usted.
A continuación presento una segunda solución que funciona con marcos de terminal de texto.
Cuando su inicialización requiere la entrada del usuario a través de uno, las funciones recomendadas con
avoid-initial-terminal
Emacs esperan hasta que abra un marco de terminal de texto. El mensaje aparece en el minibúfer de ese marco y puede dar su respuesta interactiva.La información relacionada con el código se proporciona como comentarios en el código. Hay
TODO
marcadores con descripciones que le muestran dónde insertar su propia configuración. Actualmente hay formularios de prueba que validan el código.Prueba: versión Emacs: 26.1
1º) Ejecutar
emacs --daemon
en una consola.2º) Ejecutar
emacsclient --tty
en otra consola. Allí se le solicita una contraseña y una cadena. Posteriormente, también debe responder una consulta y-or-np.fuente
No es exactamente lo que está pidiendo, pero tal vez una solución a su problema original:
Si el demonio le proporciona un marco gráfico para responder las preguntas que surgen en su fase de inicio, ya no se queda atascado.
El siguiente código define un consejo general
my-with-initial-frame
que abre un marco en la primera pantalla disponible (por ejemplo,:0.0
).Ese consejo se puede agregar fácilmente a los comandos de consulta como
y-or-n-p
oread-passwd
, como se demuestra a continuación.Solo abrir un marco le brinda una posibilidad bastante grosera de responder las consultas en la interfaz de usuario. También se podría usar un cuadro de diálogo,
y-or-n-p
pero eso requeriría soluciones especiales para comandos de consulta específicos. Quería evitar eso.Si prueba ese código en su archivo init, asegúrese de que sea lo primero que haya allí.
Prueba:
Suposiciones
Tenga un xserver en ejecución al que se puedan conectar los programas a través de la
DISPLAY
variable de entorno.Entrada en xterm:
emacs --daemon
emacsclient --eval '(y-or-n-p "A")'
Allí se abre un marco con el
y-or-n-p
mensaje de consultaA (y or n)
. Responda esa consulta e intente nuevamente:emacsclient --eval '(y-or-n-p "B")'
Nueva consulta con solicitud
B (y or n)
en el mismo marco. Cierre ese marco, por ejemplo, con C-x 5 0e intente nuevamente:emacsclient --eval '(y-or-n-p "C")'
Se abre un nuevo marco con el mensaje de consulta
C (y or n)
.Lo mismo funciona para la entrada de contraseña.
fuente
xterm
. Además, no creo que esta solución pueda funcionar para aquellos que sí lo hacen: si tiene el demonio configurado para ejecutarse en el inicio, intentaría abrir un marco en la parte superior de la pantalla de inicio de sesión, lo que no está permitido, por lo que se bloqueaserver-start
al final del inicio en cambio, si tiene un inicio limpio, no tendrá que esperar. Pero ... tendrá que esperar, porque a menos que lo malinterprete, no puede poner la tarea de iniciar el demonio Emacs en el script de inicio de sesión del sistema ya que una GUI no estará disponible en ese momento. (Y en un caso como el mío, nunca será más tarde tampoco.)Creo que diferir las indicaciones será difícil en general, pero debería ser bastante fácil cambiar Emacs para que tales indicaciones indiquen inmediatamente un error.
No solo eso, sino que si no puede responder a esas indicaciones sin mucha gimnasia, creo que califica como un error, por lo que le recomiendo que envíe un informe de error para eso.
fuente
Warning: desktop file appears to be in use by PID xxx. Using it may cause conflicts. Use it anyway? (y or n)
solicitud en un error, sin referirse específicamente al "escritorio" de alguna manera (porque de esa forma, al no ser general, se encuentra whack-a-mole)?*Messages*
es probablemente un aviso insuficiente en la primera conexión del cliente de que algo puede estar seriamente mal y necesita atención inmediata antes de que el usuario intente cualquier operación con estado.emacs --daemon
o comenzandoemacsclient
con laALTERNATE_EDITOR
variable de entorno establecida en la cadena vacía, verá la salida que normalmente se*Messages*
repite en el terminal hasta que el demonio completa la inicialización y Emacs está listo Pero muchos tienen Emacs iniciar el demonio al iniciar el sistema o el tiempo de inicio de sesión y la salida es conectado o tirado..desktop
sino en lay-or-n-p
función (o aún más baja). Tenemos algún mecanismo para retrasar la visualización de errores que ocurrieron durante el inicio, por lo que podríamos usar eso para mostrarlos cuando el primer cliente de correo electrónico se conecte al demonio.*Messages*
y si bien el*Warnings*
sistema poco utilizado abre una ventana al búfer si existe un marco activo cuando se genera la advertencia, en este caso, no existe un marco, y no Parece fácil aplazar la ventana emergente hasta el primer cliente de correo electrónico que sigue al problema de la advertencia. Si eso pudiera hacerse, su sugerencia de hacer unayes-or-no-p
advertencia previa al cliente sería ideal. (¡Dudo que los usuarios se peinen*Messages*
en el inicio!)