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
Comentários do Hacker News
Abaixo está um resumo dos comentários do Hacker News:
ace-window,ace-window-display-modeeframes-only-mode.windmove-modee usar `(windmove-default-keybindings 'control)`` para permitir mover-se entre janelas com Ctrl+setas.zygospore, com o qual, após fechar uma janela comC-x 1, é possível restaurar o layout anterior das janelas pressionandoC-x 1novamente.hledger-balance-sheet, manter o arquivo journal aberto à esquerda e mostrar o resultado dividido à direita em 30% do espaço.