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.
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.
Respostas:
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:
sudo apt-get install colordiffbrew install colordiffouport install colordiffless -R, que exibe as seqüências de escape das cores corretamente.
-yopção para habilitar) ☹ A vimdiffsugestão abaixo provavelmente a melhor maneira
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).
-ysuporte lado a lado ( ).
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.
vim -d /path/to/[ab]
vimdiff file1 file2 file3 file4
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.
zsh? Não reconheço =(...)construção. Segundo, eu tinha diff -ur a bem mente.
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.
git diff <(xxd file1) <(xxd filed)não funciona.
git help diff. Portanto, se o seu diff git estiver vazio, tente cdonde você está.
git config color.diff auto
git diff --no-indexpara comparar dois arquivos.
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:
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:
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.
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).
git diff --colortambém funciona. Útil ao trabalhar com ssh.
diff --color=always | less -R
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.
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).
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
Colorido, palavra de nível diff ouput
Aqui está o que você pode fazer com o script abaixo e o diff-realce :
#!/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)
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.
fork()chamadas, embora provavelmente funcione com a WSL.
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:
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
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:
Exemplo de https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html
colordiffagora (1.0.16) entende wdiff, por isso, você também pode simplesmente pipe: wdiff -n f1 f2 | colordiff. wdiffdeve ser mesclado em diffutils ...
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
Com o comando bat :
diff file1 file2 | bat -l diff
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.