Como colorir o diff na linha de comando?

504

Quando tenho um diff, como posso colori-lo para que fique bem? Eu quero isso para a linha de comando, por isso não há soluções de GUI.

daniel kullmann
fonte
6
Algum sistema operacional / shell em particular?
Rowland Shaw
4
Tente github.com/walles/riff . Como um bônus adicional, destaca quais partes das linhas foram alteradas.
Johan Walles

Respostas:

608

As páginas de diffmanual para sugerem nenhuma solução para a coloração de dentro de si. Por favor, considere usar colordiff. É um invólucro diffque produz a mesma saída que o diff, exceto que aumenta a saída usando o realce de sintaxe colorido para aumentar a legibilidade:

diff old new | colordiff

ou apenas:

colordiff old new

Instalação:

  • Ubuntu / Debian: sudo apt-get install colordiff
  • OS X: brew install colordiffouport install colordiff
kaji
fonte
45
Acabei de descobrir que :-). Ele pode ser canalizado para menos usando less -R, que exibe as seqüências de escape das cores corretamente.
Daniel kullmann
34
Pode apenas usar a sintaxe: arq2 colordiff file1
Felipe Alvarez
3
Infelizmente, ele não funciona para a saída de side-by-side ( -yopção para habilitar) ☹ A vimdiffsugestão abaixo provavelmente a melhor maneira
Hi-Angel
8
colordifffunciona bem para svn diff | colordiff(ou seja, em situações em que você só tem o diff, não os dois arquivos sendo diffed).
Cornstalks
8
Como uma atualização do comentário do @ Hi-Angel: o colordiff foi atualizado e agora inclui -ysuporte lado a lado ( ).
Bailey Parker
333

Use o Vim :

diff /path/to/a /path/to/b | vim -R -

Ou melhor ainda, o VimDiff (ou vim -d, que é mais curto para digitar) mostrará diferenças entre dois, três ou quatro arquivos lado a lado.

Exemplos:

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4
Johnsyweb
fonte
7
@Jichao: Eu prefiro aprender os comandos do que apelidá-los. Dessa forma, eu posso usá-los em qualquer lugar, mesmo quando meus arquivos de ponto não estiverem disponíveis.
precisa saber é o seguinte
1
@AquariusPower: ctrl-ce ctrl-xtem outros usos no Vim. ctrl-qé capturado por muitos terminais. Consulte Escrevendo e saindo para encontrar a melhor maneira de atender às suas necessidades.
Johnsyweb
1
Primeiro, que tipo de concha é essa? zsh? Não reconheço =(...)construção. Segundo, eu tinha diff -ur a bem mente.
X-yuri
1
Esta solução é melhor do que a resposta aceite, uma vez que não exigem que você tenha direitos de administrador de sistema e instalar qualquer ferramenta adicional
amanzoor
173

Na verdade, parece haver mais uma opção (que eu notei apenas recentemente, ao encontrar o problema descrito acima):

git diff --no-index <file1> <file2>
# output to console instead of opening a pager
git --no-pager diff --no-index <file1> <file2>

Se você tem o Git por perto (que você já pode estar usando de qualquer maneira), poderá usá-lo para comparação, mesmo que os arquivos em si não estejam sob controle de versão. Se não estiver habilitado para você por padrão, ativar o suporte a cores aqui parece ser consideravelmente mais fácil do que algumas das soluções alternativas mencionadas anteriormente.

Lars Baehren
fonte
19
Isso é legal, mas infelizmente isso não funciona quando as entradas são tubos. Por exemplo, comparar arquivos binários via git diff <(xxd file1) <(xxd filed)não funciona.
Michael Anderson
8
Estranhamente, pelo menos um dos arquivos deve estar 'fora do repositório atual', de acordo com git help diff. Portanto, se o seu diff git estiver vazio, tente cdonde você está.
Pedido inválido
7
Para activar cores para git diff:git config color.diff auto
JWhy
2
super simples e rápida
EE33
31
Se os dois arquivos estiverem dentro do repositório atual, use git diff --no-indexpara comparar dois arquivos.
Olivier 'Ölbaum' Scherler
95

diff --color A opção foi adicionada ao GNU diffutils 3.4 (08-08 2016)

Essa é a diffimplementação padrão na maioria das distribuições, que em breve será obtida.

O Ubuntu 18.04 possui diffutils3.6 e, portanto, possui.

No 3.5, fica assim:

insira a descrição da imagem aqui

Testado:

diff --color -u \
  <(seq 6 | sed 's/$/ a/') \
  <(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')

Aparentemente adicionado ao commit c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (março de 2015).

Diferença no nível da palavra

Like diff-highlight. Parece impossível, solicitação de recurso: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html

Tópicos relacionados:

ydiff faz isso, porém, veja abaixo.

ydiff nível de palavra lado a lado diff

https://github.com/ymattw/ydiff

É o Nirvana?

python3 -m pip install --user ydiff
diff -u a b | ydiff -s

Resultado:

insira a descrição da imagem aqui

Se as linhas forem muito estreitas (padrão de 80 colunas), ajuste para a tela com:

diff -u a b | ydiff -w 0 -s

Conteúdo dos arquivos de teste:

uma

1
2
3
4
5 the original line the original line the original line the original line
6
7
8
9
10
11
12
13
14
15 the original line the original line the original line the original line
16
17
18
19
20

b

1
2
3
4
5 the original line teh original line the original line the original line
6
7
8
9
10
11
12
13
14
15 the original line the original line the original line the origlnal line
16
17
18
19
20

ydiff Integração Git

ydiff integra-se ao Git sem nenhuma configuração necessária.

De dentro de um repositório git, em vez de git diff, você pode fazer apenas:

ydiff -s

e em vez de git log:

ydiff -ls

Veja também: Como posso obter uma comparação lado a lado quando faço o "git diff"?

Testado no Ubuntu 16.04, git 2.18.0, ydiff 1.1.

Ciro Santilli adicionou uma nova foto
fonte
Aqui está a documentação.
Alex12
1
Na lista de discussão: There is no word-highlighting, yet- alguma atualização? Foi para isso que eu vim a esta pergunta (eu quero uma grep --colorsaída diff).
I336_
@ i336_ infelizmente não há atualizações; se eu tiver alguma, atualizarei a pergunta. Ping-me se você encontrar alguma coisa.
Ciro Santilli escreveu
A propósito, git diff --colortambém funciona. Útil ao trabalhar com ssh.
Nagev 04/07/19
Difere muito grande? usediff --color=always | less -R
inetphantom 5/07/19
69

E naquelas ocasiões em que um yum install colordiffou um apt-get install colordiffnão é uma opção devido a alguma restrição insana além do seu controle imediato, ou você está apenas louco , pode reinventar a roda com uma linha de sed:

sed 's/^-/\x1b[41m-/;s/^+/\x1b[42m+/;s/^@/\x1b[34m@/;s/$/\x1b[0m/'

Jogue isso em um script de shell e envie a saída diff unificada através dele.

Torna os marcadores do pedaço em azul e destaca os nomes de arquivos novos / antigos e as linhas adicionadas / removidas em fundo verde e vermelho, respectivamente. 1 E tornará as mudanças no espaço à direita 2 mais prontamente aparentes do que o colordiff.


1 Aliás, o motivo para destacar os nomes de arquivos da mesma forma que as linhas modificadas é que para diferenciar corretamente entre os nomes de arquivos e as linhas modificadas, é necessário analisar corretamente o formato diff, o que não é algo a ser abordado em uma regex. Destacar-lhes o mesmo funciona "suficientemente bem" visualmente e torna o problema trivial. Dito isto, existem algumas sutilezas interessantes .

2 Mas não abas à direita. Aparentemente, as guias não têm o fundo definido, pelo menos no meu xterm. Ele faz as alterações de tabulação versus espaço se destacarem um pouco.

retrátil
fonte
5
@ Matt: Aqui está uma abordagem de força bruta para um Mac: sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/"(embora eu espere que exista uma maneira melhor).
retracile
1
Hmm, meio que funcionou ... deu aos 3 traços entre cada pedaço um fundo rosa.
precisa
Maneira ilegível e não sustentável manual, sem a opção de alterar facilmente as cores, por exemplo.
1
Cara isso é incrível! Caminho a percorrer! Essa é uma boa magia sed.
Fthinker 17/10/2013
6
sed 's / ^ - / \ x1b [31m - /; s / ^ + / \ x1b [32m + /; s / ^ @ / \ x1b [34m @ /; s / $ / \ x1b [0m /' também parece ótimo
Yura
16

Você pode alterar a configuração do subversion para usar o colordiff

~ / .subversion / config.diff

 ### Set diff-cmd to the absolute path of your 'diff' program.
 ###   This will override the compile-time default, which is to use
 ###   Subversion's internal diff implementation.
-# diff-cmd = diff_program (diff, gdiff, etc.)
+diff-cmd = colordiff

via: https://gist.github.com/westonruter/846524

Azd325
fonte
svn: Não é possível iniciar o processo 'colordiff': Recurso temporariamente indisponível
niken
Você instalou o colordiff?
precisa saber é o seguinte
Sim, eu tentei codificar o caminho bem (em execução no cygwin)
niken
idk tentativa pode este superuser.com/questions/635995/...
Azd325
12

Colorido, palavra de nível diff ouput

Aqui está o que você pode fazer com o script abaixo e o diff-realce :

Captura de tela colorida diff

#!/bin/sh -eu

# Use diff-highlight to show word-level differences

diff -U3 --minimal "$@" |
  sed 's/^-/\x1b[1;31m-/;s/^+/\x1b[1;32m+/;s/^@/\x1b[1;34m@/;s/$/\x1b[0m/' |
  diff-highlight

(Crédito à resposta de @ retracile para o seddestaque)

Tom Hale
fonte
Como uso essa saída no GVim?
Hemant Sharma
Para vim, use um plugin, por exemplo diffchar .
Tom Hale
10

Eu uso grc(Colouriser genérico), que permite colorir a saída de vários comandos, inclusive diff.

É um script python que pode ser envolvido em qualquer comando. Então, em vez de invocar diff file1 file2, você invocaria grc diff file1 file2para ver a saída colorida. Tenho alias diffpara grc difftorná-lo mais fácil.

dogbane
fonte
Não funciona no Windows com mingw / cygwin devido a fork()chamadas, embora provavelmente funcione com a WSL.
Gabriel Devillers 16/03
6

Aqui é uma outra solução que invoca sedpara inserir as sequências de escape ANSI apropriados para cores para mostrar as +, -e @as linhas em vermelho, verde, e ciano, respectivamente.

diff -u old new | sed "s/^-/$(tput setaf 1)&/; s/^+/$(tput setaf 2)&/; s/^@/$(tput setaf 6)&/; s/$/$(tput sgr0)/"

Diferente das outras soluções para essa pergunta, essa solução não explica explicitamente as seqüências de escape ANSI. Em vez disso, ele chama os comandos tput setafe tput sgr0para gerar as seqüências de escape ANSI para definir uma cor apropriada e redefinir os atributos do terminal, respectivamente.

Para ver as cores disponíveis para cada argumento tput setaf, use este comando:

for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo

Aqui está como a saída se parece:

insira a descrição da imagem aqui

Aqui está a evidência de que os comandos tput setafe tput sgr0geram as seqüências de escape ANSI apropriadas:

$ tput setaf 1 | xxd -g1
00000000: 1b 5b 33 31 6d                                   .[31m
$ tput setaf 2 | xxd -g1
00000000: 1b 5b 33 32 6d                                   .[32m
$ tput setaf 6 | xxd -g1
00000000: 1b 5b 33 36 6d                                   .[36m
$ tput sgr0 | xxd -g1
00000000: 1b 28 42 1b 5b 6d                                .(B.[m
Susam Pal
fonte
5

Como wdiffaceita args, especificando a sequência no início e no final de inserções e exclusões, você pode usar sequências de cores ANSI como as seguintes:

wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m' file1 file2

Por exemplo, este é o resultado da comparação de dois arquivos CSV:

saída diff de arquivos CSV

Exemplo de https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html

jcomeau_ictx
fonte
1
colordiffagora (1.0.16) entende wdiff, por isso, você também pode simplesmente pipe: wdiff -n f1 f2 | colordiff. wdiffdeve ser mesclado em diffutils ...
Ciro Santilli
3

Eu sugiro que você dê diff-assim-fantasia uma tentativa. Eu uso durante o meu trabalho e com certeza parece ótimo a partir de agora. Ele vem com muitas opções e é realmente fácil configurar seus diffs da maneira que você deseja.

Você pode instalá-lo:

sudo npm install -g diff-so-fancy

ou no Mac:

brew install diff-so-fancy

Posteriormente, você pode destacar suas diferenças assim:

diff -u file1 file2 | diff-so-fancy
Naveen
fonte
1

Com o comando bat :

diff file1 file2 | bat -l diff
Jian Weihang
fonte
0

Nas versões recentes do git no Ubuntu, você pode ativar o destaque diferencial com:

sudo ln -s /usr/share/doc/git/contrib/diff-highlight/diff-highlight /usr/local/bin
sudo chmod a+x /usr/share/doc/git/contrib/diff-highlight/diff-highlight

E adicionando isso ao seu .gitconfig:

[pager]
    log = diff-highlight | less
    show = diff-highlight | less
    diff = diff-highlight | less

É possível que o script esteja localizado em outro lugar em outras distros, você pode usar locate diff-highlightpara descobrir onde.

naught101
fonte
0

Diferença de cor no nível do caractere: Instale o ccdiff

ccdiff -r /usr/share/dict/words /tmp/new-dict

Saída de ccdiff

Damasco
fonte