1 pontos por GN⁺ 2024-05-13 | 1 comentários | Compartilhar no WhatsApp

Visão geral da gestão de janelas no Emacs

A reputação e o potencial da gestão de janelas

  • A gestão de janelas do Emacs não tem uma boa reputação
  • Isso se deve em grande parte ao resultado de combinar um sistema de layout muito flexível e granular com controles brutos
  • Isso deixa espaço para criar e usar ferramentas que ofereçam metáforas e affordances melhores para lidar com janelas

Opções básicas de gestão de janelas

other-window e a "próxima janela"

  • other-window (C-x o) oferece a experiência básica de alternância entre janelas
  • Isso é ensinado no tutorial do Emacs e funciona bem quando há poucas janelas
  • A seleção de janelas percorre o frame inteiro em sentido aproximadamente horário

windmove

  • windmove é uma biblioteca interna do Emacs para mover o foco entre janelas conforme a direção e mover buffers entre janelas
  • É um recurso esperado por usuários de Vim, e usuários de evil-mode já estão usando Windmove
  • Usa-se windmove-left, -right, -up, -down vinculando-os a teclas associadas à direção

frames-only-mode

  • frames-only-mode permite delegar ao SO o tratamento de janelas no Emacs
  • Se todos os buffers forem abertos em novos frames, isso passa a ser trabalho do gerenciador de janelas
  • Isso faz com que os buffers do Emacs se tornem equivalentes às janelas do SO, podendo ser gerenciados com as mesmas teclas

winum-mode

  • Winum é a evolução natural do esforço para alternar entre n janelas, de O(n) (other-window) para O(√n) (windmove) e depois para O(1)
  • Adiciona números de janela à mode line, permitindo selecionar janelas pelo número
  • Quando o minibuffer está ativo, ele sempre recebe o número 0

ace-window

  • ace-window é o estado da arte do controle de janelas do Emacs via teclado
  • Ele coloca "dicas" no topo de cada janela, e ao digitar a tecla correspondente o foco muda para aquela janela
  • O usuário "seleciona" a janela de uma forma geral e depois decide o que fazer com ela
  • Além das operações fornecidas, como apagar, mover ou trocar janelas, dividir e exibir buffers, também é possível adicionar ações personalizadas

Uso do mouse

  • As vantagens de usar o mouse para gerir janelas são imediatas e óbvias
  • Selecionar janelas é uma extensão natural do uso básico do mouse, e redimensioná-las é simples
  • Menus de contexto e suporte a arrastar e soltar são muito intuitivos
  • Para mitigar as desvantagens, quando você já está usando o mouse para outras tarefas, operar o Emacs com o mouse é de fato o caminho de menor resistência

transpose-frame (rotacionar, inverter e espelhar)

  • transpose-frame fornece comandos para rotacionar ou espelhar o layout de janelas em um frame
  • Usa-se rotate-frame, flip-frame, flop-frame vinculando-os a teclas apropriadas com frequência

window-prefix-map

  • window-prefix-map vem vinculado por padrão a C-x w e reúne alguns comandos úteis de gestão de janelas
  • split-root-window-right e split-root-window-below dividem a janela raiz do frame
  • tab-detach e tear-off-window são comandos práticos para mover uma janela para uma nova aba ou um novo frame

other-window-prefix

  • other-window-prefix oferece uma forma de separar a seleção de janelas da exibição de buffers e resolve três incômodos relacionados a janelas
  • Muitos comandos do Emacs acoplam fortemente a operação principal, o buffer e a janela. Com other-window-prefix, é possível exibir o buffer do comando em outra janela
  • Com other-window-prefix, também é possível escolher a janela ao ativar objetos como links
  • Com other-window-prefix, é possível abrir objetos de "link" de forma uniforme, sem precisar adaptar ou personalizar o comportamento de cada pacote

Salvar e restaurar configurações de janelas

  • window-configuration-to-register é uma ferramenta meio bruta, mas perfeita como um grande botão vermelho de reset
  • A qualquer momento, você pode usar esse comando para salvar a configuração atual de janelas em um registrador e depois restaurá-la com jump-to-register
  • Com winner-mode, você pode pedir ao Emacs que mantenha uma pilha de arranjos de janelas anteriores

Exploração aprofundada

Como ir e voltar

  • Independentemente de quantas janelas existam ao mesmo tempo, na maioria dos casos basta alternar entre duas janelas
  • É possível usar o comando other-window-mru para alternar entre pares de janelas

Melhorando other-window

  • É possível fazer com que other-window divida o frame quando houver apenas uma janela
  • Também é possível fazer com que ele percorra janelas em ordem de uso mais recente em vez de ordem espacial (pacote switchy-window)
  • Também é possível inverter a direção da troca de janela a cada chamada, permitindo alternar naturalmente entre duas janelas

Usando magia de janelas com o despacho do ace-window

  • ace-window faz para janelas o que completing-read faz para listas de strings
  • aw-select é ideal para os dois primeiros passos de chamar qualquer operação em qualquer janela: filtragem e seleção
  • ace-window-one-command permite selecionar uma janela com ace-window e então executar qualquer comando simples naquela janela
  • ace-window-prefix funciona de modo semelhante a other-window-prefix, mas permite escolher explicitamente a janela em que o buffer do próximo comando será exibido

Será que é preciso alternar janelas?

  • A navegação independente de janelas com Avy é um caso especial de uma ideia mais geral
  • Como contêineres de texto, janelas podem ser uma abstração desnecessária
  • mark-ring e global-mark-ring rastreiam posições visitadas, permitindo navegar por elas em várias janelas quando necessário
  • Com point-to-register e jump-to-register, é possível fixar manualmente posições para visitar depois
  • Criar e navegar por bookmarks oferece muitas opções para percorrer janelas inteiras por posições significativas definidas pelo Emacs ou pelo usuário

Lidar com janelas sem interagir com elas

  • display-buffer-alist e o comportamento automático de janelas podem resolver o problema das janelas estilo "whack-a-mole"
  • Se você definir regras para todos os tipos de buffer que vê diariamente no Emacs, a maior parte da gestão de janelas fica resolvida
  • O problema de display-buffer-alist não é que ele não funcione, e sim que exige muito trabalho
  • O pacote Shackle encobre as esquisitices de display-buffer-alist e fornece uma interface elisp simplificada para especificar regras de janelas
  • Distribuições de Emacs normalmente oferecem interfaces simples para definir esse tipo de configuração

Popper, Popwin, shell-pop e vterm-toggle

  • Popwin e Popper partem da observação de que nem todos os buffers são criados da mesma forma
  • Com esses pacotes, é possível definir buffers popup que usam janelas auxiliares e chamar ou dispensar essas janelas conforme necessário

O que está faltando

window-tree

  • Existe uma diferença fundamental entre a forma como o Emacs representa janelas e a forma como as abordagens discutidas acima as manipulam
  • As janelas de um frame são organizadas em uma árvore; os nós folha são as janelas "reais" e o restante são janelas "internas"
  • Adicionar comandos para trabalhar com a árvore de janelas abriria muitas novas possibilidades

Integrador com gerenciadores de janelas em mosaico

  • O modelo de árvore de janelas do Emacs é quase idêntico ao modelo de gerenciadores de janelas em mosaico manuais como i3 ou bspwm
  • Surge naturalmente a dúvida sobre por que usar outro gerenciador de janelas em mosaico dentro de um gerenciador de janelas em mosaico
  • Fornecer no Emacs uma interface mais limpa e unificada para integração com todos os gerenciadores de janelas poderia tornar isso muito mais fácil

Perspectiva

  • Existem várias formas de alternar, mover, pular, criar, apagar e manipular janelas, vários modos de controlar a exibição de janelas em tempo real ao chamar comandos, formas de trabalhar dentro das janelas e formas de não pensar nelas de jeito nenhum
  • A gestão de janelas é menos complexa do que aberta
  • O Emacs fornece os ingredientes e alguma orientação, e os ingredientes por si só podem ser usados como refeição básica
  • Mas, com um pouco de preparo, podemos fazer algo delicioso

Opinião do GN⁺

  • A gestão de janelas é um dos maiores pontos fracos do Emacs e não é amigável ao usuário. Especialmente para iniciantes, pode ser confusa.
  • Os métodos apresentados podem aliviar os problemas de gestão de janelas no Emacs, mas não são uma solução fundamental. É necessário um sistema de gestão de janelas mais intuitivo e fácil de usar.
  • A gestão de janelas do Emacs é muito flexível

1 comentários

 
GN⁺ 2024-05-13
Comentários do Hacker News

Abaixo está um resumo dos comentários do Hacker News:

  • Apresenta uma forma de ajustar duas janelas para tamanhos de 70% e 30% por meio de uma função Elisp personalizada. O código Lisp também é fornecido.
  • Sugere experimentar pacotes como ace-window, ace-window-display-mode e frames-only-mode.
  • Há também a opinião de usar o Emacs no modo de janela única e, mesmo quando várias janelas forem criadas inevitavelmente, fazê-las fechar automaticamente.
  • É dada a dica de ativar windmove-mode e usar `(windmove-default-keybindings 'control)`` para permitir mover-se entre janelas com Ctrl+setas.
  • Apresenta o pacote zygospore, com o qual, após fechar uma janela com C-x 1, é possível restaurar o layout anterior das janelas pressionando C-x 1 novamente.
  • Há também um comentário elogiando a menção ao editor Acme.
  • Há uma pergunta sobre como, ao executar a função hledger-balance-sheet, manter o arquivo journal aberto à esquerda e mostrar o resultado dividido à direita em 30% do espaço.