Mudanças do Emacs 31 que já uso todos os dias
(rahuljuliato.com)- O Emacs 31 ainda não foi lançado oficialmente, mas mudanças perceptíveis já vêm se acumulando nos branches
emacs-31emaster, 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 exref-edit-modereforç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-nameenative-comp-async-on-battery-powerreduzem atritos repetitivos - Os nomes dos recursos e valores padrão do Emacs 31 ainda podem mudar, e
markdown-ts-modee 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-31emasterem 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.eldo 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 ttreesit-auto-install-grammar t
- Se
treesit-enabled-modesestiver comot, os major modes que tiverem variante Tree-sitter passam a usar essa variante treesit-auto-install-grammarnã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
.soparax86_64e o.soparaarm64podem 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.mdautomaticamente- É possível carregar a biblioteca com
M-x load-library RET markdown-ts-modee ativá-la no buffer - Também dá para adicioná-lo manualmente ao
auto-mode-alist
- É possível carregar a biblioteca com
- 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-modeeglot-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-indicationspermite desligar as novas dicas inline de code action- Em alguns language servers, essas dicas podem parecer barulhentas
eglot-events-buffer-sizeestá sendo substituído poreglot-events-buffer-configeldoc-help-at-pt tmostra 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
- Em conjunto com
- Novas configurações de completion atualizam a interface de forma mais agressiva enquanto você digita
completion-eager-update tcompletion-eager-display 'autominibuffer-visible-completions 'up-down
completion-eager-updateecompletion-eager-displayatualizam a UI de completion de acordo com a entrada mesmo antes de o usuário solicitar- Ao definir
minibuffer-visible-completionscomo'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-listicomplete-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-transposewindow-layout-rotate-clockwisewindow-layout-flip-leftrightwindow-layout-flip-topdown
transposetroca arranjos horizontal e vertical,rotategira o layout inteiro, e os comandosflipespelham 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-widthspeedbar-window-max-widthspeedbar-window
speedbar-windowacopla 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 tvc-allow-rewriting-published-history tvc-dir-auto-hide-up-to-date 'revert
vc-dir-auto-hide-up-to-dateoculta automaticamente arquivos atualizados ao recarregar o buffervc-dir- Isso permite apagar hacks de tecla que antes chamavam
vc-dir-hide-up-to-datedepois devc-dir-refresh
- Isso permite apagar hacks de tecla que antes chamavam
vc-allow-rewriting-published-historyse 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-resultsnor, e isso ficava limitado a substituições baseadas em regex - Diferentemente do
wdired-modedo Dired ou dogrep-edit-modeem buffers grep, não havia um fluxo de editar diretamente o buffer de resultados no xref
- Antes, o buffer xref só tinha
- A proposta inicial era usar
xref-export-to-greppara exportar os resultados de xref para um buffergrep-modeno formatofile:line:contente 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-modefoi implementado xref-edit-modeelimina 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 comeno buffer*xref*e, após editar, confirmar comC-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-pfaz com que logs anteriores sejam inseridos apenas ao abrir um novo target buffer - No Emacs 31, o módulo
scrolltobottomdo ERC não depende mais deerc-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ósdelete-pair, permitindo selecionar o interior comC-x C-xibuffer-human-readable-size t: mostra KB/MB em vez de bytes crusielm-history-file-name: preserva o histórico de entrada do IELM após reiniciarkill-region-dwim 'emacs-word: quando não há região ativa,C-wmata a palavra seguinte em vez de gerar erronative-comp-async-on-battery-power nil: interrompe a compilação nativa em segundo plano quando estiver na bateriaview-lossage-auto-refresh t: fazC-h latualizar as teclas pressionadas recentes em tempo realdisplay-fill-column-indicator-warning nildired-hide-details-hide-absolute-location t: oculta o caminho absoluto do diretório emdired-hide-details-modeworld-clock-sort-order "%FT%T": ajusta a ordenação do world clockzone-all-frames tzone-all-windows-in-frame tuniquify-after-kill-buffer-flag t: o nome mudou da variante anterior com-p
kill-region-dwimevita o erro “the mark is not active” noC-wview-lossage-auto-refreshé útil para mostrar teclas em tempo real durante compartilhamento de tela ou ensinonative-comp-async-on-battery-power nilreduz situações em que o ventilador dispara por causa de compilação em segundo plano enquanto você está em movimento sem estar ligado na tomadatty-tip-modeoferece tooltips mesmo no Emacs executado com-nw
term, temas Modus e por que usar master
- O Emacs 31 corrige em
termeansi-termproblemas de linhas engolidas ou tela corrompida- Programas como
htop,nethacke 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
- Programas como
- O Emacs passa a incluir os temas Modus 5 de Protesilaos
modus-operandi-deuteranopia: tema com fundo branco otimizado para deuteranopiamodus-operandi: tema de alta legibilidade com fundo brancomodus-operandi-tinted: tema de alta legibilidade com fundo ocre claromodus-operandi-tritanopia: tema com fundo branco otimizado para tritanopiamodus-vivendi-deuteranopia: tema com fundo preto otimizado para deuteranopiamodus-vivendi: tema de alta legibilidade com fundo pretomodus-vivendi-tinted: tema de alta legibilidade com fundo de céu noturnomodus-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.
icompleteefido-modechegam bem perto do que eu quero, mas ainda não são tão confortáveis de usar quanto pacotes de terceiros comocorfuverticoetc. só com recursos nativos, e ainda por cima ativados por padrãoCom alguns ajustes e só habilitando recursos embutidos, a usabilidade já muda bastante;
bedrockeemacs-solosão configurados mais ou menos assimToda vez que inicio o Emacs aparece uma mensagem enorme sobre uma
dylibausenteA 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 configuradasTambém há pequenas mudanças na próxima release de que gostei:
minibuffer-nonselected-modevem ativado por padrão, então fica mais fácil ver se há trabalho inacabado no minibuffer, ediff-modecomdiff-delete-other-hunksé muito útil junto do comportamento de VC no buffer de diff introduzido no Emacs 29with-work-bufferé parecido comwith-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 à parteTambém precisei de alguns ajustes para voltar a funcionar exatamente do jeito que eu queria:
xterm-mouse-modevem ativado por padrão, então desativei explicitamente, e a face demode-linemuda para combinar com temas escuros, mas eu estava acostumado com as cores padrão antigas e reverti issoO Emacs 31 avisa quando arquivos-fonte não têm o cookie
lexical-binding. Se isso incomodar, dá para desativar, corrigir facilmente com o comandoelisp-enable-lexical-binding, e também tornarlexical-bindingo padrão globalSe não aparecerem bugs novos, parece que será, como sempre, uma release sólida
:customdouse-packagePor isso tenho uma sensação meio ambígua sobre
:custom. É mais trabalhoso quando quero testar ou compartilhar valoreswith-work-bufferé para desempenho? A documentação não explica por que usar isso no lugar dewith-temp-buffer, só diz que é preciso ter mais cuidadoelpa, mas avisar só para os meus arquivosAlé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 deelpa/melpaFinalmente 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