1 pontos por GN⁺ 4 시간 전 | 1 comentários | Compartilhar no WhatsApp
  • 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-windows e highlight-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-mode e keymaps de manipulação de imagens
  • O takeaway central é que, mesmo que o diretório lisp do 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-mode també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-file e dired de forma interativa
  • Em find-file, usar um padrão como *foo*.txt permite 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-find e embark-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-lo
  • ffap-menu percorre 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-menu não detecta isso
    • Para contornar isso, é possível usar um comando personalizado inspirado em ffap-menu para também coletar a propriedade de texto shr-url
    • O comando de exemplo my/search-occur-browse-url é configurado para encontrar tanto URLs por regex quanto propriedades shr-url, transformá-las em candidatos de conclusão e abrir a URL escolhida com browse-url ou browse-url-generic

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-diff e vários comandos ediff-*
  • compare-windows compara 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-directories pergunta, 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-directories também pode ser usado

Destaque de mudanças no buffer: M-x highlight-changes-mode

  • highlight-changes-mode destaca os pontos alterados em um arquivo e pode servir como uma alternativa “ao vivo” a comandos diff como diff-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-hook e after-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-mode em buffers de arquivo via text-mode-hook e ajusta o estado do destaque com hooks antes e depois de salvar
  • Se isso for transformado em algo como um highlight-unsaved-mode independente, o resultado será um modo menor que destaca todas as mudanças até o momento de salvar
  • highlight-changes-next-change e highlight-changes-previous-change permitem 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-versions e kept-new-versions permitem ajustar o local dos backups e quantas versões manter
    • O pacote externo backup-walker oferece 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-diff faz diff de um arquivo com a versão imediatamente anterior ou com uma versão especificada
    • vc-ediff executa Ediff com a versão imediatamente anterior ou com uma versão especificada do arquivo
    • vc-revision-other-window mostra 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-diff e vc-ediff comparam o buffer com o arquivo
    • Em arquivos versionados, vc-diff, vc-ediff e vc-revision-other-window originais 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
  • apropos não é um único comando, mas uma família de comandos de busca especializados, como apropos-library, apropos-function, apropos-command, apropos-variable, apropos-user-option, apropos-documentation e info-apropos
  • A configuração de exemplo vincula esses comandos em um keymap sob C-h a, substituindo apropos
  • Mesmo sem um prompt como which-key, é possível ver a lista de comandos disponíveis pressionando C-h após a tecla de prefixo C-h a
  • customize-apropos reú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-key ou C-h k para descobrir qual comando a tecla chama e depois pressionar s para ir ao código-fonte
  • find-function-on-key elimina essa segunda etapa e vai direto do keybinding ao código-fonte da função
  • A configuração de exemplo vincula C-h M-k a find-function-on-key no help-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-command copia texto da primeira linha não vazia acima da linha atual, de forma parecida com C-y no Vim
  • duplicate-dwim copia a linha atual ou a região ativa para baixo da linha atual, de forma parecida com yy<N>p no Vim
  • copy-from-above-command copia caracteres da linha acima de acordo com o argumento de prefixo, mas o advice de exemplo muda o prefixo C-u para 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-dwim exige 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-position e duplicate-line-final-position como -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 pacote dot-mode do 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 recentes
  • kmacro-edit-lossage permite 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), mas kmacro-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-query no 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, GtkWindow se divide em Gtk e Window, EmacsFrameClass em Emacs, Frame, Class, e NSGraphicsContext em NS, Graphics, Context
  • Em superword-mode, símbolos em snake_case como this_is_a_symbol são tratados como uma única palavra
  • No uso prático, como os comandos *-sexp já dão bom suporte à manipulação de símbolos, superword-mode é menos útil que subword-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 :foo com backward-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) e modify-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 i para 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 + e i - são úteis para zoom, e i r gira a imagem em 90 graus
  • Também é possível recortar a imagem com i c, e as teclas detalhadas podem ser vistas em M-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 +, - e r sem o prefixo i
  • 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 TAB geralmente 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-mode desativa 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-mode estiver 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 a M-s i
  • No exemplo, buscou-se zero para 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 pressionar M-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ão C-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 em fill-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-margin e set-right-margin não alteram a largura da margin exibida; eles funcionam mais como os comandos da família center, 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> e S-<mouse-3>, é possível definir as margins esquerda e direita do buffer
  • Também é possível definir fill-column arrastando com <mouse-2>
  • Se você quiser ajustar margins na hora, em vez de alternar larguras predefinidas, ruler-mode pode ser mais amigável do que pacotes como visual-fill-column ou olivetti

Repreencher texto: M-x refill-mode

  • O Emacs oferece vários comandos fill-* para preencher texto e o auto-fill-mode para 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-mode nã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 a fill-column
  • Esse comportamento pode ser ativado com M-x refill-mode

Rolar todas as janelas juntas: M-x scroll-all-mode

  • scroll-other-window permite 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óxima
  • follow-mode permite visualizar um único buffer de forma contínua em várias janelas
  • scroll-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-window escolhida pelo Emacs
    • O master-mode embutido 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-window a rolar a janela pretendida

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-mode amplia 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-mode precisa estar ativado
  • Ele faz com frames o que os recursos embutidos winner e tab-bar-history fazem com janelas
  • Se você deixar undelete-frame-mode ativado 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 subtree
  • shadowfile implementa unison dentro do Emacs, mas sua utilidade é questionável
  • double-mode é uma forma de entrada de caracteres sem teclado baseada em conversão de teclas, anterior ao quail
  • A biblioteca bs foi uma tentativa de criar um comando list-buffers mais inteligente, mas ibuffer acabou 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, smartparens e embrace sã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 lisp fornecido com o Emacs não é tão grande, mas ainda há espaço para continuar descobrindo recursos padrão úteis

1 comentários

 
GN⁺ 4 시간 전
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 um advice-add em find-file-noselect para que, ao usar curingas, o find-file abra diretamente o dired
    A lógica é passar para dired-noselect quando o resultado de file-expand-wildcards for 2 ou mais; caso contrário, chama o find-file-noselect original

  • ruler-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 prazeroso

  • Eu achava que já tinha explorado quase tudo usando apenas o Emacs comum, mas ainda havia muito mais para descobrir. ruler-mode é bem legal para escrever

    • É surpreendente que recursos assim estejam dentro do próprio Emacs. É fácil pensar que o Emacs apenas fornece a API em elisp para criar esse tipo de coisa, mas eu estava deixando passar muitas ferramentas padrão
      Antes eu usava muito mais o Magit, mas agora migrei para o vc-mode embutido e para as ferramentas de diff, e estou satisfeito porque ambos funcionam muito bem
  • Eu 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?