3 pontos por GN⁺ 2024-11-09 | 1 comentários | Compartilhar no WhatsApp
  • Delta é uma ferramenta que adiciona realce de sintaxe e recursos de visualizador paginado às saídas de Git, diff e grep, ajudando a ler diffs de forma mais eficiente e agradável
  • Na maioria dos gerenciadores de pacotes, o nome do pacote é git-delta, mas o executável é delta, e ele pode ser usado como pager do Git definindo core.pager = delta em ~/.gitconfig
  • Os principais recursos incluem os mesmos temas de realce de sintaxe do bat, realce de diff por palavra com base no algoritmo de inferência de edição de Levenshtein, visualização lado a lado, números de linha, navegação com n/N e melhor exibição de conflitos de merge
  • Também aplica realce de sintaxe às saídas de git blame, rg, git grep e grep, e com --hyperlinks pode gerar hashes de commit no formato de links para provedores de hospedagem como GitHub, GitLab, SourceHut e Codeberg
  • É possível manter uma aparência próxima da saída padrão de Git/diff ou mudar bastante o layout e o estilo, ajustando com precisão o ambiente de revisão de diff dentro do terminal

O que o Delta faz

  • Delta é um visualizador paginado com realce de sintaxe para saídas de Git, diff e grep
  • O objetivo é tornar o tempo gasto lendo diffs mais eficiente e agradável em ambientes onde o código muda constantemente
  • É possível alterar amplamente o layout e o estilo do diff e, se quiser, também mantê-lo muito próximo da saída padrão de Git/diff

Instalação e configuração básica

  • A documentação de instalação está disponível em Install it
  • Na maioria dos gerenciadores de pacotes, o nome do pacote é git-delta e o nome do executável é delta
  • Você pode adicionar a configuração abaixo ao ~/.gitconfig para usá-lo como pager do Git e filtro de diff interativo
[core]
    pager = delta

[interactive]
    diffFilter = delta --color-only

[delta]
    navigate = true  # use n and N to move between diff sections
    dark = true      # or light = true, or omit for auto-detection

[merge]
    conflictStyle = zdiff3
  • A mesma configuração também pode ser aplicada com os comandos git config --global
git config --global core.pager delta
git config --global interactive.diffFilter 'delta --color-only'
git config --global delta.navigate true
git config --global delta.dark true  # or `delta.light true`, or omit for auto-detection
git config --global merge.conflictStyle zdiff3
  • A ajuda está disponível em delta -h, o manual completo em delta --help, e a documentação online pode ser consultada no user manual

Recursos para leitura de diff

  • O realce de sintaxe usa os mesmos temas de realce do bat
  • O realce de diff por palavra usa o algoritmo de inferência de edição de Levenshtein
  • Suporta visualização lado a lado e quebra de linha
  • Suporta exibição de números de linha
  • Em diffs grandes, é possível se mover entre arquivos e entre diffs na visualização de log -p com as teclas n e N
    • Esse recurso é ativado com --navigate
  • Também processa a saída tradicional de unified diff junto com a saída do Git
  • Pode detectar automaticamente fundos claros/escuros do terminal

Modos de visualização e temas

  • Todos os temas de realce de sintaxe fornecidos pelo bat também podem ser usados no Delta
    • delta --show-syntax-themes --dark
    • delta --show-syntax-themes --light
  • A visualização lado a lado está documentada em Side-by-side view user manual
[delta]
    side-by-side = true
  • Por padrão, a visualização lado a lado vem com números de linha ativados e realce de sintaxe aplicado nos painéis esquerdo e direito
  • A visualização lado a lado quebra automaticamente linhas longas
  • O recurso de números de linha está documentado em Line numbers user manual
[delta]
    line-numbers = true

Suporte por tarefa do Git

  • A exibição de conflitos de merge é fornecida em um formato melhorado, com documentação relacionada em Merge conflicts user manual
  • A saída de git blame oferece suporte a realce de sintaxe e, ao usar --hyperlinks, pode transformar commits em links no formato do provedor de hospedagem
    • Provedores de hospedagem suportados: GitHub, GitLab, SourceHut, Codeberg
    • Documentação relacionada: Git blame user manual
  • Também aplica realce de sintaxe às saídas de grep, como rg, git grep e grep
  • Suporta o recurso --color-moved do Git

Estilo e modo de compatibilidade

  • É possível copiar o código diretamente do diff, e os marcadores -/+ são removidos por padrão
  • Oferece modos de emulação de diff-highlight e diff-so-fancy
  • Hashes de commit podem ser vinculados a páginas do provedor de hospedagem no formato de hyperlinks do terminal
  • Caminhos de arquivo também podem ser convertidos em hyperlinks que o sistema operacional pode abrir
  • É possível estilizar decorações com caixas/linhas que destacam seções de cabeçalho de commit, arquivo e hunk
  • Suporta strings de estilo com cor de primeiro plano, cor de fundo e atributos de fonte para mais de 20 elementos de estilo
    • A linguagem de estilo usa a mesma linguagem de cores/estilos do Git

1 comentários

 
GN⁺ 2024-11-09
Opiniões no Hacker News
  • Delta foi uma ferramenta que configurei uma vez e nunca mais precisei pensar nela; faz um bom tempo que não vejo a saída “crua” de git grep/diff/blame
    Também uso sempre para diffs comuns fora de repositórios Git, e hoje descobri que também dá para usar junto com ripgrep
    https://dandavison.github.io/delta/grep.html
    O bat, já mencionado, também é uma dessas ferramentas de configurar uma vez e esquecer; por isso defini cat como alias para bat e deixei o /usr/bin/cat, o “cat puro”, separado com o alias vcat
    https://github.com/sharkdp/bat

    • Para impedir a expansão de alias, use \cat
  • Uma boa observação que vi tempos atrás continua na minha cabeça: o realce de sintaxe atual está destacando o alvo errado
    Humanos já distinguem bem a sintaxe, então não deveríamos colorir a sintaxe, e sim destacar símbolos. Se cada nome de variável e de função diferente recebesse uma cor diferente, o objetivo não seria “isto é um símbolo”, mas “distinguir símbolos diferentes mais rapidamente”
    Só que isso é muito mais difícil do que embelezar a sintaxe, então parece que as ferramentas ficam no lado mais fácil, não no mais útil. Realce de sintaxe também ajuda bastante, mas eu gostaria de ver um mecanismo de correspondência de símbolos funcionando bem de verdade
    Não lembro onde li o texto original, então não consigo citar a fonte corretamente
    Procurando, encontrei este artigo: https://www.wilfred.me.uk/blog/2014/09/27/the-definitive-gui...

    • No KDevelop, isso era chamado de realce semântico, não de realce de sintaxe
      Acho que já existia antes disso, mas o texto explicativo mais antigo que consigo encontrar é de 2009: https://zwabel.wordpress.com/2009/01/08/c-ide-evolution-from...
    • O autor desse artigo também criou o difftastic, um “diff estrutural que entende a sintaxe” usando treesitter
      https://difftastic.wilfred.me.uk/
      https://github.com/Wilfred/difftastic
    • Concordo totalmente. No começo pareceu estranho, mas depois que me acostumei passei a preferir esse tipo de realce
      Pessoalmente, uso color-identifiers-mode no Emacs
      https://github.com/ankurdave/color-identifiers-mode
    • Também dá para distinguir nomes de variáveis muito bem. Especialmente quando a própria sintaxe está realçada, você sabe exatamente para onde olhar e o que pode ignorar
      Não fiquei totalmente convencido por essa lógica, mas fiquei um pouco curioso
      Às vezes destaco manualmente uma variável para segui-la e conferir se não deixei passar algum uso, e entendo bem esse caso de uso. Só não sei se há cores e contraste suficientes para acompanhar várias variáveis ao mesmo tempo, e a tela também pode ficar poluída
      Como meio-termo, talvez dê para colorir manualmente no máximo umas 3 variáveis. Mas, quando esse tipo de ajuda é necessário, talvez isso já seja sinal de que o código tem baixa legibilidade. Claro que ajudar a lidar com uma codebase bagunçada é um uso legítimo
  • Não é sofisticado, mas, se você precisa de um diff por palavra razoável usando apenas o git padrão, isto muitas vezes basta
    git diff --color-words --word-diff-regex='\w+|.'

    • Como faço para ativar isso como padrão no .gitconfig?
  • O Delta cumpre muito bem seu papel, mas eu vivia esbarrando no problema de ele cortar linhas longas
    Ao ver este post, fui conferir se a situação tinha mudado, e de fato mudou. Agora, ao definir git config --global --replace-all delta.max-line-length 0, ele não corta mais as linhas
    Não sei bem por que isso não é o padrão. A discussão da mudança está em https://github.com/dandavison/delta/pull/290

    • O motivo de não ser o padrão está exatamente nesse PR
      É porque realçar a sintaxe de linhas muito longas, por exemplo em arquivos .js minificados, pode ficar muito lento quando elas não são cortadas
  • Já que estamos falando de diff, uma coisa que me irrita na saída de diff do Git é que ela imprime o caminho do arquivo começando com dois nomes de arquivo, como no diff tradicional do Unix
    --- a/some/path/to/file.c
    +++ b/some/path/to/file.c
    Costumo abrir arquivos no editor com cmd-clique no iTerm, mas aqui isso não funciona por causa dos prefixos a/ e b/. Existe algum jeito de fazer o Git formatar melhor os nomes de arquivo? Essas duas linhas nem são realmente necessárias

    • git config --global diff.noprefix true
      Para outras opções relacionadas a prefixos, consulte o manual
  • Uso delta e difftastic juntos, e ambos são excelentes
    O difftastic em especial é forte na sintaxe de AST com tree-sitter; embora seja um pouco lento, um diff que entende AST é muito bom
    O Delta é limpo e muito rápido

  • Uma dica útil para ativar e desativar o recurso side-by-side do Delta conforme o tamanho da janela. Aqui é para bash; em outros shells, adapte por conta própria
    function delta_sidebyside {
    if [[ COLUMNS -ge 120 ]]; then
    DELTA_FEATURES='side-by-side'
    else
    DELTA_FEATURES=''
    fi
    }
    trap delta_sidebyside WINCH

    • Falta um $ antes de COLUMNS, e provavelmente também é necessário export antes de definir DELTA_FEATURES
  • Uso tanto delta quanto difftastic, e não consigo recomendá-los o suficiente
    Se você usa o terminal nem que seja um pouco, vale a pena instalar

    • Difftastic e Delta não funcionam apenas no terminal puro
      Ambos são suportados no Magit do Emacs, e também no Lazygit
    • Estou usando difftastic há algum tempo, e fiquei curioso sobre como usar os dois juntos
  • Também vale conferir o tig: https://jonas.github.io/tig/

  • Quero gostar disso porque venho usando git diff comum com cores, mas parece complicado demais

    • Talvez você goste do diffr: https://github.com/mookid/diffr
      Para deixar claro, é um projeto meu
    • Tive a mesma impressão. Nunca senti que o git diff puro fosse exatamente um problema