- 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
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/blameTambém uso sempre para diffs comuns fora de repositórios Git, e hoje descobri que também dá para usar junto com
ripgrephttps://dandavison.github.io/delta/grep.html
O bat, já mencionado, também é uma dessas ferramentas de configurar uma vez e esquecer; por isso defini
catcomo alias parabate deixei o/usr/bin/cat, o “cat puro”, separado com o aliasvcathttps://github.com/sharkdp/bat
\catUma 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...
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...
https://difftastic.wilfred.me.uk/
https://github.com/Wilfred/difftastic
Pessoalmente, uso color-identifiers-mode no Emacs
https://github.com/ankurdave/color-identifiers-mode
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
gitpadrão, isto muitas vezes bastagit diff --color-words --word-diff-regex='\w+|.'.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 linhasNã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
É porque realçar a sintaxe de linhas muito longas, por exemplo em arquivos
.jsminificados, pode ficar muito lento quando elas não são cortadasJá 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.cCostumo abrir arquivos no editor com
cmd-clique no iTerm, mas aqui isso não funciona por causa dos prefixosa/eb/. Existe algum jeito de fazer o Git formatar melhor os nomes de arquivo? Essas duas linhas nem são realmente necessáriasgit config --global diff.noprefix truePara 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 ]]; thenDELTA_FEATURES='side-by-side'elseDELTA_FEATURES=''fi}trap delta_sidebyside WINCH$antes deCOLUMNS, e provavelmente também é necessárioexportantes de definirDELTA_FEATURESUso 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
Ambos são suportados no Magit do Emacs, e também no Lazygit
Também vale conferir o tig: https://jonas.github.io/tig/
Quero gostar disso porque venho usando
git diffcomum com cores, mas parece complicado demaisPara deixar claro, é um projeto meu
git diffpuro fosse exatamente um problema