Questão
Gostaria de criar uma interface de usuário na forma de menu pop-up , menu pop-up semelhante ao usado no Magit .
Características
Definição de pop-up
O pop-up no contexto desta pergunta significa uma pequena janela temporária que contém uma coleção de itens de menu para que o usuário possa selecionar um e apenas um desses itens.
Posição na tela
É permitido que o pop-up apareça em qualquer parte da tela, mas é desejável que seja bastante óbvio e, portanto, apareça ao lado da janela ativa no momento.
Conteúdo do buffer pop-up
Os itens devem ser exibidos em forma de tabela bonita. Pretty é contexto da pergunta significa visualmente atraente, esse efeito pode ser alcançado mais facilmente colocando itens de menu em linhas retas, veja,
complete--insert-string
por exemplo. Este parágrafo serve para esclarecimentos adicionais. Você pode fazê-lo à sua maneira. Isso não tornará sua resposta incorreta.
Seleção do item de menu
Espera-se que a seleção seja realizada pressionando uma única tecla ou, opcionalmente, com um mouse (embora não seja tão importante, portanto, as respostas que contêm proposições que não suportam o mouse são legais). Se você propõe uma solução que suporta mouse, observe que o usuário deve poder selecionar um item de menu de maneira intuitiva, ou seja, clicando com o botão esquerdo na opção desejada.
O mouse NB pode ser usado de várias maneiras e maneiras alternativas para indicar uma escolha também são bem-vindas.
Eliminação de pop-up
Depois que o usuário seleciona um item de menu da maneira descrita acima, o buffer e, portanto, sua janela devem ser eliminados da visualização e eliminados. A janela que estava ativa antes da chamada do menu pop-up deve obter o foco (ou seja, tornar-se ativo) novamente.
Valor retornado e argumentos
De preferência, essa consequência de ações deve resultar em um objeto Lisp retornado. O objeto Lisp pode ser:
nil
- isso indica que o usuário cancelou o menu pop-up pressionando C-gou de alguma outra maneira †.string
- string (é permitido usar um símbolo) deve serstring-equal
uma das strings fornecidas no menu pop-up como coleção de itens reais.
Formas alternativas de informar o restante do programa sobre a escolha do usuário ou, possivelmente, sua ausência, são aceitáveis. No entanto, se não estiver claro de que outra forma isso pode ser executado, peço a todos os respondentes que improvisem e não me peçam mais esclarecimentos sobre esse aspecto.
Isso é tudo para o valor retornado. Quanto aos parâmetros de entrada, eles devem incluir pelo menos a coleção de strings que representam possíveis opções (ou seja, itens de menu).
Respostas Aceitáveis
A resposta esperada pode ter as seguintes formas:
Fragmento de código suficiente que permite que o leitor instruído escreva funções como as descritas acima; não é esperado ou necessário escrever toda a função de trabalho. No entanto, para evitar incertezas (partes consideráveis do código podem ser omitidas?), Devo observar que partes ausentes do trecho devem ser descritas no componente textual da resposta.
Um link para a biblioteca existente que implementa funcionalidade semelhante. Para evitar incertezas, devo observar que semelhante em nosso caso significa que a biblioteca pode ser usada para criar pop-up (veja a definição acima) que possui pelo menos 2 ou 3 recursos descritos acima. Se a biblioteca proposta for diferente do ponto em que a condição declarada anteriormente não puder ser atendida, cada um desses casos será julgado de forma independente e sempre será votado se o OP considerar útil.
Descrição das funções internas do Emacs ou de terceiros que podem ser usadas para implementar qualquer recurso descrito na seção «Recursos», veja acima. Para evitar incertezas, indique claramente como sua resposta pode ser útil para futuros leitores que desejam implementar pop-up , menu pop-up semelhante ao usado no Magit .
† Formas alternativas de abortar o menu pop-up podem incluir o seguinte (mas não limitado a estes):
clicar fora da janela do menu pop-up;
morte de buffer contendo o pop-up sem fazer uma escolha.
magit-popup
. O novo pacote é chamadotransient
e é isso que é usado nas versões atuais domagit
. Veja magit.vc/manual/transient para documentação.