Exibir lista de palavras na parte inferior do quadro?

20

Gostaria de exibir 3 listas de palavras em linhas separadas horizontalmente ao longo da parte inferior (embora a parte superior também funcione) de todos os quadros do emacs que eu abrir. Eu pensei em 6 maneiras de fazer isso, e todos eles têm problemas:

  1. Meu primeiro pensamento foi adicionar uma linha à minha linha de modo, mas AFAICT você não pode usar o caractere de nova linha em uma linha de modo, apenas é convertido em "^ J".

  2. Meu segundo pensamento foi ter a linha na parte superior da tela e usar a linha de cabeçalho, mas também não suporta o caractere de nova linha.

  3. Eu poderia exibir uma sobreposição nas últimas 3 linhas da janela, mas, para tornar isso robusto, parece difícil - a rolagem precisaria ser acionada quando o ponto atingisse a sobreposição e não o final real da janela, e eu teria que reposicionar constantemente a sobreposição, pois as sobreposições estão no espaço de texto e não na janela.

  4. Eu poderia tentar criar janelas dedicadas na parte inferior do quadro. Eu tentei codificar isso, mas também não é muito robusto, parece não funcionar corretamente quando um quadro já contém janelas divididas e eu tive que religar o Cx, 1 para uma versão personalizada do delete-other-windows que ignora minhas janelas especiais e tenho certeza de que existem outros casos de canto. Além disso, quando uma janela de ajuda se abre agora, ela se abre verticalmente porque acha que já existe uma divisão horizontal (o que tecnicamente existe, mas é apenas para exibir uma janela de uma linha).

  5. Eu poderia ter um quadro dedicado para isso, mas minha configuração não funcionará no modo terminal, e eu teria que criar um script para o meu gerenciador de janelas para mantê-lo na parte inferior da tela, tornando-o não selecionável, sem afetar o layout, etc etc.

  6. Eu poderia inserir o texto para as 3 linhas diretamente no minibuffer. Eu consegui isso parcialmente trabalhando, posso aumentar o minibuffer para acomodar as 3 linhas e posso exibi-las. No entanto, sempre que uma mensagem é repetida, as linhas desaparecem até que eu emita outro comando, no qual elas reaparecem. Idealmente, as 3 linhas e a área de eco não se sobrepunham para que eu pudesse ver as duas. Isso seria menos irritante se eu pudesse filtrar com segurança quais mensagens vão para a área de eco - encontrei uma solução no EmacsWiki, mas ela não parece funcionar para mensagens originadas na fonte C do emacs (especificamente, eu gostaria de receber livrar-me das mensagens de salvamento de arquivos porque eu sempre salvei automaticamente em um timer).

Para contextualizar, meu objetivo é exibir constantemente as palavras mais usadas no buffer atual, as palavras mais próximas do buffer atual e as palavras usadas mais recentemente no buffer atual. Pretendo inseri-los no buffer por meio de comandos de voz. Então, eu poderia dizer "mais próximo de 2" e pedir para ele escolher o segundo item da lista de palavras mais próximo e inseri-lo. Eu só me importo com o fato de as listas de palavras serem visíveis para qualquer buffer que estou editando no momento. Não quero usar as janelas pop-up usadas pelos vários modos de conclusão de código porque preciso das listas sempre visíveis.

Joseph Garvin
fonte
Boa pergunta e bem colocada. Espero que você obtenha algumas sugestões úteis.
Drew
Gostaria de saber sobre as outras partes do # 5, além da necessidade do modo terminal (que é importante). Você pode usar um quadro dedicado que está posicionado na parte inferior (sem problemas). O que você quer dizer com não selecionável e por que você precisa disso? Se você quer dizer somente leitura, isso também não é problema. O que você quer dizer com não afeta o layout ? Em resumo, o número 5 não está muito claro para mim.
Desenhou
@ Drew: quero dizer que eu dirijo meu WM usando o teclado, e é improvável que eu queira focar esse quadro de propósito, então gostaria que minhas ligações da janela seguinte / anterior passassem por cima dele. Da mesma forma, eu gostaria que os layouts de janela agissem como se esse quadro fosse apenas parte de um painel / barra de tarefas. Edit: em todo lugar neste comentário eu disse 'window' quero dizer janela X, não janela emacs; p
Joseph Garvin
Uma outra possibilidade sugerida para mim é apenas usar o minibuffer. Eu não tenho idéia se é possível texto do visor passivamente lá sem ele interferir com tudo o resto tentando usá-lo embora ...
Joseph Garvin
Adicionada uma observação sobre como tentar usar o minibuffer.
Joseph Garvin

Respostas:

8

Com muita experimentação hacky, consegui obter o número 6 (usando o texto minibuffer) para um estado de funcionamento "bom o suficiente". Aqui está uma captura de tela:

Captura de tela do cinto em ação

Existem várias partes principais para fazer isso funcionar:

  • A inserção de texto no minibuffer surpreendentemente quase faz a coisa certa imediatamente. O texto inserido lá será exibido.
  • Fazendo com que o texto seja a 'sequência posterior de uma sobreposição em vez de texto normal, você o torna não selecionável e não precisa se preocupar com o cursor que acidentalmente entra nele.
  • Para que os comandos de solicitação do minibuffer funcionem corretamente, é necessário inibir a inserção do texto / sobreposição quando a janela do minibuffer estiver ativa.
  • Se você tentar redimensionar o minibuffer com funções normais de redimensionamento de janelas, obterá erros sobre o tamanho das janelas, se você usar a função md-resize-minibuf não documentada, poderá redimensionar para o número exato de linhas que desejar, desde que definimos redimensionar mini-janelas como zero primeiro.
  • Para resolver as listas que desaparecem sempre que houver uma mensagem, é necessário aconselhar a função de mensagem para interceptar mensagens. Em seguida, você mesmo os inserirá no minibuffer. Você também deve observar a variável de mensagem atual, que armazena o que foi mostrado na área de eco (surpreendentemente, a área de eco e o minibuffer são tecnicamente distintos e algumas funções do código fonte C são impressas diretamente na área de eco sem passar pela mensagem função). O código que forneço abaixo para isso é imperfeito, as mensagens persistem por mais tempo do que normalmente, o que eu ainda preciso investigar (verificar a última entrada em * Mensagens * pode ser mais simples e mais robusta), mas isso é 'bom o suficiente' por enquanto.

Aqui está um link para minha implementação com um exemplo de cinto exibindo o anel de morte. Eventualmente, isso fará parte de um projeto adequado: https://gist.github.com/jgarvin/ce37d08654978fd7e4c9

Esta é a primeira vez que escrevo qualquer quantidade significativa de elisp, de modo que a qualidade é provavelmente inferior, mas funciona.

Joseph Garvin
fonte
1

Infelizmente, nem a linha de modo nem a linha de cabeçalho podem ter várias linhas. Eu perguntei sobre isso antes e existe (pelo menos não havia) nenhuma opção oculta para fazer isso funcionar. Então 1 e 2 estão fora. Também sinto que 3 e 6 são hacks que não farão você feliz a longo prazo. 3 e 4 parecem boas abordagens, mas fazê-las funcionar de maneira confiável será um investimento e tanto.

Por isso, recomendo que você o inicie no emacs-devel . Na minha experiência, as coisas serão implementadas eventualmente se você se preocupar em explicar cuidadosamente o que deseja e por que isso é uma coisa boa. Pode levar algum tempo, pelo menos até a próxima versão, mas se você estiver bem esperando um pouco ou usando a versão de desenvolvimento, poderá obter exatamente o que deseja, com muito menos esforço.

tarso
fonte
Obrigado pela sugestão para entrar em contato com emacs-devel. Embora eu tenha encontrado uma solução, ela é bastante hacky e seria bom ter uma API real para desenhar diretamente as coordenadas da tela; portanto, quando tiver tempo, provavelmente dispararei um e-mail à sua maneira.
Joseph Garvin