Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to setup coloured git diff with vim as a pager

Tags:

git

vim

diff

I am unable to configure git to follow my requests:

  1. use vim as a diff pager
  2. keep colours for diff when adding files in interactive mode

My ~/.gitconfig setup:

[color]
    ui = auto
    # diff = false

[pager]
    diff = vim -

With this configuration the interactive mode for git add --interactive produces coloured output as expected:

interactive adding

The downside of this is that diff in vim is corrupted. See the output of git diff:

diff using vim

When using git diff | vim - the colours are OK but I'm too lazy to type the full command. Is there any known method that preserves colours in both cases?

like image 791
Ikar Pohorský Avatar asked Jun 09 '13 19:06

Ikar Pohorský


2 Answers

You need to install AnsiEsc plugin and run :AnsiEsc just after loading file. You can set pager to vim -c AnsiEsc - to do this.

Alternatively, use vim own highlighting: using the same method (-c command) run

%sm/\e.\{-}m//g
set ft=diff

:

    diff = "vim -c '%sm/\\e.\\{-}m//g' -c 'set ft=diff' -"
like image 172
ZyX Avatar answered Oct 22 '22 15:10

ZyX


You have two alternatives here.

Use Vimdiff as a difftool

$ git config --global diff.tool vimdiff
$ git config --global difftool.prompt false
$ git config --global alias.d difftool

[diff]
    tool = vimdiff
[difftool]
    prompt = false
[alias]
    d = difftool # Not needed, just a convenience. $ git difftool, still works.

Regular Git diff, but with color highlithing.

$ git config --global color.ui true

[color]
    ui = true

Right now, you have a weird mix. You can of course use both, but the pager is messing up things.
The reason you get ^[32m etc is because you're trying to read shell colors in Vim. This doesn't work.

like image 42
timss Avatar answered Oct 22 '22 15:10

timss