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 diff
manual para sugerem nenhuma solução para a coloração de dentro de si. Por favor, considere usar colordiff
. É um invólucro diff
que 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 colordiff
brew install colordiff
ouport install colordiff
less -R
, que exibe as seqüências de escape das cores corretamente.
-y
opção para habilitar) ☹ A vimdiff
sugestão abaixo provavelmente a melhor maneira
colordiff
funciona bem para svn diff | colordiff
(ou seja, em situações em que você só tem o diff, não os dois arquivos sendo diffed).
-y
suporte 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-c
e ctrl-x
tem 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 b
em 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 cd
onde você está.
git config color.diff auto
git diff --no-index
para comparar dois arquivos.
diff --color
A opção foi adicionada ao GNU diffutils 3.4 (08-08 2016)
Essa é a diff
implementação padrão na maioria das distribuições, que em breve será obtida.
O Ubuntu 18.04 possui diffutils
3.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 --color
saída diff).
git diff --color
também funciona. Útil ao trabalhar com ssh.
diff --color=always | less -R
E naquelas ocasiões em que um yum install colordiff
ou um apt-get install colordiff
nã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 sed
destaque)
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 file2
para ver a saída colorida. Tenho alias diff
para grc diff
torná-lo mais fácil.
fork()
chamadas, embora provavelmente funcione com a WSL.
Aqui é uma outra solução que invoca sed
para 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 setaf
e tput sgr0
para 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 setaf
e tput sgr0
geram 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 wdiff
aceita 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
colordiff
agora (1.0.16) entende wdiff
, por isso, você também pode simplesmente pipe: wdiff -n f1 f2 | colordiff
. wdiff
deve 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-highlight
para descobrir onde.