Mais baterias incluídas por padrão no Emacs
(karthinks.com)- Os recursos padrão do Emacs incluem muitas ferramentas utilizáveis sem pacotes extras, mas pouco visíveis, e mesmo no Emacs moderno 28.1+ continuam surgindo funções práticas que vale a pena aprender em menos de 5 minutos
- Tarefas do dia a dia, como abrir arquivos, coletar URLs, comparar e rastrear mudanças, podem ser em grande parte resolvidas apenas com
find-file,dired,ffap-menu,compare-windowsehighlight-changes-mode - Arquivos de backup e arquivos de controle de versão podem ser reunidos em um único modelo de trabalho de comparar com a versão anterior ao expandir a família de comandos
vc-diff - Tarefas de edição, navegação e exibição melhoram rapidamente com recursos já incluídos, como a família
apropos,find-function-on-key,kmacro-edit-lossage,subword-modee keymaps de manipulação de imagens - O takeaway central é que, mesmo que o diretório
lispdo Emacs não seja grande, ainda há muito espaço para ampliar o fluxo de trabalho apenas com funcionalidades nativas
Visão geral e escopo
- Os recursos do Emacs têm um problema de descoberta, e este texto é uma tentativa de reduzir isso ao apresentar, um a um, recursos embutidos pouco conhecidos, mas úteis
- Este é o terceiro texto sobre recursos úteis, porém menos conhecidos, incluídos por padrão no Emacs
- “Menos conhecidos” é um critério subjetivo e significa, em linhas gerais, recursos que, ao longo de 20 anos acompanhando discussões sobre Emacs online, foram mencionados menos de cinco vezes ou nunca chegaram a ser vistos
- Não é ideal que novos usuários de Emacs comecem por aqui; esta lista fica mais útil depois de se familiarizar com os conceitos básicos e com os pacotes mais recomendados
- Os critérios são usar apenas Emacs puro, sem pacotes, evitar recursos com curva de aprendizado acentuada, excluir funções de brincadeira e as muito citadas, e assumir o Emacs moderno 28.1+
Dicionário com mouseover: M-x dictionary-tooltip-mode
- Ao ativar
dictionary-tooltip-mode, é possível ver o significado de uma palavra em uma tooltip ao passar o mouse sobre ela tooltip-modetambém precisa estar ativado, mas isso já acontece por padrão- Se houver um dicionário local configurado, ele será usado primeiro, e o dicionário do Emacs geralmente também consegue encontrar termos modernos e gírias via Wiktionary
Wildcards em find-file e dired
- É possível usar wildcards também ao usar
find-fileediredde forma interativa - Em
find-file, usar um padrão como*foo*.txtpermite abrir vários arquivos de uma vez - Ao abrir um diretório no Dired, especificar um wildcard de nome de arquivo permite criar uma lista personalizada contendo apenas determinados arquivos
- O fluxo de exemplo usa o padrão
*/*_region_*para encontrar arquivos temporários do AucTeX em subdiretórios, selecioná-los no Dired e apagá-los, e depois usar novamente wildcards para abrir vários arquivos TeX em subdiretórios - Esse recurso aparece na assinatura da função para chamadas programáticas, mas perceber que ele também funciona no uso interativo exige, em geral, ler toda a docstring
- O recurso de wildcard do Dired pode acabar ofuscado por fluxos modernos de Dired criados com
consult-findeembark-export, mas funciona imediatamente no estado padrão
Lista de URIs no buffer: M-x ffap-menu
ffapé o recurso find-file-at-point, que verifica se a posição do cursor corresponde a um caminho de arquivo ou URL válido para então abri-loffap-menupercorre todo o buffer em busca de itens que pareçam caminhos de arquivo ou URLs e os apresenta em uma lista- Como usa a interface
completing-read, é possível exportar a lista filtrada de candidatos para um buffer, copiar ou abrir parte deles ou todos, ou processá-los com Embark -
Listagem de links com propriedades anexadas
- Aplicações do Emacs como o EWW às vezes inserem URLs não como links em texto simples, mas como propriedades de texto, e
ffap-menunão detecta isso - Para contornar isso, é possível usar um comando personalizado inspirado em
ffap-menupara também coletar a propriedade de textoshr-url - O comando de exemplo
my/search-occur-browse-urlé configurado para encontrar tanto URLs por regex quanto propriedadesshr-url, transformá-las em candidatos de conclusão e abrir a URL escolhida combrowse-urloubrowse-url-generic
- Aplicações do Emacs como o EWW às vezes inserem URLs não como links em texto simples, mas como propriedades de texto, e
Comparação de janelas: M-x compare-windows
- O Emacs tem muitos comandos de comparação, como
diff,diff-buffers,diff-backup,dired-diff,vc-diffe vários comandosediff-* compare-windowscompara o texto das duas janelas a partir da posição do cursor, para no próximo ponto de divergência e informa essa diferença- Os alvos da comparação são a janela ativa e a janela selecionada por
other-window; ele tem menos recursos do que Ediff ou diff, mas é mais fácil e rápido de executar - Independentemente do tipo de buffer, estado de modificação, arquivo ou estado de controle de versão, ele compara apenas o texto real visível nas duas janelas
- Se duas partes diferentes do mesmo buffer forem exibidas em duas janelas, também é possível comparar dois trechos de texto dentro do mesmo buffer
- Também é possível comparar listagens de diretório, e no exemplo a hora de modificação do arquivo é detectada como a primeira diferença
- Com um argumento de prefixo, diferenças de espaço em branco podem ser ignoradas
Comparação de diretórios com Dired: M-x dired-compare-directories
dired-compare-directoriespergunta, no Dired, qual diretório deve ser comparado e destaca, nas duas listas do Dired, os arquivos cujos nomes diferem- Essa abordagem consegue lidar com o caso de uso mais comum de comparação de diretórios
- Como a comparação é no nível do arquivo, é possível fornecer critérios de correspondência personalizados que incluam propriedades do arquivo, como hora de modificação ou tamanho
- A condição
(> mtime2 mtime1)pode destacar arquivos modificados mais recentemente - A condição
(/= size1 size2)pode destacar arquivos com o mesmo nome, mas com tamanhos diferentes - Se for necessário um comparativo mais interativo,
ediff-directoriestambém pode ser usado
Destaque de mudanças no buffer: M-x highlight-changes-mode
highlight-changes-modedestaca os pontos alterados em um arquivo e pode servir como uma alternativa “ao vivo” a comandos diff comodiff-buffer-with-file- O comportamento padrão destaca as mudanças feitas desde que o modo foi ativado até que seja desativado; não se trata, automaticamente, de destacar apenas mudanças não salvas
- Com
before-save-hookeafter-save-hook, é possível criar um fluxo em que o destaque é desligado antes de salvar e religado depois, de modo a destacar apenas as mudanças anteriores ao salvamento - O código de exemplo ativa
highlight-changes-modeem buffers de arquivo viatext-mode-hooke ajusta o estado do destaque com hooks antes e depois de salvar - Se isso for transformado em algo como um
highlight-unsaved-modeindependente, o resultado será um modo menor que destaca todas as mudanças até o momento de salvar highlight-changes-next-changeehighlight-changes-previous-changepermitem ir para o próximo e o anterior ponto de mudança- Com
highlight-changes-remove-highlight, é possível remover o destaque visual e usar apenas a navegação baseada no rastreamento de mudanças
Tornando arquivos de backup realmente úteis: a família vc-diff
-
O problema dos backups no Emacs
- O Emacs, por padrão, cria periodicamente backups dos arquivos que você edita e salva
- Esse sistema de backup costuma ser mencionado como um incômodo a ser desativado com
make-backup-files - Pode haver preocupações de segurança com arquivos sensíveis sendo copiados para outro lugar no disco
- Fora isso, o problema principal é que os backups ficam espalhados pelo diretório de trabalho, e falta uma UI prática para inspecionar ou lidar com esses arquivos
- Opções do usuário como
backup-directory-alist,kept-old-versionsekept-new-versionspermitem ajustar o local dos backups e quantas versões manter - O pacote externo
backup-walkeroferece uma interface para explorar backups como se fosse uma viagem no tempo
-
Expansão da interface VC
- O pacote VC embutido no Emacs fornece uma interface para ver versões anteriores de arquivos sob controle de versão
vc-difffaz diff de um arquivo com a versão imediatamente anterior ou com uma versão especificadavc-ediffexecuta Ediff com a versão imediatamente anterior ou com uma versão especificada do arquivovc-revision-other-windowmostra a versão anterior imediata ou uma versão passada especificada ao lado do arquivo atual- Essa interface não é limitada ao Git, mas não funciona em arquivos fora de controle de versão
- Ao sobrecarregar os três comandos de VC, é possível unificar buffers não salvos, arquivos versionados e backups de arquivos não versionados sob o modelo “comparar com a versão anterior”
- Em arquivos não salvos,
vc-diffevc-ediffcomparam o buffer com o arquivo - Em arquivos versionados,
vc-diff,vc-ediffevc-revision-other-windoworiginais continuam sendo executados - Em arquivos não versionados, eles comparam ou exibem o backup numerado mais recente, ou um backup numerado escolhido com argumento de prefixo
A família apropos
describe-key, isto é,C-h k, é uma tecla de ajuda extremamente útil porque permite verificar diretamente qual função um pressionamento de tecla chama- Como segunda função de ajuda para aprender,
aproposé poderoso e serve como porta de entrada para entender a organização dos recursos do Emacs quando você nem sabe o que procurar aproposnão é um único comando, mas uma família de comandos de busca especializados, comoapropos-library,apropos-function,apropos-command,apropos-variable,apropos-user-option,apropos-documentationeinfo-apropos- A configuração de exemplo vincula esses comandos em um keymap sob
C-h a, substituindoapropos - Mesmo sem um prompt como
which-key, é possível ver a lista de comandos disponíveis pressionandoC-hapós a tecla de prefixoC-h a customize-aproposreúne opções, faces e grupos que correspondem ao termo buscado e cria um buffer de customize sob medida
Ferramentas find-func: M-x find-function-on-key, M-x find-function
- Quando você não gosta de um keybinding ou quer entender seu comportamento, pode ir até a definição do comando chamado por aquela tecla para ler ou modificar seu funcionamento
- O fluxo comum é usar
describe-keyouC-h kpara descobrir qual comando a tecla chama e depois pressionarspara ir ao código-fonte find-function-on-keyelimina essa segunda etapa e vai direto do keybinding ao código-fonte da função- A configuração de exemplo vincula
C-h M-kafind-function-on-keynohelp-map
copy-from-above-command e duplicate-dwim
- O Emacs passou a incluir recentemente comandos de duplicação de texto que vários usuários já usavam há muito tempo
copy-from-above-commandcopia texto da primeira linha não vazia acima da linha atual, de forma parecida comC-yno Vimduplicate-dwimcopia a linha atual ou a região ativa para baixo da linha atual, de forma parecida comyy<N>pno Vimcopy-from-above-commandcopia caracteres da linha acima de acordo com o argumento de prefixo, mas o advice de exemplo muda o prefixoC-upara o comportamento “copiar a linha inteira acima e comentar”- Com um argumento de prefixo numérico
C-<N>, continua sendo possível copiar, como antes, um número definido de caracteres da linha acima duplicate-dwimexige escolher se o cursor fica no original ou na cópia após a duplicação, e isso pode ser definido por uma opção do usuário- A configuração de exemplo define
duplicate-region-final-positioneduplicate-line-final-positioncomo-1, para que o cursor e a região se movam para o texto duplicado
Transformando o histórico de teclas em macro: M-x kmacro-edit-lossage
- As macros de teclado do Emacs podem capturar e reproduzir não só transformações de texto, mas qualquer sequência de ações no Emacs, incluindo cliques do mouse
- As macros de teclado são poderosas, mas impõem uma carga cognitiva alta, porque é preciso prever a possibilidade de repetição antes de começar a gravar e executar ações generalizadas sem erros
- O comando
.do Vim e o pacotedot-modedo Emacs aliviam o problema da repetição de edição, mas têm um escopo diferente do de macros de teclado completas view-lossage(C-h l) mostra o histórico dos cerca de 300 pressionamentos de tecla mais recenteskmacro-edit-lossagepermite criar uma macro a qualquer momento a partir desse histórico de teclas- O lossage é realmente editável, então você pode inserir novos comandos no histórico ao criar a macro
- Macros já definidas podem ser editadas com mais frequência por
edit-kbd-macro(C-x C-k e), maskmacro-edit-lossageé útil em situações raras para tornar repetível uma tarefa complexa que você acabou de fazer - Para criar uma macro que possa ser generalizada, muitas vezes é preciso inserir uma chamada a
kbd-macro-queryno lossage
subword-mode, superword-mode e gramática de palavras
- Os comandos de navegação e edição baseados em palavras no Emacs usam a syntax table de cada major mode, e o usuário pode ajustar o que será considerado uma palavra
- Em
subword-mode, cada componente de um símbolo em CamelCase é tratado como uma palavra - Por exemplo,
GtkWindowse divide emGtkeWindow,EmacsFrameClassemEmacs,Frame,Class, eNSGraphicsContextemNS,Graphics,Context - Em
superword-mode, símbolos em snake_case comothis_is_a_symbolsão tratados como uma única palavra - No uso prático, como os comandos
*-sexpjá dão bom suporte à manipulação de símbolos,superword-modeé menos útil quesubword-mode - Bastam alguns minutos mexendo na syntax table de um major mode para reduzir incômodos na navegação estrutural
- Em contextos da família Lisp, tornar
:um caractere constituinte de palavra facilita tratar palavras-chave como:foocombackward-kill-word - No Org mode, é possível mudar o comportamento para tratar os delimitadores
=e~como caracteres constituintes de palavra - A forma de especificar a sintaxe dos caracteres pode ser consultada em
describe-syntax(C-h s) emodify-syntax-entry
Manipulação da exibição de imagens
- Em praticamente qualquer lugar onde o Emacs exibe uma imagem, você pode posicionar o cursor sobre ela e pressionar
ipara manipular sua exibição - A mesma manipulação funciona em pré-visualizações de links de imagem no Org mode e em imagens nos buffers de itens do Elfeed
i +ei -são úteis para zoom, ei rgira a imagem em 90 graus- Também é possível recortar a imagem com
i c, e as teclas detalhadas podem ser vistas emM-x describe-keymap RET image-map - O atalho
C-<wheel>, comum em navegadores e outros aplicativos, também pode ser usado - Com
repeat-mode, depois da primeira chamada, é possível repetir apenas+,-ersem o prefixoi - Esse recurso é fornecido por um keymap sobreposto à imagem e não precisa de ativação separada
- O que é manipulado não é o arquivo de imagem no disco, mas apenas o estado de exibição
- Em páginas web e buffers HTML renderizados,
z(shr-zoom-image) divide a imagem em várias fatias horizontais e alterna seu tamanho para contornar limitações na exibição de imagens grandes
Mostrar todo o texto: M-x visible-mode
- O Emacs pode tornar o texto do buffer seletivamente invisível, e esse recurso é a base de comportamentos de recolhimento como Magit section, Outline mode e Org mode
- Modos que oferecem recursos de recolhimento normalmente fornecem atalhos de teclado para alterar o estado do recolhimento, e
TABgeralmente funciona - Se for difícil aprender os atalhos específicos de cada modo ou você não os usar com frequência suficiente, é possível ver todo o texto oculto com
visible-mode visible-modedesativa a invisibilidade de texto em todo o buffer e, ao executá-lo novamente, restaura o estado anterior de invisibilidade- Em buffers com UI de recolhimento dinâmica, a tela pode parecer quebrada enquanto
visible-modeestiver ativado - Esse recurso é mais uma medida temporária ou ferramenta de depuração, mas permite revelar de forma uniforme todo o texto do buffer com um único comando
Ignorar texto invisível: isearch-toggle-invisible
- Alguns comandos do Emacs, como Isearch, ignoram a invisibilidade do texto por padrão, facilitando a busca no documento real inteiro
- Quando o estado visível do buffer serve como guia de navegação, a busca que revela texto recolhido automaticamente pode funcionar de forma diferente do esperado
- Ao usar Isearch como ferramenta de navegação em vez de busca, mover-se para correspondências em áreas recolhidas pode ser um problema
- Durante o Isearch, é possível alternar se o texto invisível será pesquisado com
isearch-toggle-invisible, associado aM-s i - No exemplo, buscou-se
zeropara ir até o último título de um documento Org, mas a busca pulou para uma correspondência em uma área recolhida; então, ao buscar novamente e pressionarM-s i, passou a mover-se apenas entre correspondências no texto visível - As teclas para alternar o comportamento do Isearch ficam sob o keymap
M-s, correspondente ao atalho padrãoC-s
Régua: M-x ruler-mode
- O Emacs ainda mantém recursos como os comandos
center-*como resquícios de antigas funções de processamento de texto WYSIWYG - Os comandos
center-*centralizam linhas, parágrafos e regiões com base emfill-column, podendo servir para comentários decorativos em código, por exemplo - As larguras de margin e fringe exibidas são espaço de tela onde muitas funções podem ser encaixadas, mas ajustar diretamente a largura da margin exibida não é simples
set-left-margineset-right-marginnão alteram a largura da margin exibida; eles funcionam mais como os comandos da famíliacenter, recuando o texto real do buffer- Não há um comando direto para configurar a margin exibida, e existe o problema de que o efeito não é aplicado até que a janela seja redesenhada
- Ao ativar
ruler-mode, é possível ver o modo de uso em um tooltip sobre a header-line - Com
S-<mouse-1>eS-<mouse-3>, é possível definir as margins esquerda e direita do buffer - Também é possível definir
fill-columnarrastando com<mouse-2> - Se você quiser ajustar margins na hora, em vez de alternar larguras predefinidas,
ruler-modepode ser mais amigável do que pacotes comovisual-fill-columnouolivetti
Repreencher texto: M-x refill-mode
- O Emacs oferece vários comandos
fill-*para preencher texto e oauto-fill-modepara lidar com quebras de linha durante a digitação - O
auto-fill-modeé tratado como um recurso de edição importante a ponto de aparecer logo no início do tutorial do Emacs - Na prática,
auto-fill-modenão é totalmente automático: ele só quebra a linha atual, e desalinhamentos em parágrafos anteriores causados por colagem e afins precisam ser corrigidos manualmente refill-modeé o recurso de preenchimento de texto realmente automático do Emacs para manter o documento ajustado afill-column- Esse comportamento pode ser ativado com
M-x refill-mode
Rolar todas as janelas juntas: M-x scroll-all-mode
scroll-other-windowpermite rolar outra janela não selecionada sem alternar para ela, o que é útil ao trabalhar na janela atual enquanto consulta material de referência na próximafollow-modepermite visualizar um único buffer de forma contínua em várias janelasscroll-all-modeé menos conhecido, mas rola todas as janelas do frame ao mesmo tempo- É útil ao examinar buffers que precisam ser comparados em sincronia; no exemplo, ele é usado para comparar visualmente duas versões de um arquivo sem entrar em uma sessão do Ediff
- No fluxo de exemplo, uma revisão anterior específica do arquivo atual é aberta com
vc-revision-other-window,scroll-all-modeé ativado e, então, a rolagem normal passa a mover todas as janelas ao mesmo tempo -
Rolagem de outra janela e
master-mode- Pode haver problema quando há mais de duas janelas na tela e a janela que você quer rolar não é a
next-windowescolhida pelo Emacs - O
master-modeembutido permite pré-definir ou definir na hora qual buffer em outra janela pode ser rolado - Uma forma mais imediata é configurar a estratégia para encontrar a janela a ser rolada
(setq other-window-scroll-default #'get-lru-window)faz com que sempre seja rolada a janela usada há mais tempo- Isso é útil quando se quer rolar uma janela que contém material de referência e quase nunca é selecionada
- Se houver duas janelas frequentemente editadas entre várias, é possível definir uma função lambda para que a outra janela rolada seja a usada mais recentemente
- Combinações assim ajudam
scroll-other-windowa rolar a janela pretendida
- Pode haver problema quando há mais de duas janelas na tela e a janela que você quer rolar não é a
Recusar encerramento: M-x emacs-lock-mode
- Quando há arquivos não salvos, o Emacs se recusa a encerrar até que você responda como cada arquivo deve ser tratado
emacs-lock-modeamplia essa ideia e permite ao usuário bloquear buffers arbitrários- Até que o bloqueio seja removido, o buffer se recusa a ser encerrado e mostra mensagens como
Buffer "*scratch*" is locked and cannot be killed - Se houver buffers bloqueados, o Emacs também se recusa a encerrar e mostra mensagens como
Emacs cannot exit because buffer "*scratch*" is locked - Isso é útil para não perder por engano informações contidas em buffers que não visitam arquivos ou para lembrar que ainda há trabalho pendente naquele buffer
- Após o Org-capture, o primeiro problema é raro, mas isso ainda é útil para não perder a saída ou o estado de buffers de shell, compilation, sites e outros aplicativos especiais
Restaurar frame: M-x undelete-frame-mode, M-x undelete-frame
- Se você fechar por engano um frame do Emacs cuidadosamente configurado, pode restaurá-lo com
undelete-frame - Para usar esse recurso,
undelete-frame-modeprecisa estar ativado - Ele faz com frames o que os recursos embutidos
winneretab-bar-historyfazem com janelas - Se você deixar
undelete-frame-modeativado junto com o Emacs, pode se preocupar menos em fechar frames - É possível restaurar até 16 frames excluídos
Recursos restantes e recursos excluídos
- Entre os recursos encontrados nos últimos 6 anos, 20 sobreviveram à realidade de uso do Emacs em 2026
- Várias bibliotecas do Emacs descobertas por acaso tinham mais interesse arqueológico do que valor como solução estável para necessidades de usuários comuns
allout-modeé um gerenciador de outline de um universo paralelo, parecido com Org mode, e tem recursos como speed-key do Org e criptografia por subtreeshadowfileimplementaunisondentro do Emacs, mas sua utilidade é questionáveldouble-modeé uma forma de entrada de caracteres sem teclado baseada em conversão de teclas, anterior aoquail- A biblioteca
bsfoi uma tentativa de criar um comandolist-buffersmais inteligente, masibufferacabou sendo melhor e eliminou o motivo para usá-la - Até recursos aparentemente úteis, como envolver regiões com delimitadores usando
electric-pair-mode, foram excluídos por terem pouco benefício em relação à dificuldade - Para esse tipo de uso, pacotes externos como
wrap-region,smartparenseembracesão melhores - Bibliotecas embutidas ligadas ao Org e adjacentes ao Org, como
appt, são interessantes, mas amplas o bastante para merecer um texto separado - Bibliotecas úteis principalmente para desenvolvedores de Elisp, como
thunk, também exigem uma organização separada - O diretório
lispfornecido com o Emacs não é tão grande, mas ainda há espaço para continuar descobrindo recursos padrão úteis
1 comentários
Opiniões no Lobste.rs
Abrir vários arquivos com curinga no
find-file(C-x C-f), como*foo*.txt, geralmente é um engano, então foi adicionado umadvice-addemfind-file-noselectpara que, ao usar curingas, ofind-fileabra diretamente odiredA lógica é passar para
dired-noselectquando o resultado defile-expand-wildcardsfor 2 ou mais; caso contrário, chama ofind-file-noselectoriginalruler-modeé realmente muito divertido. Eu não fazia ideia de que existia esse tipo de recurso WYSIWYG no Emacs, e o Emacs é um software realmente peculiar e prazerosoEu achava que já tinha explorado quase tudo usando apenas o Emacs comum, mas ainda havia muito mais para descobrir.
ruler-modeé bem legal para escreverAntes eu usava muito mais o Magit, mas agora migrei para o
vc-modeembutido e para as ferramentas dediff, e estou satisfeito porque ambos funcionam muito bemEu gosto desse tipo de post. Ao usar editores complexos e customizáveis como Emacs ou Neovim, muita gente instala logo de cara uma distribuição inchada e vai rápido demais antes de entender o que o editor padrão consegue fazer
Se você tiver tempo, ler o manual e construir sua configuração desde o começo é um processo bastante recompensador. Há uma função pouco conhecida do Emacs,
finder-list-keywords, que ao ser executada mostra um menu para explorar recursos do Emacs que são difíceis de encontrar. Por exemplo, você sabia que há 24 jogos embutidos?