¿Mostrar lista de palabras en la parte inferior del marco?

20

Me gustaría mostrar 3 listas de palabras en líneas separadas horizontalmente a lo largo de la parte inferior (aunque la parte superior también funcionaría) de cada cuadro de emacs que tengo abierto. He pensado en 6 formas de hacer esto, y todas tienen problemas:

  1. Lo primero que pensé fue agregar una línea a mi línea de modo, pero AFAICT no puede usar el carácter de nueva línea en una línea de modo, simplemente se convierte a "^ J".

  2. Mi segundo pensamiento fue tener la línea en la parte superior de la pantalla y usar la línea de encabezado, pero tampoco admite el carácter de nueva línea.

  3. Podría mostrar una superposición en las últimas 3 líneas de la ventana, pero hacer que esto sea robusto parece difícil: el desplazamiento tendría que activarse cuando el punto llegara a la superposición en lugar del final real de la ventana, y tendría que reposicionar constantemente la superposición ya que las superposiciones están en el espacio de texto, no en el espacio de la ventana.

  4. Podría intentar hacer ventanas dedicadas en la parte inferior del marco. He intentado codificar esto, pero tampoco es muy robusto, no parece funcionar bien cuando un marco ya contiene ventanas divididas y he tenido que volver a vincular Cx, 1 a una versión personalizada de delete-other-windows que ignora mis ventanas especiales y estoy seguro de que hay otros casos de esquina. Además, cuando se abre una ventana de ayuda ahora se abre verticalmente porque cree que ya hay una división horizontal (que técnicamente existe, pero es solo para mostrar una ventana de una línea).

  5. Podría tener un marco dedicado para esto, pero luego mi configuración no funcionará en modo terminal, y tendría que hacer un script en mi administrador de ventanas para manejarlo en la parte inferior de la pantalla, haciéndolo no seleccionable, sin afectar el diseño, etcétera etcétera.

  6. Podría insertar el texto de las 3 líneas directamente en el minibúfer. Obtuve esto parcialmente funcionando, puedo hacer crecer el minibúfer para acomodar las 3 líneas, y puedo mostrarlas. Sin embargo, cada vez que se hace eco de un mensaje, las líneas desaparecen hasta que emito otro comando en el momento en que vuelven a aparecer. Idealmente, las 3 líneas y el área de eco no se superpondrían para poder ver ambas. Esto sería menos molesto si pudiera filtrar de manera confiable qué mensajes van al área de eco: encontré una solución en EmacsWiki pero no parece funcionar para los mensajes que se originan en la fuente emacs C (específicamente me gustaría obtener deshacerse de los mensajes que guardan archivos porque guardo automáticamente en un temporizador).

Para el contexto, mi objetivo es mostrar constantemente las palabras que se usan con más frecuencia en el búfer actual, el punto más cercano en el búfer actual y las palabras que se usaron más recientemente en el búfer actual. Tengo la intención de poder insertarlos en el búfer a través de comandos de voz. Entonces podría decir "2 más cercano" y hacer que elija el segundo elemento de la lista de palabras punto más cercano e insertarlo. Solo me importa que las listas de palabras sean visibles para cualquier búfer que esté editando actualmente. No quiero usar las ventanas emergentes utilizadas por los diversos modos de finalización de código porque necesito que las listas estén siempre visibles.

Joseph Garvin
fuente
Buena pregunta y bien planteada. Espero que tengas algunas sugerencias útiles.
Dibujó
Me pregunto sobre las otras partes del n. ° 5, además de la necesidad del modo terminal (que es importante). Podría usar un marco dedicado que se coloca en la parte inferior (no hay problema). ¿Qué quieres decir con no seleccionable y por qué lo necesitas? Si te refieres a solo lectura, entonces tampoco hay problema. ¿Qué quieres decir con no afectar el diseño ? En resumen, el n. ° 5 no me queda muy claro.
Dibujó
@Drew: Quiero decir que conduzco mi WM usando el teclado, y es poco probable que alguna vez quiera enfocar ese cuadro a propósito, por lo que me gustaría que mis enlaces de la ventana siguiente / anterior salten sobre él. Del mismo modo, me gustaría que los diseños de ventana actúen como si ese marco fuera solo parte de un panel / barra de tareas. Editar: en todas partes en este comentario dije 'ventana', quiero decir ventana X, no ventana emacs; p
Joseph Garvin
Otra posibilidad que me sugirieron es simplemente usar el minibúfer. No tengo idea si es posible mostrar texto pasivamente allí sin que interfiera con todo lo demás tratando de usarlo ...
Joseph Garvin
Se agregó una nota sobre cómo intentar usar el minibúfer.
Joseph Garvin

Respuestas:

8

Con mucha experimentación hacky pude obtener el n. ° 6 (usando texto de minibúfer) a un estado de trabajo 'suficientemente bueno'. Aquí hay una captura de pantalla:

Captura de pantalla del cinturón en acción

Hay varias partes clave para que esto funcione:

  • Insertar texto en el minibúfer sorprendentemente casi hace lo correcto fuera de la caja. El texto insertado allí aparecerá en realidad.
  • Al hacer que el texto sea la 'cadena posterior de una superposición en lugar del texto normal, lo hace no seleccionable y no tiene que preocuparse de que el cursor ingrese accidentalmente en él.
  • Para que los comandos de solicitud del minibúfer funcionen correctamente, debe inhibir la inserción del texto / superposición cuando la ventana del minibúfer esté activa.
  • Si intenta cambiar el tamaño del minibúfer con las funciones normales de cambio de tamaño de la ventana, obtendrá errores acerca de que las ventanas son demasiado pequeñas, si usa la función indocumentada md-resize-minibuf, puede cambiar el tamaño al número exacto de líneas que desee, siempre que ha configurado resize-mini-windows a nil primero.
  • Para resolver las listas que desaparecen cada vez que hay un mensaje, debe avisar a la función de mensaje que intercepte los mensajes. Luego los inserta usted mismo en el minibúfer. También debe mirar la variable de mensaje actual, que almacena lo último que apareció en el área de eco (sorprendentemente, el área de eco y el minibúfer son técnicamente distintos y algunas funciones de código fuente C se imprimen directamente en el área de eco sin pasar por el mensaje función). El código que proporciono a continuación para esto es imperfecto, los mensajes persisten más de lo que normalmente lo harían, lo que aún necesito investigar (verificar la última entrada en * Mensajes * puede ser más simple y más robusto) pero esto es 'suficientemente bueno' por ahora.

Aquí hay un enlace a mi implementación con un cinturón de ejemplo que muestra el anillo de matar. Eventualmente, esto será parte de un proyecto adecuado: https://gist.github.com/jgarvin/ce37d08654978fd7e4c9

Esta es la primera vez que escribo una cantidad significativa de elisp, por lo que la calidad probablemente sea inferior, pero funciona.

Joseph Garvin
fuente
1

Desafortunadamente, ni la línea de modo ni la línea de encabezado pueden ser líneas múltiples. He preguntado sobre esto antes y no hay (al menos no) ninguna opción oculta para que esto funcione. Entonces 1 y 2 están fuera. También siento que 3 y 6 son hacks que no te harán feliz a la larga. 3 y 4 parecen buenos enfoques, pero lograr que funcionen de manera confiable será una gran inversión.

Por lo tanto, recomendaría que primero mencione esto en emacs-devel . En mi experiencia, las cosas se implementan eventualmente si te molestas en explicar cuidadosamente lo que quieres y por qué eso es algo bueno. Puede llevar algo de tiempo, al menos hasta la próxima versión, pero si está bien esperando un poco o utilizando la versión de desarrollo, podría obtener exactamente lo que desea, con mucho menos esfuerzo.

tarsius
fuente
Gracias por la sugerencia de contactar emacs-devel. A pesar de que se me ocurrió una solución, fue bastante hacky y sería bueno tener una API real para dibujar directamente en las coordenadas de la pantalla, así que cuando tenga tiempo, probablemente les envíe un correo electrónico.
Joseph Garvin el