Utilice un área de eco vacía para mostrar información

10

El área de eco está vacía la mayor parte del tiempo, lo que me hace pensar que podría usarla para mostrar información. Por ejemplo, org-clockmuestra la tarea actual, el tiempo restante y el tiempo total transcurrido en la línea de modo. Esta información no se pueda leer ahí (el modeline puede ser bastante corta), se repite en cada modeline (porque se aplica a la sesión de emacs enteros), y no es que la utilidad que estoy dispuesto a sacrificar algo de espacio precioso para que modeline . Por otro lado, podría aparecer en el área de eco cuando no hay nada más que mostrar aquí.

¿Hay alguna forma canónica de lograr esto? He pensado en hackear una función de inserción minibuffer-inactive-mode-hook(pero no funciona de manera confiable, por ejemplo, el mensaje desaparece tan pronto como se usa nuevamente el área de eco), o enviar mensajes no deseados por correo no deseado (pero esto será un desastre con otros usos de el área del eco y el minibúfer).

Una versión pobre de esto usaría temporizadores inactivos, pero el área de eco puede estar vacía sin que emacs esté inactivo (por ejemplo, al ingresar texto).

T. Verron
fuente
1
El área de eco que se muestra es el contenido de `* Echo Area 0 *` o `* Echo Area 1 *` y estos son buffers "normales". Debería ser posible parchear Emacs para proporcionar una ejecución de gancho cada vez que estos buffers estén "vacíos" (o se muestren y estén vacíos), para que esta funcionalidad se pueda implementar de manera eficiente y confiable.
Stefan
No es exactamente lo que tiene en mente, pero Bastien Guerry hizo algunas cosas interesantes para guardar el estado de la pantalla, especialmente al mostrar la línea de modo en el título del cuadro: bzg.fr/emacs-strip-tease.html
Dieter.Wilhelm

Respuestas:

4

Un comentario sobre esta pregunta menciona que un paquete llamado symon hace uso de dicha característica.

Se logra enviando mensajes no registrados cuando el minibúfer está inactivo y deteniendo la visualización cada vez que se emite un comando. El punto de referencia para eso es bastante corto, y después de unos minutos de uso, no pude notar ningún problema con eso: los mensajes y el uso de minibúfer aún tienen prioridad sobre los mensajes.

Los componentes clave son:

  • una función de visualización, se ejecuta en un temporizador inactivo (llama al mensaje con message-log-maxset to nil, de modo que la cadena que se muestra no entra en el *Messages*búfer)
  • una función de volver a mostrar, ejecutar en un temporizador
  • una función para detener la pantalla, ejecutar en pre-command-hook

El único problema es que la pantalla se detiene cada vez que se ejecuta un comando, lo que incluye al escribir.

Para aquellos interesados, he extraído el código relevante en un paquete repetitivo disponible en github .

T. Verron
fuente
1

La respuesta, en mi opinión, es no . El área de eco es para mensajes efímeros . Y muchas cosas borran explícitamente todo lo que podría haber tenido eco allí. Entonces darse cuenta de lo que solicita de manera razonable es problemático, en mi opinión.

En resumen, use una alternativa. Aquí están algunas:

  1. Use algún otro búfer (por ejemplo, un pequeño marco o ventana que mantenga abierto para este propósito). Fácil de hacer, puede moverlo, editarlo, borrarlo o hacer lo que quiera con él.

  2. Use parte o la totalidad de la línea de modo (que aparentemente ya ha considerado).

  3. Use una línea de encabezado.

  4. Use un título de marco.

Si fuera yo, probablemente optaría por el # 1. (Pero realmente no quiero / necesito una visualización de información de estado de tiempo completo. Es más probable que defina un comando que me muestre la información (incluso un historial / registro) a pedido).


Actualizado después de sus comentarios:

Ya ha dicho, en su pregunta, " el mensaje desaparece tan pronto como se utiliza nuevamente el área de eco ". Por lo tanto, sonaba como usar un espacio tan efímero ya que el área de eco no satisfaría sus necesidades. Sus comentarios parecen contradecir esto.

Si realmente desea usar el área de eco, use minibuffer-inactive-mode-hook, como mencionó, o use un temporizador para llamar messageo insertar el mensaje de tiempo en el área de eco de alguna otra manera. Sin embargo, ya has notado los problemas con eso. Esos problemas (sobrescritura, borrado) se derivan de la naturaleza efímera ( prevista ) del área de eco .

En resumen, desea utilizar un área destinada a mensajes efímeros, pero no desea que sus mensajes desaparezcan tan pronto como se vuelva a utilizar esa área.

(Por cierto, mencione que la información de la línea de modo se repite en cada línea de modo: ese no tiene por qué ser el caso. Puede hacer que la línea de modo sea específica para un búfer particular, etc.) Ahora, puede elegir una línea de modo para siempre (o periódicamente) muestra tu reloj o lo que sea)

Dibujó
fuente
¡Gracias por tus sugerencias! Primero, sin embargo, no entiendo bien, ¿por qué es tan problemático? Quisiera cosas que irían al cajero automático del área de eco para anular cualquier otro uso del área de eco, por lo que borrarlo está bien. Y la información adicional solo debe mostrarse cuando el área de eco está vacía, por lo que no hay nada que borrar. ¿No suena eso como una especificación razonable? Sobre el n. ° 1, el problema es que no quiero desperdiciar espacio en la pantalla. El área de eco siempre está ahí, incluso cuando está vacía. Enumeré algunos problemas con # 2, y # 3 y # 4 comparten muchos de estos problemas.
T. Verron
Acerca de por qué quiero mostrar la información a tiempo completo, tome por ejemplo el org-clockejemplo de la pregunta: quiero que el temporizador funcione para recordarme lo que debería estar haciendo, y que se supone que debo estar haciendo eso ahora , como a menudo como sea posible
T. Verron
"el mensaje desaparece en cuanto se vuelve a utilizar el área de eco" Ok, eso no estaba claro. Lo que quise decir es que si uso minibuffer-inactive-mode-hooky salgo del minibúfer, se muestra el mensaje. Luego, si algún otro comando imprime algo en el área de eco, este nuevo mensaje se agrega y el mensaje efímero no regresa (porque el minibúfer no se involucró esta vez).
T. Verron
Acerca de la línea de modelo, el problema principal es el pequeño espacio disponible allí (con frecuencia tengo muchas ventanas, divididas horizontalmente, por lo que modelos muy cortos).
T. Verron
Nuevamente: " En resumen, desea utilizar un área destinada a mensajes efímeros, pero no desea que sus mensajes desaparezcan tan pronto como se use esa área nuevamente " . Use un temporizador con messageo post-command-hook, si lo desea. Pero el problema esencial de la desaparición / sobreescritura hará que su cabeza se retrase a veces, porque está intentando usar un área de visualización temporal para algo que no desea que sea temporal.
Dibujó el