1 pontos por GN⁺ 2024-05-13 | 1 comentários | Compartilhar no WhatsApp
  • O gerenciamento de janelas do Emacs fica sobre uma estrutura flexível em que buffers e janelas são separados, mas com operações básicas um tanto desajeitadas, então o usuário precisa combinar ferramentas e hábitos para montar seu fluxo de trabalho
  • O foco do texto não está em regras de display-buffer nem em workspaces baseados em abas, mas em operações manuais dentro de um único frame do Emacs, lidando com movimento de foco, posicionamento de buffers, divisão e remoção de janelas, e tarefas temporárias
  • other-window, windmove, winum, ace-window, o mouse, transpose-frame, window-prefix-map, other-window-prefix e winner-mode dividem entre si a navegação cíclica, navegação por direção, seleção por número, seleção por dicas, transformação de layout e restauração
  • Com ace-window e Avy, dá para escolher uma janela específica e então executar um comando, ou pular direto para uma posição no texto, reduzindo a própria necessidade de trocar de janela
  • O gerenciamento de janelas no Emacs é menos um sistema fixo e complexo e mais um problema em aberto; display-buffer-alist, Popper e Popwin, manipulação da árvore de janelas e integração com tiling WM são poderosos, mas também têm custo de configuração e várias lacunas

O que o Emacs chama de gerenciamento de janelas

  • A janela(window) no Emacs é o viewport ou painel dentro de um frame, e o buffer(buffer) é um bloco contínuo de texto que pode ou não ser o conteúdo de um arquivo
  • Muitos IDEs e editores praticamente fundem os conceitos de janela e buffer para reduzir a carga cognitiva, mas o Emacs separa os dois para permitir layouts mais flexíveis
    • Ver o mesmo arquivo duas vezes é simples
    • Buffers que não correspondem diretamente a arquivos também podem ser tratados de forma natural
    • Os indirect buffers do Emacs são quase uma cópia “ao vivo” do buffer inteiro
  • Essa estrutura separada cobra um preço dos novos usuários
    • É preciso colocar as janelas no lugar desejado dentro do frame
    • É preciso colocar o buffer desejado na janela desejada
    • No começo, a carga operacional aparece antes das vantagens trazidas por essa separação

O que este texto não cobre

  • As regras automáticas de exibição de buffers para controlar completamente o display-buffer não são o tema principal
  • Abas, workspaces, isolamento de buffers e persistência de sessão também ficam fora do escopo principal
  • Alternativas radicais que fazem o Emacs se comportar como um gerenciador de janelas separado também ficam fora do corpo principal
    • Edwina impõe um layout de tiling automático no estilo DWM com master-and-stack
    • HyControl oferece um painel de controle para ações de layout de janelas, exibição em grade uniforme e mais
  • O foco real está em operações manuais do dia a dia
    • Troca de foco entre janelas
    • Movimentação de buffers entre janelas
    • Divisão e remoção de janelas
    • Controle da janela de destino durante a execução de comandos

Navegação básica: other-window e a “próxima janela”

  • other-window é o comando básico de troca de janela ensinado no tutorial do Emacs, com atalho padrão C-x o
  • A ordem de seleção normalmente circula no sentido horário dentro do frame
    • Quando há poucas janelas, é simples e suficiente
    • Conforme o número de janelas cresce, pode ser necessário chamá-lo várias vezes até chegar ao lugar desejado
  • Há também formas práticas de ajustar isso
    • Dá para associá-lo a uma tecla mais fácil de pressionar, como M-o
    • É possível pular várias posições ou mover-se no sentido inverso usando um argumento numérico
    • Se repeat-mode estiver ativado, dá para repetir a entrada como em C-x o o o... ou M-o o o...
  • Se o parâmetro de janela no-other-window estiver definido, other-window ignora aquela janela específica
    • É por isso que janelas laterais de gerenciadores de arquivos como dired-sidebar ou dirvish-side ficam fora do alvo de other-window
  • A ideia de “próxima janela” também é o alvo padrão de comandos que atuam sobre outra janela, como scroll-other-window

Navegação por direção: windmove

  • windmove é uma biblioteca embutida para mover o foco entre janelas com base em direção
    • É mais próxima da navegação para esquerda, direita, cima e baixo que usuários de Vim esperam
    • Usuários de evil-mode também usam Windmove internamente
  • windmove-left, windmove-right, windmove-up e windmove-down podem ser associados a WASD, HJKL, setas ou outras teclas
  • Os comandos windmove-swap-states-left/right/up/down trocam os buffers das janelas com base em direção
    • Nesse caso, o foco se move junto com o buffer
  • Também é possível apagar janelas numa direção específica com a família windmove-delete-*, mas o texto trata de outros métodos mais adiante
  • Em ambientes com tiling WM, é possível integrar as teclas para navegar tanto entre janelas internas do Emacs quanto entre janelas do sistema operacional
    • Há um exemplo de integração Emacs+i3wm em i3 integration
    • Um exemplo de configuração para qtile pode ser visto em emacs-wm.el

Deixar as janelas do Emacs por conta das janelas do sistema operacional

  • frames-only-mode faz com que todos os buffers sejam abertos em novos frames, em vez de janelas do Emacs, para que o gerenciador de janelas do sistema operacional cuide deles
  • Essa abordagem coloca os buffers do Emacs no mesmo nível das janelas do sistema operacional, permitindo gerenciar ambos com as mesmas teclas
  • Ferramentas como Avy, winum, ace-window e scroll-other-window podem se aplicar não só a janelas, mas também a frames inteiros
  • Alguns comandos do Emacs presumem que podem dividir frames livremente, então podem surgir casos excepcionais
    • Isso tende a acontecer especialmente com comandos do org-mode
  • Não há experiência relatada com o uso de frames-only-mode em compositores Wayland

Seleção imediata com números e dicas

  • winum exibe números das janelas na mode line e permite selecioná-las por número
    • Se other-window é algo próximo de O(n) e windmove depende da disposição espacial, o winum oferece um acesso mais próximo de O(1) quando você sabe o número
    • Se o comando de seleção for chamado com um argumento prefixado negativo, a janela correspondente é excluída
    • Quando o minibuffer está ativo, ele sempre recebe o número 0
    • Funciona entre frames do Emacs
  • Como a tecla padrão C-x w <n> pode ser longa, há exemplos de configuração que usam M-0 até M-9 para selecionar janelas
  • ace-window é tratado como uma ferramenta poderosa para controle de janelas no Emacs via teclado
    • Exibe dicas sobre cada janela, e você a seleciona pressionando a tecla correspondente
    • Se ace-window-display-mode estiver ativado, as dicas podem ficar sempre visíveis na mode line, como no winum
    • Pressionar ? abre o menu de dispatch
  • O ponto forte do ace-window não está só na seleção simples, mas em escolher uma janela e então executar uma ação
    • Excluir janela
    • Mover e trocar janelas
    • Dividir janelas
    • Exibir um buffer específico
    • Aplicar uma ação a outra janela sem sair da janela selecionada

Mouse e transformação de layout

  • No Emacs, o mouse se encaixa naturalmente para selecionar janelas, redimensioná-las, abrir menus de contexto e usar arrastar e soltar
    • context-menu-mode e a barra de menus aumentam a descoberta de recursos
  • Se suas mãos já saíram do teclado, operar o Emacs com o mouse pode ser o caminho com menos atrito
  • Também há operações possíveis com gestos do mouse
    • Divisão vertical e horizontal do frame
    • Excluir janela
    • Alternar entre buffers dentro da janela
    • Trocar janelas para a direita ou esquerda
    • Alternar entre os dois últimos buffers em uma janela
  • Configurando mouse-autoselect-window, é possível ativar o comportamento focus-follows-mouse
  • transpose-frame fornece comandos para rotacionar ou inverter o layout de janelas do frame
    • rotate-frame, flip-frame e flop-frame são citados como comandos especialmente úteis
    • O próprio transpose-frame é avaliado como pouco útil na prática, por fazer uma transposição pela diagonal principal

window-prefix-map e a árvore de janelas

  • window-prefix-map é um conjunto de comandos de gerenciamento de janelas vinculado à tecla padrão C-x w do Emacs
  • split-root-window-right e split-root-window-below dividem a janela raiz do frame
    • Eles estão vinculados a C-x w 3 e C-x w 2, respectivamente
    • Ao contrário dos comandos de divisão normais, que fragmentam ainda mais a janela atual, eles são úteis para criar um espaço de trabalho separado
  • As janelas no Emacs são organizadas em uma estrutura de árvore
    • Janelas reais são nós folha
    • Uma divisão transforma uma folha em nó pai de duas janelas
    • Isso lembra o arranjo de gerenciadores de janelas com tiling manual, como i3 ou bspwm
  • tab-window-detach e tear-off-window movem a janela atual para uma nova aba ou um novo frame
    • As teclas padrão C-x w ^ t e C-x w ^ f são consideradas longas
    • Elas podem ser substituídas por ações de dispatch do ace-window ou por bindings do mouse

other-window-prefix: mudar onde o próximo comando vai exibir

  • other-window-prefix é um comando embutido vinculado a C-x 4 4, que faz o buffer exibido pelo próximo comando aparecer na próxima janela
  • Esse comando separa comandos que exibem buffers, como abrir arquivos, trocar de buffer ou saltar para bookmarks, da escolha da janela de destino
    • Reduz a necessidade de decorar toda vez famílias de comandos como find-file-other-window, find-file-other-tab e find-file-other-frame
    • Você pode apenas adicionar o prefixo antes de comandos básicos como find-file, find-file-read-only ou switch-to-buffer para mudar só o local de exibição
  • No exemplo com Forge, ele evita que a janela atual seja sobrescrita ao pressionar RET na lista de issues usando other-window-prefix
  • Também oferece um comportamento uniforme quando cada pacote tem sua própria forma de “abrir em outra janela”, como em Magit, Org mode, Notmuch, Elfeed e EWW
  • Há prefixos relacionados também
    • same-window-prefix força o buffer do próximo comando a aparecer na janela atual
    • other-frame-prefix faz abrir em um novo frame
    • other-tab-prefix faz abrir em uma nova aba

Salvar e restaurar configurações de janelas

  • window-configuration-to-register é o comando embutido para salvar a configuração atual das janelas em um registrador, e sua tecla padrão é C-x r w
  • jump-to-register restaura a configuração salva, e sua tecla padrão é C-x r j
  • No nível de Elisp, é possível guardar o resultado de current-window-configuration em uma variável e aplicá-lo com set-window-configuration
    • Salvar isso em disco com algo como prin1, persist ou multisession pode ser o começo de um recurso de restauração entre sessões
    • Ainda assim, o fato de a posição do cursor em cada janela também ser restaurada pode ser um comportamento normalmente indesejado
  • Também existem opções “oops” que acumulam automaticamente configurações passadas
    • winner-mode: quando não se usam abas, winner-undo e winner-redo permitem desfazer ou refazer mudanças na configuração das janelas
    • tab-bar-history-mode: fornece uma pilha de histórico separada para cada aba
    • undelete-frame-mode e tab-undo: recuperam frames ou abas fechados por engano
  • Usar winner-undo como forma de consertar toda vez que o Emacs exibe um buffer no lugar errado é mais uma gambiarra temporária
    • O problema de fundo é que as regras de exibição de buffers não estão configuradas como você quer

Otimizando para duas janelas entre as quais você alterna com frequência

  • No trabalho real, mesmo com várias janelas na tela, na maior parte do tempo você alterna com frequência entre duas janelas
    • Código & REPL
    • Código & Grep
    • Prosa & Notas
    • Lista & Item
  • As outras janelas podem ser áreas de referência que você consulta com frequência, mas quase nunca alterna para elas, como documentação, informações de depuração, logs, saída de comandos, sumário, explorador de arquivos ou pré-visualização
  • Há um exemplo de other-window-mru que usa get-mru-window para alternar para a janela usada mais recentemente
    • Não importa como a segunda janela foi escolhida — mouse, ace-window, winum ou outro método — depois disso fica fácil alternar rapidamente entre as duas
  • Também há formas de melhorar o próprio other-window
    • Fazer com que ele divida automaticamente quando só houver uma janela
    • Circular em ordem de uso recente, como em switchy-window
    • Inverter a direção sempre que a chamada não for consecutiva, como em other-window-alternating, para tornar natural a ida e volta entre duas janelas

Expandindo o ace-window com base em execução de comandos

  • ace-window permite usar separadamente só a etapa de seleção de uma janela específica por meio de aw-select
  • Se você executar a ação desejada sobre a janela retornada por aw-select, pode criar o padrão “selecionar janela → executar ação → manter a janela original”
  • Os comandos de exemplo são os seguintes
    • ace-tear-off-window: destaca em um novo frame a janela escolhida com ace-window
    • ace-tab-window-detach: move a janela escolhida para uma nova aba
  • ace-window-one-command executa um único comando arbitrário na janela selecionada
    • Primeiro, escolhe-se a janela com ace-window
    • Depois, a sequência de teclas é lida e o comando correspondente é executado
    • Assim, é possível aplicar uma ação em outra janela sem mudar a janela originalmente selecionada
  • ace-window-prefix funciona como uma versão mais direta de other-window-prefix
    • Você escolhe diretamente com ace-window a janela de destino do buffer que o próximo comando vai exibir
    • Se necessário, é possível criar uma nova janela na hora com uma ação do ace-window e exibir o buffer ali
    • O binding de tecla sugerido é C-x 4 o

É mesmo necessário alternar de janela?

  • O objetivo de alternar de janela se divide, em grande parte, em dois casos
    • Switch and stay: continuar editando ou trabalhando na janela de destino
    • Switch and return: fazer rapidamente algo como rolar, pesquisar, copiar ou apagar, e voltar à posição original
  • No primeiro caso, o Avy pode unir a alternância de janela e o movimento do cursor em uma coisa só
    • avy-goto-char-timer trata várias janelas e frames visíveis do Emacs como um único conjunto de candidatos para salto
    • Ao saltar para uma determinada string ou posição de caractere, a janela também muda automaticamente
    • Se o Avy não atravessar janelas e frames, é preciso verificar a configuração avy-all-windows
  • pop-global-mark é um meio de voltar à posição anterior e, se necessário, a alternância de janela também pode acontecer junto
    • Por padrão, ele troca o buffer na janela atual, então existe um advice para fazer com que use pop-to-buffer
  • No segundo caso, o fluxo “alternar → agir → voltar” pode ser encapsulado em um comando e automatizado
    • ace-window-one-command é uma forma genérica de fazer isso
    • Ações específicas podem virar comandos ou macros dedicados

Rolagem, busca e troca de buffer em outra janela

  • scroll-other-window e scroll-other-window-down rolam outra janela sem sair da janela atual
    • O alvo padrão é a “próxima janela” no sentido horário a partir da janela atual
    • Se houver três ou mais janelas, pode acabar rolando uma janela diferente da janela de referência esperada
  • É possível mudar a regra de escolha do alvo de rolagem configurando other-window-scroll-default
    • Com get-lru-window, a rolagem acontece na janela usada há menos tempo
    • Com get-mru-window, é possível usar como alvo a janela usada mais recentemente
  • Se other-window-scroll-buffer for definido, a janela que exibe um buffer específico pode ser escolhida como alvo da rolagem
    • Em geral, isso é tratado como uma opção mais útil para autores de pacotes
  • O exemplo de isearch-other-window inicia uma busca na janela alvo da rolagem e, ao terminar a busca, volta para a janela original
    • Há um exemplo de uso conjunto com buffers de shell e Man
  • next-buffer, previous-buffer e switch-to-buffer também podem ser estendidos para rodar em outra janela combinando argumento de prefixo com other-window-for-scrolling
    • Se você criar um keymap para repeat-mode, dá para circular ou selecionar em sequência os buffers de outra janela com n, p e b

master-mode, scroll-all-mode, with-other-window

  • master-mode define o buffer atual como “master” e outro buffer como “slave”, permitindo enviar ações ao buffer slave sem sair da posição atual
    • No geral, ele é avaliado como uma alternativa menos transparente do que a abordagem com other-window-scroll-default descrita acima
    • Com master-says, é possível criar teclas que executem ações arbitrárias, como recenter, no buffer slave
  • scroll-all-mode vincula o comportamento de rolagem de todas as janelas do frame
    • Isso é útil quando você quer visualizar várias janelas de forma sincronizada
  • A macro with-other-window é um helper de Elisp que executa o código do corpo na janela escolhida por other-window-for-scrolling
    • Ela permite criar facilmente comandos como isearch-other-window e isearch-other-window-backwards
    • Funciona como o equivalente em Elisp do interativo ace-window-one-command

Estratégias para reduzir o número de janelas

  • A UI de editores modernos em geral converge para uma janela principal, uma barra de abas no topo, uma barra lateral à esquerda com diretórios ou sumário, um painel opcional à direita e um terminal embaixo
  • Também é possível montar esse tipo de layout no Emacs, mas há a alternativa de concentrar a tela em um único buffer e substituir a troca de janela por troca de buffer
  • Se você se limitar a no máximo duas janelas, ainda dá para manter a maior parte da simplicidade e usar a segunda janela como material de referência ao vivo
    • A configuração padrão do Emacs oferece um suporte bastante bom para esse padrão por meio de comandos como scroll-other-window
  • Também existe a estratégia de tratar as janelas apenas como contêineres de texto e ignorá-las
    • Saltar diretamente para posições de texto na tela com o Avy
    • Refazer o caminho por posições anteriores com mark-ring e global-mark-ring
    • dogears pode oferecer uma UI de rastreamento mais detalhada
  • Para fixar posições manualmente, você pode usar point-to-register e jump-to-register; para um registro mais permanente, bookmark-set e bookmark-jump

Regras de exibição automática e gerenciamento de pop-ups

  • display-buffer-alist é a variável que decide como exibir um buffer ao casar buffers e regras quando código Elisp tenta mostrá-lo
  • Em teoria, grande parte do gerenciamento de janelas pode ser resolvida se você criar regras de tamanho, posição, papel e foco para cada tipo de buffer que vê no dia a dia
  • O problema é o custo de configuração
    • Predicados de buffer e de modo
    • Tipos de janela e slots
    • Funções de ação de display-buffer
    • Parâmetros de janela
    • Não é fácil expressar de forma simples intenções como “não mexa no meu layout de janelas”
  • Também há ferramentas auxiliares
    • Shackle esconde a complexidade de display-buffer-alist e fornece uma interface Elisp mais simples
    • O Doom Emacs oferece comandos de conveniência como set-popup-rule!
  • Popwin e Popper partem da observação de que nem todos os buffers são iguais
    • Eles distinguem entre buffers principais de trabalho e buffers temporários de pop-up
    • Documentação, shell, estado de tarefas, resultados de compilação, resultados de busca e mensagens podem aparecer em pequenas janelas auxiliares e ser fechados ou percorridos com facilidade
    • O Popper foca em subir e descer buffers de pop-up definidos com uma única tecla
    • O Popwin é uma implementação mais antiga e abrangente, mas também empacota sua própria configuração de display-buffer
    • Se você só quer abrir e fechar o shell rapidamente, shell-pop ou vterm-toggle podem ser suficientes

A peça que falta: manipulação da árvore de janelas

  • O Emacs representa as janelas dentro de um frame como uma árvore, mas a maioria dos comandos de usuário opera olhando apenas para a posição espacial, não para a estrutura da árvore
  • Por causa desse descompasso, ao dividir ou apagar janelas o comportamento pode sair diferente do esperado, ou podem surgir limitações na estrutura de divisões que é possível criar
  • Se existisse um pacote hipotético como window-tree, seria possível manipular nós internos diretamente
    • Dividir, transpor ou espelhar apenas parte de um frame
    • Selecionar várias janelas como uma subconfiguração
    • Enviar a parte selecionada para uma aba ou frame
    • Duplicar ou salvar subconfigurações
    • Proteger um branch específico da árvore contra comandos da família display-buffer
  • Já existem elementos de Elisp relacionados
    • window-tree retorna a própria árvore
    • frame-root-window retorna a raiz
    • window-parent, window-child e window-*-sibling
    • walk-window-tree e walk-windows permitem percorrê-la
  • As lacunas também são claras
    • Fora split/delete em geral, não há funções básicas para transformar a árvore
    • Não existe o conceito de selecionar janelas internas, então isso teria de ser simulado pela UI

A peça que faltava: integração com WM tiling

  • O modelo de árvore de janelas do Emacs é muito parecido com gerenciadores de janelas tiling manuais como i3 e bspwm
  • Se você usa Emacs dentro de i3, bspwm ou tmux, é natural querer navegar entre janelas internas e externas do Emacs com os mesmos atalhos de teclado
  • Exemplos existentes incluem o i3-integration de Pavel Korytov e o emacs-wm.el para qtile
  • Uma interface de integração mais limpa precisa dos seguintes elementos
    • O gerenciador de janelas deve identificar a classe da janela ativa e fornecer movimentação e manipulação de janelas de forma programática
    • O método de comunicação pode ser por comandos shell, sockets, IPC baseado em servidor, D-Bus no Linux etc.
    • No lado do Emacs, é necessária uma interface independente do método de comunicação que imite manipulações no estilo de gerenciador de janelas
    • Ao alternar entre janelas do sistema operacional, verifica-se se a janela ativa é o Emacs e, se necessário, o Emacs processa a operação dentro do frame interno

Conclusão

  • O gerenciamento de janelas no Emacs oferece opções em várias camadas, de other-window a ace-window, Avy, Popper e display-buffer-alist
  • Não é necessário usar todos os métodos; como há muitos meios alternativos para resolver o mesmo problema, você pode escolher um e ignorar o restante
  • As ferramentas nativas básicas provavelmente serão mantidas por muito tempo, mas o estado de pacotes de terceiros pode variar conforme desenvolvimento, abandono ou orfandade
  • O gerenciamento de janelas do Emacs está mais próximo de uma estrutura aberta que fornece ingredientes e receitas do que de um sistema fixo e complexo
  • Mesmo com pouca configuração já dá para ter a refeição básica, e com algumas combinações e ajustes em Elisp é possível criar um fluxo de trabalho muito mais personalizado

1 comentários

 
GN⁺ 2024-05-13
Opiniões no Hacker News
  • O texto é bom, e as explicações e diretrizes também são excelentes. Às vezes, janelas divididas igualmente não bastam; por isso coloquei a função abaixo no init.el e a vinculei a C-x 7 para ajustar a janela atual e a janela pareada verticalmente em 70%/30%
    A direção horizontal também é tratada da mesma forma com um atalho em C-x 8

    (defun partial-size-window ()
    "Set the two split windows to 70% and 30% vertically."
    (interactive)
    (let ((size (- (truncate (* .70 (frame-height))) (window-height))))
    (if (> size 0)
    (enlarge-window size))))

    (defun partial-size-window-h ()
    "Set the two split windows to 70% and 30% horizontally."
    (interactive)
    (let ((size (- (truncate (* .70 (frame-width))) (window-width))))
    (if (> size 0)
    (enlarge-window-horizontally size))))

    • golden-ratio também pode ser usado para esse fim
  • Foi uma boa exploração. Estou no celular agora, então não posso testar de imediato, mas quero muito experimentar ace-window, ace-window-display-mode e frames-only-mode
    Para ser sincero, mesmo usando Emacs há uns 40 anos, em geral fiquei basicamente em next-window, criar uma nova janela abaixo ou ao lado e depender do tmux ao trabalhar em servidores remotos

    • Comigo é parecido. Por 30 anos, praticamente usei só C-x 1/2/3 e C-x o
      Ainda assim, na verdade isso é bem poderoso e suficiente para o meu uso; sinto que vários gerenciadores de janelas em mosaico bem que poderiam ser só nesse nível
    • Comigo também é parecido. C-x o é um pouco incômodo, então deixei a configuração abaixo, mas não sinto que esses pacotes adicionais sejam realmente necessários
      (global-set-key (kbd "M-o") #'other-window)
      Mesmo assim, é ótimo ter um texto de referência tão aprofundado, e os textos do Karthik são sempre didáticos e interessantes
  • Somando à observação do Karthink sobre windmove-mode, é possível configurar windmove-default-keybindings para se mover entre janelas com Ctrl-<teclas de direção>
    (windmove-default-keybindings 'control)
    Também coloquei isso na minha configuração e incluí em um starter kit minimalista; é realmente um divisor de águas
    https://codeberg.org/ashton314/emacs-bedrock

    • Conferi meu .emacs e vi que uso exatamente a mesma coisa. Prefiro porque exige uma tecla a menos que C-x O e é mais flexível
  • Configurei o Emacs para não dividir frames em várias janelas. É parecido com a forma como um navegador web não divide uma janela do navegador em vários viewports
    Meu Emacs também não cria um segundo frame. O método de implementação mudou de ano para ano, conforme a forma antiga deixou de funcionar
    No método atual, em certas situações o frame é dividido, por exemplo quando o Emacs mostra o buffer *Completions*, mas, pelo que me lembro, nunca precisei chamar delete-window manualmente para eliminar a segunda janela; ela sempre desapareceu sozinha

    • Navegadores web também podem de fato dividir a janela dessa forma, se forem navegadores como o Vivaldi, que permitem ver várias páginas ao mesmo tempo
    • Fico curioso se impedir que frames sejam divididos em várias janelas tinha o objetivo de resolver algum problema específico
      Eu uso bastante frames com várias janelas. No macOS recente e com Emacs recente, às vezes um frame com várias janelas parece travar, sem responder ao teclado ou ao trackpad, e nem várias pressões de Ctrl-G resolvem
      Mas criar um novo frame com C-x 5 2 funciona, e então eu conseguia voltar ao frame travado e fechá-lo com C-x 5 0
  • O texto é muito aprofundado, e gostei muito do fato de o autor ter dedicado tempo a desenhar bons diagramas

  • É um bom texto, e quero compartilhar um excelente pacote para usar junto. Para mim, zygospore foi uma ferramenta indispensável
    “zygospore permite desfazer C-x 1 (delete-other-window) pressionando C-x 1 de novo”
    https://github.com/LouisKottmann/zygospore.el

    • Para refazer ou desfazer todas as mudanças na configuração das janelas, vale dar uma olhada no winner mode
      https://www.emacswiki.org/emacs/WinnerMode
    • Idealmente, não deveria ser undo?
      Seria meio estranho, mas C-u C-x 1 parece coerente
  • Se o autor vir isto, quero dizer que fiquei contente com a breve menção ao Acme editor

  • Ao chamar hledger-balance-sheet, quero que ele abra à direita com 30% de largura, sem substituir o .hledger.journal existente
    Gostaria que o .hledger.journal continuasse aberto à esquerda e permanecesse selecionado