Pregunta
Me gustaría crear una interfaz de usuario en forma de menú emergente , menú emergente similar al utilizado en Magit .
Caracteristicas
Definición de ventana emergente
La ventana emergente en el contexto de esta pregunta significa una pequeña ventana temporal que contiene una colección de elementos de menú para que el usuario pueda seleccionar uno y solo uno de estos elementos.
Posición en la pantalla
Se permite que la ventana emergente aparezca en cualquier parte de la pantalla, pero es deseable que sea bastante obvia y, por lo tanto, que aparezca junto a la ventana actualmente activa.
Contenido de Popup Buffer
Los artículos deben mostrarse en forma de bonita mesa. Bonito es el contexto de la pregunta significa visualmente atractivo, este efecto se puede lograr más fácilmente colocando los elementos del menú en filas rectas, ver
complete--insert-string
por ejemplo. Este párrafo sirve para aclaraciones adicionales, puede hacerlo a su manera, esto no hará que su respuesta sea incorrecta.
Selección de elemento de menú
Se espera que la selección se realice presionando una sola tecla u, opcionalmente, con un mouse (aunque no es tan importante, por lo que las respuestas que contienen proposiciones que no admiten mouse son legales). Si propone una solución compatible con el mouse, tenga en cuenta que el usuario debe poder seleccionar un elemento del menú de forma intuitiva, es decir, haciendo clic con el botón izquierdo en la opción deseada.
El mouse NB se puede usar de muchas maneras y también se aceptan formas alternativas para indicar una elección.
Eliminación de Popup
Una vez que el usuario ha seleccionado un elemento del menú de la manera descrita anteriormente, el búfer y, por lo tanto, su ventana deben eliminarse de la vista y eliminarse. La ventana que ha estado activa antes de la invocación del menú emergente debería volver a enfocarse (es decir, volverse activa).
Valor devuelto y argumentos
Preferiblemente, esta consecuencia de las acciones debería dar como resultado un objeto Lisp devuelto. El objeto Lisp puede ser:
nil
- esto indica que el usuario ha abortado el menú emergente presionando C-go de alguna otra manera †.string
- la cadena (está permitido usar un símbolo) debe estarstring-equal
en una de las cadenas suministradas al menú emergente como colección de elementos reales.
Se aceptan formas alternativas para que el resto del programa conozca la elección del usuario o, posiblemente, su ausencia. Sin embargo, si no está claro de qué otra manera se puede realizar, pido a todos los que responden que improvisen y no me piden más aclaraciones sobre este aspecto.
Esto es todo por valor devuelto. En cuanto a los parámetros de entrada, deberían incluir al menos una colección de cadenas que representen posibles opciones (es decir, elementos de menú).
Respuestas Aceptables
La respuesta esperada puede ser de las siguientes formas:
Suficiente fragmento de código que permite al lector educado escribir una función como la descrita anteriormente; No se espera ni es necesario escribir toda la función de trabajo. Sin embargo, para evitar la incertidumbre (¿se pueden omitir partes considerables del código?), Debo tener en cuenta que las partes faltantes del fragmento deben describirse en el componente textual de la respuesta.
Un enlace a la biblioteca existente que implementa una funcionalidad similar. Para evitar la incertidumbre, debo tener en cuenta que similar en nuestro caso significa que la biblioteca se puede utilizar para crear ventanas emergentes (consulte la definición anterior) que tiene al menos 2 o 3 características descritas anteriormente. Si la biblioteca propuesta es diferente al punto en el que no se puede cumplir la condición previamente establecida, cada uno de estos casos se juzgará de forma independiente y siempre se votará si OP lo considera útil.
Descripción de las funciones integradas de Emacs o de terceros que se pueden utilizar para implementar cualquier característica descrita en la sección «Características», ver arriba. Para evitar la incertidumbre, por favor aclara cómo su respuesta puede ser útil para futuros lectores que deseen implementar emergente , menú emergente similar a la utilizada en Magit .
† Las formas alternativas de abortar el menú emergente pueden incluir lo siguiente (pero no limitado a esto):
haciendo clic fuera de la ventana del menú emergente;
Eliminación del búfer que contiene la ventana emergente sin hacer una elección.
magit-popup
. Se llama al nuevo paquetetransient
, y esto es lo que se usa en las versiones actuales demagit
. Consulte magit.vc/manual/transient para obtener documentación.