1 pontos por GN⁺ 13 시간 전 | 1 comentários | Compartilhar no WhatsApp
  • O Emacs 31 ainda não foi lançado oficialmente, mas mudanças perceptíveis já vêm se acumulando nos branches emacs-31 e master, e várias configurações estão migrando para uma direção em que podem ser resolvidas sem pacotes externos, apenas com o core do Emacs
  • Com a troca automática para Tree-sitter e a instalação de gramáticas, diminui a carga de manter manualmente major modes e fontes de gramática
  • markdown-ts-mode, renderização de documentação no Eglot, eldoc-help-at-pt, completion eager e xref-edit-mode reforçam o fluxo de edição, navegação e consulta de documentação com foco em recursos nativos
  • Pequenas opções como janela lateral do Speedbar, ocultação automática no VC, condição de logs do ERC, kill-region-dwim, ielm-history-file-name e native-comp-async-on-battery-power reduzem atritos repetitivos
  • Os nomes dos recursos e valores padrão do Emacs 31 ainda podem mudar, e markdown-ts-mode e a renderização de documentação do Eglot que o utiliza são explicitamente marcados como experimentais e precisam ser ativados manualmente

Premissas desta prévia do Emacs 31

  • O Emacs 31 ainda não foi lançado, e o ambiente de referência consiste em compilar e usar os branches emacs-31 e master em meados de 2026
  • Os itens apresentados são mudanças que realmente entraram na configuração do dia a dia, e a maioria já entrou no core do Emacs ou está muito perto disso
  • Os nomes dos recursos e os valores padrão podem mudar até o lançamento final
  • Os exemplos de configuração podem ser vistos em init.el do Emacs Solo, marcados com o comentário ; EMACS-31

Menos configuração de Tree-sitter

  • No Emacs 31, duas opções simplificam o fluxo de troca para modos baseados em Tree-sitter e de instalação de gramáticas
    • treesit-enabled-modes t
    • treesit-auto-install-grammar t
  • Se treesit-enabled-modes estiver como t, os major modes que tiverem variante Tree-sitter passam a usar essa variante
  • treesit-auto-install-grammar não apenas acusa erro quando falta uma gramática: o Emacs sugere buscar e compilar a gramática
  • Como as fontes de gramática para linguagens como TypeScript, TSX, Rust, TOML, YAML e Dockerfile passam a vir dentro dos próprios modos, dá para reduzir a configuração manual de URLs e caminhos em treesit-language-source-alist
  • É preciso tomar cuidado ao usar um diretório compartilhado do Emacs entre várias arquiteturas
    • As gramáticas instaladas automaticamente não são separadas por arquitetura
    • O .so para x86_64 e o .so para arm64 podem ficar sob o mesmo nome, e um binário compilado em uma máquina pode não ser carregado em outra

markdown-ts-mode embutido

  • O Emacs 31 inclui o markdown-ts-mode, ainda experimental
  • Esse modo começou a partir de uma proposta enviada ao emacs-devel no início de 2025, e depois Stéphane Marks entrou como coautor para continuar os aprimoramentos
  • Ele trata Markdown não só como alvo de realce de sintaxe, mas como um ambiente de edição mais confortável para escrever e ler
    • Oferece navegação por headings, folding e movimentação estrutural familiares para usuários de Org
    • Blocos de código fenced não são apenas texto monoespaçado plano: recebem font-locking com o major mode real daquela linguagem
    • Blocos de Emacs Lisp e outros modos embutidos também podem receber realce de sintaxe real
    • Comandos de edição de blocos de código já funcionam em boa parte, embora a completion dentro dos blocos ainda tenha pontos ásperos
    • Links de imagem são renderizados inline dentro do buffer
  • Ele ainda não está ligado ao auto-mode-alist, então não assume arquivos .md automaticamente
    • É possível carregar a biblioteca com M-x load-library RET markdown-ts-mode e ativá-la no buffer
    • Também dá para adicioná-lo manualmente ao auto-mode-alist
  • Feedback pode ser enviado pela bug list com M-x report-emacs-bug
  • Há mais capturas de tela no demo do markdown-ts-mode-lab

Melhorias em Eglot, Eldoc e completion

  • No Emacs 31, o Eglot pode renderizar documentação LSP com markdown-ts-view-mode
    • eglot-documentation-renderer 'markdown-ts-view-mode
    • Dá para ver hover docs formatadas sem pacotes externos
    • Como isso depende de markdown-ts-mode, o recurso também é experimental
  • eglot-code-action-indications permite desligar as novas dicas inline de code action
    • Em alguns language servers, essas dicas podem parecer barulhentas
  • eglot-events-buffer-size está sendo substituído por eglot-events-buffer-config
  • eldoc-help-at-pt t mostra a ajuda do item sob o cursor sem precisar invocar algo separadamente
    • Em conjunto com eldoc-echo-area-prefer-doc-buffer, isso aumenta a orientação ao explorar código desconhecido
  • Novas configurações de completion atualizam a interface de forma mais agressiva enquanto você digita
    • completion-eager-update t
    • completion-eager-display 'auto
    • minibuffer-visible-completions 'up-down
  • completion-eager-update e completion-eager-display atualizam a UI de completion de acordo com a entrada mesmo antes de o usuário solicitar
  • Ao definir minibuffer-visible-completions como 'up-down, dá para navegar entre os candidatos visíveis com as teclas de seta
  • O icomplete inclui o patch bug#75784, que adiciona comportamento vertical no buffer e um indicador de prefixo
    • icomplete-vertical-in-buffer-adjust-list
    • icomplete-vertical-render-prefix-indicator

Layout de janelas e Speedbar

  • O Emacs 31 adiciona comandos para mudar o layout sem precisar dividir e fechar janelas manualmente
    • window-layout-transpose
    • window-layout-rotate-clockwise
    • window-layout-flip-leftright
    • window-layout-flip-topdown
  • transpose troca arranjos horizontal e vertical, rotate gira o layout inteiro, e os comandos flip espelham para esquerda/direita ou cima/baixo
  • Isso é útil quando você quer mudar apenas a posição das janelas de edição em uma configuração com três janelas, mantendo os buffers
  • No Emacs 31, o Speedbar pode ficar em uma janela lateral em vez de um frame separado
    • speedbar-window-default-width
    • speedbar-window-max-width
    • speedbar-window
  • speedbar-window acopla o Speedbar ao lado, como uma árvore de arquivos mais moderna
  • Em ambientes com tiling ou em notebooks com um único monitor, a janela lateral se encaixa melhor do que o frame flutuante antigo

VC e xref editável

  • O VC recebe configurações que reduzem atrito no fluxo cotidiano de versionamento
    • vc-auto-revert-mode t
    • vc-allow-rewriting-published-history t
    • vc-dir-auto-hide-up-to-date 'revert
  • vc-dir-auto-hide-up-to-date oculta automaticamente arquivos atualizados ao recarregar o buffer vc-dir
    • Isso permite apagar hacks de tecla que antes chamavam vc-dir-hide-up-to-date depois de vc-dir-refresh
  • vc-allow-rewriting-published-history se encaixa em fluxos como Jujutsu ou force-push de feature branches, onde o histórico já publicado é reescrito de propósito
  • O Emacs 31 inclui um buffer xref editável
    • Antes, o buffer xref só tinha xref-query-replace-in-results no r, e isso ficava limitado a substituições baseadas em regex
    • Diferentemente do wdired-mode do Dired ou do grep-edit-mode em buffers grep, não havia um fluxo de editar diretamente o buffer de resultados no xref
  • A proposta inicial era usar xref-export-to-grep para exportar os resultados de xref para um buffer grep-mode no formato file:line:content e editar ali
  • O mantenedor do xref, Dmitry Gutov, propôs edição inline no próprio buffer xref em vez de uma interface desviando para buffer grep, e depois disso o xref-edit-mode foi implementado
  • xref-edit-mode elimina a ida a buffers extras e funciona mais rápido mesmo em buffers xref grandes
  • O fluxo de uso é buscar com C-x p g, iniciar o modo de edição com e no buffer *xref* e, após editar, confirmar com C-c C-c
  • A discussão relacionada está pública em bug#80616

ERC e pequenas melhorias de qualidade

  • No ERC, erc-log-insert-log-on-open 'erc-log-new-target-buffer-p faz com que logs anteriores sejam inseridos apenas ao abrir um novo target buffer
  • No Emacs 31, o módulo scrolltobottom do ERC não depende mais de erc-fill-wrap, então é possível remover configurações condicionais usadas para versões anteriores
  • Pequenos valores de configuração também ajudam na usabilidade
    • delete-pair-push-mark t: faz push da mark após delete-pair, permitindo selecionar o interior com C-x C-x
    • ibuffer-human-readable-size t: mostra KB/MB em vez de bytes crus
    • ielm-history-file-name: preserva o histórico de entrada do IELM após reiniciar
    • kill-region-dwim 'emacs-word: quando não há região ativa, C-w mata a palavra seguinte em vez de gerar erro
    • native-comp-async-on-battery-power nil: interrompe a compilação nativa em segundo plano quando estiver na bateria
    • view-lossage-auto-refresh t: faz C-h l atualizar as teclas pressionadas recentes em tempo real
    • display-fill-column-indicator-warning nil
    • dired-hide-details-hide-absolute-location t: oculta o caminho absoluto do diretório em dired-hide-details-mode
    • world-clock-sort-order "%FT%T": ajusta a ordenação do world clock
    • zone-all-frames t
    • zone-all-windows-in-frame t
    • uniquify-after-kill-buffer-flag t: o nome mudou da variante anterior com -p
  • kill-region-dwim evita o erro “the mark is not active” no C-w
  • view-lossage-auto-refresh é útil para mostrar teclas em tempo real durante compartilhamento de tela ou ensino
  • native-comp-async-on-battery-power nil reduz situações em que o ventilador dispara por causa de compilação em segundo plano enquanto você está em movimento sem estar ligado na tomada
  • tty-tip-mode oferece tooltips mesmo no Emacs executado com -nw

term, temas Modus e por que usar master

  • O Emacs 31 corrige em term e ansi-term problemas de linhas engolidas ou tela corrompida
    • Programas como htop, nethack e outros baseados em curses, que usam endereçamento de cursor e redraw de tela inteira, passam a redesenhar corretamente dentro do terminal do Emacs
    • Isso elimina mais um motivo para abrir um emulador de terminal externo
  • O Emacs passa a incluir os temas Modus 5 de Protesilaos
    • modus-operandi-deuteranopia: tema com fundo branco otimizado para deuteranopia
    • modus-operandi: tema de alta legibilidade com fundo branco
    • modus-operandi-tinted: tema de alta legibilidade com fundo ocre claro
    • modus-operandi-tritanopia: tema com fundo branco otimizado para tritanopia
    • modus-vivendi-deuteranopia: tema com fundo preto otimizado para deuteranopia
    • modus-vivendi: tema de alta legibilidade com fundo preto
    • modus-vivendi-tinted: tema de alta legibilidade com fundo de céu noturno
    • modus-vivendi-tritanopia: tema com fundo preto otimizado para tritanopia
  • O motivo para usar diariamente um Emacs ainda não lançado é ver de perto o que está entrando no core e acompanhar, a cada release, a redução da quantidade de glue code feito à mão
  • Como texto complementar sobre recursos que já entraram, vale ler Even More Batteries Included with Emacs

1 comentários

 
Opiniões no Lobste.rs
  • Estou realmente ansioso pelas mudanças no tree-sitter. Sempre achei o processo de configuração meio estranho
    também tenho curiosidade sobre o eager complete. icomplete e fido-mode chegam bem perto do que eu quero, mas ainda não são tão confortáveis de usar quanto pacotes de terceiros como corfu

    • Seria ótimo se um dia desse para ter uma experiência mais próxima de vertico etc. só com recursos nativos, e ainda por cima ativados por padrão
      Com alguns ajustes e só habilitando recursos embutidos, a usabilidade já muda bastante; bedrock e emacs-solo são configurados mais ou menos assim
    • Uso o Emacs 32 no dia a dia, e não dá para dizer que treesit simplesmente funciona
      Toda vez que inicio o Emacs aparece uma mensagem enorme sobre uma dylib ausente
  • A sintaxe dos exemplos (treesit-auto-install-grammar t) e (treesit-enabled-modes t) parece chamada de função, mas na verdade são opções que precisam ser configuradas
    Também há pequenas mudanças na próxima release de que gostei: minibuffer-nonselected-mode vem ativado por padrão, então fica mais fácil ver se há trabalho inacabado no minibuffer, e diff-mode com diff-delete-other-hunks é muito útil junto do comportamento de VC no buffer de diff introduzido no Emacs 29
    with-work-buffer é parecido com with-temp-buffer, mas reutiliza o pool de buffers. Descobri isso por acaso na minha configuração pessoal, quando usei a mesma convenção de nome de buffer *work*
    O Emacs 31 inclui lua-mode, então não é mais preciso instalar à parte
    Também precisei de alguns ajustes para voltar a funcionar exatamente do jeito que eu queria: xterm-mouse-mode vem ativado por padrão, então desativei explicitamente, e a face de mode-line muda para combinar com temas escuros, mas eu estava acostumado com as cores padrão antigas e reverti isso
    O Emacs 31 avisa quando arquivos-fonte não têm o cookie lexical-binding. Se isso incomodar, dá para desativar, corrigir facilmente com o comando elisp-enable-lexical-binding, e também tornar lexical-binding o padrão global
    Se não aparecerem bugs novos, parece que será, como sempre, uma release sólida

    • Esse exemplo provavelmente foi copiado da lista :custom do use-package
      Por isso tenho uma sensação meio ambígua sobre :custom. É mais trabalhoso quando quero testar ou compartilhar valores
    • with-work-buffer é para desempenho? A documentação não explica por que usar isso no lugar de with-temp-buffer, só diz que é preciso ter mais cuidado
    • Queria saber como desativar esse aviso. Idealmente, seria bom não avisar para arquivos dentro de elpa, mas avisar só para os meus arquivos
      Além disso, 64 dos 68 avisos no meu Emacs vêm de arquivos gerados -autoloads.el. Parece algo que deveria ser corrigido nas ferramentas de geração do lado de elpa/melpa
  • Finalmente vão ter xref editável, que eu já queria há um tempo, e isso parece que vai deixar minha vida bem mais fácil
    Há muitas mudanças excelentes que afetam surpreendentemente bastante coisas com as quais mexo todos os dias

  • O Nvim mudou o padrão de regex do vim para treesitter, e isso quebrou meu ambiente de escrita
    O treesitter precisava de alguma configuração para fazer parsing de comentários HTML dentro de Markdown, e mesmo depois de juntar as peças não funcionou
    No fim, resolvi desativando o treesitter
    Sou bem conservador com infraestrutura básica como editor. Mudanças no editor quase sempre quebram algo que vinha funcionando sem problemas havia anos

    • Felizmente, no Emacs o padrão não está mudando para treesitter; continua tudo ativado de forma opcional