Utilize uma área de eco vazia para exibir informações

10

A área de eco fica vazia a maior parte do tempo, o que me faz pensar que eu poderia usá-la para exibir algumas informações. Por exemplo, org-clockexibe a tarefa atual, o tempo restante e o tempo total decorrido na modelagem. Esta informação não é realmente legível lá (o modeline pode ser bastante curto), é repetido em cada modeline (porque se aplica à sessão emacs inteiros), e não é que útil que eu estou disposto a sacrificar algum espaço modeline precioso para ele . Por outro lado, pode aparecer na área de eco quando não há mais nada para exibir aqui.

Existe uma maneira canônica de conseguir isso? Pensei em invadir uma função de inserção minibuffer-inactive-mode-hook(mas não funciona de maneira confiável, por exemplo, a mensagem desaparece assim que a área de eco é usada novamente) ou envia mensagens de spam não registradas (mas isso atrapalhará outros usos de a área de eco e o minibuffer).

Uma versão pobre disso usaria temporizadores ociosos, mas a área de eco pode estar vazia sem o emacs ficar ocioso (por exemplo, ao inserir algum texto).

T. Verron
fonte
11
A área de eco exibida é o conteúdo de `* Echo Area 0 *` ou `* Echo Area 1 *` e esses são buffers "normais". Deve ser possível corrigir o Emacs para fornecer talvez um gancho sempre que esses buffers forem "liberados" (ou exibidos e vazios), para que essa funcionalidade possa ser implementada de maneira eficiente e confiável.
Stefan
Não é exatamente o que você tem em mente, mas Bastien Guerry fez algumas coisas interessantes para economia de espaço na tela, especialmente com a exibição da linha de modo no título da moldura: bzg.fr/emacs-strip-tease.html
Dieter.Wilhelm

Respostas:

4

Um comentário sobre esta pergunta menciona que um pacote chamado symon faz uso desse recurso.

Isso é conseguido enviando spam para mensagens não registradas quando o minibuffer está inativo e interrompendo a exibição novamente toda vez que um comando é emitido. O boilerplate para isso é bastante curto e, após alguns minutos de uso, não percebi nenhum problema com isso: as mensagens e o uso do minibuffer ainda têm prioridade sobre as mensagens.

Os principais componentes são:

  • uma função de exibição, execute em um timer ocioso (chama a mensagem com message-log-maxset para nil, para que a string exibida não entre no *Messages*buffer)
  • uma função de reexibição, execute um temporizador
  • uma função para parar a exibição, execute pre-command-hook

O único problema é que a exibição é interrompida sempre que um comando está sendo executado, o que inclui ao digitar.

Para os interessados, extraí o código relevante em um pacote padrão disponível no github .

T. Verron
fonte
1

A resposta, IMO, é não . A área de eco é para mensagens efêmeras . E muitas coisas apagam explicitamente qualquer coisa que possa ter ecoado lá. Portanto, a realização do que você solicita de maneira razoável é problemática, IMO.

Em suma, use uma alternativa. Aqui estão alguns:

  1. Use outro buffer (por exemplo, uma pequena moldura ou janela que você mantenha aberta para esse fim). Simples de fazer, você pode movê-lo, editá-lo, apagá-lo ou fazer o que quiser com ele.

  2. Use parte ou toda a linha de modo (que você já considerou, aparentemente).

  3. Use uma linha de cabeçalho.

  4. Use um título de quadro.

Se fosse eu, provavelmente optaria pelo # 1. (Mas eu realmente não quero / preciso de uma exibição em tempo integral das informações de status. É mais provável que eu defina um comando que me mostre as informações (mesmo um histórico / log) sob demanda).


Atualizado após seus comentários:

Você já disse, na sua pergunta, " a mensagem desaparece assim que a área de eco é usada novamente ". Por isso, parecia usar um espaço efêmero que a área de eco não atenderia às suas necessidades. Suas respostas aos comentários parecem contradizer isso.

Se você realmente deseja usar a área de eco, use minibuffer-inactive-mode-hook, como mencionado, ou use um timer para ligar messageou inserir a mensagem de tempo na área de eco de alguma outra maneira. No entanto, você já observou os problemas com isso. Esses problemas (substituição, apagamento) decorrem da natureza efêmera ( pretendida ) da área de eco .

Em suma, você deseja usar uma área destinada a mensagens efêmeras, mas não deseja que suas mensagens desapareçam assim que essa área for usada novamente.

(BTW - por favor, mencione que as informações da linha de modo são repetidas em todas as linhas de modo: isso não precisa ser o caso. Você pode tornar a linha de modo específica para um buffer em particular etc. IOW, você pode escolher uma linha de modo para sempre (ou periodicamente) mostre seu relógio ou o que for.)

Desenhou
fonte
Obrigado por suas sugestões! Primeiro, porém, eu não entendo direito, por que isso é problemático? Eu gostaria que as coisas que iriam para a área de eco atm substituíssem qualquer outro uso da área de eco, portanto, apagá-lo é bom. E as informações extras devem ser exibidas apenas quando a área de eco estiver vazia, para que não haja nada a apagar. Isso não soa como uma especificação razoável? Sobre o número 1, o problema é que não quero perder espaço na tela. A área de eco está sempre lá, mesmo quando está vazia. Listei alguns problemas com o número 2 e os números 3 e 4 compartilham muitos desses problemas.
T. Verron
Sobre o motivo pelo qual desejo exibir as informações em tempo integral, tomemos, por exemplo, o org-clockexemplo da pergunta: Quero que o cronômetro toque para baixo para me lembrar o que devo fazer e que devo fazê-lo agora , como sempre que possível.
T. Verron
"a mensagem desaparece assim que a área de eco é usada novamente" Ok, isso não estava claro. O que eu quis dizer foi que, se eu usar minibuffer-inactive-mode-hooke sair do minibuffer, a mensagem será exibida. Então, se algum outro comando imprimir algo na área de eco, essa nova mensagem será adicionada e a mensagem efêmera não retornará (porque o minibuffer não se envolveu dessa vez).
T. Verron
Sobre a modelagem, o principal problema é o pequeno espaço disponível (muitas vezes tenho muitas janelas, divididas horizontalmente, modelines muito curtas).
T. Verron
Novamente - " Em suma, você deseja usar uma área destinada a mensagens efêmeras, mas não deseja que suas mensagens desapareçam assim que a área for usada novamente. " Use um cronômetro com messageou post-command-hook, se desejar. Mas o problema essencial de desaparecer / substituir, às vezes, eleva sua cabeça, porque você está tentando usar uma área de exibição temporária para algo que não deseja que seja temporário.
Tirou